summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/mlb/mxc_mlb.txt27
-rw-r--r--drivers/Kconfig1
-rw-r--r--drivers/Makefile1
-rw-r--r--drivers/media/platform/Kconfig8
-rw-r--r--drivers/media/platform/Makefile1
-rw-r--r--drivers/media/platform/mxc/output/Kconfig5
-rw-r--r--drivers/media/platform/mxc/output/Makefile1
-rw-r--r--drivers/media/platform/mxc/output/mxc_vout.c2302
-rw-r--r--drivers/mfd/Kconfig7
-rw-r--r--drivers/mfd/Makefile1
-rw-r--r--drivers/mfd/mxc-hdmi-core.c819
-rw-r--r--drivers/mxc/Kconfig39
-rw-r--r--drivers/mxc/Makefile11
-rw-r--r--drivers/mxc/gpu-viv/Kbuild330
-rw-r--r--drivers/mxc/gpu-viv/Kconfig10
-rw-r--r--drivers/mxc/gpu-viv/config71
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c5147
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.h183
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c17712
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h345
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_async_fe.c670
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_fe.h290
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_mc_fe.c838
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_waitlink_fe.c1758
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_recorder.c721
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_command_vg.c1411
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_command_vg.h353
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c2384
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.h110
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c5647
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h2413
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c4485
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c3922
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c1654
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c1312
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c2392
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_heap.c888
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c911
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c3409
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu_vg.c557
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_power.c381
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_precomp.h63
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security.c286
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security_v1.c320
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c514
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.h119
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c4743
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h141233
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h2291
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h6051
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_debug_zones.h329
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h1431
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h280
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_drm.h195
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h146
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h589
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h326
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h2987
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h1369
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h2409
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h326
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h566
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_metadata.h121
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h1359
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h1195
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h1108
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_security_interface.h186
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h135
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h1153
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h71
-rw-r--r--drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h886
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_array.h119
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c605
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c552
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c1389
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c544
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c876
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_array.h131
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c611
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c260
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h608
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debug.h176
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.c229
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.h115
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c2314
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h209
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c1462
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c858
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_iommu.c236
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c575
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h393
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_math.c66
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_mutex.h80
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c7494
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h124
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_platform.h315
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_security_channel.c426
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_security_channel_emulator.c116
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.c378
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.h151
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/default/gc_hal_kernel_platform_default.c450
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/default/gc_hal_kernel_platform_default.config3
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.c1838
-rw-r--r--drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.config29
-rw-r--r--drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta.c348
-rw-r--r--drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta.h373
-rw-r--r--drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.c1068
-rw-r--r--drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.h139
-rw-r--r--drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_mmu.c585
-rw-r--r--drivers/mxc/gpu-viv/hal/security_v1/os/emulator/gc_hal_ta_emulator.c324
-rw-r--r--drivers/mxc/hantro/Kconfig14
-rw-r--r--drivers/mxc/hantro/Makefile8
-rw-r--r--drivers/mxc/hantro/dwl_defs.h94
-rwxr-xr-xdrivers/mxc/hantro/hantrodec.c1946
-rwxr-xr-xdrivers/mxc/hantro_845/Kconfig14
-rwxr-xr-xdrivers/mxc/hantro_845/Makefile8
-rw-r--r--drivers/mxc/hantro_845/dwl_defs.h94
-rwxr-xr-xdrivers/mxc/hantro_845/hantrodec_845s.c2040
-rwxr-xr-xdrivers/mxc/hantro_845_h1/Kconfig14
-rwxr-xr-xdrivers/mxc/hantro_845_h1/Makefile8
-rwxr-xr-xdrivers/mxc/hantro_845_h1/hx280enc.c920
-rwxr-xr-xdrivers/mxc/hantro_845_h1/hx280enc.h82
-rw-r--r--drivers/mxc/hdmi-cec/Kconfig11
-rw-r--r--drivers/mxc/hdmi-cec/Makefile1
-rw-r--r--drivers/mxc/hdmi-cec/mxc_hdmi-cec.c665
-rw-r--r--drivers/mxc/hdmi-cec/mxc_hdmi-cec.h38
-rw-r--r--drivers/mxc/ipu3/Kconfig21
-rw-r--r--drivers/mxc/ipu3/Makefile7
-rw-r--r--drivers/mxc/ipu3/ipu_calc_stripes_sizes.c495
-rw-r--r--drivers/mxc/ipu3/ipu_capture.c816
-rw-r--r--drivers/mxc/ipu3/ipu_common.c3494
-rw-r--r--drivers/mxc/ipu3/ipu_device.c3756
-rw-r--r--drivers/mxc/ipu3/ipu_disp.c1993
-rw-r--r--drivers/mxc/ipu3/ipu_ic.c924
-rw-r--r--drivers/mxc/ipu3/ipu_param_mem.h1002
-rw-r--r--drivers/mxc/ipu3/ipu_pixel_clk.c317
-rw-r--r--drivers/mxc/ipu3/ipu_prv.h369
-rw-r--r--drivers/mxc/ipu3/ipu_regs.h702
-rw-r--r--drivers/mxc/ipu3/pre-regs.h480
-rw-r--r--drivers/mxc/ipu3/pre.c1001
-rw-r--r--drivers/mxc/ipu3/prg-regs.h70
-rw-r--r--drivers/mxc/ipu3/prg.c506
-rw-r--r--drivers/mxc/ipu3/vdoa.c538
-rw-r--r--drivers/mxc/ipu3/vdoa.h62
-rw-r--r--drivers/mxc/mlb/Kconfig17
-rw-r--r--drivers/mxc/mlb/Makefile5
-rwxr-xr-xdrivers/mxc/mlb/mxc_mlb.c2828
-rw-r--r--drivers/mxc/sim/Kconfig27
-rw-r--r--drivers/mxc/sim/Makefile6
-rw-r--r--drivers/mxc/sim/imx_emvsim.c1726
-rwxr-xr-xdrivers/mxc/sim/imx_sim.c1866
-rw-r--r--drivers/mxc/vpu/Kconfig31
-rw-r--r--drivers/mxc/vpu/Makefile9
-rwxr-xr-xdrivers/mxc/vpu/mxc_vpu.c1349
-rw-r--r--drivers/mxc/vpu_malone/Kconfig20
-rw-r--r--drivers/mxc/vpu_malone/Makefile19
-rw-r--r--drivers/mxc/vpu_malone/insert_startcode.c776
-rw-r--r--drivers/mxc/vpu_malone/insert_startcode.h44
-rw-r--r--drivers/mxc/vpu_malone/mediasys_types.h798
-rw-r--r--drivers/mxc/vpu_malone/vpu_b0.c6693
-rw-r--r--drivers/mxc/vpu_malone/vpu_b0.h514
-rw-r--r--drivers/mxc/vpu_malone/vpu_debug_log.c137
-rw-r--r--drivers/mxc/vpu_malone/vpu_debug_log.h48
-rw-r--r--drivers/mxc/vpu_malone/vpu_mu.c248
-rw-r--r--drivers/mxc/vpu_malone/vpu_mu.h47
-rw-r--r--drivers/mxc/vpu_malone/vpu_pm.c97
-rw-r--r--drivers/mxc/vpu_malone/vpu_pm.h32
-rw-r--r--drivers/mxc/vpu_malone/vpu_rpc.c364
-rw-r--r--drivers/mxc/vpu_malone/vpu_rpc.h118
-rw-r--r--drivers/mxc/vpu_malone/vpu_ts.c619
-rw-r--r--drivers/mxc/vpu_malone/vpu_ts.h252
-rw-r--r--drivers/mxc/vpu_windsor/Kconfig25
-rw-r--r--drivers/mxc/vpu_windsor/Makefile17
-rw-r--r--drivers/mxc/vpu_windsor/mediasys_types.h712
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_b0.c5898
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_b0.h511
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_config.h54
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_ctrl.c644
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_ctrl.h22
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_mem.c623
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_mem.h34
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_mu.c226
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_mu.h43
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_pm.c149
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_pm.h32
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_rpc.c448
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_rpc.h132
-rw-r--r--drivers/mxc/vpu_windsor/vpu_event_msg.c240
-rw-r--r--drivers/mxc/vpu_windsor/vpu_event_msg.h38
-rw-r--r--include/linux/hantrodec.h29
-rwxr-xr-xinclude/linux/hx280enc.h31
-rw-r--r--include/linux/ipu-v3-pre.h155
-rw-r--r--include/linux/ipu-v3-prg.h61
-rw-r--r--include/linux/ipu-v3.h770
-rw-r--r--include/linux/ipu.h38
-rw-r--r--include/linux/mfd/mxc-hdmi-core.h56
-rw-r--r--include/linux/mxc_mlb.h55
-rw-r--r--include/linux/mxc_sim_interface.h124
-rw-r--r--include/linux/mxc_vpu.h118
-rw-r--r--include/uapi/linux/hantrodec.h93
-rwxr-xr-xinclude/uapi/linux/hx280enc.h79
-rw-r--r--include/uapi/linux/mxc_mlb.h55
-rw-r--r--include/uapi/linux/mxc_sim_interface.h124
-rw-r--r--include/video/mxc_hdmi.h1015
204 files changed, 316734 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/mlb/mxc_mlb.txt b/Documentation/devicetree/bindings/mlb/mxc_mlb.txt
new file mode 100644
index 000000000000..e55d0083790a
--- /dev/null
+++ b/Documentation/devicetree/bindings/mlb/mxc_mlb.txt
@@ -0,0 +1,27 @@
+*MediaLB (MLB) for i.MX
+
+Required properties:
+- compatible :
+ - "fsl,imx6sx-mlb50" for MLB compatible with the one integrated on i.MX6SX soc
+ - "fsl,imx6q-mlb150" for MLB compatible with the one integrated on i.MX6Q
+ - "fsl,imx8qxp-mlb150" for MLB compatible with the one integrated on i.MX8 soc
+- reg : address and length for mlb registers
+- interrupt-parent : core interrupt controller
+- interrupts : MLB Break/Error interrupt and ahb interrupt
+ Two ahb interrupt for imx6, ahb_int[0] and ahb_int[1]
+ One ahb interrupt for imx8, ahb_int[0]
+- clocks : mlb clock specifier
+
+Examples:
+
+mlb: mlb@5B060000 {
+ compatible = "fsl,imx6q-mlb150";
+ reg = <0x0 0x5B060000 0x0 0x10000>;
+ interrupt-parent = <&gic>;
+ interrupts = <0 265 IRQ_TYPE_LEVEL_HIGH>,
+ <0 266 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&clk IMX8QM_MLB_CLK>,
+ <&clk IMX8QM_MLB_HCLK>,
+ <&clk IMX8QM_MLB_IPG_CLK>;
+ status = "disabled";
+};
diff --git a/drivers/Kconfig b/drivers/Kconfig
index 8befa53f43be..3986e201fe6f 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -228,4 +228,5 @@ source "drivers/interconnect/Kconfig"
source "drivers/counter/Kconfig"
+source "drivers/mxc/Kconfig"
endmenu
diff --git a/drivers/Makefile b/drivers/Makefile
index aaef17cc6512..5792caca1bb1 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -186,3 +186,4 @@ obj-$(CONFIG_SIOX) += siox/
obj-$(CONFIG_GNSS) += gnss/
obj-$(CONFIG_INTERCONNECT) += interconnect/
obj-$(CONFIG_COUNTER) += counter/
+obj-y += mxc/
diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig
index a41bb5c6300b..16cbff0e9b0b 100644
--- a/drivers/media/platform/Kconfig
+++ b/drivers/media/platform/Kconfig
@@ -153,8 +153,16 @@ config VIDEO_MXC_CAPTURE
---help---
This is the video4linux2 capture driver based on i.MX video-in module.
+config VIDEO_MXC_OUTPUT
+ tristate "MXC Video For Linux Video Output"
+ depends on VIDEO_DEV && ARCH_MXC && FB_MXC
+ select VIDEOBUF_DMA_CONTIG
+ ---help---
+ This is the video4linux2 output driver based on MXC module.
+
source "drivers/media/platform/imx8/Kconfig"
source "drivers/media/platform/mxc/capture/Kconfig"
+source "drivers/media/platform/mxc/output/Kconfig"
source "drivers/media/platform/exynos4-is/Kconfig"
source "drivers/media/platform/am437x/Kconfig"
source "drivers/media/platform/xilinx/Kconfig"
diff --git a/drivers/media/platform/Makefile b/drivers/media/platform/Makefile
index 8e76cc8fbfb9..2e6fb9ca93dd 100644
--- a/drivers/media/platform/Makefile
+++ b/drivers/media/platform/Makefile
@@ -86,6 +86,7 @@ obj-$(CONFIG_VIDEO_STM32_DCMI) += stm32/
obj-$(CONFIG_VIDEO_MX8_CAPTURE) += imx8/
obj-$(CONFIG_VIDEO_MXC_CAPTURE) += mxc/capture/
+obj-$(CONFIG_VIDEO_MXC_OUTPUT) += mxc/output/
obj-$(CONFIG_VIDEO_MEDIATEK_VPU) += mtk-vpu/
diff --git a/drivers/media/platform/mxc/output/Kconfig b/drivers/media/platform/mxc/output/Kconfig
new file mode 100644
index 000000000000..6139efc80a07
--- /dev/null
+++ b/drivers/media/platform/mxc/output/Kconfig
@@ -0,0 +1,5 @@
+config VIDEO_MXC_IPU_OUTPUT
+ tristate "IPU v4l2 output support"
+ depends on VIDEO_MXC_OUTPUT && MXC_IPU
+ help
+ This is the video4linux2 driver for IPU post processing video output.
diff --git a/drivers/media/platform/mxc/output/Makefile b/drivers/media/platform/mxc/output/Makefile
new file mode 100644
index 000000000000..7b524fe8e616
--- /dev/null
+++ b/drivers/media/platform/mxc/output/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_VIDEO_MXC_IPU_OUTPUT) += mxc_vout.o
diff --git a/drivers/media/platform/mxc/output/mxc_vout.c b/drivers/media/platform/mxc/output/mxc_vout.c
new file mode 100644
index 000000000000..a54df6146fda
--- /dev/null
+++ b/drivers/media/platform/mxc/output/mxc_vout.c
@@ -0,0 +1,2302 @@
+/*
+ * Copyright (C) 2011-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <linux/console.h>
+#include <linux/dma-mapping.h>
+#include <linux/init.h>
+#include <linux/ipu-v3.h>
+#include <linux/module.h>
+#include <linux/mxcfb.h>
+#include <linux/mxc_v4l2.h>
+#include <linux/platform_device.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/videodev2.h>
+#include <linux/vmalloc.h>
+
+#include <media/videobuf-dma-contig.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-ioctl.h>
+
+#define UYVY_BLACK (0x00800080)
+#define RGB_BLACK (0x0)
+#define UV_BLACK (0x80)
+#define Y_BLACK (0x0)
+
+#define MAX_FB_NUM 6
+#define FB_BUFS 3
+#define VDOA_FB_BUFS (FB_BUFS - 1)
+#define VALID_HEIGHT_1080P (1080)
+#define FRAME_HEIGHT_1080P (1088)
+#define FRAME_WIDTH_1080P (1920)
+#define CHECK_TILED_1080P_DISPLAY(vout) \
+ ((((vout)->task.input.format == IPU_PIX_FMT_TILED_NV12) || \
+ ((vout)->task.input.format == IPU_PIX_FMT_TILED_NV12F)) &&\
+ ((vout)->task.input.width == FRAME_WIDTH_1080P) && \
+ ((vout)->task.input.height == FRAME_HEIGHT_1080P) && \
+ ((vout)->task.input.crop.w == FRAME_WIDTH_1080P) && \
+ (((vout)->task.input.crop.h == FRAME_HEIGHT_1080P) || \
+ ((vout)->task.input.crop.h == VALID_HEIGHT_1080P)) && \
+ ((vout)->task.output.width == FRAME_WIDTH_1080P) && \
+ ((vout)->task.output.height == VALID_HEIGHT_1080P) && \
+ ((vout)->task.output.crop.w == FRAME_WIDTH_1080P) && \
+ ((vout)->task.output.crop.h == VALID_HEIGHT_1080P))
+#define CHECK_TILED_1080P_STREAM(vout) \
+ ((((vout)->task.input.format == IPU_PIX_FMT_TILED_NV12) || \
+ ((vout)->task.input.format == IPU_PIX_FMT_TILED_NV12F)) &&\
+ ((vout)->task.input.width == FRAME_WIDTH_1080P) && \
+ ((vout)->task.input.crop.w == FRAME_WIDTH_1080P) && \
+ ((vout)->task.input.height == FRAME_HEIGHT_1080P) && \
+ ((vout)->task.input.crop.h == FRAME_HEIGHT_1080P))
+#define IS_PLANAR_PIXEL_FORMAT(format) \
+ (format == IPU_PIX_FMT_NV12 || \
+ format == IPU_PIX_FMT_YUV420P2 || \
+ format == IPU_PIX_FMT_YUV420P || \
+ format == IPU_PIX_FMT_YVU420P || \
+ format == IPU_PIX_FMT_YUV422P || \
+ format == IPU_PIX_FMT_YVU422P || \
+ format == IPU_PIX_FMT_YUV444P)
+
+#define NSEC_PER_FRAME_30FPS (33333333)
+
+struct mxc_vout_fb {
+ char *name;
+ int ipu_id;
+ struct v4l2_rect crop_bounds;
+ unsigned int disp_fmt;
+ bool disp_support_csc;
+ bool disp_support_windows;
+};
+
+struct dma_mem {
+ void *vaddr;
+ dma_addr_t paddr;
+ size_t size;
+};
+
+struct mxc_vout_output {
+ int open_cnt;
+ struct fb_info *fbi;
+ unsigned long fb_smem_start;
+ unsigned long fb_smem_len;
+ struct video_device *vfd;
+ struct mutex mutex;
+ struct mutex task_lock;
+ struct mutex accs_lock;
+ enum v4l2_buf_type type;
+
+ struct videobuf_queue vbq;
+ spinlock_t vbq_lock;
+
+ struct list_head queue_list;
+ struct list_head active_list;
+
+ struct v4l2_rect crop_bounds;
+ unsigned int disp_fmt;
+ struct mxcfb_pos win_pos;
+ bool disp_support_windows;
+ bool disp_support_csc;
+
+ bool fmt_init;
+ bool release;
+ bool linear_bypass_pp;
+ bool vdoa_1080p;
+ bool tiled_bypass_pp;
+ struct v4l2_rect in_rect;
+ struct ipu_task task;
+ struct ipu_task vdoa_task;
+ struct dma_mem vdoa_work;
+ struct dma_mem vdoa_output[VDOA_FB_BUFS];
+
+ bool timer_stop;
+ struct hrtimer timer;
+ struct workqueue_struct *v4l_wq;
+ struct work_struct disp_work;
+ unsigned long frame_count;
+ unsigned long vdi_frame_cnt;
+ ktime_t start_ktime;
+
+ int ctrl_rotate;
+ int ctrl_vflip;
+ int ctrl_hflip;
+
+ dma_addr_t disp_bufs[FB_BUFS];
+
+ struct videobuf_buffer *pre1_vb;
+ struct videobuf_buffer *pre2_vb;
+
+ bool input_crop;
+};
+
+struct mxc_vout_dev {
+ struct device *dev;
+ struct v4l2_device v4l2_dev;
+ struct mxc_vout_output *out[MAX_FB_NUM];
+ int out_num;
+};
+
+/* Driver Configuration macros */
+#define VOUT_NAME "mxc_vout"
+
+/* Variables configurable through module params*/
+static int debug;
+static int vdi_rate_double;
+static int video_nr = 16;
+
+static int mxc_vidioc_s_input_crop(struct mxc_vout_output *vout,
+ const struct v4l2_crop *crop);
+static int mxc_vidioc_g_input_crop(struct mxc_vout_output *vout,
+ struct v4l2_crop *crop);
+/* Module parameters */
+module_param(video_nr, int, S_IRUGO);
+MODULE_PARM_DESC(video_nr, "video device numbers");
+module_param(debug, int, 0600);
+MODULE_PARM_DESC(debug, "Debug level (0-1)");
+module_param(vdi_rate_double, int, 0600);
+MODULE_PARM_DESC(vdi_rate_double, "vdi frame rate double on/off");
+
+static const struct v4l2_fmtdesc mxc_formats[] = {
+ {
+ .description = "RGB565",
+ .pixelformat = V4L2_PIX_FMT_RGB565,
+ },
+ {
+ .description = "BGR24",
+ .pixelformat = V4L2_PIX_FMT_BGR24,
+ },
+ {
+ .description = "RGB24",
+ .pixelformat = V4L2_PIX_FMT_RGB24,
+ },
+ {
+ .description = "RGB32",
+ .pixelformat = V4L2_PIX_FMT_RGB32,
+ },
+ {
+ .description = "BGR32",
+ .pixelformat = V4L2_PIX_FMT_BGR32,
+ },
+ {
+ .description = "NV12",
+ .pixelformat = V4L2_PIX_FMT_NV12,
+ },
+ {
+ .description = "UYVY",
+ .pixelformat = V4L2_PIX_FMT_UYVY,
+ },
+ {
+ .description = "YUYV",
+ .pixelformat = V4L2_PIX_FMT_YUYV,
+ },
+ {
+ .description = "YUV422 planar",
+ .pixelformat = V4L2_PIX_FMT_YUV422P,
+ },
+ {
+ .description = "YUV444",
+ .pixelformat = V4L2_PIX_FMT_YUV444,
+ },
+ {
+ .description = "YUV420",
+ .pixelformat = V4L2_PIX_FMT_YUV420,
+ },
+ {
+ .description = "YVU420",
+ .pixelformat = V4L2_PIX_FMT_YVU420,
+ },
+ {
+ .description = "TILED NV12P",
+ .pixelformat = IPU_PIX_FMT_TILED_NV12,
+ },
+ {
+ .description = "TILED NV12F",
+ .pixelformat = IPU_PIX_FMT_TILED_NV12F,
+ },
+ {
+ .description = "YUV444 planar",
+ .pixelformat = IPU_PIX_FMT_YUV444P,
+ },
+};
+
+#define NUM_MXC_VOUT_FORMATS (ARRAY_SIZE(mxc_formats))
+
+#define DEF_INPUT_WIDTH 320
+#define DEF_INPUT_HEIGHT 240
+
+static int mxc_vidioc_streamoff(struct file *file, void *fh,
+ enum v4l2_buf_type i);
+
+static struct mxc_vout_fb g_fb_setting[MAX_FB_NUM];
+static int config_disp_output(struct mxc_vout_output *vout);
+static void release_disp_output(struct mxc_vout_output *vout);
+
+static DEFINE_MUTEX(gfb_mutex);
+static DEFINE_MUTEX(gfbi_mutex);
+
+static unsigned int get_frame_size(struct mxc_vout_output *vout)
+{
+ unsigned int size;
+
+ if (IPU_PIX_FMT_TILED_NV12 == vout->task.input.format)
+ size = TILED_NV12_FRAME_SIZE(vout->task.input.width,
+ vout->task.input.height);
+ else if (IPU_PIX_FMT_TILED_NV12F == vout->task.input.format) {
+ size = TILED_NV12_FRAME_SIZE(vout->task.input.width,
+ vout->task.input.height/2);
+ size *= 2;
+ } else
+ size = vout->task.input.width * vout->task.input.height *
+ fmt_to_bpp(vout->task.input.format)/8;
+
+ return size;
+}
+
+static void free_dma_buf(struct mxc_vout_output *vout, struct dma_mem *buf)
+{
+ dma_free_coherent(vout->vbq.dev, buf->size, buf->vaddr, buf->paddr);
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "free dma size:0x%x, paddr:0x%x\n",
+ buf->size, buf->paddr);
+ memset(buf, 0, sizeof(*buf));
+}
+
+static int alloc_dma_buf(struct mxc_vout_output *vout, struct dma_mem *buf)
+{
+
+ buf->vaddr = dma_alloc_coherent(vout->vbq.dev, buf->size, &buf->paddr,
+ GFP_DMA | GFP_KERNEL);
+ if (!buf->vaddr) {
+ v4l2_err(vout->vfd->v4l2_dev,
+ "cannot get dma buf size:0x%x\n", buf->size);
+ return -ENOMEM;
+ }
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "alloc dma buf size:0x%x, paddr:0x%x\n", buf->size, buf->paddr);
+ return 0;
+}
+
+static ipu_channel_t get_ipu_channel(struct fb_info *fbi)
+{
+ ipu_channel_t ipu_ch = CHAN_NONE;
+ mm_segment_t old_fs;
+
+ if (fbi->fbops->fb_ioctl) {
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+ fbi->fbops->fb_ioctl(fbi, MXCFB_GET_FB_IPU_CHAN,
+ (unsigned long)&ipu_ch);
+ set_fs(old_fs);
+ }
+
+ return ipu_ch;
+}
+
+static unsigned int get_ipu_fmt(struct fb_info *fbi)
+{
+ mm_segment_t old_fs;
+ unsigned int fb_fmt = 0;
+
+ if (fbi->fbops->fb_ioctl) {
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+ fbi->fbops->fb_ioctl(fbi, MXCFB_GET_DIFMT,
+ (unsigned long)&fb_fmt);
+ set_fs(old_fs);
+ }
+
+ return fb_fmt;
+}
+
+static void update_display_setting(void)
+{
+ int i;
+ struct fb_info *fbi;
+ struct v4l2_rect bg_crop_bounds[2] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0} };
+
+ mutex_lock(&gfb_mutex);
+ for (i = 0; i < num_registered_fb; i++) {
+ fbi = registered_fb[i];
+
+ memset(&g_fb_setting[i], 0, sizeof(struct mxc_vout_fb));
+
+ if (!strncmp(fbi->fix.id, "DISP3", 5))
+ g_fb_setting[i].ipu_id = 0;
+ else
+ g_fb_setting[i].ipu_id = 1;
+
+ g_fb_setting[i].name = fbi->fix.id;
+ g_fb_setting[i].crop_bounds.left = 0;
+ g_fb_setting[i].crop_bounds.top = 0;
+ g_fb_setting[i].crop_bounds.width = fbi->var.xres;
+ g_fb_setting[i].crop_bounds.height = fbi->var.yres;
+ g_fb_setting[i].disp_fmt = get_ipu_fmt(fbi);
+
+ if (get_ipu_channel(fbi) == MEM_BG_SYNC) {
+ bg_crop_bounds[g_fb_setting[i].ipu_id] =
+ g_fb_setting[i].crop_bounds;
+ g_fb_setting[i].disp_support_csc = true;
+ } else if (get_ipu_channel(fbi) == MEM_FG_SYNC) {
+ g_fb_setting[i].disp_support_csc = true;
+ g_fb_setting[i].disp_support_windows = true;
+ }
+ }
+
+ for (i = 0; i < num_registered_fb; i++) {
+ fbi = registered_fb[i];
+
+ if (get_ipu_channel(fbi) == MEM_FG_SYNC)
+ g_fb_setting[i].crop_bounds =
+ bg_crop_bounds[g_fb_setting[i].ipu_id];
+ }
+ mutex_unlock(&gfb_mutex);
+}
+
+/* called after g_fb_setting filled by update_display_setting */
+static int update_setting_from_fbi(struct mxc_vout_output *vout,
+ struct fb_info *fbi)
+{
+ int i;
+ bool found = false;
+
+ mutex_lock(&gfbi_mutex);
+
+ update_display_setting();
+
+ for (i = 0; i < MAX_FB_NUM; i++) {
+ if (g_fb_setting[i].name) {
+ if (!strcmp(fbi->fix.id, g_fb_setting[i].name)) {
+ vout->crop_bounds = g_fb_setting[i].crop_bounds;
+ vout->disp_fmt = g_fb_setting[i].disp_fmt;
+ vout->disp_support_csc =
+ g_fb_setting[i].disp_support_csc;
+ vout->disp_support_windows =
+ g_fb_setting[i].disp_support_windows;
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if (!found) {
+ v4l2_err(vout->vfd->v4l2_dev, "can not find output\n");
+ mutex_unlock(&gfbi_mutex);
+ return -EINVAL;
+ }
+ strlcpy(vout->vfd->name, fbi->fix.id, sizeof(vout->vfd->name));
+
+ memset(&vout->task, 0, sizeof(struct ipu_task));
+
+ vout->task.input.width = DEF_INPUT_WIDTH;
+ vout->task.input.height = DEF_INPUT_HEIGHT;
+ vout->task.input.crop.pos.x = 0;
+ vout->task.input.crop.pos.y = 0;
+ vout->task.input.crop.w = DEF_INPUT_WIDTH;
+ vout->task.input.crop.h = DEF_INPUT_HEIGHT;
+ vout->input_crop = false;
+
+ vout->task.output.width = vout->crop_bounds.width;
+ vout->task.output.height = vout->crop_bounds.height;
+ vout->task.output.crop.pos.x = 0;
+ vout->task.output.crop.pos.y = 0;
+ vout->task.output.crop.w = vout->crop_bounds.width;
+ vout->task.output.crop.h = vout->crop_bounds.height;
+ if (colorspaceofpixel(vout->disp_fmt) == YUV_CS)
+ vout->task.output.format = IPU_PIX_FMT_UYVY;
+ else
+ vout->task.output.format = IPU_PIX_FMT_RGB565;
+
+ mutex_unlock(&gfbi_mutex);
+ return 0;
+}
+
+static bool deinterlace_3_field(struct mxc_vout_output *vout)
+{
+ return (vout->task.input.deinterlace.enable &&
+ (vout->task.input.deinterlace.motion != HIGH_MOTION));
+}
+
+static int set_field_fmt(struct mxc_vout_output *vout, enum v4l2_field field)
+{
+ struct ipu_deinterlace *deinterlace = &vout->task.input.deinterlace;
+
+ switch (field) {
+ /* Images are in progressive format, not interlaced */
+ case V4L2_FIELD_NONE:
+ case V4L2_FIELD_ANY:
+ deinterlace->enable = false;
+ deinterlace->field_fmt = 0;
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev, "Progressive frame.\n");
+ break;
+ case V4L2_FIELD_INTERLACED_TB:
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "Enable deinterlace TB.\n");
+ deinterlace->enable = true;
+ deinterlace->field_fmt = IPU_DEINTERLACE_FIELD_TOP;
+ break;
+ case V4L2_FIELD_INTERLACED_BT:
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "Enable deinterlace BT.\n");
+ deinterlace->enable = true;
+ deinterlace->field_fmt = IPU_DEINTERLACE_FIELD_BOTTOM;
+ break;
+ default:
+ v4l2_err(vout->vfd->v4l2_dev,
+ "field format:%d not supported yet!\n", field);
+ return -EINVAL;
+ }
+
+ if (IPU_PIX_FMT_TILED_NV12F == vout->task.input.format) {
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "tiled fmt enable deinterlace.\n");
+ deinterlace->enable = true;
+ }
+
+ if (deinterlace->enable && vdi_rate_double)
+ deinterlace->field_fmt |= IPU_DEINTERLACE_RATE_EN;
+
+ return 0;
+}
+
+static bool is_pp_bypass(struct mxc_vout_output *vout)
+{
+ if ((IPU_PIX_FMT_TILED_NV12 == vout->task.input.format) ||
+ (IPU_PIX_FMT_TILED_NV12F == vout->task.input.format))
+ return false;
+ if ((vout->task.input.width == vout->task.output.width) &&
+ (vout->task.input.height == vout->task.output.height) &&
+ (vout->task.input.crop.w == vout->task.output.crop.w) &&
+ (vout->task.input.crop.h == vout->task.output.crop.h) &&
+ (vout->task.output.rotate < IPU_ROTATE_HORIZ_FLIP) &&
+ !vout->task.input.deinterlace.enable) {
+ if (vout->disp_support_csc)
+ return true;
+ else if (!need_csc(vout->task.input.format, vout->disp_fmt))
+ return true;
+ /*
+ * input crop show to full output which can show based on
+ * xres_virtual/yres_virtual
+ */
+ } else if ((vout->task.input.crop.w == vout->task.output.crop.w) &&
+ (vout->task.output.crop.w == vout->task.output.width) &&
+ (vout->task.input.crop.h == vout->task.output.crop.h) &&
+ (vout->task.output.crop.h ==
+ vout->task.output.height) &&
+ (vout->task.output.rotate < IPU_ROTATE_HORIZ_FLIP) &&
+ !vout->task.input.deinterlace.enable) {
+ if (vout->disp_support_csc)
+ return true;
+ else if (!need_csc(vout->task.input.format, vout->disp_fmt))
+ return true;
+ }
+ return false;
+}
+
+static void setup_buf_timer(struct mxc_vout_output *vout,
+ struct videobuf_buffer *vb)
+{
+ ktime_t expiry_time, now;
+
+ /* if timestamp is 0, then default to 30fps */
+ if (vb->ts == 0)
+ expiry_time = ktime_add_ns(vout->start_ktime,
+ NSEC_PER_FRAME_30FPS * vout->frame_count);
+ else
+ expiry_time = ns_to_ktime(vb->ts);
+
+ now = hrtimer_cb_get_time(&vout->timer);
+ if (ktime_after(now, expiry_time)) {
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "warning: timer timeout already expired.\n");
+ expiry_time = now;
+ }
+
+ hrtimer_start(&vout->timer, expiry_time, HRTIMER_MODE_ABS);
+
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev, "timer handler next "
+ "schedule: %lldnsecs\n", ktime_to_ns(expiry_time));
+}
+
+static int show_buf(struct mxc_vout_output *vout, int idx,
+ struct ipu_pos *ipos)
+{
+ struct fb_info *fbi = vout->fbi;
+ struct fb_var_screeninfo var;
+ int ret;
+ u32 fb_base = 0;
+
+ memcpy(&var, &fbi->var, sizeof(var));
+
+ if (vout->linear_bypass_pp || vout->tiled_bypass_pp) {
+ /*
+ * crack fb base
+ * NOTE: should not do other fb operation during v4l2
+ */
+ console_lock();
+ fb_base = fbi->fix.smem_start;
+ fbi->fix.smem_start = vout->task.output.paddr;
+ fbi->var.yoffset = ipos->y + 1;
+ var.xoffset = ipos->x;
+ var.yoffset = ipos->y;
+ var.vmode |= FB_VMODE_YWRAP;
+ ret = fb_pan_display(fbi, &var);
+ fbi->fix.smem_start = fb_base;
+ console_unlock();
+ } else {
+ console_lock();
+ var.yoffset = idx * fbi->var.yres;
+ var.vmode &= ~FB_VMODE_YWRAP;
+ ret = fb_pan_display(fbi, &var);
+ console_unlock();
+ }
+
+ return ret;
+}
+
+static void disp_work_func(struct work_struct *work)
+{
+ struct mxc_vout_output *vout =
+ container_of(work, struct mxc_vout_output, disp_work);
+ struct videobuf_queue *q = &vout->vbq;
+ struct videobuf_buffer *vb, *vb_next = NULL;
+ unsigned long flags = 0;
+ struct ipu_pos ipos;
+ int ret = 0;
+ u32 in_fmt = 0, in_width = 0, in_height = 0;
+ u32 vdi_cnt = 0;
+ u32 vdi_frame;
+ u32 index = 0;
+ u32 ocrop_h = 0;
+ u32 o_height = 0;
+ u32 tiled_interlaced = 0;
+ bool tiled_fmt = false;
+
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev, "disp work begin one frame\n");
+
+ spin_lock_irqsave(q->irqlock, flags);
+
+ if (list_empty(&vout->active_list)) {
+ v4l2_warn(vout->vfd->v4l2_dev,
+ "no entry in active_list, should not be here\n");
+ spin_unlock_irqrestore(q->irqlock, flags);
+ return;
+ }
+
+ vb = list_first_entry(&vout->active_list,
+ struct videobuf_buffer, queue);
+ ret = set_field_fmt(vout, vb->field);
+ if (ret < 0) {
+ spin_unlock_irqrestore(q->irqlock, flags);
+ return;
+ }
+ if (deinterlace_3_field(vout)) {
+ if (list_is_singular(&vout->active_list)) {
+ if (list_empty(&vout->queue_list)) {
+ vout->timer_stop = true;
+ spin_unlock_irqrestore(q->irqlock, flags);
+ v4l2_warn(vout->vfd->v4l2_dev,
+ "no enough entry for 3 fields "
+ "deinterlacer\n");
+ return;
+ }
+
+ /*
+ * We need to use the next vb even if it is
+ * not on the active list.
+ */
+ vb_next = list_first_entry(&vout->queue_list,
+ struct videobuf_buffer, queue);
+ } else
+ vb_next = list_first_entry(vout->active_list.next,
+ struct videobuf_buffer, queue);
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "cur field_fmt:%d, next field_fmt:%d.\n",
+ vb->field, vb_next->field);
+ /* repeat the last field during field format changing */
+ if ((vb->field != vb_next->field) &&
+ (vb_next->field != V4L2_FIELD_NONE))
+ vb_next = vb;
+ }
+
+ spin_unlock_irqrestore(q->irqlock, flags);
+
+vdi_frame_rate_double:
+ mutex_lock(&vout->task_lock);
+
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "v4l2 frame_cnt:%ld, vb_field:%d, fmt:%d\n",
+ vout->frame_count, vb->field,
+ vout->task.input.deinterlace.field_fmt);
+ if (vb->memory == V4L2_MEMORY_USERPTR)
+ vout->task.input.paddr = vb->baddr;
+ else
+ vout->task.input.paddr = videobuf_to_dma_contig(vb);
+
+ if (vout->task.input.deinterlace.field_fmt & IPU_DEINTERLACE_RATE_EN)
+ index = vout->vdi_frame_cnt % FB_BUFS;
+ else
+ index = vout->frame_count % FB_BUFS;
+ if (vout->linear_bypass_pp) {
+ vout->task.output.paddr = vout->task.input.paddr;
+ ipos.x = vout->task.input.crop.pos.x;
+ ipos.y = vout->task.input.crop.pos.y;
+ } else {
+ if (deinterlace_3_field(vout)) {
+ if (vb->memory == V4L2_MEMORY_USERPTR)
+ vout->task.input.paddr_n = vb_next->baddr;
+ else
+ vout->task.input.paddr_n =
+ videobuf_to_dma_contig(vb_next);
+ }
+ vout->task.output.paddr = vout->disp_bufs[index];
+ if (vout->vdoa_1080p) {
+ o_height = vout->task.output.height;
+ ocrop_h = vout->task.output.crop.h;
+ vout->task.output.height = FRAME_HEIGHT_1080P;
+ vout->task.output.crop.h = FRAME_HEIGHT_1080P;
+ }
+ tiled_fmt =
+ (IPU_PIX_FMT_TILED_NV12 == vout->task.input.format) ||
+ (IPU_PIX_FMT_TILED_NV12F == vout->task.input.format);
+ if (vout->tiled_bypass_pp) {
+ ipos.x = vout->task.input.crop.pos.x;
+ ipos.y = vout->task.input.crop.pos.y;
+ } else if (tiled_fmt) {
+ vout->vdoa_task.input.paddr = vout->task.input.paddr;
+ if (deinterlace_3_field(vout))
+ vout->vdoa_task.input.paddr_n =
+ vout->task.input.paddr_n;
+ vout->vdoa_task.output.paddr = vout->vdoa_work.paddr;
+ ret = ipu_queue_task(&vout->vdoa_task);
+ if (ret < 0) {
+ mutex_unlock(&vout->task_lock);
+ goto err;
+ }
+ vout->task.input.paddr = vout->vdoa_task.output.paddr;
+ in_fmt = vout->task.input.format;
+ in_width = vout->task.input.width;
+ in_height = vout->task.input.height;
+ vout->task.input.format = vout->vdoa_task.output.format;
+ vout->task.input.width = vout->vdoa_task.output.width;
+ vout->task.input.height = vout->vdoa_task.output.height;
+ if (vout->task.input.deinterlace.enable) {
+ tiled_interlaced = 1;
+ vout->task.input.deinterlace.enable = 0;
+ }
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "tiled queue task\n");
+ }
+ ret = ipu_queue_task(&vout->task);
+ if ((!vout->tiled_bypass_pp) && tiled_fmt) {
+ vout->task.input.format = in_fmt;
+ vout->task.input.width = in_width;
+ vout->task.input.height = in_height;
+ }
+ if (tiled_interlaced)
+ vout->task.input.deinterlace.enable = 1;
+ if (ret < 0) {
+ mutex_unlock(&vout->task_lock);
+ goto err;
+ }
+ if (vout->vdoa_1080p) {
+ vout->task.output.crop.h = ocrop_h;
+ vout->task.output.height = o_height;
+ }
+ }
+
+ mutex_unlock(&vout->task_lock);
+
+ ret = show_buf(vout, index, &ipos);
+ if (ret < 0)
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "show buf with ret %d\n", ret);
+
+ if (vout->task.input.deinterlace.field_fmt & IPU_DEINTERLACE_RATE_EN) {
+ vdi_frame = vout->task.input.deinterlace.field_fmt
+ & IPU_DEINTERLACE_RATE_FRAME1;
+ if (vdi_frame)
+ vout->task.input.deinterlace.field_fmt &=
+ ~IPU_DEINTERLACE_RATE_FRAME1;
+ else
+ vout->task.input.deinterlace.field_fmt |=
+ IPU_DEINTERLACE_RATE_FRAME1;
+ vout->vdi_frame_cnt++;
+ vdi_cnt++;
+ if (vdi_cnt < IPU_DEINTERLACE_MAX_FRAME)
+ goto vdi_frame_rate_double;
+ }
+ spin_lock_irqsave(q->irqlock, flags);
+
+ list_del(&vb->queue);
+
+ /*
+ * The videobuf before the last one has been shown. Set
+ * VIDEOBUF_DONE state here to avoid tearing issue in ic bypass
+ * case, which makes sure a buffer being shown will not be
+ * dequeued to be overwritten. It also brings side-effect that
+ * the last 2 buffers can not be dequeued correctly, apps need
+ * to take care of it.
+ */
+ if (vout->pre2_vb) {
+ vout->pre2_vb->state = VIDEOBUF_DONE;
+ wake_up_interruptible(&vout->pre2_vb->done);
+ vout->pre2_vb = NULL;
+ }
+
+ if (vout->linear_bypass_pp) {
+ vout->pre2_vb = vout->pre1_vb;
+ vout->pre1_vb = vb;
+ } else {
+ if (vout->pre1_vb) {
+ vout->pre1_vb->state = VIDEOBUF_DONE;
+ wake_up_interruptible(&vout->pre1_vb->done);
+ vout->pre1_vb = NULL;
+ }
+ vb->state = VIDEOBUF_DONE;
+ wake_up_interruptible(&vb->done);
+ }
+
+ vout->frame_count++;
+
+ /* pick next queue buf to setup timer */
+ if (list_empty(&vout->queue_list))
+ vout->timer_stop = true;
+ else {
+ vb = list_first_entry(&vout->queue_list,
+ struct videobuf_buffer, queue);
+ setup_buf_timer(vout, vb);
+ }
+
+ spin_unlock_irqrestore(q->irqlock, flags);
+
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev, "disp work finish one frame\n");
+
+ return;
+err:
+ v4l2_err(vout->vfd->v4l2_dev, "display work fail ret = %d\n", ret);
+ vout->timer_stop = true;
+ vb->state = VIDEOBUF_ERROR;
+ return;
+}
+
+static enum hrtimer_restart mxc_vout_timer_handler(struct hrtimer *timer)
+{
+ struct mxc_vout_output *vout = container_of(timer,
+ struct mxc_vout_output,
+ timer);
+ struct videobuf_queue *q = &vout->vbq;
+ struct videobuf_buffer *vb;
+ unsigned long flags = 0;
+
+ spin_lock_irqsave(q->irqlock, flags);
+
+ /*
+ * put first queued entry into active, if previous entry did not
+ * finish, setup current entry's timer again.
+ */
+ if (list_empty(&vout->queue_list)) {
+ spin_unlock_irqrestore(q->irqlock, flags);
+ return HRTIMER_NORESTART;
+ }
+
+ /* move videobuf from queued list to active list */
+ vb = list_first_entry(&vout->queue_list,
+ struct videobuf_buffer, queue);
+ list_del(&vb->queue);
+ list_add_tail(&vb->queue, &vout->active_list);
+
+ if (queue_work(vout->v4l_wq, &vout->disp_work) == 0) {
+ v4l2_warn(vout->vfd->v4l2_dev,
+ "disp work was in queue already, queue buf again next time\n");
+ list_del(&vb->queue);
+ list_add(&vb->queue, &vout->queue_list);
+ spin_unlock_irqrestore(q->irqlock, flags);
+ return HRTIMER_NORESTART;
+ }
+
+ vb->state = VIDEOBUF_ACTIVE;
+
+ spin_unlock_irqrestore(q->irqlock, flags);
+
+ return HRTIMER_NORESTART;
+}
+
+/* Video buffer call backs */
+
+/*
+ * Buffer setup function is called by videobuf layer when REQBUF ioctl is
+ * called. This is used to setup buffers and return size and count of
+ * buffers allocated. After the call to this buffer, videobuf layer will
+ * setup buffer queue depending on the size and count of buffers
+ */
+static int mxc_vout_buffer_setup(struct videobuf_queue *q, unsigned int *count,
+ unsigned int *size)
+{
+ struct mxc_vout_output *vout = q->priv_data;
+ unsigned int frame_size;
+
+ if (!vout)
+ return -EINVAL;
+
+ if (V4L2_BUF_TYPE_VIDEO_OUTPUT != q->type)
+ return -EINVAL;
+
+ frame_size = get_frame_size(vout);
+ *size = PAGE_ALIGN(frame_size);
+
+ return 0;
+}
+
+/*
+ * This function will be called when VIDIOC_QBUF ioctl is called.
+ * It prepare buffers before give out for the display. This function
+ * converts user space virtual address into physical address if userptr memory
+ * exchange mechanism is used.
+ */
+static int mxc_vout_buffer_prepare(struct videobuf_queue *q,
+ struct videobuf_buffer *vb,
+ enum v4l2_field field)
+{
+ vb->state = VIDEOBUF_PREPARED;
+ return 0;
+}
+
+/*
+ * Buffer queue function will be called from the videobuf layer when _QBUF
+ * ioctl is called. It is used to enqueue buffer, which is ready to be
+ * displayed.
+ * This function is protected by q->irqlock.
+ */
+static void mxc_vout_buffer_queue(struct videobuf_queue *q,
+ struct videobuf_buffer *vb)
+{
+ struct mxc_vout_output *vout = q->priv_data;
+ struct videobuf_buffer *active_vb;
+
+ list_add_tail(&vb->queue, &vout->queue_list);
+ vb->state = VIDEOBUF_QUEUED;
+
+ if (vout->timer_stop) {
+ if (deinterlace_3_field(vout) &&
+ !list_empty(&vout->active_list)) {
+ active_vb = list_first_entry(&vout->active_list,
+ struct videobuf_buffer, queue);
+ setup_buf_timer(vout, active_vb);
+ } else {
+ setup_buf_timer(vout, vb);
+ }
+ vout->timer_stop = false;
+ }
+}
+
+/*
+ * Buffer release function is called from videobuf layer to release buffer
+ * which are already allocated
+ */
+static void mxc_vout_buffer_release(struct videobuf_queue *q,
+ struct videobuf_buffer *vb)
+{
+ vb->state = VIDEOBUF_NEEDS_INIT;
+}
+
+static int mxc_vout_mmap(struct file *file, struct vm_area_struct *vma)
+{
+ int ret;
+ struct mxc_vout_output *vout = file->private_data;
+
+ if (!vout)
+ return -ENODEV;
+
+ ret = videobuf_mmap_mapper(&vout->vbq, vma);
+ if (ret < 0)
+ v4l2_err(vout->vfd->v4l2_dev,
+ "offset invalid [offset=0x%lx]\n",
+ (vma->vm_pgoff << PAGE_SHIFT));
+
+ return ret;
+}
+
+static int mxc_vout_release(struct file *file)
+{
+ unsigned int ret = 0;
+ struct videobuf_queue *q;
+ struct mxc_vout_output *vout = file->private_data;
+
+ if (!vout)
+ return 0;
+
+ mutex_lock(&vout->accs_lock);
+ if (--vout->open_cnt == 0) {
+ q = &vout->vbq;
+ if (q->streaming)
+ mxc_vidioc_streamoff(file, vout, vout->type);
+ else {
+ release_disp_output(vout);
+ videobuf_queue_cancel(q);
+ }
+ destroy_workqueue(vout->v4l_wq);
+ ret = videobuf_mmap_free(q);
+ }
+
+ mutex_unlock(&vout->accs_lock);
+ return ret;
+}
+
+static long mxc_vout_ioctl(struct file *file,
+ unsigned int cmd, unsigned long arg)
+{
+ struct mxc_vout_output *vout = file->private_data;
+ struct v4l2_crop crop;
+ int ret;
+
+ switch (cmd) {
+ case VIDIOC_S_INPUT_CROP:
+ if (copy_from_user(&crop, (void __user *)arg, sizeof(struct v4l2_crop)))
+ return -EFAULT;
+ ret = mxc_vidioc_s_input_crop(vout, &crop);
+ break;
+ case VIDIOC_G_INPUT_CROP:
+ mxc_vidioc_g_input_crop(vout, &crop);
+ ret = copy_from_user((void __user *)arg, &crop, sizeof(struct v4l2_crop));
+ break;
+ default:
+ ret = video_ioctl2(file, cmd, arg);
+ }
+ return ret;
+}
+
+static int mxc_vout_open(struct file *file)
+{
+ struct mxc_vout_output *vout = NULL;
+ int ret = 0;
+
+ vout = video_drvdata(file);
+
+ if (vout == NULL)
+ return -ENODEV;
+
+ mutex_lock(&vout->accs_lock);
+ if (vout->open_cnt++ == 0) {
+ vout->ctrl_rotate = 0;
+ vout->ctrl_vflip = 0;
+ vout->ctrl_hflip = 0;
+ ret = update_setting_from_fbi(vout, vout->fbi);
+ if (ret < 0)
+ goto err;
+
+ vout->v4l_wq = create_singlethread_workqueue("v4l2q");
+ if (!vout->v4l_wq) {
+ v4l2_err(vout->vfd->v4l2_dev,
+ "Could not create work queue\n");
+ ret = -ENOMEM;
+ goto err;
+ }
+
+ INIT_WORK(&vout->disp_work, disp_work_func);
+
+ INIT_LIST_HEAD(&vout->queue_list);
+ INIT_LIST_HEAD(&vout->active_list);
+
+ vout->fmt_init = false;
+ vout->frame_count = 0;
+ vout->vdi_frame_cnt = 0;
+
+ vout->win_pos.x = 0;
+ vout->win_pos.y = 0;
+ vout->release = true;
+ }
+
+ file->private_data = vout;
+
+err:
+ mutex_unlock(&vout->accs_lock);
+ return ret;
+}
+
+/*
+ * V4L2 ioctls
+ */
+static int mxc_vidioc_querycap(struct file *file, void *fh,
+ struct v4l2_capability *cap)
+{
+ struct mxc_vout_output *vout = fh;
+
+ strlcpy(cap->driver, VOUT_NAME, sizeof(cap->driver));
+ strlcpy(cap->card, vout->vfd->name, sizeof(cap->card));
+ cap->bus_info[0] = '\0';
+ cap->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_OUTPUT;
+ cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
+
+ return 0;
+}
+
+static int mxc_vidioc_enum_fmt_vid_out(struct file *file, void *fh,
+ struct v4l2_fmtdesc *fmt)
+{
+ if (fmt->index >= NUM_MXC_VOUT_FORMATS)
+ return -EINVAL;
+
+ strlcpy(fmt->description, mxc_formats[fmt->index].description,
+ sizeof(fmt->description));
+ fmt->pixelformat = mxc_formats[fmt->index].pixelformat;
+
+ return 0;
+}
+
+static int mxc_vidioc_g_fmt_vid_out(struct file *file, void *fh,
+ struct v4l2_format *f)
+{
+ struct mxc_vout_output *vout = fh;
+
+ f->fmt.pix.width = vout->task.input.width;
+ f->fmt.pix.height = vout->task.input.height;
+ f->fmt.pix.pixelformat = vout->task.input.format;
+ f->fmt.pix.sizeimage = get_frame_size(vout);
+
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "frame_size:0x%x, pix_fmt:0x%x\n",
+ f->fmt.pix.sizeimage,
+ vout->task.input.format);
+
+ return 0;
+}
+
+static inline int ipu_try_task(struct mxc_vout_output *vout)
+{
+ int ret;
+ struct ipu_task *task = &vout->task;
+
+again:
+ ret = ipu_check_task(task);
+ if (ret != IPU_CHECK_OK) {
+ if (ret > IPU_CHECK_ERR_MIN) {
+ if (ret == IPU_CHECK_ERR_SPLIT_INPUTW_OVER ||
+ ret == IPU_CHECK_ERR_W_DOWNSIZE_OVER) {
+ task->input.crop.w -= 8;
+ goto again;
+ }
+ if (ret == IPU_CHECK_ERR_SPLIT_INPUTH_OVER ||
+ ret == IPU_CHECK_ERR_H_DOWNSIZE_OVER) {
+ task->input.crop.h -= 8;
+ goto again;
+ }
+ if (ret == IPU_CHECK_ERR_SPLIT_OUTPUTW_OVER) {
+ if (vout->disp_support_windows) {
+ task->output.width -= 8;
+ task->output.crop.w =
+ task->output.width;
+ } else
+ task->output.crop.w -= 8;
+ goto again;
+ }
+ if (ret == IPU_CHECK_ERR_SPLIT_OUTPUTH_OVER) {
+ if (vout->disp_support_windows) {
+ task->output.height -= 8;
+ task->output.crop.h =
+ task->output.height;
+ } else
+ task->output.crop.h -= 8;
+ goto again;
+ }
+ ret = -EINVAL;
+ }
+ } else
+ ret = 0;
+
+ return ret;
+}
+
+static inline int vdoaipu_try_task(struct mxc_vout_output *vout)
+{
+ int ret;
+ int is_1080p_stream;
+ int in_width, in_height;
+ size_t size;
+ struct ipu_task *ipu_task = &vout->task;
+ struct ipu_crop *icrop = &ipu_task->input.crop;
+ struct ipu_task *vdoa_task = &vout->vdoa_task;
+ u32 deinterlace = 0;
+ u32 in_fmt;
+
+ if (vout->task.input.deinterlace.enable)
+ deinterlace = 1;
+
+ memset(vdoa_task, 0, sizeof(*vdoa_task));
+ vdoa_task->output.format = IPU_PIX_FMT_NV12;
+ memcpy(&vdoa_task->input, &ipu_task->input,
+ sizeof(ipu_task->input));
+ if ((icrop->w % IPU_PIX_FMT_TILED_NV12_MBALIGN) ||
+ (icrop->h % IPU_PIX_FMT_TILED_NV12_MBALIGN)) {
+ vdoa_task->input.crop.w =
+ ALIGN(icrop->w, IPU_PIX_FMT_TILED_NV12_MBALIGN);
+ vdoa_task->input.crop.h =
+ ALIGN(icrop->h, IPU_PIX_FMT_TILED_NV12_MBALIGN);
+ }
+ vdoa_task->output.width = vdoa_task->input.crop.w;
+ vdoa_task->output.height = vdoa_task->input.crop.h;
+ vdoa_task->output.crop.w = vdoa_task->input.crop.w;
+ vdoa_task->output.crop.h = vdoa_task->input.crop.h;
+
+ size = PAGE_ALIGN(vdoa_task->input.crop.w *
+ vdoa_task->input.crop.h *
+ fmt_to_bpp(vdoa_task->output.format)/8);
+ if (size > vout->vdoa_work.size) {
+ if (vout->vdoa_work.vaddr)
+ free_dma_buf(vout, &vout->vdoa_work);
+ vout->vdoa_work.size = size;
+ ret = alloc_dma_buf(vout, &vout->vdoa_work);
+ if (ret < 0)
+ return ret;
+ }
+ ret = ipu_check_task(vdoa_task);
+ if (ret != IPU_CHECK_OK)
+ return -EINVAL;
+
+ is_1080p_stream = CHECK_TILED_1080P_STREAM(vout);
+ if (is_1080p_stream)
+ ipu_task->input.crop.h = VALID_HEIGHT_1080P;
+ in_fmt = ipu_task->input.format;
+ in_width = ipu_task->input.width;
+ in_height = ipu_task->input.height;
+ ipu_task->input.format = vdoa_task->output.format;
+ ipu_task->input.height = vdoa_task->output.height;
+ ipu_task->input.width = vdoa_task->output.width;
+ if (deinterlace)
+ ipu_task->input.deinterlace.enable = 0;
+ ret = ipu_try_task(vout);
+ if (deinterlace)
+ ipu_task->input.deinterlace.enable = 1;
+ ipu_task->input.format = in_fmt;
+ ipu_task->input.width = in_width;
+ ipu_task->input.height = in_height;
+
+ return ret;
+}
+
+static int mxc_vout_try_task(struct mxc_vout_output *vout)
+{
+ int ret = 0;
+ struct ipu_output *output = &vout->task.output;
+ struct ipu_input *input = &vout->task.input;
+ struct ipu_crop *crop = &input->crop;
+ u32 o_height = 0;
+ u32 ocrop_h = 0;
+ bool tiled_fmt = false;
+ bool tiled_need_pp = false;
+
+ vout->vdoa_1080p = CHECK_TILED_1080P_DISPLAY(vout);
+ if (vout->vdoa_1080p) {
+ input->crop.h = FRAME_HEIGHT_1080P;
+ o_height = output->height;
+ ocrop_h = output->crop.h;
+ output->height = FRAME_HEIGHT_1080P;
+ output->crop.h = FRAME_HEIGHT_1080P;
+ }
+
+ if ((IPU_PIX_FMT_TILED_NV12 == input->format) ||
+ (IPU_PIX_FMT_TILED_NV12F == input->format)) {
+ if ((input->width % IPU_PIX_FMT_TILED_NV12_MBALIGN) ||
+ (input->height % IPU_PIX_FMT_TILED_NV12_MBALIGN) ||
+ (crop->pos.x % IPU_PIX_FMT_TILED_NV12_MBALIGN) ||
+ (crop->pos.y % IPU_PIX_FMT_TILED_NV12_MBALIGN)) {
+ v4l2_err(vout->vfd->v4l2_dev,
+ "ERR: tiled fmt needs 16 pixel align.\n");
+ return -EINVAL;
+ }
+ if ((crop->w % IPU_PIX_FMT_TILED_NV12_MBALIGN) ||
+ (crop->h % IPU_PIX_FMT_TILED_NV12_MBALIGN))
+ tiled_need_pp = true;
+ } else {
+ crop->w -= crop->w % 8;
+ crop->h -= crop->h % 8;
+ }
+ /* assume task.output already set by S_CROP */
+ vout->linear_bypass_pp = is_pp_bypass(vout);
+ if (vout->linear_bypass_pp) {
+ v4l2_info(vout->vfd->v4l2_dev, "Bypass IC.\n");
+ output->format = input->format;
+ } else {
+ /* if need CSC, choose IPU-DP or IPU_IC do it */
+ if (vout->disp_support_csc) {
+ if (colorspaceofpixel(input->format) == YUV_CS)
+ output->format = IPU_PIX_FMT_UYVY;
+ else
+ output->format = IPU_PIX_FMT_RGB565;
+ } else {
+ if (colorspaceofpixel(vout->disp_fmt) == YUV_CS)
+ output->format = IPU_PIX_FMT_UYVY;
+ else
+ output->format = IPU_PIX_FMT_RGB565;
+ }
+
+ vout->tiled_bypass_pp = false;
+ if ((IPU_PIX_FMT_TILED_NV12 == input->format) ||
+ (IPU_PIX_FMT_TILED_NV12F == input->format)) {
+ /* check resize/rotate/flip, or csc task */
+ if (!(tiled_need_pp ||
+ (IPU_ROTATE_NONE != output->rotate) ||
+ (input->crop.w != output->crop.w) ||
+ (input->crop.h != output->crop.h) ||
+ (!vout->disp_support_csc &&
+ (colorspaceofpixel(vout->disp_fmt) == RGB_CS)))
+ ) {
+ /* IC bypass */
+ output->format = IPU_PIX_FMT_NV12;
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "tiled bypass pp\n");
+ vout->tiled_bypass_pp = true;
+ }
+ tiled_fmt = true;
+ }
+
+ if ((!vout->tiled_bypass_pp) && tiled_fmt)
+ ret = vdoaipu_try_task(vout);
+ else
+ ret = ipu_try_task(vout);
+ }
+
+ if (vout->vdoa_1080p) {
+ output->height = o_height;
+ output->crop.h = ocrop_h;
+ }
+
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "icrop.w:%u, icrop.h:%u, iw:%u, ih:%u,"
+ "ocrop.w:%u, ocrop.h:%u, ow:%u, oh:%u\n",
+ input->crop.w, input->crop.h,
+ input->width, input->height,
+ output->crop.w, output->crop.h,
+ output->width, output->height);
+ return ret;
+}
+
+static int mxc_vout_try_format(struct mxc_vout_output *vout,
+ struct v4l2_format *f)
+{
+ int ret = 0;
+
+ if ((f->fmt.pix.field != V4L2_FIELD_NONE) &&
+ (IPU_PIX_FMT_TILED_NV12 == vout->task.input.format)) {
+ v4l2_err(vout->vfd->v4l2_dev,
+ "progressive tiled fmt should used V4L2_FIELD_NONE!\n");
+ return -EINVAL;
+ }
+
+ if (vout->input_crop == false) {
+ vout->task.input.crop.pos.x = 0;
+ vout->task.input.crop.pos.y = 0;
+ vout->task.input.crop.w = f->fmt.pix.width;
+ vout->task.input.crop.h = f->fmt.pix.height;
+ }
+
+ vout->task.input.width = f->fmt.pix.width;
+ vout->task.input.height = f->fmt.pix.height;
+ vout->task.input.format = f->fmt.pix.pixelformat;
+
+ ret = set_field_fmt(vout, f->fmt.pix.field);
+ if (ret < 0)
+ return ret;
+
+ ret = mxc_vout_try_task(vout);
+ if (!ret) {
+ f->fmt.pix.width = vout->task.input.crop.w;
+ f->fmt.pix.height = vout->task.input.crop.h;
+ }
+
+ return ret;
+}
+
+static bool mxc_vout_need_fb_reconfig(struct mxc_vout_output *vout,
+ struct mxc_vout_output *pre_vout)
+{
+ if (!vout->vbq.streaming)
+ return false;
+
+ if (vout->tiled_bypass_pp)
+ return true;
+
+ if (vout->linear_bypass_pp != pre_vout->linear_bypass_pp)
+ return true;
+
+ /* cropped output resolution or format are changed */
+ if (vout->task.output.format != pre_vout->task.output.format ||
+ vout->task.output.crop.w != pre_vout->task.output.crop.w ||
+ vout->task.output.crop.h != pre_vout->task.output.crop.h)
+ return true;
+
+ /* overlay: window position or resolution are changed */
+ if (vout->disp_support_windows &&
+ (vout->win_pos.x != pre_vout->win_pos.x ||
+ vout->win_pos.y != pre_vout->win_pos.y ||
+ vout->task.output.width != pre_vout->task.output.width ||
+ vout->task.output.height != pre_vout->task.output.height))
+ return true;
+
+ /* background: cropped position is changed */
+ if (!vout->disp_support_windows &&
+ (vout->task.output.crop.pos.x !=
+ pre_vout->task.output.crop.pos.x ||
+ vout->task.output.crop.pos.y !=
+ pre_vout->task.output.crop.pos.y))
+ return true;
+
+ return false;
+}
+
+static int mxc_vidioc_s_fmt_vid_out(struct file *file, void *fh,
+ struct v4l2_format *f)
+{
+ struct mxc_vout_output *vout = fh;
+ int ret = 0;
+
+ if (vout->vbq.streaming)
+ return -EBUSY;
+
+ mutex_lock(&vout->task_lock);
+ ret = mxc_vout_try_format(vout, f);
+ if (ret >= 0)
+ vout->fmt_init = true;
+ mutex_unlock(&vout->task_lock);
+
+ return ret;
+}
+
+static int mxc_vidioc_g_selection(struct file *file, void *fh,
+ struct v4l2_selection *s)
+{
+ struct mxc_vout_output *vout = fh;
+
+ if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
+ return -EINVAL;
+
+ switch (s->target) {
+ case V4L2_SEL_TGT_COMPOSE_DEFAULT:
+ case V4L2_SEL_TGT_COMPOSE_BOUNDS:
+ s->r = vout->crop_bounds;
+ break;
+ default:
+ if (vout->disp_support_windows) {
+ s->r.left = vout->win_pos.x;
+ s->r.top = vout->win_pos.y;
+ s->r.width = vout->task.output.width;
+ s->r.height = vout->task.output.height;
+ } else {
+ if (vout->task.output.crop.w &&
+ vout->task.output.crop.h) {
+ s->r.left = vout->task.output.crop.pos.x;
+ s->r.top = vout->task.output.crop.pos.y;
+ s->r.width = vout->task.output.crop.w;
+ s->r.height = vout->task.output.crop.h;
+ } else {
+ s->r.left = 0;
+ s->r.top = 0;
+ s->r.width = vout->task.output.width;
+ s->r.height = vout->task.output.height;
+ }
+ }
+ break;
+ }
+
+ return 0;
+}
+
+static int mxc_vidioc_s_selection(struct file *file, void *fh,
+ struct v4l2_selection *s)
+{
+ struct mxc_vout_output *vout = fh, *pre_vout;
+ struct v4l2_rect *b = &vout->crop_bounds;
+ struct v4l2_selection fix_up_selection;
+ int ret = 0;
+
+ memcpy(&fix_up_selection, s, sizeof(*s));
+
+ if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
+ return -EINVAL;
+
+ if (s->r.width < 0 || s->r.height < 0)
+ return -EINVAL;
+
+ if (s->r.width == 0)
+ fix_up_selection.r.width = b->width - b->left;
+ if (s->r.height == 0)
+ fix_up_selection.r.height = b->height - b->top;
+
+ if (s->r.top < b->top)
+ fix_up_selection.r.top = b->top;
+ if (s->r.top >= b->top + b->height)
+ fix_up_selection.r.top = b->top + b->height - 1;
+ if (s->r.height > b->top - s->r.top + b->height)
+ fix_up_selection.r.height =
+ b->top - fix_up_selection.r.top + b->height;
+
+ if (s->r.left < b->left)
+ fix_up_selection.r.left = b->left;
+ if (s->r.left >= b->left + b->width)
+ fix_up_selection.r.left = b->left + b->width - 1;
+ if (s->r.width > b->left - s->r.left + b->width)
+ fix_up_selection.r.width =
+ b->left - fix_up_selection.r.left + b->width;
+
+ /* stride line limitation */
+ fix_up_selection.r.height -= fix_up_selection.r.height % 8;
+ fix_up_selection.r.width -= fix_up_selection.r.width % 8;
+ if ((fix_up_selection.r.width <= 0) ||
+ (fix_up_selection.r.height <= 0) ||
+ ((fix_up_selection.r.left + fix_up_selection.r.width) >
+ (b->left + b->width)) ||
+ ((fix_up_selection.r.top + fix_up_selection.r.height) >
+ (b->top + b->height))) {
+ v4l2_err(vout->vfd->v4l2_dev, "s_selection err: %d, %d, %d, %d",
+ fix_up_selection.r.left, fix_up_selection.r.top,
+ fix_up_selection.r.width, fix_up_selection.r.height);
+ return -EINVAL;
+ }
+
+ /* the same setting, return */
+ if (vout->disp_support_windows) {
+ if ((vout->win_pos.x == fix_up_selection.r.left) &&
+ (vout->win_pos.y == fix_up_selection.r.top) &&
+ (vout->task.output.crop.w == fix_up_selection.r.width) &&
+ (vout->task.output.crop.h == fix_up_selection.r.height))
+ return 0;
+ } else {
+ if ((vout->task.output.crop.pos.x == fix_up_selection.r.left) &&
+ (vout->task.output.crop.pos.y == fix_up_selection.r.top) &&
+ (vout->task.output.crop.w == fix_up_selection.r.width) &&
+ (vout->task.output.crop.h == fix_up_selection.r.height))
+ return 0;
+ }
+
+ pre_vout = vmalloc(sizeof(*pre_vout));
+ if (!pre_vout)
+ return -ENOMEM;
+
+ /* wait current work finish */
+ if (vout->vbq.streaming)
+ flush_workqueue(vout->v4l_wq);
+
+ mutex_lock(&vout->task_lock);
+
+ memcpy(pre_vout, vout, sizeof(*vout));
+
+ if (vout->disp_support_windows) {
+ vout->task.output.crop.pos.x = 0;
+ vout->task.output.crop.pos.y = 0;
+ vout->win_pos.x = fix_up_selection.r.left;
+ vout->win_pos.y = fix_up_selection.r.top;
+ vout->task.output.width = fix_up_selection.r.width;
+ vout->task.output.height = fix_up_selection.r.height;
+ } else {
+ vout->task.output.crop.pos.x = fix_up_selection.r.left;
+ vout->task.output.crop.pos.y = fix_up_selection.r.top;
+ }
+
+ vout->task.output.crop.w = fix_up_selection.r.width;
+ vout->task.output.crop.h = fix_up_selection.r.height;
+
+ /*
+ * must S_CROP before S_FMT, for fist time S_CROP, will not check
+ * ipu task, it will check in S_FMT, after S_FMT, S_CROP should
+ * check ipu task too.
+ */
+ if (vout->fmt_init) {
+ memcpy(&vout->task.input.crop, &vout->in_rect,
+ sizeof(vout->in_rect));
+ ret = mxc_vout_try_task(vout);
+ if (ret < 0) {
+ v4l2_err(vout->vfd->v4l2_dev,
+ "vout check task failed\n");
+ memcpy(vout, pre_vout, sizeof(*vout));
+ goto done;
+ }
+
+ if (mxc_vout_need_fb_reconfig(vout, pre_vout)) {
+ ret = config_disp_output(vout);
+ if (ret < 0)
+ v4l2_err(vout->vfd->v4l2_dev,
+ "Config display output failed\n");
+ }
+ }
+
+done:
+ vfree(pre_vout);
+ mutex_unlock(&vout->task_lock);
+
+ return ret;
+}
+
+static int mxc_vidioc_queryctrl(struct file *file, void *fh,
+ struct v4l2_queryctrl *ctrl)
+{
+ int ret = 0;
+
+ switch (ctrl->id) {
+ case V4L2_CID_ROTATE:
+ ret = v4l2_ctrl_query_fill(ctrl, 0, 270, 90, 0);
+ break;
+ case V4L2_CID_VFLIP:
+ ret = v4l2_ctrl_query_fill(ctrl, 0, 1, 1, 0);
+ break;
+ case V4L2_CID_HFLIP:
+ ret = v4l2_ctrl_query_fill(ctrl, 0, 1, 1, 0);
+ break;
+ case V4L2_CID_MXC_MOTION:
+ ret = v4l2_ctrl_query_fill(ctrl, 0, 2, 1, 0);
+ break;
+ default:
+ ctrl->name[0] = '\0';
+ ret = -EINVAL;
+ }
+ return ret;
+}
+
+static int mxc_vidioc_g_ctrl(struct file *file, void *fh,
+ struct v4l2_control *ctrl)
+{
+ int ret = 0;
+ struct mxc_vout_output *vout = fh;
+
+ switch (ctrl->id) {
+ case V4L2_CID_ROTATE:
+ ctrl->value = vout->ctrl_rotate;
+ break;
+ case V4L2_CID_VFLIP:
+ ctrl->value = vout->ctrl_vflip;
+ break;
+ case V4L2_CID_HFLIP:
+ ctrl->value = vout->ctrl_hflip;
+ break;
+ case V4L2_CID_MXC_MOTION:
+ if (vout->task.input.deinterlace.enable)
+ ctrl->value = vout->task.input.deinterlace.motion;
+ else
+ ctrl->value = 0;
+ break;
+ default:
+ ret = -EINVAL;
+ }
+ return ret;
+}
+
+static void setup_task_rotation(struct mxc_vout_output *vout)
+{
+ if (vout->ctrl_rotate == 0) {
+ if (vout->ctrl_vflip && vout->ctrl_hflip)
+ vout->task.output.rotate = IPU_ROTATE_180;
+ else if (vout->ctrl_vflip)
+ vout->task.output.rotate = IPU_ROTATE_VERT_FLIP;
+ else if (vout->ctrl_hflip)
+ vout->task.output.rotate = IPU_ROTATE_HORIZ_FLIP;
+ else
+ vout->task.output.rotate = IPU_ROTATE_NONE;
+ } else if (vout->ctrl_rotate == 90) {
+ if (vout->ctrl_vflip && vout->ctrl_hflip)
+ vout->task.output.rotate = IPU_ROTATE_90_LEFT;
+ else if (vout->ctrl_vflip)
+ vout->task.output.rotate = IPU_ROTATE_90_RIGHT_VFLIP;
+ else if (vout->ctrl_hflip)
+ vout->task.output.rotate = IPU_ROTATE_90_RIGHT_HFLIP;
+ else
+ vout->task.output.rotate = IPU_ROTATE_90_RIGHT;
+ } else if (vout->ctrl_rotate == 180) {
+ if (vout->ctrl_vflip && vout->ctrl_hflip)
+ vout->task.output.rotate = IPU_ROTATE_NONE;
+ else if (vout->ctrl_vflip)
+ vout->task.output.rotate = IPU_ROTATE_HORIZ_FLIP;
+ else if (vout->ctrl_hflip)
+ vout->task.output.rotate = IPU_ROTATE_VERT_FLIP;
+ else
+ vout->task.output.rotate = IPU_ROTATE_180;
+ } else if (vout->ctrl_rotate == 270) {
+ if (vout->ctrl_vflip && vout->ctrl_hflip)
+ vout->task.output.rotate = IPU_ROTATE_90_RIGHT;
+ else if (vout->ctrl_vflip)
+ vout->task.output.rotate = IPU_ROTATE_90_RIGHT_HFLIP;
+ else if (vout->ctrl_hflip)
+ vout->task.output.rotate = IPU_ROTATE_90_RIGHT_VFLIP;
+ else
+ vout->task.output.rotate = IPU_ROTATE_90_LEFT;
+ }
+}
+
+static int mxc_vidioc_s_ctrl(struct file *file, void *fh,
+ struct v4l2_control *ctrl)
+{
+ int ret = 0;
+ struct mxc_vout_output *vout = fh, *pre_vout;
+
+ pre_vout = vmalloc(sizeof(*pre_vout));
+ if (!pre_vout)
+ return -ENOMEM;
+
+ /* wait current work finish */
+ if (vout->vbq.streaming)
+ flush_workqueue(vout->v4l_wq);
+
+ mutex_lock(&vout->task_lock);
+
+ memcpy(pre_vout, vout, sizeof(*vout));
+
+ switch (ctrl->id) {
+ case V4L2_CID_ROTATE:
+ {
+ vout->ctrl_rotate = (ctrl->value/90) * 90;
+ if (vout->ctrl_rotate > 270)
+ vout->ctrl_rotate = 270;
+ setup_task_rotation(vout);
+ break;
+ }
+ case V4L2_CID_VFLIP:
+ {
+ vout->ctrl_vflip = ctrl->value;
+ setup_task_rotation(vout);
+ break;
+ }
+ case V4L2_CID_HFLIP:
+ {
+ vout->ctrl_hflip = ctrl->value;
+ setup_task_rotation(vout);
+ break;
+ }
+ case V4L2_CID_MXC_MOTION:
+ {
+ vout->task.input.deinterlace.motion = ctrl->value;
+ break;
+ }
+ default:
+ ret = -EINVAL;
+ goto done;
+ }
+
+ if (vout->fmt_init) {
+ memcpy(&vout->task.input.crop, &vout->in_rect,
+ sizeof(vout->in_rect));
+ ret = mxc_vout_try_task(vout);
+ if (ret < 0) {
+ v4l2_err(vout->vfd->v4l2_dev,
+ "vout check task failed\n");
+ memcpy(vout, pre_vout, sizeof(*vout));
+ goto done;
+ }
+
+ if (mxc_vout_need_fb_reconfig(vout, pre_vout)) {
+ ret = config_disp_output(vout);
+ if (ret < 0)
+ v4l2_err(vout->vfd->v4l2_dev,
+ "Config display output failed\n");
+ }
+ }
+
+done:
+ vfree(pre_vout);
+ mutex_unlock(&vout->task_lock);
+
+ return ret;
+}
+
+static int mxc_vidioc_reqbufs(struct file *file, void *fh,
+ struct v4l2_requestbuffers *req)
+{
+ int ret = 0;
+ struct mxc_vout_output *vout = fh;
+ struct videobuf_queue *q = &vout->vbq;
+
+ if (req->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
+ return -EINVAL;
+
+ /* should not be here after streaming, videobuf_reqbufs will control */
+ mutex_lock(&vout->task_lock);
+
+ ret = videobuf_reqbufs(q, req);
+
+ mutex_unlock(&vout->task_lock);
+ return ret;
+}
+
+static int mxc_vidioc_querybuf(struct file *file, void *fh,
+ struct v4l2_buffer *b)
+{
+ int ret;
+ struct mxc_vout_output *vout = fh;
+
+ ret = videobuf_querybuf(&vout->vbq, b);
+ if (!ret) {
+ /* return physical address */
+ struct videobuf_buffer *vb = vout->vbq.bufs[b->index];
+ if (b->flags & V4L2_BUF_FLAG_MAPPED)
+ b->m.offset = videobuf_to_dma_contig(vb);
+ }
+
+ return ret;
+}
+
+static int mxc_vidioc_qbuf(struct file *file, void *fh,
+ struct v4l2_buffer *buffer)
+{
+ struct mxc_vout_output *vout = fh;
+
+ return videobuf_qbuf(&vout->vbq, buffer);
+}
+
+static int mxc_vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b)
+{
+ struct mxc_vout_output *vout = fh;
+
+ if (!vout->vbq.streaming)
+ return -EINVAL;
+
+ if (file->f_flags & O_NONBLOCK)
+ return videobuf_dqbuf(&vout->vbq, (struct v4l2_buffer *)b, 1);
+ else
+ return videobuf_dqbuf(&vout->vbq, (struct v4l2_buffer *)b, 0);
+}
+
+static int mxc_vidioc_s_input_crop(struct mxc_vout_output *vout,
+ const struct v4l2_crop *crop)
+{
+ int ret = 0;
+
+ if (crop->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
+ return -EINVAL;
+
+ if (crop->c.width < 0 || crop->c.height < 0)
+ return -EINVAL;
+
+ vout->task.input.crop.pos.x = crop->c.left;
+ vout->task.input.crop.pos.y = crop->c.top;
+ vout->task.input.crop.w = crop->c.width;
+ vout->task.input.crop.h = crop->c.height;
+
+ vout->input_crop = true;
+ memcpy(&vout->in_rect, &vout->task.input.crop, sizeof(vout->in_rect));
+
+ return ret;
+}
+
+static int mxc_vidioc_g_input_crop(struct mxc_vout_output *vout,
+ struct v4l2_crop *crop)
+{
+ int ret = 0;
+
+ crop->c.left = vout->task.input.crop.pos.x;
+ crop->c.top = vout->task.input.crop.pos.y;
+ crop->c.width = vout->task.input.crop.w;
+ crop->c.height = vout->task.input.crop.h;
+
+ return ret;
+}
+
+static int set_window_position(struct mxc_vout_output *vout,
+ struct mxcfb_pos *pos)
+{
+ struct fb_info *fbi = vout->fbi;
+ mm_segment_t old_fs;
+ int ret = 0;
+
+ if (vout->disp_support_windows) {
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+ ret = fbi->fbops->fb_ioctl(fbi, MXCFB_SET_OVERLAY_POS,
+ (unsigned long)pos);
+ set_fs(old_fs);
+ }
+
+ return ret;
+}
+
+static int config_disp_output(struct mxc_vout_output *vout)
+{
+ struct dma_mem *buf = NULL;
+ struct fb_info *fbi = vout->fbi;
+ struct fb_var_screeninfo var;
+ struct mxcfb_pos pos;
+ int i, fb_num, ret;
+ u32 fb_base;
+ u32 size;
+ u32 display_buf_size;
+ u32 *pixel = NULL;
+ u32 color;
+ int j;
+
+ memcpy(&var, &fbi->var, sizeof(var));
+ fb_base = fbi->fix.smem_start;
+
+ var.xres = vout->task.output.width;
+ var.yres = vout->task.output.height;
+ if (vout->linear_bypass_pp || vout->tiled_bypass_pp) {
+ fb_num = 1;
+ /* input crop */
+ if (vout->task.input.width > vout->task.output.width)
+ var.xres_virtual = vout->task.input.width;
+ else
+ var.xres_virtual = var.xres;
+ if (vout->task.input.height > vout->task.output.height)
+ var.yres_virtual = vout->task.input.height;
+ else
+ var.yres_virtual = var.yres;
+ var.rotate = vout->task.output.rotate;
+ var.vmode |= FB_VMODE_YWRAP;
+ } else {
+ fb_num = FB_BUFS;
+ var.xres_virtual = var.xres;
+ var.yres_virtual = fb_num * var.yres;
+ var.vmode &= ~FB_VMODE_YWRAP;
+ }
+ var.bits_per_pixel = fmt_to_bpp(vout->task.output.format);
+ var.nonstd = vout->task.output.format;
+
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "set display fb to %d %d\n",
+ var.xres, var.yres);
+
+ /*
+ * To setup the overlay fb from scratch without
+ * the last time overlay fb position or resolution's
+ * impact, we take the following steps:
+ * - blank fb
+ * - set fb position to the starting point
+ * - reconfigure fb
+ * - set fb position to a specific point
+ * - unblank fb
+ * This procedure applies to non-overlay fbs as well.
+ */
+ console_lock();
+ fbi->flags |= FBINFO_MISC_USEREVENT;
+ fb_blank(fbi, FB_BLANK_POWERDOWN);
+ fbi->flags &= ~FBINFO_MISC_USEREVENT;
+ console_unlock();
+
+ pos.x = 0;
+ pos.y = 0;
+ ret = set_window_position(vout, &pos);
+ if (ret < 0) {
+ v4l2_err(vout->vfd->v4l2_dev, "failed to set fb position "
+ "to starting point\n");
+ return ret;
+ }
+
+ /* Init display channel through fb API */
+ var.yoffset = 0;
+ var.activate |= FB_ACTIVATE_FORCE;
+ console_lock();
+ fbi->flags |= FBINFO_MISC_USEREVENT;
+ ret = fb_set_var(fbi, &var);
+ fbi->flags &= ~FBINFO_MISC_USEREVENT;
+ console_unlock();
+ if (ret < 0) {
+ v4l2_err(vout->vfd->v4l2_dev,
+ "ERR:%s fb_set_var ret:%d\n", __func__, ret);
+ return ret;
+ }
+
+ ret = set_window_position(vout, &vout->win_pos);
+ if (ret < 0) {
+ v4l2_err(vout->vfd->v4l2_dev, "failed to set fb position\n");
+ return ret;
+ }
+
+ if (vout->linear_bypass_pp || vout->tiled_bypass_pp)
+ display_buf_size = fbi->fix.line_length * fbi->var.yres_virtual;
+ else
+ display_buf_size = fbi->fix.line_length * fbi->var.yres;
+ for (i = 0; i < fb_num; i++)
+ vout->disp_bufs[i] = fbi->fix.smem_start + i * display_buf_size;
+ if (vout->tiled_bypass_pp) {
+ size = PAGE_ALIGN(vout->task.input.crop.w *
+ vout->task.input.crop.h *
+ fmt_to_bpp(vout->task.output.format)/8);
+ if (size > vout->vdoa_output[0].size) {
+ for (i = 0; i < VDOA_FB_BUFS; i++) {
+ buf = &vout->vdoa_output[i];
+ if (buf->vaddr)
+ free_dma_buf(vout, buf);
+ buf->size = size;
+ ret = alloc_dma_buf(vout, buf);
+ if (ret < 0)
+ goto err;
+ }
+ }
+ for (i = fb_num; i < (fb_num + VDOA_FB_BUFS); i++)
+ vout->disp_bufs[i] =
+ vout->vdoa_output[i - fb_num].paddr;
+ }
+ vout->fb_smem_len = fbi->fix.smem_len;
+ vout->fb_smem_start = fbi->fix.smem_start;
+ if (fb_base != fbi->fix.smem_start) {
+ v4l2_dbg(1, debug, vout->vfd->v4l2_dev,
+ "realloc fb mem size:0x%x@0x%lx,old paddr @0x%x\n",
+ fbi->fix.smem_len, fbi->fix.smem_start, fb_base);
+ }
+
+ /* fill black when video config changed */
+ color = colorspaceofpixel(vout->task.output.format) == YUV_CS ?
+ UYVY_BLACK : RGB_BLACK;
+ if (IS_PLANAR_PIXEL_FORMAT(vout->task.output.format)) {
+ size = display_buf_size * 8 /
+ fmt_to_bpp(vout->task.output.format);
+ memset(fbi->screen_base, Y_BLACK, size);
+ memset(fbi->screen_base + size, UV_BLACK,
+ display_buf_size - size);
+ } else {
+ pixel = (u32 *)fbi->screen_base;
+ for (i = 0; i < ((display_buf_size * fb_num) >> 2); i++)
+ *pixel++ = color;
+ }
+ console_lock();
+ fbi->flags |= FBINFO_MISC_USEREVENT;
+ ret = fb_blank(fbi, FB_BLANK_UNBLANK);
+ fbi->flags &= ~FBINFO_MISC_USEREVENT;
+ console_unlock();
+ vout->release = false;
+
+ return ret;
+err:
+ for (j = i - 1; j >= 0; j--) {
+ buf = &vout->vdoa_output[j];
+ if (buf->vaddr)
+ free_dma_buf(vout, buf);
+ }
+ return ret;
+}
+
+static inline void wait_for_vsync(struct mxc_vout_output *vout)
+{
+ struct fb_info *fbi = vout->fbi;
+ mm_segment_t old_fs;
+
+ if (fbi->fbops->fb_ioctl) {
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+ fbi->fbops->fb_ioctl(fbi, MXCFB_WAIT_FOR_VSYNC,
+ (unsigned long)NULL);
+ set_fs(old_fs);
+ }
+
+ return;
+}
+
+static void release_disp_output(struct mxc_vout_output *vout)
+{
+ struct fb_info *fbi = vout->fbi;
+ struct mxcfb_pos pos;
+
+ if (vout->release)
+ return;
+ console_lock();
+ fbi->flags |= FBINFO_MISC_USEREVENT;
+ fb_blank(fbi, FB_BLANK_POWERDOWN);
+ fbi->flags &= ~FBINFO_MISC_USEREVENT;
+ console_unlock();
+
+ /* restore pos to 0,0 avoid fb pan display hang? */
+ pos.x = 0;
+ pos.y = 0;
+ set_window_position(vout, &pos);
+
+ if (get_ipu_channel(fbi) == MEM_BG_SYNC) {
+ console_lock();
+ fbi->fix.smem_start = vout->disp_bufs[0];
+ fbi->flags |= FBINFO_MISC_USEREVENT;
+ fb_blank(fbi, FB_BLANK_UNBLANK);
+ fbi->flags &= ~FBINFO_MISC_USEREVENT;
+ console_unlock();
+
+ }
+
+ vout->release = true;
+}
+
+static int mxc_vidioc_streamon(struct file *file, void *fh,
+ enum v4l2_buf_type i)
+{
+ struct mxc_vout_output *vout = fh;
+ struct videobuf_queue *q = &vout->vbq;
+ int ret;
+
+ if (q->streaming) {
+ v4l2_err(vout->vfd->v4l2_dev,
+ "video output already run\n");
+ ret = -EBUSY;
+ goto done;
+ }
+
+ if (deinterlace_3_field(vout) && list_is_singular(&q->stream)) {
+ v4l2_err(vout->vfd->v4l2_dev,
+ "deinterlacing: need queue 2 frame before streamon\n");
+ ret = -EINVAL;
+ goto done;
+ }
+
+ ret = config_disp_output(vout);
+ if (ret < 0) {
+ v4l2_err(vout->vfd->v4l2_dev,
+ "Config display output failed\n");
+ goto done;
+ }
+
+ hrtimer_init(&vout->timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
+ vout->timer.function = mxc_vout_timer_handler;
+ vout->timer_stop = true;
+ vout->frame_count = 0;
+ vout->vdi_frame_cnt = 0;
+
+ vout->start_ktime = hrtimer_cb_get_time(&vout->timer);
+
+ vout->pre1_vb = NULL;
+ vout->pre2_vb = NULL;
+
+ ret = videobuf_streamon(q);
+done:
+ return ret;
+}
+
+static int mxc_vidioc_streamoff(struct file *file, void *fh,
+ enum v4l2_buf_type i)
+{
+ struct mxc_vout_output *vout = fh;
+ struct videobuf_queue *q = &vout->vbq;
+ int ret = 0;
+
+ if (q->streaming) {
+ flush_workqueue(vout->v4l_wq);
+
+ hrtimer_cancel(&vout->timer);
+
+ /*
+ * Wait for 2 vsyncs to make sure
+ * frames are drained on triple
+ * buffer.
+ */
+ wait_for_vsync(vout);
+ wait_for_vsync(vout);
+
+ release_disp_output(vout);
+
+ ret = videobuf_streamoff(&vout->vbq);
+ }
+ INIT_LIST_HEAD(&vout->queue_list);
+ INIT_LIST_HEAD(&vout->active_list);
+
+ return ret;
+}
+
+static const struct v4l2_ioctl_ops mxc_vout_ioctl_ops = {
+ .vidioc_querycap = mxc_vidioc_querycap,
+ .vidioc_enum_fmt_vid_out = mxc_vidioc_enum_fmt_vid_out,
+ .vidioc_g_fmt_vid_out = mxc_vidioc_g_fmt_vid_out,
+ .vidioc_s_fmt_vid_out = mxc_vidioc_s_fmt_vid_out,
+ .vidioc_g_selection = mxc_vidioc_g_selection,
+ .vidioc_s_selection = mxc_vidioc_s_selection,
+ .vidioc_queryctrl = mxc_vidioc_queryctrl,
+ .vidioc_g_ctrl = mxc_vidioc_g_ctrl,
+ .vidioc_s_ctrl = mxc_vidioc_s_ctrl,
+ .vidioc_reqbufs = mxc_vidioc_reqbufs,
+ .vidioc_querybuf = mxc_vidioc_querybuf,
+ .vidioc_qbuf = mxc_vidioc_qbuf,
+ .vidioc_dqbuf = mxc_vidioc_dqbuf,
+ .vidioc_streamon = mxc_vidioc_streamon,
+ .vidioc_streamoff = mxc_vidioc_streamoff,
+};
+
+static const struct v4l2_file_operations mxc_vout_fops = {
+ .owner = THIS_MODULE,
+ .unlocked_ioctl = mxc_vout_ioctl,
+ .mmap = mxc_vout_mmap,
+ .open = mxc_vout_open,
+ .release = mxc_vout_release,
+};
+
+static struct video_device mxc_vout_template = {
+ .name = "MXC Video Output",
+ .device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_OUTPUT,
+ .fops = &mxc_vout_fops,
+ .ioctl_ops = &mxc_vout_ioctl_ops,
+ .release = video_device_release,
+};
+
+static struct videobuf_queue_ops mxc_vout_vbq_ops = {
+ .buf_setup = mxc_vout_buffer_setup,
+ .buf_prepare = mxc_vout_buffer_prepare,
+ .buf_release = mxc_vout_buffer_release,
+ .buf_queue = mxc_vout_buffer_queue,
+};
+
+static void mxc_vout_free_output(struct mxc_vout_dev *dev)
+{
+ int i;
+ int j;
+ struct mxc_vout_output *vout;
+ struct video_device *vfd;
+
+ for (i = 0; i < dev->out_num; i++) {
+ vout = dev->out[i];
+ vfd = vout->vfd;
+ if (vout->vdoa_work.vaddr)
+ free_dma_buf(vout, &vout->vdoa_work);
+ for (j = 0; j < VDOA_FB_BUFS; j++) {
+ if (vout->vdoa_output[j].vaddr)
+ free_dma_buf(vout, &vout->vdoa_output[j]);
+ }
+ if (vfd) {
+ if (!video_is_registered(vfd))
+ video_device_release(vfd);
+ else
+ video_unregister_device(vfd);
+ }
+ kfree(vout);
+ }
+}
+
+static int mxc_vout_setup_output(struct mxc_vout_dev *dev)
+{
+ struct videobuf_queue *q;
+ struct fb_info *fbi;
+ struct mxc_vout_output *vout;
+ int i, ret = 0;
+
+ update_display_setting();
+
+ /* all output/overlay based on fb */
+ for (i = 0; i < num_registered_fb; i++) {
+ fbi = registered_fb[i];
+
+ vout = kzalloc(sizeof(struct mxc_vout_output), GFP_KERNEL);
+ if (!vout) {
+ ret = -ENOMEM;
+ break;
+ }
+
+ dev->out[dev->out_num] = vout;
+ dev->out_num++;
+
+ vout->fbi = fbi;
+ vout->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
+ vout->vfd = video_device_alloc();
+ if (!vout->vfd) {
+ ret = -ENOMEM;
+ break;
+ }
+
+ *vout->vfd = mxc_vout_template;
+ vout->vfd->v4l2_dev = &dev->v4l2_dev;
+ vout->vfd->lock = &vout->mutex;
+ vout->vfd->vfl_dir = VFL_DIR_TX;
+
+ mutex_init(&vout->mutex);
+ mutex_init(&vout->task_lock);
+ mutex_init(&vout->accs_lock);
+
+ strlcpy(vout->vfd->name, fbi->fix.id, sizeof(vout->vfd->name));
+
+ video_set_drvdata(vout->vfd, vout);
+
+ if (video_register_device(vout->vfd,
+ VFL_TYPE_GRABBER, video_nr + i) < 0) {
+ ret = -ENODEV;
+ break;
+ }
+
+ q = &vout->vbq;
+ q->dev = dev->dev;
+ spin_lock_init(&vout->vbq_lock);
+ videobuf_queue_dma_contig_init(q, &mxc_vout_vbq_ops, q->dev,
+ &vout->vbq_lock, vout->type, V4L2_FIELD_NONE,
+ sizeof(struct videobuf_buffer), vout, NULL);
+
+ v4l2_info(vout->vfd->v4l2_dev, "V4L2 device registered as %s\n",
+ video_device_node_name(vout->vfd));
+
+ }
+
+ return ret;
+}
+
+static int mxc_vout_probe(struct platform_device *pdev)
+{
+ int ret;
+ struct mxc_vout_dev *dev;
+
+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ if (!dev)
+ return -ENOMEM;
+
+ dev->dev = &pdev->dev;
+ dev->dev->dma_mask = kmalloc(sizeof(*dev->dev->dma_mask), GFP_KERNEL);
+ *dev->dev->dma_mask = DMA_BIT_MASK(32);
+ dev->dev->coherent_dma_mask = DMA_BIT_MASK(32);
+
+ ret = v4l2_device_register(dev->dev, &dev->v4l2_dev);
+ if (ret) {
+ dev_err(dev->dev, "v4l2_device_register failed\n");
+ goto free_dev;
+ }
+
+ ret = mxc_vout_setup_output(dev);
+ if (ret < 0)
+ goto rel_vdev;
+
+ return 0;
+
+rel_vdev:
+ mxc_vout_free_output(dev);
+ v4l2_device_unregister(&dev->v4l2_dev);
+free_dev:
+ kfree(dev);
+ return ret;
+}
+
+static int mxc_vout_remove(struct platform_device *pdev)
+{
+ struct v4l2_device *v4l2_dev = platform_get_drvdata(pdev);
+ struct mxc_vout_dev *dev = container_of(v4l2_dev, struct
+ mxc_vout_dev, v4l2_dev);
+
+ mxc_vout_free_output(dev);
+ v4l2_device_unregister(v4l2_dev);
+ kfree(dev);
+ return 0;
+}
+
+static const struct of_device_id mxc_v4l2_dt_ids[] = {
+ { .compatible = "fsl,mxc_v4l2_output", },
+ { /* sentinel */ }
+};
+
+static struct platform_driver mxc_vout_driver = {
+ .driver = {
+ .name = "mxc_v4l2_output",
+ .of_match_table = mxc_v4l2_dt_ids,
+ },
+ .probe = mxc_vout_probe,
+ .remove = mxc_vout_remove,
+};
+
+static int __init mxc_vout_init(void)
+{
+ if (platform_driver_register(&mxc_vout_driver) != 0) {
+ printk(KERN_ERR VOUT_NAME ":Could not register Video driver\n");
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static void mxc_vout_cleanup(void)
+{
+ platform_driver_unregister(&mxc_vout_driver);
+}
+
+module_init(mxc_vout_init);
+module_exit(mxc_vout_cleanup);
+
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_DESCRIPTION("V4L2-driver for MXC video output");
+MODULE_LICENSE("GPL");
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index ae24d3ea68ea..6b9fd46bd543 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -460,6 +460,13 @@ config MFD_MX25_TSADC
i.MX25 processors. They consist of a conversion queue for general
purpose ADC and a queue for Touchscreens.
+config MFD_MXC_HDMI
+ tristate "Freescale HDMI Core"
+ select MFD_CORE
+ help
+ This is the core driver for the Freescale i.MX6 on-chip HDMI.
+ This MFD driver connects with the video and audio drivers for HDMI.
+
config MFD_HI6421_PMIC
tristate "HiSilicon Hi6421 PMU/Codec IC"
depends on OF
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index c1067ea46204..b0d4cf17c9e6 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -112,6 +112,7 @@ obj-$(CONFIG_MFD_TWL4030_AUDIO) += twl4030-audio.o
obj-$(CONFIG_TWL6040_CORE) += twl6040.o
obj-$(CONFIG_MFD_MX25_TSADC) += fsl-imx25-tsadc.o
+obj-$(CONFIG_MFD_MXC_HDMI) += mxc-hdmi-core.o
obj-$(CONFIG_MFD_MC13XXX) += mc13xxx-core.o
obj-$(CONFIG_MFD_MC13XXX_SPI) += mc13xxx-spi.o
diff --git a/drivers/mfd/mxc-hdmi-core.c b/drivers/mfd/mxc-hdmi-core.c
new file mode 100644
index 000000000000..01179b48040a
--- /dev/null
+++ b/drivers/mfd/mxc-hdmi-core.c
@@ -0,0 +1,819 @@
+/*
+ * Copyright (C) 2011-2016 Freescale Semiconductor, Inc.
+
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <linux/spinlock.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+
+#include <linux/platform_device.h>
+#include <linux/regulator/machine.h>
+//#include <asm/mach-types.h>
+
+#include <video/mxc_hdmi.h>
+#include <linux/ipu-v3.h>
+#include <video/mxc_edid.h>
+#include "../mxc/ipu3/ipu_prv.h"
+#include <linux/mfd/mxc-hdmi-core.h>
+#include <linux/of_device.h>
+#include <linux/mod_devicetable.h>
+#include <linux/mfd/mxc-hdmi-core.h>
+
+struct mxc_hdmi_data {
+ struct platform_device *pdev;
+ unsigned long __iomem *reg_base;
+ unsigned long reg_phys_base;
+ struct device *dev;
+};
+
+static void __iomem *hdmi_base;
+static struct clk *isfr_clk;
+static struct clk *iahb_clk;
+static struct clk *mipi_core_clk;
+static spinlock_t irq_spinlock;
+static spinlock_t edid_spinlock;
+static unsigned int sample_rate;
+static unsigned long pixel_clk_rate;
+static struct clk *pixel_clk;
+static int hdmi_ratio;
+int mxc_hdmi_ipu_id;
+int mxc_hdmi_disp_id;
+static struct mxc_edid_cfg hdmi_core_edid_cfg;
+static int hdmi_core_init;
+static unsigned int hdmi_dma_running;
+static struct snd_pcm_substream *hdmi_audio_stream_playback;
+static unsigned int hdmi_cable_state;
+static unsigned int hdmi_blank_state;
+static unsigned int hdmi_abort_state;
+static spinlock_t hdmi_audio_lock, hdmi_blank_state_lock, hdmi_cable_state_lock;
+
+unsigned int hdmi_set_cable_state(unsigned int state)
+{
+ unsigned long flags;
+ struct snd_pcm_substream *substream = hdmi_audio_stream_playback;
+
+ spin_lock_irqsave(&hdmi_cable_state_lock, flags);
+ hdmi_cable_state = state;
+ spin_unlock_irqrestore(&hdmi_cable_state_lock, flags);
+
+#ifndef CONFIG_MFD_MXC_HDMI_ANDROID
+ if (check_hdmi_state() && substream && hdmi_abort_state) {
+ hdmi_abort_state = 0;
+ substream->ops->trigger(substream, SNDRV_PCM_TRIGGER_START);
+ }
+#endif
+ return 0;
+}
+EXPORT_SYMBOL(hdmi_set_cable_state);
+
+unsigned int hdmi_set_blank_state(unsigned int state)
+{
+ unsigned long flags;
+ struct snd_pcm_substream *substream = hdmi_audio_stream_playback;
+
+ spin_lock_irqsave(&hdmi_blank_state_lock, flags);
+ hdmi_blank_state = state;
+ spin_unlock_irqrestore(&hdmi_blank_state_lock, flags);
+
+#ifndef CONFIG_MFD_MXC_HDMI_ANDROID
+ if (check_hdmi_state() && substream && hdmi_abort_state) {
+ hdmi_abort_state = 0;
+ substream->ops->trigger(substream, SNDRV_PCM_TRIGGER_START);
+ }
+#endif
+
+ return 0;
+}
+EXPORT_SYMBOL(hdmi_set_blank_state);
+
+#ifdef CONFIG_SND_SOC_IMX_HDMI_DMA
+static void hdmi_audio_abort_stream(struct snd_pcm_substream *substream)
+{
+ unsigned long flags;
+
+ snd_pcm_stream_lock_irqsave(substream, flags);
+
+#ifndef CONFIG_MFD_MXC_HDMI_ANDROID
+ if (snd_pcm_running(substream)) {
+ hdmi_abort_state = 1;
+ substream->ops->trigger(substream, SNDRV_PCM_TRIGGER_STOP);
+ }
+#else
+ if (snd_pcm_running(substream))
+ snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED);
+#endif
+
+ snd_pcm_stream_unlock_irqrestore(substream, flags);
+}
+
+int mxc_hdmi_abort_stream(void)
+{
+ unsigned long flags;
+ spin_lock_irqsave(&hdmi_audio_lock, flags);
+ if (hdmi_audio_stream_playback)
+ hdmi_audio_abort_stream(hdmi_audio_stream_playback);
+ spin_unlock_irqrestore(&hdmi_audio_lock, flags);
+
+ return 0;
+}
+EXPORT_SYMBOL(mxc_hdmi_abort_stream);
+#else
+int mxc_hdmi_abort_stream(void)
+{
+ return 0;
+}
+EXPORT_SYMBOL(mxc_hdmi_abort_stream);
+#endif
+
+int check_hdmi_state(void)
+{
+ unsigned long flags1, flags2;
+ unsigned int ret;
+
+ spin_lock_irqsave(&hdmi_cable_state_lock, flags1);
+ spin_lock_irqsave(&hdmi_blank_state_lock, flags2);
+
+ ret = hdmi_cable_state && hdmi_blank_state;
+
+ spin_unlock_irqrestore(&hdmi_blank_state_lock, flags2);
+ spin_unlock_irqrestore(&hdmi_cable_state_lock, flags1);
+
+ return ret;
+}
+EXPORT_SYMBOL(check_hdmi_state);
+
+#ifdef CONFIG_SND_SOC_IMX_HDMI_DMA
+int mxc_hdmi_register_audio(struct snd_pcm_substream *substream)
+{
+ unsigned long flags, flags1;
+ int ret = 0;
+
+ if (!substream)
+ return -EINVAL;
+
+ snd_pcm_stream_lock_irqsave(substream, flags);
+
+ if (check_hdmi_state()) {
+ spin_lock_irqsave(&hdmi_audio_lock, flags1);
+ if (hdmi_audio_stream_playback) {
+ pr_err("%s unconsist hdmi auido stream!\n", __func__);
+ ret = -EINVAL;
+ }
+ hdmi_audio_stream_playback = substream;
+ hdmi_abort_state = 0;
+ spin_unlock_irqrestore(&hdmi_audio_lock, flags1);
+ } else
+ ret = -EINVAL;
+
+ snd_pcm_stream_unlock_irqrestore(substream, flags);
+
+ return ret;
+}
+EXPORT_SYMBOL(mxc_hdmi_register_audio);
+#endif
+
+void mxc_hdmi_unregister_audio(struct snd_pcm_substream *substream)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&hdmi_audio_lock, flags);
+ hdmi_audio_stream_playback = NULL;
+ hdmi_abort_state = 0;
+ spin_unlock_irqrestore(&hdmi_audio_lock, flags);
+}
+EXPORT_SYMBOL(mxc_hdmi_unregister_audio);
+
+u8 hdmi_readb(unsigned int reg)
+{
+ u8 value;
+
+ value = __raw_readb(hdmi_base + reg);
+
+ return value;
+}
+EXPORT_SYMBOL(hdmi_readb);
+
+#ifdef DEBUG
+static bool overflow_lo;
+static bool overflow_hi;
+
+bool hdmi_check_overflow(void)
+{
+ u8 val, lo, hi;
+
+ val = hdmi_readb(HDMI_IH_FC_STAT2);
+ lo = (val & HDMI_IH_FC_STAT2_LOW_PRIORITY_OVERFLOW) != 0;
+ hi = (val & HDMI_IH_FC_STAT2_HIGH_PRIORITY_OVERFLOW) != 0;
+
+ if ((lo != overflow_lo) || (hi != overflow_hi)) {
+ pr_debug("%s LowPriority=%d HighPriority=%d <=======================\n",
+ __func__, lo, hi);
+ overflow_lo = lo;
+ overflow_hi = hi;
+ return true;
+ }
+ return false;
+}
+#else
+bool hdmi_check_overflow(void)
+{
+ return false;
+}
+#endif
+EXPORT_SYMBOL(hdmi_check_overflow);
+
+void hdmi_writeb(u8 value, unsigned int reg)
+{
+ hdmi_check_overflow();
+ __raw_writeb(value, hdmi_base + reg);
+ hdmi_check_overflow();
+}
+EXPORT_SYMBOL(hdmi_writeb);
+
+void hdmi_mask_writeb(u8 data, unsigned int reg, u8 shift, u8 mask)
+{
+ u8 value = hdmi_readb(reg) & ~mask;
+ value |= (data << shift) & mask;
+ hdmi_writeb(value, reg);
+}
+EXPORT_SYMBOL(hdmi_mask_writeb);
+
+unsigned int hdmi_read4(unsigned int reg)
+{
+ /* read a four byte address from registers */
+ return (hdmi_readb(reg + 3) << 24) |
+ (hdmi_readb(reg + 2) << 16) |
+ (hdmi_readb(reg + 1) << 8) |
+ hdmi_readb(reg);
+}
+EXPORT_SYMBOL(hdmi_read4);
+
+void hdmi_write4(unsigned int value, unsigned int reg)
+{
+ /* write a four byte address to hdmi regs */
+ hdmi_writeb(value & 0xff, reg);
+ hdmi_writeb((value >> 8) & 0xff, reg + 1);
+ hdmi_writeb((value >> 16) & 0xff, reg + 2);
+ hdmi_writeb((value >> 24) & 0xff, reg + 3);
+}
+EXPORT_SYMBOL(hdmi_write4);
+
+static void initialize_hdmi_ih_mutes(void)
+{
+ u8 ih_mute;
+
+ /*
+ * Boot up defaults are:
+ * HDMI_IH_MUTE = 0x03 (disabled)
+ * HDMI_IH_MUTE_* = 0x00 (enabled)
+ */
+
+ /* Disable top level interrupt bits in HDMI block */
+ ih_mute = hdmi_readb(HDMI_IH_MUTE) |
+ HDMI_IH_MUTE_MUTE_WAKEUP_INTERRUPT |
+ HDMI_IH_MUTE_MUTE_ALL_INTERRUPT;
+
+ hdmi_writeb(ih_mute, HDMI_IH_MUTE);
+
+ /* by default mask all interrupts */
+ hdmi_writeb(0xff, HDMI_VP_MASK);
+ hdmi_writeb(0xff, HDMI_FC_MASK0);
+ hdmi_writeb(0xff, HDMI_FC_MASK1);
+ hdmi_writeb(0xff, HDMI_FC_MASK2);
+ hdmi_writeb(0xff, HDMI_PHY_MASK0);
+ hdmi_writeb(0xff, HDMI_PHY_I2CM_INT_ADDR);
+ hdmi_writeb(0xff, HDMI_PHY_I2CM_CTLINT_ADDR);
+ hdmi_writeb(0xff, HDMI_AUD_INT);
+ hdmi_writeb(0xff, HDMI_AUD_SPDIFINT);
+ hdmi_writeb(0xff, HDMI_AUD_HBR_MASK);
+ hdmi_writeb(0xff, HDMI_GP_MASK);
+ hdmi_writeb(0xff, HDMI_A_APIINTMSK);
+ hdmi_writeb(0xff, HDMI_CEC_MASK);
+ hdmi_writeb(0xff, HDMI_I2CM_INT);
+ hdmi_writeb(0xff, HDMI_I2CM_CTLINT);
+
+ /* Disable interrupts in the IH_MUTE_* registers */
+ hdmi_writeb(0xff, HDMI_IH_MUTE_FC_STAT0);
+ hdmi_writeb(0xff, HDMI_IH_MUTE_FC_STAT1);
+ hdmi_writeb(0xff, HDMI_IH_MUTE_FC_STAT2);
+ hdmi_writeb(0xff, HDMI_IH_MUTE_AS_STAT0);
+ hdmi_writeb(0xff, HDMI_IH_MUTE_PHY_STAT0);
+ hdmi_writeb(0xff, HDMI_IH_MUTE_I2CM_STAT0);
+ hdmi_writeb(0xff, HDMI_IH_MUTE_CEC_STAT0);
+ hdmi_writeb(0xff, HDMI_IH_MUTE_VP_STAT0);
+ hdmi_writeb(0xff, HDMI_IH_MUTE_I2CMPHY_STAT0);
+ hdmi_writeb(0xff, HDMI_IH_MUTE_AHBDMAAUD_STAT0);
+
+ /* Enable top level interrupt bits in HDMI block */
+ ih_mute &= ~(HDMI_IH_MUTE_MUTE_WAKEUP_INTERRUPT |
+ HDMI_IH_MUTE_MUTE_ALL_INTERRUPT);
+ hdmi_writeb(ih_mute, HDMI_IH_MUTE);
+}
+
+static void hdmi_set_clock_regenerator_n(unsigned int value)
+{
+ u8 val;
+
+ if (!hdmi_dma_running) {
+ hdmi_writeb(value & 0xff, HDMI_AUD_N1);
+ hdmi_writeb(0, HDMI_AUD_N2);
+ hdmi_writeb(0, HDMI_AUD_N3);
+ }
+
+ hdmi_writeb(value & 0xff, HDMI_AUD_N1);
+ hdmi_writeb((value >> 8) & 0xff, HDMI_AUD_N2);
+ hdmi_writeb((value >> 16) & 0x0f, HDMI_AUD_N3);
+
+ /* nshift factor = 0 */
+ val = hdmi_readb(HDMI_AUD_CTS3);
+ val &= ~HDMI_AUD_CTS3_N_SHIFT_MASK;
+ hdmi_writeb(val, HDMI_AUD_CTS3);
+}
+
+static void hdmi_set_clock_regenerator_cts(unsigned int cts)
+{
+ u8 val;
+
+ if (!hdmi_dma_running) {
+ hdmi_writeb(cts & 0xff, HDMI_AUD_CTS1);
+ hdmi_writeb(0, HDMI_AUD_CTS2);
+ hdmi_writeb(0, HDMI_AUD_CTS3);
+ }
+
+ /* Must be set/cleared first */
+ val = hdmi_readb(HDMI_AUD_CTS3);
+ val &= ~HDMI_AUD_CTS3_CTS_MANUAL;
+ hdmi_writeb(val, HDMI_AUD_CTS3);
+
+ hdmi_writeb(cts & 0xff, HDMI_AUD_CTS1);
+ hdmi_writeb((cts >> 8) & 0xff, HDMI_AUD_CTS2);
+ hdmi_writeb(((cts >> 16) & HDMI_AUD_CTS3_AUDCTS19_16_MASK) |
+ HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
+}
+
+static unsigned int hdmi_compute_n(unsigned int freq, unsigned long pixel_clk,
+ unsigned int ratio)
+{
+ unsigned int n = (128 * freq) / 1000;
+
+ switch (freq) {
+ case 32000:
+ if (pixel_clk == 25174000)
+ n = (ratio == 150) ? 9152 : 4576;
+ else if (pixel_clk == 27020000)
+ n = (ratio == 150) ? 8192 : 4096;
+ else if (pixel_clk == 74170000 || pixel_clk == 148350000)
+ n = 11648;
+ else if (pixel_clk == 297000000)
+ n = (ratio == 150) ? 6144 : 3072;
+ else
+ n = 4096;
+ break;
+
+ case 44100:
+ if (pixel_clk == 25174000)
+ n = 7007;
+ else if (pixel_clk == 74170000)
+ n = 17836;
+ else if (pixel_clk == 148350000)
+ n = (ratio == 150) ? 17836 : 8918;
+ else if (pixel_clk == 297000000)
+ n = (ratio == 150) ? 9408 : 4704;
+ else
+ n = 6272;
+ break;
+
+ case 48000:
+ if (pixel_clk == 25174000)
+ n = (ratio == 150) ? 9152 : 6864;
+ else if (pixel_clk == 27020000)
+ n = (ratio == 150) ? 8192 : 6144;
+ else if (pixel_clk == 74170000)
+ n = 11648;
+ else if (pixel_clk == 148350000)
+ n = (ratio == 150) ? 11648 : 5824;
+ else if (pixel_clk == 297000000)
+ n = (ratio == 150) ? 10240 : 5120;
+ else
+ n = 6144;
+ break;
+
+ case 88200:
+ n = hdmi_compute_n(44100, pixel_clk, ratio) * 2;
+ break;
+
+ case 96000:
+ n = hdmi_compute_n(48000, pixel_clk, ratio) * 2;
+ break;
+
+ case 176400:
+ n = hdmi_compute_n(44100, pixel_clk, ratio) * 4;
+ break;
+
+ case 192000:
+ n = hdmi_compute_n(48000, pixel_clk, ratio) * 4;
+ break;
+
+ default:
+ break;
+ }
+
+ return n;
+}
+
+static unsigned int hdmi_compute_cts(unsigned int freq, unsigned long pixel_clk,
+ unsigned int ratio)
+{
+ unsigned int cts = 0;
+ switch (freq) {
+ case 32000:
+ if (pixel_clk == 297000000)
+ cts = 222750;
+ else if (pixel_clk == 25174000)
+ cts = 28125;
+ break;
+ case 48000:
+ case 96000:
+ case 192000:
+ switch (pixel_clk) {
+ case 25200000:
+ case 27000000:
+ case 54000000:
+ case 74250000:
+ case 148500000:
+ cts = pixel_clk / 1000;
+ break;
+ case 297000000:
+ cts = 247500;
+ break;
+ case 25174000:
+ cts = 28125l;
+ break;
+ /*
+ * All other TMDS clocks are not supported by
+ * DWC_hdmi_tx. The TMDS clocks divided or
+ * multiplied by 1,001 coefficients are not
+ * supported.
+ */
+ default:
+ break;
+ }
+ break;
+ case 44100:
+ case 88200:
+ case 176400:
+ switch (pixel_clk) {
+ case 25200000:
+ cts = 28000;
+ break;
+ case 25174000:
+ cts = 31250;
+ break;
+ case 27000000:
+ cts = 30000;
+ break;
+ case 54000000:
+ cts = 60000;
+ break;
+ case 74250000:
+ cts = 82500;
+ break;
+ case 148500000:
+ cts = 165000;
+ break;
+ case 297000000:
+ cts = 247500;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ if (ratio == 100)
+ return cts;
+ else
+ return (cts * ratio) / 100;
+}
+
+static void hdmi_set_clk_regenerator(void)
+{
+ unsigned int clk_n, clk_cts;
+
+ clk_n = hdmi_compute_n(sample_rate, pixel_clk_rate, hdmi_ratio);
+ clk_cts = hdmi_compute_cts(sample_rate, pixel_clk_rate, hdmi_ratio);
+
+ if (clk_cts == 0) {
+ pr_debug("%s: pixel clock not supported: %d\n",
+ __func__, (int)pixel_clk_rate);
+ return;
+ }
+
+ pr_debug("%s: samplerate=%d ratio=%d pixelclk=%d N=%d cts=%d\n",
+ __func__, sample_rate, hdmi_ratio, (int)pixel_clk_rate,
+ clk_n, clk_cts);
+
+ hdmi_set_clock_regenerator_cts(clk_cts);
+ hdmi_set_clock_regenerator_n(clk_n);
+}
+
+static int hdmi_core_get_of_property(struct platform_device *pdev)
+{
+ struct device_node *np = pdev->dev.of_node;
+ int err;
+ int ipu_id, disp_id;
+
+ err = of_property_read_u32(np, "ipu_id", &ipu_id);
+ if (err) {
+ dev_dbg(&pdev->dev, "get of property ipu_id fail\n");
+ return err;
+ }
+ err = of_property_read_u32(np, "disp_id", &disp_id);
+ if (err) {
+ dev_dbg(&pdev->dev, "get of property disp_id fail\n");
+ return err;
+ }
+
+ mxc_hdmi_ipu_id = ipu_id;
+ mxc_hdmi_disp_id = disp_id;
+
+ return err;
+}
+
+/* Need to run this before phy is enabled the first time to prevent
+ * overflow condition in HDMI_IH_FC_STAT2 */
+void hdmi_init_clk_regenerator(void)
+{
+ if (pixel_clk_rate == 0) {
+ pixel_clk_rate = 74250000;
+ hdmi_set_clk_regenerator();
+ }
+}
+EXPORT_SYMBOL(hdmi_init_clk_regenerator);
+
+void hdmi_clk_regenerator_update_pixel_clock(u32 pixclock)
+{
+
+ if (!pixclock)
+ return;
+ /* Translate pixel clock in ps (pico seconds) to Hz */
+ pixel_clk_rate = PICOS2KHZ(pixclock) * 1000UL;
+ hdmi_set_clk_regenerator();
+}
+EXPORT_SYMBOL(hdmi_clk_regenerator_update_pixel_clock);
+
+void hdmi_set_dma_mode(unsigned int dma_running)
+{
+ hdmi_dma_running = dma_running;
+ hdmi_set_clk_regenerator();
+}
+EXPORT_SYMBOL(hdmi_set_dma_mode);
+
+void hdmi_set_sample_rate(unsigned int rate)
+{
+ sample_rate = rate;
+}
+EXPORT_SYMBOL(hdmi_set_sample_rate);
+
+void hdmi_set_edid_cfg(struct mxc_edid_cfg *cfg)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&edid_spinlock, flags);
+ memcpy(&hdmi_core_edid_cfg, cfg, sizeof(struct mxc_edid_cfg));
+ spin_unlock_irqrestore(&edid_spinlock, flags);
+}
+EXPORT_SYMBOL(hdmi_set_edid_cfg);
+
+void hdmi_get_edid_cfg(struct mxc_edid_cfg *cfg)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&edid_spinlock, flags);
+ memcpy(cfg, &hdmi_core_edid_cfg, sizeof(struct mxc_edid_cfg));
+ spin_unlock_irqrestore(&edid_spinlock, flags);
+}
+EXPORT_SYMBOL(hdmi_get_edid_cfg);
+
+void hdmi_set_registered(int registered)
+{
+ hdmi_core_init = registered;
+}
+EXPORT_SYMBOL(hdmi_set_registered);
+
+int hdmi_get_registered(void)
+{
+ return hdmi_core_init;
+}
+EXPORT_SYMBOL(hdmi_get_registered);
+
+static int mxc_hdmi_core_probe(struct platform_device *pdev)
+{
+ struct mxc_hdmi_data *hdmi_data;
+ struct resource *res;
+ unsigned long flags;
+ int ret = 0;
+
+#ifdef DEBUG
+ overflow_lo = false;
+ overflow_hi = false;
+#endif
+
+ hdmi_core_init = 0;
+ hdmi_dma_running = 0;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENOENT;
+
+ ret = hdmi_core_get_of_property(pdev);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "get hdmi of property fail\n");
+ return -ENOENT;
+ }
+
+ hdmi_data = devm_kzalloc(&pdev->dev, sizeof(struct mxc_hdmi_data), GFP_KERNEL);
+ if (!hdmi_data) {
+ dev_err(&pdev->dev, "Couldn't allocate mxc hdmi mfd device\n");
+ return -ENOMEM;
+ }
+ hdmi_data->pdev = pdev;
+
+ pixel_clk = NULL;
+ sample_rate = 48000;
+ pixel_clk_rate = 0;
+ hdmi_ratio = 100;
+
+ spin_lock_init(&irq_spinlock);
+ spin_lock_init(&edid_spinlock);
+
+
+ spin_lock_init(&hdmi_cable_state_lock);
+ spin_lock_init(&hdmi_blank_state_lock);
+ spin_lock_init(&hdmi_audio_lock);
+
+ spin_lock_irqsave(&hdmi_cable_state_lock, flags);
+ hdmi_cable_state = 0;
+ spin_unlock_irqrestore(&hdmi_cable_state_lock, flags);
+
+ spin_lock_irqsave(&hdmi_blank_state_lock, flags);
+ hdmi_blank_state = 0;
+ spin_unlock_irqrestore(&hdmi_blank_state_lock, flags);
+
+ spin_lock_irqsave(&hdmi_audio_lock, flags);
+ hdmi_audio_stream_playback = NULL;
+ hdmi_abort_state = 0;
+ spin_unlock_irqrestore(&hdmi_audio_lock, flags);
+
+ mipi_core_clk = clk_get(&hdmi_data->pdev->dev, "mipi_core");
+ if (IS_ERR(mipi_core_clk)) {
+ ret = PTR_ERR(mipi_core_clk);
+ dev_err(&hdmi_data->pdev->dev,
+ "Unable to get mipi core clk: %d\n", ret);
+ goto eclkg;
+ }
+
+ ret = clk_prepare_enable(mipi_core_clk);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "Cannot enable mipi core clock: %d\n", ret);
+ goto eclke;
+ }
+
+ isfr_clk = clk_get(&hdmi_data->pdev->dev, "hdmi_isfr");
+ if (IS_ERR(isfr_clk)) {
+ ret = PTR_ERR(isfr_clk);
+ dev_err(&hdmi_data->pdev->dev,
+ "Unable to get HDMI isfr clk: %d\n", ret);
+ goto eclkg1;
+ }
+
+ ret = clk_prepare_enable(isfr_clk);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "Cannot enable HDMI clock: %d\n", ret);
+ goto eclke1;
+ }
+
+ pr_debug("%s isfr_clk:%d\n", __func__,
+ (int)clk_get_rate(isfr_clk));
+
+ iahb_clk = clk_get(&hdmi_data->pdev->dev, "hdmi_iahb");
+ if (IS_ERR(iahb_clk)) {
+ ret = PTR_ERR(iahb_clk);
+ dev_err(&hdmi_data->pdev->dev,
+ "Unable to get HDMI iahb clk: %d\n", ret);
+ goto eclkg2;
+ }
+
+ ret = clk_prepare_enable(iahb_clk);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "Cannot enable HDMI clock: %d\n", ret);
+ goto eclke2;
+ }
+
+ hdmi_data->reg_phys_base = res->start;
+ if (!request_mem_region(res->start, resource_size(res),
+ dev_name(&pdev->dev))) {
+ dev_err(&pdev->dev, "request_mem_region failed\n");
+ ret = -EBUSY;
+ goto emem;
+ }
+
+ hdmi_data->reg_base = ioremap(res->start, resource_size(res));
+ if (!hdmi_data->reg_base) {
+ dev_err(&pdev->dev, "ioremap failed\n");
+ ret = -ENOMEM;
+ goto eirq;
+ }
+ hdmi_base = hdmi_data->reg_base;
+
+ pr_debug("\n%s hdmi hw base = 0x%08x\n\n", __func__, (int)res->start);
+
+ initialize_hdmi_ih_mutes();
+
+ /* Disable HDMI clocks until video/audio sub-drivers are initialized */
+ clk_disable_unprepare(isfr_clk);
+ clk_disable_unprepare(iahb_clk);
+ clk_disable_unprepare(mipi_core_clk);
+
+ /* Replace platform data coming in with a local struct */
+ platform_set_drvdata(pdev, hdmi_data);
+
+ return ret;
+
+eirq:
+ release_mem_region(res->start, resource_size(res));
+emem:
+ clk_disable_unprepare(iahb_clk);
+eclke2:
+ clk_put(iahb_clk);
+eclkg2:
+ clk_disable_unprepare(isfr_clk);
+eclke1:
+ clk_put(isfr_clk);
+eclkg1:
+ clk_disable_unprepare(mipi_core_clk);
+eclke:
+ clk_put(mipi_core_clk);
+eclkg:
+ return ret;
+}
+
+
+static int __exit mxc_hdmi_core_remove(struct platform_device *pdev)
+{
+ struct mxc_hdmi_data *hdmi_data = platform_get_drvdata(pdev);
+ struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+ iounmap(hdmi_data->reg_base);
+ release_mem_region(res->start, resource_size(res));
+
+ return 0;
+}
+
+static const struct of_device_id imx_hdmi_dt_ids[] = {
+ { .compatible = "fsl,imx6q-hdmi-core", },
+ { .compatible = "fsl,imx6dl-hdmi-core", },
+ { /* sentinel */ }
+};
+
+static struct platform_driver mxc_hdmi_core_driver = {
+ .driver = {
+ .name = "mxc_hdmi_core",
+ .of_match_table = imx_hdmi_dt_ids,
+ .owner = THIS_MODULE,
+ },
+ .remove = __exit_p(mxc_hdmi_core_remove),
+};
+
+static int __init mxc_hdmi_core_init(void)
+{
+ return platform_driver_probe(&mxc_hdmi_core_driver,
+ mxc_hdmi_core_probe);
+}
+
+static void __exit mxc_hdmi_core_exit(void)
+{
+ platform_driver_unregister(&mxc_hdmi_core_driver);
+}
+
+subsys_initcall(mxc_hdmi_core_init);
+module_exit(mxc_hdmi_core_exit);
+
+MODULE_DESCRIPTION("Core driver for Freescale i.Mx on-chip HDMI");
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_LICENSE("GPL");
diff --git a/drivers/mxc/Kconfig b/drivers/mxc/Kconfig
index 88efc69c1880..227260b893ea 100644
--- a/drivers/mxc/Kconfig
+++ b/drivers/mxc/Kconfig
@@ -1 +1,40 @@
+# drivers/mxc/Kconfig
+
+if ARCH_MXC
+
+menu "MXC support drivers"
+
+config MXC_SIM
+ tristate "MXC SIM support"
+ default n
+ help
+ Say Y to get MXC SIM support.
+
+config MXC_IPU
+ bool "Image Processing Unit Driver"
+ select MXC_IPU_V3
+ help
+ If you plan to use the Image Processing unit, say
+ Y here. IPU is needed by Framebuffer and V4L2 drivers.
+
+# drivers common to MXC and MX8 go here:
+
+if ARM64
+source "drivers/mxc/hantro/Kconfig"
+source "drivers/mxc/hantro_845/Kconfig"
+source "drivers/mxc/hantro_845_h1/Kconfig"
+source "drivers/mxc/vpu_malone/Kconfig"
+source "drivers/mxc/vpu_windsor/Kconfig"
+endif
+
+source "drivers/mxc/gpu-viv/Kconfig"
+source "drivers/mxc/vpu/Kconfig"
+source "drivers/mxc/sim/Kconfig"
+source "drivers/mxc/mlb/Kconfig"
+source "drivers/mxc/ipu3/Kconfig"
+source "drivers/mxc/hdmi-cec/Kconfig"
source "drivers/mxc/mipi/Kconfig"
+
+endmenu
+
+endif
diff --git a/drivers/mxc/Makefile b/drivers/mxc/Makefile
index 6b309ddb227e..609567b8f333 100644
--- a/drivers/mxc/Makefile
+++ b/drivers/mxc/Makefile
@@ -1 +1,12 @@
+obj-$(CONFIG_MXC_GPU_VIV) += gpu-viv/
+obj-$(CONFIG_MXC_HANTRO) += hantro/
+obj-$(CONFIG_MXC_HANTRO_845) += hantro_845/
+obj-$(CONFIG_MXC_HANTRO_845_H1) += hantro_845_h1/
+obj-$(CONFIG_MXC_VPU_MALONE) += vpu_malone/
+obj-$(CONFIG_MXC_VPU_WINDSOR) += vpu_windsor/
+obj-$(CONFIG_MXC_VPU) += vpu/
+obj-$(CONFIG_MXC_SIM) += sim/
+obj-$(CONFIG_MXC_MLB) += mlb/
+obj-$(CONFIG_MXC_IPU_V3) += ipu3/
+obj-$(CONFIG_MXC_HDMI_CEC) += hdmi-cec/
obj-$(CONFIG_MXC_MIPI_CSI2) += mipi/
diff --git a/drivers/mxc/gpu-viv/Kbuild b/drivers/mxc/gpu-viv/Kbuild
new file mode 100644
index 000000000000..6847d5492128
--- /dev/null
+++ b/drivers/mxc/gpu-viv/Kbuild
@@ -0,0 +1,330 @@
+##############################################################################
+#
+# The MIT License (MIT)
+#
+# Copyright (c) 2014 - 2019 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 - 2019 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.
+#
+##############################################################################
+
+
+#
+# Linux build file for kernel HAL driver.
+#
+AQROOT := $(srctree)/drivers/mxc/gpu-viv
+
+include $(AQROOT)/config
+
+soc_vendor := $(firstword $(subst -, ,$(SOC_PLATFORM)))
+soc_board := $(lastword $(subst -, ,$(SOC_PLATFORM)))
+
+KERNEL_DIR ?= $(TOOL_DIR)/kernel
+
+OS_KERNEL_DIR := hal/os/linux/kernel
+ARCH_KERNEL_DIR := hal/kernel/arch
+ARCH_VG_KERNEL_DIR := hal/kernel/archvg
+HAL_KERNEL_DIR := hal/kernel
+TA_DIR := hal/security_v1
+HOST := $(shell hostname)
+
+MODULE_NAME ?= galcore
+CUSTOMER_ALLOCATOR_OBJS ?=
+ALLOCATOR_ARRAY_H_LOCATION ?= $(OS_KERNEL_DIR)/allocator/default/
+SOC_PLATFORM_LOCATION ?= $(OS_KERNEL_DIR)/platform/$(soc_vendor)
+
+# Set common platform driver source
+SOC_PLATFORM_OBJS ?= $(SOC_PLATFORM_LOCATION)/gc_hal_kernel_platform_$(soc_board).o
+# Include platform config if exists.
+-include $(AQROOT)/$(SOC_PLATFORM_LOCATION)/gc_hal_kernel_platform_$(soc_board).config
+
+ifeq ($(CONFIG_KASAN),)
+EXTRA_CFLAGS += -Werror -Wno-implicit-fallthrough
+endif
+
+OBJS := $(OS_KERNEL_DIR)/gc_hal_kernel_device.o \
+ $(OS_KERNEL_DIR)/gc_hal_kernel_linux.o \
+ $(OS_KERNEL_DIR)/gc_hal_kernel_math.o \
+ $(OS_KERNEL_DIR)/gc_hal_kernel_os.o \
+ $(OS_KERNEL_DIR)/gc_hal_kernel_debugfs.o \
+ $(OS_KERNEL_DIR)/gc_hal_kernel_allocator.o \
+ $(OS_KERNEL_DIR)/allocator/default/gc_hal_kernel_allocator_user_memory.o \
+ $(OS_KERNEL_DIR)/allocator/default/gc_hal_kernel_allocator_dma.o \
+ $(OS_KERNEL_DIR)/allocator/default/gc_hal_kernel_allocator_gfp.o \
+ $(OS_KERNEL_DIR)/allocator/default/gc_hal_kernel_allocator_reserved_mem.o \
+ $(OS_KERNEL_DIR)/gc_hal_kernel_driver.o
+
+# Source files for soc platform board
+OBJS += $(SOC_PLATFORM_OBJS)
+
+ifneq ($(CONFIG_DMA_SHARED_BUFFER),)
+OBJS += $(OS_KERNEL_DIR)/allocator/default/gc_hal_kernel_allocator_dmabuf.o
+endif
+
+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_db.o \
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_debug.o \
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_event.o \
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_heap.o \
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_mmu.o \
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_video_memory.o \
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_power.o \
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_security_v1.o
+
+OBJS += $(ARCH_KERNEL_DIR)/gc_hal_kernel_context.o \
+ $(ARCH_KERNEL_DIR)/gc_hal_kernel_hardware.o \
+ $(ARCH_KERNEL_DIR)/gc_hal_kernel_hardware_async_fe.o \
+ $(ARCH_KERNEL_DIR)/gc_hal_kernel_hardware_mc_fe.o \
+ $(ARCH_KERNEL_DIR)/gc_hal_kernel_hardware_waitlink_fe.o
+
+ifeq ($(VIVANTE_ENABLE_3D), 1)
+OBJS += $(ARCH_KERNEL_DIR)/gc_hal_kernel_recorder.o
+endif
+
+ifneq ($(CONFIG_ARM64),)
+ifeq ($(CONFIG_ANDROID),)
+VIVANTE_ENABLE_VG=0
+endif
+endif
+
+ifeq ($(VIVANTE_ENABLE_VG), 1)
+OBJS +=\
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_vg.o\
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_command_vg.o\
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_interrupt_vg.o\
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_mmu_vg.o\
+ $(ARCH_VG_KERNEL_DIR)/gc_hal_kernel_hardware_command_vg.o\
+ $(ARCH_VG_KERNEL_DIR)/gc_hal_kernel_hardware_vg.o
+endif
+
+ifneq ($(CONFIG_SYNC),)
+EXTRA_CFLAGS += -Idrivers/staging/android
+EXTRA_CFLAGS += -DgcdLINUX_SYNC_FILE=1
+
+OBJS += $(OS_KERNEL_DIR)/gc_hal_kernel_sync.o
+else
+ ifneq ($(CONFIG_SYNC_FILE),)
+ EXTRA_CFLAGS += -DgcdLINUX_SYNC_FILE=1
+ OBJS += $(OS_KERNEL_DIR)/gc_hal_kernel_sync.o
+ endif
+endif
+
+ifeq ($(SECURITY), 1)
+OBJS += $(OS_KERNEL_DIR)/gc_hal_kernel_security_channel.o \
+ $(HAL_KERNEL_DIR)/gc_hal_kernel_security.o
+endif
+
+ifneq ($(CUSTOMER_ALLOCATOR_OBJS),)
+OBJS += $(CUSTOMER_ALLOCATOR_OBJS)
+endif
+
+OBJS += $(OS_KERNEL_DIR)/gc_hal_kernel_security_channel_emulator.o \
+ $(TA_DIR)/gc_hal_ta.o \
+ $(TA_DIR)/gc_hal_ta_hardware.o \
+ $(TA_DIR)/gc_hal_ta_mmu.o \
+ $(TA_DIR)/os/emulator/gc_hal_ta_emulator.o
+
+ifeq ($(KERNELRELEASE), )
+
+.PHONY: all clean install
+
+# Define targets.
+all:
+ @$(MAKE) V=$(V) ARCH=$(ARCH_TYPE) -C $(KERNEL_DIR) SUBDIRS=`pwd` modules
+
+clean:
+ @rm -rf $(OBJS)
+ @rm -rf modules.order Module.symvers .tmp_versions
+ @find $(AQROOT) -name ".gc_*.cmd" | xargs rm -f
+
+install: all
+ @mkdir -p $(SDK_DIR)/drivers
+ @cp $(MODULE_NAME).ko $(SDK_DIR)/drivers
+
+else
+
+
+EXTRA_CFLAGS += -DLINUX -DDRIVER
+
+ifeq ($(FLAREON),1)
+EXTRA_CFLAGS += -DFLAREON
+endif
+
+ifeq ($(DEBUG), 1)
+EXTRA_CFLAGS += -DDBG=1 -DDEBUG -D_DEBUG
+else
+EXTRA_CFLAGS += -DDBG=0
+endif
+
+ifeq ($(NO_DMA_COHERENT), 1)
+EXTRA_CFLAGS += -DNO_DMA_COHERENT
+endif
+
+ifeq ($(CONFIG_DOVE_GPU), 1)
+EXTRA_CFLAGS += -DCONFIG_DOVE_GPU=1
+endif
+
+ifneq ($(USE_PLATFORM_DRIVER), 0)
+EXTRA_CFLAGS += -DUSE_PLATFORM_DRIVER=1
+else
+EXTRA_CFLAGS += -DUSE_PLATFORM_DRIVER=0
+endif
+
+EXTRA_CFLAGS += -DVIVANTE_PROFILER=1
+EXTRA_CFLAGS += -DVIVANTE_PROFILER_CONTEXT=1
+
+ifeq ($(ENABLE_GPU_CLOCK_BY_DRIVER), 1)
+EXTRA_CFLAGS += -DENABLE_GPU_CLOCK_BY_DRIVER=1
+else
+EXTRA_CFLAGS += -DENABLE_GPU_CLOCK_BY_DRIVER=0
+endif
+
+ifeq ($(USE_NEW_LINUX_SIGNAL), 1)
+EXTRA_CFLAGS += -DUSE_NEW_LINUX_SIGNAL=1
+else
+EXTRA_CFLAGS += -DUSE_NEW_LINUX_SIGNAL=0
+endif
+
+ifeq ($(USE_LINUX_PCIE), 1)
+EXTRA_CFLAGS += -DUSE_LINUX_PCIE=1
+else
+EXTRA_CFLAGS += -DUSE_LINUX_PCIE=0
+endif
+
+ifeq ($(CACHE_FUNCTION_UNIMPLEMENTED), 1)
+EXTRA_CFLAGS += -DgcdCACHE_FUNCTION_UNIMPLEMENTED=1
+else
+EXTRA_CFLAGS += -DgcdCACHE_FUNCTION_UNIMPLEMENTED=0
+endif
+
+ifeq ($(VIVANTE_ENABLE_3D),0)
+EXTRA_CFLAGS += -DgcdENABLE_3D=0
+else
+EXTRA_CFLAGS += -DgcdENABLE_3D=1
+endif
+
+ifeq ($(VIVANTE_ENABLE_2D),0)
+EXTRA_CFLAGS += -DgcdENABLE_2D=0
+else
+EXTRA_CFLAGS += -DgcdENABLE_2D=1
+endif
+
+ifeq ($(VIVANTE_ENABLE_VG),0)
+EXTRA_CFLAGS += -DgcdENABLE_VG=0
+else
+EXTRA_CFLAGS += -DgcdENABLE_VG=1
+endif
+
+ifeq ($(USE_BANK_ALIGNMENT), 1)
+ EXTRA_CFLAGS += -DgcdENABLE_BANK_ALIGNMENT=1
+ ifneq ($(BANK_BIT_START), 0)
+ ifneq ($(BANK_BIT_END), 0)
+ EXTRA_CFLAGS += -DgcdBANK_BIT_START=$(BANK_BIT_START)
+ EXTRA_CFLAGS += -DgcdBANK_BIT_END=$(BANK_BIT_END)
+ endif
+ endif
+
+ ifneq ($(BANK_CHANNEL_BIT), 0)
+ EXTRA_CFLAGS += -DgcdBANK_CHANNEL_BIT=$(BANK_CHANNEL_BIT)
+ endif
+endif
+
+ifeq ($(FPGA_BUILD), 1)
+EXTRA_CFLAGS += -DgcdFPGA_BUILD=1
+else
+EXTRA_CFLAGS += -DgcdFPGA_BUILD=0
+endif
+
+ifeq ($(SECURITY), 1)
+EXTRA_CFLAGS += -DgcdSECURITY=1
+endif
+
+ifneq ($(CONFIG_DRM), )
+ ifneq ($(CONFIG_ANDROID),)
+ EXTRA_CFLAGS += -DgcdENABLE_DRM=$(VIVANTE_ENABLE_DRM)
+ else
+ EXTRA_CFLAGS += -DgcdENABLE_DRM=0
+ endif
+else
+EXTRA_CFLAGS += -DgcdENABLE_DRM=0
+endif
+
+EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel/inc
+EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel
+EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel/arch
+EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel/inc
+EXTRA_CFLAGS += -I$(AQROOT)/hal/os/linux/kernel
+EXTRA_CFLAGS += -I$(AQROOT)/$(ALLOCATOR_ARRAY_H_LOCATION)
+EXTRA_CFLAGS += -I$(AQROOT)/hal/security_v1/
+EXTRA_CFLAGS += -I$(AQROOT)/$(SOC_PLATFORM_LOCATION)
+
+ifneq ($(CONFIG_ARM), )
+EXTRA_CFLAGS += -Iarch/arm/mm
+endif
+
+ifeq ($(VIVANTE_ENABLE_VG), 1)
+EXTRA_CFLAGS += -I$(AQROOT)/hal/kernel/archvg
+endif
+
+EXTRA_CFLAGS += -DHOST=\"$(HOST)\"
+
+EXTRA_CFLAGS += -DgcdENABLE_TRUST_APPLICATION=1
+
+obj-$(CONFIG_MXC_GPU_VIV) = $(MODULE_NAME).o
+
+$(MODULE_NAME)-objs = $(OBJS)
+
+endif
diff --git a/drivers/mxc/gpu-viv/Kconfig b/drivers/mxc/gpu-viv/Kconfig
new file mode 100644
index 000000000000..ebf6d5909f65
--- /dev/null
+++ b/drivers/mxc/gpu-viv/Kconfig
@@ -0,0 +1,10 @@
+menu "MXC Vivante GPU support"
+
+config MXC_GPU_VIV
+ tristate "MXC Vivante GPU support"
+ default y
+
+ ---help---
+ Say Y to get the GPU driver support.
+
+endmenu
diff --git a/drivers/mxc/gpu-viv/config b/drivers/mxc/gpu-viv/config
new file mode 100644
index 000000000000..267487c7039f
--- /dev/null
+++ b/drivers/mxc/gpu-viv/config
@@ -0,0 +1,71 @@
+##############################################################################
+#
+# The MIT License (MIT)
+#
+# Copyright (c) 2014 - 2019 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 - 2019 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.
+#
+##############################################################################
+
+
+ARCH_TYPE ?= arm
+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
+CACHE_FUNCTION_UNIMPLEMENTED ?= 0
+USE_BANK_ALIGNMENT ?= 1
+BANK_BIT_START ?= 13
+BANK_BIT_END ?= 15
+BANK_CHANNEL_BIT ?= 12
+SECURITY ?= 0
+SOC_PLATFORM ?= freescale-imx
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
new file mode 100644
index 000000000000..85db746858a6
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.c
@@ -0,0 +1,5147 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal.h"
+#include "gc_hal_kernel.h"
+#include "gc_hal_kernel_context.h"
+#include "gc_hal_kernel_buffer.h"
+
+/******************************************************************************\
+******************************** Debugging Macro *******************************
+\******************************************************************************/
+
+/* Zone used for header/footer. */
+#define _GC_OBJ_ZONE gcvZONE_HARDWARE
+
+
+/******************************************************************************\
+************************** Context State Buffer Helpers ************************
+\******************************************************************************/
+
+#define _STATE(reg) \
+ _State(\
+ Context, index, \
+ reg ## _Address >> 2, \
+ reg ## _ResetValue, \
+ reg ## _Count, \
+ gcvFALSE, gcvFALSE \
+ )
+
+#define _STATE_COUNT(reg, count) \
+ _State(\
+ Context, index, \
+ reg ## _Address >> 2, \
+ reg ## _ResetValue, \
+ count, \
+ gcvFALSE, gcvFALSE \
+ )
+
+#define _STATE_COUNT_OFFSET(reg, offset, count) \
+ _State(\
+ Context, index, \
+ (reg ## _Address >> 2) + offset, \
+ reg ## _ResetValue, \
+ count, \
+ gcvFALSE, gcvFALSE \
+ )
+
+#define _STATE_MIRROR_COUNT(reg, mirror, count) \
+ _StateMirror(\
+ Context, \
+ reg ## _Address >> 2, \
+ count, \
+ mirror ## _Address >> 2 \
+ )
+
+#define _STATE_HINT(reg) \
+ _State(\
+ Context, index, \
+ reg ## _Address >> 2, \
+ reg ## _ResetValue, \
+ reg ## _Count, \
+ gcvFALSE, gcvTRUE \
+ )
+
+#define _STATE_HINT_BLOCK(reg, block, count) \
+ _State(\
+ Context, index, \
+ (reg ## _Address >> 2) + (block << reg ## _BLK), \
+ reg ## _ResetValue, \
+ count, \
+ gcvFALSE, gcvTRUE \
+ )
+
+#define _STATE_COUNT_OFFSET_HINT(reg, offset, count) \
+ _State(\
+ Context, index, \
+ (reg ## _Address >> 2) + offset, \
+ reg ## _ResetValue, \
+ count, \
+ gcvFALSE, gcvTRUE \
+ )
+
+#define _STATE_X(reg) \
+ _State(\
+ Context, index, \
+ reg ## _Address >> 2, \
+ reg ## _ResetValue, \
+ reg ## _Count, \
+ gcvTRUE, gcvFALSE \
+ )
+
+#define _STATE_INIT_VALUE(reg, value) \
+ _State(\
+ Context, index, \
+ reg ## _Address >> 2, \
+ value, \
+ reg ## _Count, \
+ gcvFALSE, gcvFALSE \
+ )
+
+#define _STATE_INIT_VALUE_BLOCK(reg, value, block, count) \
+ _State(\
+ Context, index, \
+ (reg ## _Address >> 2) + (block << reg ## _BLK), \
+ value, \
+ count, \
+ gcvFALSE, gcvFALSE \
+ )
+
+
+#define _CLOSE_RANGE() \
+ _TerminateStateBlock(Context, index)
+
+#define _ENABLE(reg, field) \
+ do \
+ { \
+ if (gcmVERIFYFIELDVALUE(data, reg, MASK_ ## field, ENABLED)) \
+ { \
+ enable |= gcmFIELDMASK(reg, field); \
+ } \
+ } \
+ while (gcvFALSE)
+
+#define _BLOCK_COUNT(reg) \
+ ((reg ## _Count) >> (reg ## _BLK))
+
+
+/******************************************************************************\
+*********************** Support Functions and Definitions **********************
+\******************************************************************************/
+
+#define gcdSTATE_MASK \
+ (gcmSETFIELDVALUE(0, AQ_COMMAND_NOP_COMMAND, OPCODE, NOP) | 0xC0FFEE)
+
+#if gcdENABLE_3D
+static gctUINT32
+_TerminateStateBlock(
+ IN gckCONTEXT Context,
+ IN gctUINT32 Index
+ )
+{
+ gctUINT32_PTR buffer;
+ gctUINT32 align;
+
+ /* Determine if we need alignment. */
+ align = (Index & 1) ? 1 : 0;
+
+ /* Address correct index. */
+ buffer = (Context->buffer == gcvNULL)
+ ? gcvNULL
+ : Context->buffer->logical;
+
+ /* Flush the current state block; make sure no pairing with the states
+ to follow happens. */
+ if (align && (buffer != gcvNULL))
+ {
+ buffer[Index] = 0xDEADDEAD;
+ }
+
+ /* Reset last address. */
+ Context->lastAddress = ~0U;
+
+ /* Return alignment requirement. */
+ return align;
+}
+#endif
+
+
+#if gcdENABLE_3D
+static gctUINT32
+_FlushPipe(
+ IN gckCONTEXT Context,
+ IN gctUINT32 Index,
+ IN gcePIPE_SELECT Pipe
+ )
+{
+ gctUINT32 flushSlots;
+ gctBOOL txCacheFix;
+ gctBOOL fcFlushStall;
+ gctBOOL iCacheInvalidate;
+ gctBOOL halti5;
+ gctBOOL snapPages;
+ gctBOOL hwTFB;
+ gctBOOL blt;
+ gctBOOL peTSFlush;
+ gctBOOL multiCluster;
+
+ txCacheFix
+ = gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_TEX_CACHE_FLUSH_FIX);
+
+ fcFlushStall
+ = gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_FC_FLUSH_STALL);
+
+ iCacheInvalidate
+ = gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_SHADER_HAS_INSTRUCTION_CACHE);
+
+ halti5
+ = gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_HALTI5);
+
+ snapPages
+ = gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_SNAPPAGE_CMD_FIX) &&
+ gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_SNAPPAGE_CMD);
+
+ hwTFB
+ = gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_HW_TFB);
+
+ blt
+ = gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_BLT_ENGINE);
+ multiCluster
+ = gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_MULTI_CLUSTER);
+
+ peTSFlush
+ = gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_PE_TILE_CACHE_FLUSH_FIX);
+
+ flushSlots = blt ? 10 : 6;
+
+ if (Pipe == gcvPIPE_3D)
+ {
+ if (!txCacheFix)
+ {
+ /* Semaphore stall */
+ flushSlots += blt ? 8 : 4;
+ }
+
+ /* VST cache */
+ flushSlots += 2;
+ }
+
+ if (fcFlushStall)
+ {
+ /* Flush tile status cache. */
+ flushSlots += blt ? ((!peTSFlush) ? 14 :10) : 6;
+ }
+
+ if (iCacheInvalidate && !halti5)
+ {
+ flushSlots += blt ? 16 : 12;
+ }
+
+ if (hwTFB)
+ {
+ flushSlots += 2;
+ }
+
+ /* Snap pages */
+ if (snapPages)
+ {
+ flushSlots += 2;
+ }
+
+ if (Context->buffer != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Address correct index. */
+ buffer = Context->buffer->logical + Index;
+
+ if (Pipe == gcvPIPE_3D && !txCacheFix)
+ {
+ if (blt)
+ {
+ /* Semaphore from FE to BLT. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to BLT. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+ }
+ else
+ {
+ /* Semaphore from FE to PE. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to PE. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+ }
+
+ /* Flush the current pipe. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E03) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = (Pipe == gcvPIPE_2D)
+ ?
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)))
+ : ((((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)))
+ | ((((gctUINT32) (0)) & ~(((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)))
+ | (multiCluster ?
+ 0 : ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 10:10) - (0 ?
+ 10:10) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 10:10) - (0 ?
+ 10:10) + 1))))))) << (0 ?
+ 10:10))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 10:10) - (0 ?
+ 10:10) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 10:10) - (0 ? 10:10) + 1))))))) << (0 ? 10:10)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1))))))) << (0 ?
+ 11:11))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 11:11) - (0 ? 11:11) + 1))))))) << (0 ? 11:11)));
+
+ if (hwTFB)
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x7003) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++
+ = 0x1;
+ }
+
+ /* Flush VST in separate cmd. */
+ if (Pipe == gcvPIPE_3D)
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E03) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++ = ((((gctUINT32) (0)) & ~(((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)));
+ }
+
+ /* Semaphore from FE to PE. */
+ if (blt)
+ {
+ /* Semaphore from FE to BLT. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to BLT. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+ }
+ else
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to PE. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+
+ if (fcFlushStall)
+ {
+ if (!peTSFlush && blt)
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502B) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++
+ = ((((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)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+ }
+ else
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0594) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++
+ = ((((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)));
+ }
+
+ /* Semaphore from FE to PE. */
+ if (blt)
+ {
+ /* Semaphore from FE to BLT. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to BLT. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+ }
+ else
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to PE. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+ }
+
+ if (iCacheInvalidate && !halti5)
+ {
+ /* Invalidate I$ after pipe is stalled */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0218) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x021A) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1))))))) << (0 ?
+ 4:4))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0218) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x021A) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)));
+
+ /* Semaphore from FE to PE. */
+ if (blt)
+ {
+ /* Semaphore from FE to BLT. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to BLT. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+ }
+ else
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to PE. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+ }
+
+ if (snapPages)
+ {
+ *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) (0x13 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x02 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x04 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x08 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)));
+
+ *buffer++
+ = 0;
+ }
+ }
+
+ /* Number of slots taken by flushing pipe. */
+ return flushSlots;
+}
+#endif
+
+#if gcdENABLE_3D
+static gctUINT32
+_SemaphoreStall(
+ IN gckCONTEXT Context,
+ IN gctUINT32 Index
+ )
+{
+ gctBOOL blt = gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_BLT_ENGINE);
+ if (Context->buffer != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Address correct index. */
+ buffer = Context->buffer->logical + Index;
+
+ if (blt)
+ {
+ /* Semaphore from FE to BLT. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++
+ = ((((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)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to BLT. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer
+ = ((((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)));
+ }
+ else
+ {
+ /* Semaphore from FE to PE. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to PE. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *buffer
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+ }
+
+ /* Semaphore/stall takes 4 slots. */
+ return (blt ? 8 : 4);
+}
+#endif
+
+#if (gcdENABLE_3D || gcdENABLE_2D)
+static gctUINT32
+_SwitchPipe(
+ IN gckCONTEXT Context,
+ IN gctUINT32 Index,
+ IN gcePIPE_SELECT Pipe
+ )
+{
+ gctUINT32 slots = 2;
+
+ if (Context->buffer != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Address correct index. */
+ buffer = Context->buffer->logical + Index;
+
+ /* LoadState(AQPipeSelect, 1), pipe. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E00) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer
+ = (Pipe == gcvPIPE_2D)
+ ? 0x1
+ : 0x0;
+ }
+
+ Context->pipeSelectBytes = slots * gcmSIZEOF(gctUINT32);
+
+ return slots;
+}
+#endif
+
+#if gcdENABLE_3D
+static gctUINT32
+_State(
+ IN gckCONTEXT Context,
+ IN gctUINT32 Index,
+ IN gctUINT32 Address,
+ IN gctUINT32 Value,
+ IN gctUINT32 Size,
+ IN gctBOOL FixedPoint,
+ IN gctBOOL Hinted
+ )
+{
+ gctUINT32_PTR buffer;
+ gctUINT32 align;
+ gctUINT32 i;
+
+ /* Determine if we need alignment. */
+ align = (Index & 1) ? 1 : 0;
+
+ /* Address correct index. */
+ buffer = (Context->buffer == gcvNULL)
+ ? gcvNULL
+ : Context->buffer->logical;
+
+ if ((buffer == gcvNULL) && (Address + Size > Context->maxState))
+ {
+ /* Determine maximum state. */
+ Context->maxState = Address + Size;
+ }
+
+ if (buffer == gcvNULL)
+ {
+ /* Update number of states. */
+ Context->numStates += Size;
+ }
+
+ /* Do we need a new entry? */
+ if ((Address != Context->lastAddress) || (FixedPoint != Context->lastFixed))
+ {
+ if (buffer != gcvNULL)
+ {
+ if (align)
+ {
+ /* Add filler. */
+ buffer[Index++] = 0xDEADDEAD;
+ }
+
+ /* LoadState(Address, Count). */
+ gcmkASSERT((Index & 1) == 0);
+
+ if (FixedPoint)
+ {
+ buffer[Index]
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1))))))) << (0 ?
+ 26:26))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 26:26) - (0 ? 26:26) + 1))))))) << (0 ? 26:26)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (Size) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (Address) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+ }
+ else
+ {
+ buffer[Index]
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1))))))) << (0 ?
+ 26:26))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 26:26) - (0 ? 26:26) + 1))))))) << (0 ? 26:26)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (Size) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (Address) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+ }
+
+ /* Walk all the states. */
+ for (i = 0; i < (gctUINT32)Size; i += 1)
+ {
+ /* Set state to uninitialized value. */
+ buffer[Index + 1 + i] = Value;
+
+ /* Set index in state mapping table. */
+ Context->map[Address + i].index = (gctUINT)Index + 1 + i;
+ }
+ }
+
+ /* Save information for this LoadState. */
+ Context->lastIndex = (gctUINT)Index;
+ Context->lastAddress = Address + (gctUINT32)Size;
+ Context->lastSize = Size;
+ Context->lastFixed = FixedPoint;
+
+ /* Return size for load state. */
+ return align + 1 + Size;
+ }
+
+ /* Append this state to the previous one. */
+ if (buffer != gcvNULL)
+ {
+ /* Update last load state. */
+ buffer[Context->lastIndex] =
+ ((((gctUINT32) (buffer[Context->lastIndex])) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (Context->lastSize + Size) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
+
+ /* Walk all the states. */
+ for (i = 0; i < (gctUINT32)Size; i += 1)
+ {
+ /* Set state to uninitialized value. */
+ buffer[Index + i] = Value;
+
+ /* Set index in state mapping table. */
+ Context->map[Address + i].index = (gctUINT)Index + i;
+ }
+ }
+
+ /* Update last address and size. */
+ Context->lastAddress += (gctUINT32)Size;
+ Context->lastSize += Size;
+
+ /* Return number of slots required. */
+ return Size;
+}
+
+static gctUINT32
+_StateMirror(
+ IN gckCONTEXT Context,
+ IN gctUINT32 Address,
+ IN gctUINT32 Size,
+ IN gctUINT32 AddressMirror
+ )
+{
+ gctUINT32 i;
+
+ /* Process when buffer is set. */
+ if (Context->buffer != gcvNULL)
+ {
+ /* Walk all states. */
+ for (i = 0; i < Size; i++)
+ {
+ /* Copy the mapping address. */
+ Context->map[Address + i].index =
+ Context->map[AddressMirror + i].index;
+ }
+ }
+
+ /* Return the number of required maps. */
+ return Size;
+}
+
+static void
+_UpdateUnifiedReg(
+ IN gckCONTEXT Context,
+ IN gctUINT32 Address,
+ IN gctUINT32 Size,
+ IN gctUINT32 Count
+ )
+{
+ gctUINT base;
+ gctUINT nopCount;
+ gctUINT32_PTR nop;
+ gcsCONTEXT_PTR buffer;
+ gcsSTATE_MAP_PTR map;
+ gctUINT i;
+
+ /* Get the current context buffer. */
+ buffer = Context->buffer;
+
+ /* Get the state map. */
+ map = Context->map;
+
+ base = map[Address].index;
+
+ if (Count > 1024)
+ {
+ buffer->logical[base - 1]
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1))))))) << (0 ?
+ 26:26))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 26:26) - (0 ? 26:26) + 1))))))) << (0 ? 26:26)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (1024) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (Address) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ buffer->logical[base + 1024 + 1]
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1))))))) << (0 ?
+ 26:26))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 26:26) - (0 ? 26:26) + 1))))))) << (0 ? 26:26)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (Count - 1024) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (Address + 1024) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ /* Determine the number of NOP commands. */
+ nopCount = (Size / 2) - (Count / 2);
+ /* Determine the location of the first NOP. */
+ nop = &buffer->logical[base + (Count | 1) + 2];
+
+ /* Fill the unused space with NOPs. */
+ for (i = 0; i < nopCount; i += 1)
+ {
+ if (nop >= buffer->logical + Context->totalSize)
+ {
+ break;
+ }
+
+ /* Generate a NOP command. */
+ *nop = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ /* Advance. */
+ nop += 2;
+ }
+ }
+ else
+ {
+ buffer->logical[base - 1]
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1))))))) << (0 ?
+ 26:26))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 26:26) - (0 ? 26:26) + 1))))))) << (0 ? 26:26)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (Count) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (Address) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ /* Determine the number of NOP commands. */
+ nopCount = (Size / 2) - (Count / 2) + Size / 1024;
+
+ /* Determine the location of the first NOP. */
+ nop = &buffer->logical[base + (Count | 1)];
+
+ /* Fill the unused space with NOPs. */
+ for (i = 0; i < nopCount; i += 1)
+ {
+ if (nop >= buffer->logical + Context->totalSize)
+ {
+ break;
+ }
+
+ /* Generate a NOP command. */
+ *nop = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ /* Advance. */
+ nop += 2;
+ }
+ }
+}
+#endif
+
+#if (gcdENABLE_3D || gcdENABLE_2D)
+static gceSTATUS
+_InitializeContextBuffer(
+ IN gckCONTEXT Context
+ )
+{
+ gctUINT32_PTR buffer;
+ gctUINT32 index;
+
+#if gcdENABLE_3D
+ gctBOOL halti0, halti1, halti2, halti3, halti4, halti5;
+ gctUINT i;
+ gctUINT vertexUniforms, fragmentUniforms;
+ gctBOOL unifiedUniform;
+ gctBOOL hasGS, hasTS;
+ gctBOOL genericAttrib;
+ gctBOOL hasICache;
+ gctBOOL hasICachePrefetch;
+ gctUINT numRT = 0;
+ gctUINT numSamplers = 32;
+ gctBOOL hasTXdesc;
+ gctBOOL hasSecurity;
+ gctBOOL hasRobustness;
+ gctBOOL multiCluster;
+ gctBOOL smallBatch;
+ gctBOOL multiCoreBlockSetCfg2;
+ gctUINT clusterAliveMask;
+ gctBOOL hasPSCSThrottle;
+ gctBOOL hasMsaaFragOperation;
+ gctBOOL newGPipe;
+#endif
+
+ gckHARDWARE hardware;
+
+ gcmkHEADER();
+
+ hardware = Context->hardware;
+
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ /* Reset the buffer index. */
+ index = 0;
+
+ /* Reset the last state address. */
+ Context->lastAddress = ~0U;
+
+ /* Get the buffer pointer. */
+ buffer = (Context->buffer == gcvNULL)
+ ? gcvNULL
+ : Context->buffer->logical;
+
+
+ /**************************************************************************/
+ /* Build 2D states. *******************************************************/
+
+
+#if gcdENABLE_3D
+ /**************************************************************************/
+ /* Build 3D states. *******************************************************/
+
+ halti0 = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_HALTI0);
+ halti1 = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_HALTI1);
+ halti2 = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_HALTI2);
+ halti3 = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_HALTI3);
+ halti4 = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_HALTI4);
+ halti5 = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_HALTI5);
+ hasGS = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_GEOMETRY_SHADER);
+ hasTS = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_TESSELLATION);
+ genericAttrib = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_GENERIC_ATTRIB);
+ hasICache = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_SHADER_HAS_INSTRUCTION_CACHE);
+ hasTXdesc = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_TX_DESCRIPTOR);
+ hasSecurity = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_SECURITY);
+ hasRobustness = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_ROBUSTNESS);
+ hasICachePrefetch = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_SH_INSTRUCTION_PREFETCH);
+ multiCluster = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_MULTI_CLUSTER);
+ smallBatch = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_SMALL_BATCH) && hardware->options.smallBatch;
+ multiCoreBlockSetCfg2 = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_MULTI_CORE_BLOCK_SET_CONFIG2);
+ clusterAliveMask = hardware->identity.clusterAvailMask & hardware->options.userClusterMask;
+ hasPSCSThrottle = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_PSCS_THROTTLE);
+ hasMsaaFragOperation = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_MSAA_FRAGMENT_OPERATION);
+ newGPipe = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_NEW_GPIPE);
+
+ /* Multi render target. */
+ if (Context->hardware->identity.chipModel == gcv880 &&
+ Context->hardware->identity.chipRevision == 0x5124 &&
+ Context->hardware->identity.customerID == 0x103)
+ {
+ numRT = 16;
+ }
+ else if (halti2 ||
+ ((Context->hardware->identity.chipModel == gcv900) &&
+ (Context->hardware->identity.chipRevision == 0x5250)))
+ {
+ numRT = 8;
+ }
+ else if (halti0)
+ {
+ numRT = 4;
+ }
+ else
+ {
+ numRT = 1;
+ }
+
+ if (hasGS && hasTS)
+ {
+ numSamplers = 80;
+ }
+
+ /* Query how many uniforms can support. */
+ gcmCONFIGUREUNIFORMS2(Context->hardware->identity.chipModel,
+ Context->hardware->identity.chipRevision,
+ halti5,
+ smallBatch,
+ Context->hardware->identity.numConstants,
+ unifiedUniform,
+ vertexUniforms,
+ fragmentUniforms);
+
+#if !gcdENABLE_UNIFIED_CONSTANT
+ if (Context->hardware->identity.numConstants > 256)
+ {
+ unifiedUniform = gcvTRUE;
+ }
+ else
+ {
+ unifiedUniform = gcvFALSE;
+ }
+#endif
+
+ /* Store the 3D entry index. */
+ Context->entryOffset3D = (gctUINT)index * gcmSIZEOF(gctUINT32);
+
+ /* Switch to 3D pipe. */
+ index += _SwitchPipe(Context, index, gcvPIPE_3D);
+
+ if (multiCluster)
+ {
+ index += _State(Context, index, (0x03910 >> 2) + (0 << 2), ((((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) (clusterAliveMask) & ((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0))), 4, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x03908 >> 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))), 1, gcvFALSE, gcvFALSE);
+ }
+
+ /* Current context pointer. */
+#if gcdDEBUG
+ index += _State(Context, index, 0x03850 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+#endif
+
+ index += _FlushPipe(Context, index, gcvPIPE_3D);
+
+ /* Global states. */
+ if (hasSecurity)
+ {
+ index += _State(Context, index, 0x03900 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ index += _State(Context, index, 0x03904 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ index += _State(Context, index, 0x03814 >> 2, 0x00000001, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ index += _State(Context, index, 0x03818 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0381C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ if (halti5)
+ {
+ gctUINT32 uscControl = ((((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)));
+ index += _State(Context, index, 0x03888 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x038C0 >> 2, 0x00000000, 16, gcvFALSE, gcvFALSE);
+
+ uscControl |= ((((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) ((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)));
+ if (multiCluster)
+ {
+ uscControl |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 11:8) - (0 ?
+ 11:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 11:8) - (0 ?
+ 11:8) + 1))))))) << (0 ?
+ 11:8))) | (((gctUINT32) ((gctUINT32) (hardware->options.uscAttribCacheRatio) & ((gctUINT32) ((((1 ?
+ 11:8) - (0 ?
+ 11:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11:8)));
+ }
+ index += _State(Context, index, 0x03884 >> 2, uscControl, 1, gcvFALSE, gcvFALSE);
+ }
+ else
+ {
+ index += _State(Context, index, 0x03820 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x03828 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0382C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x03834 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x03838 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x03854 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ if (hasGS)
+ {
+ index += _State(Context, index, 0x0388C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ index += _State(Context, index, 0x0384C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ /* Front End states. */
+ if (halti5)
+ {
+ index += _State(Context, index, 0x17800 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ index += _State(Context, index, 0x007C4 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x007D0 >> 2, 0x00000000, 2, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x007D8 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x17A80 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ if (genericAttrib || newGPipe)
+ {
+ index += _State(Context, index, 0x17880 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x17900 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x17980 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x17A00 >> 2, 0x3F800000, 32, gcvFALSE, gcvFALSE);
+ }
+ }
+ else
+ {
+ index += _State(Context, index, 0x00600 >> 2, 0x00000000, (halti0 ? 16 : 12), gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ if (genericAttrib)
+ {
+ index += _State(Context, index, 0x006C0 >> 2, 0x00000000, 16, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00700 >> 2, 0x00000000, 16, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00740 >> 2, 0x00000000, 16, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00780 >> 2, 0x3F800000, 16, gcvFALSE, gcvFALSE);
+ }
+ }
+
+ if (halti2 || (Context->hardware->identity.streamCount > 8))
+ {
+ index += _State(Context, index, 0x14600 >> 2, 0x00000000, 16, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14640 >> 2, 0x00000000, 16, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14680 >> 2, 0x00000000, 16, gcvFALSE, gcvFALSE);
+ }
+ else if (Context->hardware->identity.streamCount > 1)
+ {
+ index += _State(Context, index, 0x00680 >> 2, 0x00000000, 8, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x006A0 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+ }
+ else
+ {
+ index += _State(Context, index, 0x0064C >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x00650 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ }
+ index += _State(Context, index, 0x00644 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x00648 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00674 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00678 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0067C >> 2, 0xFFFFFFFF, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+
+ if (hasRobustness)
+ {
+ index += _State(Context, index, 0x146C0 >> 2, 0x00000000, 16, gcvFALSE, gcvTRUE);
+ index += _CLOSE_RANGE();
+ index += _State(Context, index, 0x007F8 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _CLOSE_RANGE();
+ }
+
+ /* WD */
+ if (multiCluster)
+ {
+ index += _State(Context, index, 0x18404 >> 2, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0))), 1, gcvFALSE, gcvFALSE);
+ }
+
+ if (halti5)
+ {
+ index += _State(Context, index, 0x008B8 >> 2, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1))))))) << (0 ?
+ 4:4))) | (((gctUINT32) ((gctUINT32) (smallBatch ?
+ 0x0 : 0x1) & ((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1))))))) << (0 ?
+ 4:4))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) ((gctUINT32) (smallBatch ?
+ 0x0 : 0x1) & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1))))))) << (0 ?
+ 8:8))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1))))))) << (0 ?
+ 8:8))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))), 1, gcvFALSE, gcvFALSE);
+
+ index += _State(Context, index, 0x15600 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+ else
+ {
+ /* This register is programed by all chips, which program all DECODE_SELECT as VS
+ ** except SAMPLER_DECODE_SELECT.
+ */
+ index += _State(Context, index, 0x00860 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ if (hasICache)
+ {
+ /* I-Cache states. */
+ index += _State(Context, index, 0x00868 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0086C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0304C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01028 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+
+ if (hasICachePrefetch)
+ {
+ if (halti5)
+ {
+ index += _State(Context, index, 0x15604 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x01094 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ }
+ else
+ {
+ index += _State(Context, index, 0x00890 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x0104C >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ }
+ index += _CLOSE_RANGE();
+ }
+ }
+
+ if (multiCluster)
+ {
+ index += _State(Context, index, 0x010A8 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ /* Vertex Shader states. */
+ index += _State(Context, index, 0x00804 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00808 >> 2, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1))))))) << (0 ?
+ 5:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:0) - (0 ? 5:0) + 1))))))) << (0 ? 5:0))), 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0080C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00830 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ if (halti5)
+ {
+ index += _State(Context, index, 0x00898 >> 2, 0x00000000, 2, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x008A0 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00870 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x008A8 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x008C0 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x008E0 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+ }
+ else
+ {
+ index += _State(Context, index, 0x00810 >> 2, 0x00000000, 4, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00820 >> 2, 0x00000000, 4, gcvFALSE, gcvFALSE);
+ }
+
+ if (multiCluster)
+ {
+ index += _State(Context, index, 0x007FC >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x15608 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ index += _CLOSE_RANGE();
+
+ /* GS */
+ if (hasGS)
+ {
+ index += _State(Context, index, 0x01100 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01104 >> 2, 0x00000001, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01108 >> 2, 0x01000001, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0110C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01110 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01114 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x0111C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01140 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01144 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01148 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0114C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01154 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01120 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ }
+
+ /* TCS & TES */
+ if (hasTS)
+ {
+ index += _State(Context, index, 0x007C0 >> 2, 0x00000003, 1, gcvFALSE, gcvFALSE);
+
+ index += _State(Context, index, 0x14A14 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14A18 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14A1C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14A40 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14A00 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14A04 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14A08 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x14A10 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14A20 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14A44 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14A4C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ index += _CLOSE_RANGE();
+
+ index += _State(Context, index, 0x14B18 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14B1C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14B20 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14B04 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14B08 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14B0C >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x14B14 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14B40 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14B24 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14B2C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14B34 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ index += _State(Context, index, 0x14B00 >> 2, 0x00040000, 1, gcvFALSE, gcvFALSE);
+
+ }
+
+ index += _CLOSE_RANGE();
+
+ /* TFB */
+ if (gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_HW_TFB))
+ {
+ index += _State(Context, index, 0x1C000 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x1C008 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x1C040 >> 2) + (0 << 4), 0x00000000, 4, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x1C080 >> 2, 0x00000000, 4, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x1C0C0 >> 2, 0x00000000, 4, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x1C100 >> 2, 0x00000000, 4, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x1C800 >> 2, 0x00000000, 128*4, gcvFALSE, gcvFALSE);
+
+ index += _State(Context, index, 0x1C014 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _CLOSE_RANGE();
+
+ }
+
+ /* Primitive Assembly states. */
+ index += _State(Context, index, 0x00A00 >> 2, 0x00000000, 1, gcvTRUE, gcvFALSE);
+ index += _State(Context, index, 0x00A04 >> 2, 0x00000000, 1, gcvTRUE, gcvFALSE);
+ index += _State(Context, index, 0x00A08 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A0C >> 2, 0x00000000, 1, gcvTRUE, gcvFALSE);
+ index += _State(Context, index, 0x00A10 >> 2, 0x00000000, 1, gcvTRUE, gcvFALSE);
+ index += _State(Context, index, 0x00A14 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A18 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A1C >> 2, 0x3F000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A28 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A2C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A30 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A34 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A38 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A3C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A80 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A84 >> 2, 0x00000000, 1, gcvTRUE, gcvFALSE);
+ index += _State(Context, index, 0x00A8C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A88 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ if (halti5)
+ {
+ index += _State(Context, index, 0x00AA8 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00A90 >> 2, 0x00000000, 4, gcvFALSE, gcvFALSE);
+ }
+ else
+ {
+ index += _State(Context, index, 0x00A40 >> 2, 0x00000000, Context->hardware->identity.varyingsCount, gcvFALSE, gcvFALSE);
+ }
+
+ if (multiCluster)
+ {
+ index += _State(Context, index, 0x00AAC >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ index += _State(Context, index, 0x03A00 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x03A04 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x03A08 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ if (multiCoreBlockSetCfg2)
+ {
+ index += _State(Context, index, 0x03A0C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x03A10 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ /* Setup states. */
+ index += _State(Context, index, 0x00C00 >> 2, 0x00000000, 1, gcvTRUE, gcvFALSE);
+ index += _State(Context, index, 0x00C04 >> 2, 0x00000000, 1, gcvTRUE, gcvFALSE);
+ index += _State(Context, index, 0x00C08 >> 2, 0x45000000, 1, gcvTRUE, gcvFALSE);
+ index += _State(Context, index, 0x00C0C >> 2, 0x45000000, 1, gcvTRUE, gcvFALSE);
+ index += _State(Context, index, 0x00C10 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00C14 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00C18 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00C1C >> 2, 0x42000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00C20 >> 2, 0x00000000, 1, gcvTRUE, gcvFALSE);
+ index += _State(Context, index, 0x00C24 >> 2, 0x00000000, 1, gcvTRUE, gcvFALSE);
+
+ /* Raster states. */
+ index += _State(Context, index, 0x00E00 >> 2, 0x000000F1, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00E10 >> 2, 0x00000000, 4, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00E04 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00E40 >> 2, 0x00000000, 16, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00E08 >> 2, ((((gctUINT32) (0x17000031)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) ((gctUINT32) (smallBatch ?
+ 0x0 : 0x1) & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2))), 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00E24 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00E20 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ if (halti2)
+ {
+ index += _State(Context, index, 0x00E0C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ if (halti5)
+ {
+ index += _State(Context, index, 0x00E34 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+
+ /* Pixel Shader states. */
+ index += _State(Context, index, 0x01004 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01008 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0100C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01010 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01030 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01034 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ if (halti2)
+ {
+ index += _State(Context, index, 0x01040 >> 2, 0x00000000, 2, gcvFALSE, gcvFALSE);
+ }
+
+ if (numRT == 16)
+ {
+ index += _State(Context, index, 0x0102C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x010C8 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x010CC >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+ else if (numRT == 8)
+ {
+ index += _State(Context, index, 0x0102C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01038 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ if (hasMsaaFragOperation)
+ {
+ index += _State(Context, index, 0x01054 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01060 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+ }
+
+ if (halti5)
+ {
+ index += _State(Context, index, 0x01080 >> 2, 0x00000000, 4, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01058 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01098 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ if (hasPSCSThrottle)
+ {
+ index += _State(Context, index, 0x0109C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ index += _CLOSE_RANGE();
+
+ /* Texture states. */
+ if (hasTXdesc)
+ {
+ /* Texture descriptor states */
+ index += _State(Context, index, 0x14C40 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ if (smallBatch)
+ {
+ index += _State(Context, index, 0x010B0 >> 2, numSamplers, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x010B4 >> 2, numSamplers, 1, gcvFALSE, gcvFALSE);
+
+ index += _State(Context, index, 0x16000 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x16200 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x16400 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x16600 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x16800 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+
+ index += _State(Context, index, (0x15800 >> 2) + (0 << 0), 0x00000000, numSamplers, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x15A00 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+
+ index += _CLOSE_RANGE();
+ }
+ else
+ {
+ index += _State(Context, index, 0x16C00 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x16E00 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x17000 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x17200 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x17400 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+
+ index += _State(Context, index, (0x15C00 >> 2) + (0 << 0), 0x00000000, numSamplers, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x15E00 >> 2, 0x00000000, numSamplers, gcvFALSE, gcvFALSE);
+
+ index += _CLOSE_RANGE();
+
+ _StateMirror(Context, 0x16000 >> 2, numSamplers , 0x16C00 >> 2);
+ _StateMirror(Context, 0x16200 >> 2, numSamplers , 0x16E00 >> 2);
+ _StateMirror(Context, 0x16400 >> 2, numSamplers , 0x17000 >> 2);
+ _StateMirror(Context, 0x16600 >> 2, numSamplers , 0x17200 >> 2);
+ _StateMirror(Context, 0x16800 >> 2, numSamplers , 0x17400 >> 2);
+ _StateMirror(Context, 0x15800 >> 2, numSamplers , 0x15C00 >> 2);
+ _StateMirror(Context, 0x15A00 >> 2, numSamplers , 0x15E00 >> 2);
+ }
+ }
+ else
+ {
+ index += _State(Context, index, 0x02000 >> 2, 0x00000000, 12, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x02040 >> 2, 0x00000000, 12, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x02080 >> 2, 0x00000000, 12, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x020C0 >> 2, 0x00000000, 12, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x02100 >> 2, 0x00000000, 12, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x02140 >> 2, 0x00000000, 12, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x02180 >> 2, 0x00000000, 12, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x021C0 >> 2, 0x00321000, 12, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x02200 >> 2, 0x00000000, 12, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x02240 >> 2, 0x00000000, 12, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, (0x02400 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x02440 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x02480 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x024C0 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x02500 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x02540 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x02580 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x025C0 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x02600 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x02640 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x02680 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x026C0 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x02700 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x02740 >> 2) + (0 << 4), 0x00000000, 12, gcvFALSE, gcvTRUE);
+ index += _CLOSE_RANGE();
+
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_TEXTURE_LINEAR))
+ {
+ /*
+ * Linear stride LODn will overwrite LOD0 on GC880,GC2000.
+ * And only LOD0 is valid for this register.
+ */
+ gctUINT count = halti1 ? 14 : 1;
+
+ for (i = 0; i < 12; i += 1)
+ {
+ index += _State(Context, index, (0x02C00 >> 2) + i * 16, 0x00000000, count, gcvFALSE, gcvFALSE);
+ }
+ }
+
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_SUPPORT_GCREGTX))
+ {
+ gctUINT texBlockCount;
+ gctUINT gcregTXLogSizeResetValue;
+
+ /* Enable the integer filter pipe for all texture samplers
+ so that the floating point filter clock will shut off until
+ we start using the floating point filter.
+ */
+ gcregTXLogSizeResetValue = ((((gctUINT32) (0x00000000)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 29:29) - (0 ?
+ 29:29) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 29:29) - (0 ?
+ 29:29) + 1))))))) << (0 ?
+ 29:29))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 29:29) - (0 ?
+ 29:29) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 29:29) - (0 ? 29:29) + 1))))))) << (0 ? 29:29)));
+
+ /* New texture block. */
+ index += _State(Context, index, 0x10000 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10080 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10100 >> 2, gcregTXLogSizeResetValue, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10180 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10200 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10280 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10300 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10380 >> 2, 0x00321000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10400 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10480 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_TX_FILTER))
+ {
+ index += _State(Context, index, 0x12000 >> 2, 0x00000000, 256, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x12400 >> 2, 0x00000000, 256, gcvFALSE, gcvFALSE);
+ }
+
+ texBlockCount = ((512) >> (4));
+
+ for (i = 0; i < texBlockCount; i += 1)
+ {
+ index += _State(Context, index, (0x10800 >> 2) + (i << 4), 0x00000000, 14, gcvFALSE, gcvTRUE);
+ }
+ }
+
+ if (gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_TEX_BASELOD))
+ {
+ index += _State(Context, index, 0x10700 >> 2, 0x00000F00, 32, gcvFALSE, gcvFALSE);
+ }
+
+ if (halti3 ||
+ gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_TX_SUPPORT_DEC))
+ {
+ index += _State(Context, index, 0x10780 >> 2, 0x00030000, 32, gcvFALSE, gcvFALSE);
+ }
+
+ if (halti4)
+ {
+ index += _State(Context, index, 0x11200 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x11280 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ }
+
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_TX_FRAC_PRECISION_6BIT))
+ {
+ index += _State(Context, index, 0x11000 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x11080 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x11100 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x11180 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x11300 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ }
+
+ /* ASTC */
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_TEXTURE_ASTC))
+ {
+ index += _State(Context, index, 0x10500 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10580 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10600 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x10680 >> 2, 0x00000000, 32, gcvFALSE, gcvFALSE);
+ }
+ }
+
+ if (halti3)
+ {
+ index += _State(Context, index, 0x14C00 >> 2, 0x00000000, 16, gcvFALSE, gcvFALSE);
+ }
+
+ /* Thread walker states. */
+ index += _State(Context, index, 0x00900 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00904 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00908 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0090C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00910 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00914 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00918 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00924 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0091C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_SHADER_ENHANCEMENTS2))
+ {
+ index += _State(Context, index, 0x00940 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00944 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00948 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0094C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00950 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00954 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ if (halti5)
+ {
+ index += _State(Context, index, 0x00958 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0095C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00960 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ index += _CLOSE_RANGE();
+
+ /* VS/PS Start/End PC register */
+ if (halti5)
+ {
+ index += _State(Context, index, 0x00874 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x008BC >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0087C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01090 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ }
+ else if (hasICache)
+ {
+ /* New Shader instruction PC registers(20bit). */
+ index += _State(Context, index, 0x00874 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00878 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0087C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00880 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ }
+ else
+ {
+ if (Context->hardware->identity.instructionCount <= 256)
+ {
+ /* old shader instruction PC registers (12bit)*/
+ index += _State(Context, index, 0x00800 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00838 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+
+ index += _State(Context, index, 0x01000 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01018 >> 2, 0x01000000, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ }
+ else
+ {
+ /* New Shader instruction PC registers (16bit) */
+ index += _State(Context, index, 0x0085C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0101C >> 2, 0x00000100, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ }
+ }
+
+
+ if (!hasICachePrefetch)
+ {
+ /* This unified one need SELECT bit to steer */
+ if (Context->hardware->identity.instructionCount > 1024)
+ {
+ for (i = 0;
+ i < Context->hardware->identity.instructionCount << 2;
+ i += 256 << 2
+ )
+ {
+ index += _State(Context, index, (0x20000 >> 2) + i, 0x00000000, 256 << 2, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ }
+ }
+ /* This unified one is steered by base adddress, it's automatical. */
+ else if (Context->hardware->identity.instructionCount > 256)
+ {
+ /* VS instruction memory. */
+ for (i = 0;
+ i < Context->hardware->identity.instructionCount << 2;
+ i += 256 << 2
+ )
+ {
+ index += _State(Context, index, (0x0C000 >> 2) + i, 0x00000000, 256 << 2, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ }
+
+ _StateMirror(Context, 0x08000 >> 2, Context->hardware->identity.instructionCount << 2 , 0x0C000 >> 2);
+ }
+ /* if (Context->hardware->identity.instructionCount <= 256). This is non-unified one. */
+ else
+ {
+ index += _State(Context, index, 0x04000 >> 2, 0x00000000, 1024, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ index += _State(Context, index, 0x06000 >> 2, 0x00000000, 1024, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ }
+ }
+
+ if (unifiedUniform)
+ {
+ gctINT numConstants = Context->hardware->identity.numConstants;
+
+ /* Base Offset register */
+ index += _State(Context, index, 0x01024 >> 2, 0x00000100, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x00864 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+
+ if (smallBatch)
+ {
+ index += _State(Context, index, 0x010AC >> 2, numConstants, 1, gcvFALSE, gcvFALSE);
+ }
+
+ for (i = 0;
+ numConstants > 0;
+ i += 256 << 2,
+ numConstants -= 256
+ )
+ {
+ if (halti5)
+ {
+ if (numConstants >= 256)
+ {
+ if (smallBatch)
+ {
+ index += _State(Context, index, (0x34000 >> 2) + i, 0x00000000, 256 << 2, gcvFALSE, gcvFALSE);
+ }
+ else
+ {
+ index += _State(Context, index, (0x36000 >> 2) + i, 0x00000000, 256 << 2, gcvFALSE, gcvFALSE);
+ }
+ }
+ else
+ {
+ if (smallBatch)
+ {
+ index += _State(Context, index, (0x34000 >> 2) + i, 0x00000000, numConstants << 2, gcvFALSE, gcvFALSE);
+ }
+ else
+ {
+ index += _State(Context, index, (0x36000 >> 2) + i, 0x00000000, numConstants << 2, gcvFALSE, gcvFALSE);
+ }
+ }
+ index += _CLOSE_RANGE();
+ }
+ else
+ {
+ if (numConstants >= 256)
+ {
+ index += _State(Context, index, (0x30000 >> 2) + i, 0x00000000, 256 << 2, gcvFALSE, gcvFALSE);
+ }
+ else
+ {
+ index += _State(Context, index, (0x30000 >> 2) + i, 0x00000000, numConstants << 2, gcvFALSE, gcvFALSE);
+ }
+
+ index += _CLOSE_RANGE();
+ }
+ }
+
+ if (halti5 && !smallBatch)
+ {
+ _StateMirror(Context, 0x34000 >> 2, Context->hardware->identity.numConstants << 2 , 0x36000 >> 2);
+ }
+ }
+#if gcdENABLE_UNIFIED_CONSTANT
+ else
+#endif
+ {
+ index += _State(Context, index, 0x05000 >> 2, 0x00000000, vertexUniforms * 4, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x07000 >> 2, 0x00000000, fragmentUniforms * 4, gcvFALSE, gcvFALSE);
+ }
+
+ if (halti1)
+ {
+ index += _State(Context, index, 0x00884 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ if (halti5)
+ {
+ index += _State(Context, index, 0x008B0 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ /* Store the index of the "XD" entry. */
+ Context->entryOffsetXDFrom3D = (gctUINT)index * gcmSIZEOF(gctUINT32);
+
+
+ /* Pixel Engine states. */
+ index += _State(Context, index, 0x01400 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01404 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01408 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0140C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01414 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01418 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0141C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01420 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01424 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01428 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x0142C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01434 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01454 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01458 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x014A0 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x014A8 >> 2, 0xFFFFFFFF, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x014AC >> 2, 0xFFFFFFFF, 1, gcvFALSE, gcvFALSE);
+
+ if(gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_HALF_FLOAT_PIPE) )
+ {
+ index += _State(Context, index, 0x014B0 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x014B4 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+ index += _State(Context, index, 0x014A4 >> 2, 0x000E400C, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01580 >> 2, 0x00000000, 3, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x014B8 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+
+ if (halti3)
+ {
+ index += _State(Context, index, 0x0103C >> 2, 0x76543210, 1, gcvFALSE, gcvFALSE);
+ }
+
+ index += _State(Context, index, (0x01460 >> 2) + (0 << 3), 0x00000000, Context->hardware->identity.pixelPipes, gcvFALSE, gcvTRUE);
+
+ if (Context->hardware->identity.pixelPipes == 1)
+ {
+ index += _State(Context, index, 0x01430 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x01410 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ }
+
+ if (Context->hardware->identity.pixelPipes > 1 || halti0)
+ {
+ index += _State(Context, index, (0x01480 >> 2) + (0 << 3), 0x00000000, Context->hardware->identity.pixelPipes, gcvFALSE, gcvTRUE);
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ index += _State(Context, index, (0x01500 >> 2) + (i << 3), 0x00000000, Context->hardware->identity.pixelPipes, gcvFALSE, gcvTRUE);
+ }
+
+ if (numRT == 16)
+ {
+ for (i = 0; i < 15; i++)
+ {
+ index += _State(Context, index, (0x17C00 >> 2) + (i << 0), 0x00000000, Context->hardware->identity.pixelPipes, gcvFALSE, gcvTRUE);
+ }
+ index += _State(Context, index, 0x17C40 >> 2, 0x00000000, 15, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x17C80 >> 2, 0x03012000, 15, gcvFALSE, gcvFALSE);
+ }
+ else if (numRT == 8)
+ {
+ for (i = 0; i < 7; i++)
+ {
+ index += _State(Context, index, (0x14800 >> 2) + (i << 3), 0x00000000, Context->hardware->identity.pixelPipes, gcvFALSE, gcvTRUE);
+ }
+ index += _State(Context, index, 0x14900 >> 2, 0x00000000, 7, gcvFALSE, gcvFALSE);
+ }
+
+
+ if (halti3)
+ {
+ index += _State(Context, index, 0x014BC >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ if (halti4)
+ {
+ index += _State(Context, index, 0x014C0 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ }
+
+ if (hasGS)
+ {
+ index += _State(Context, index, 0x038A0 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+ }
+
+ if (halti5)
+ {
+ index += _State(Context, index, 0x14920 >> 2, 0x00000000, 7, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14940 >> 2, 0x00000000, 7, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14960 >> 2, 0x00000000, 7, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x14980 >> 2, 0x00000000, 7, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x149A0 >> 2, 0x00000000, 7, gcvFALSE, gcvFALSE);
+ }
+
+ if (hasRobustness)
+ {
+ index += _State(Context, index, 0x149C0 >> 2, 0x00000000, 8, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x014C4 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ }
+
+ /* Memory Controller */
+ index += _State(Context, index, 0x01654 >> 2, 0x00200000, 1, gcvFALSE, gcvFALSE);
+
+ index += _CLOSE_RANGE();
+ index += _State(Context, index, 0x01658 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x0165C >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x01660 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01664 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x01668 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x0166C >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01670 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01674 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x016A4 >> 2, 0x00000000, 1, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x016AC >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x016A8 >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01720 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x01740 >> 2, 0x00000000, 8, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, 0x01760 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+
+
+ if (halti2)
+ {
+ index += _State(Context, index, 0x01780 >> 2, 0x00000000, 8, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, 0x016BC >> 2, 0x00000000, 1, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, (0x017A0 >> 2) + 1, 0x00000000, 7, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, (0x017C0 >> 2) + 1, 0x00000000, 7, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x017E0 >> 2) + 1, 0x00000000, 7, gcvFALSE, gcvTRUE);
+ index += _State(Context, index, (0x01A00 >> 2) + 1, 0x00000000, 7, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, (0x01A20 >> 2) + 1, 0x00000000, 7, gcvFALSE, gcvFALSE);
+ index += _State(Context, index, (0x01A40 >> 2) + 1, 0x00000000, 7, gcvFALSE, gcvFALSE);
+ }
+
+ index += _CLOSE_RANGE();
+
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_BUG_FIXES18))
+ {
+ index += _State(Context, index, 0x03860 >> 2, 0x6, 1, gcvFALSE, gcvFALSE);
+ index += _CLOSE_RANGE();
+ }
+
+ if (halti3)
+ {
+ index += _State(Context, index, 0x01A80 >> 2, 0x00000000, 8, gcvFALSE, gcvTRUE);
+ index += _CLOSE_RANGE();
+ }
+
+ if (hasSecurity || hasRobustness)
+ {
+ index += _State(Context, index, 0x001AC >> 2, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16))), 1, gcvFALSE, gcvFALSE);
+ }
+
+ /* Semaphore/stall. */
+ index += _SemaphoreStall(Context, index);
+#endif
+
+ /**************************************************************************/
+ /* Link to another address. ***********************************************/
+
+ Context->linkIndex3D = (gctUINT)index;
+
+ if (buffer != gcvNULL)
+ {
+ buffer[index + 0]
+ = ((((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) (0x08 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ buffer[index + 1]
+ = 0;
+ }
+
+ index += 2;
+
+ /* Store the end of the context buffer. */
+ Context->bufferSize = index * gcmSIZEOF(gctUINT32);
+
+
+ /**************************************************************************/
+ /* Pipe switch for the case where neither 2D nor 3D are used. *************/
+
+ /* Store the 3D entry index. */
+ Context->entryOffsetXDFrom2D = (gctUINT)index * gcmSIZEOF(gctUINT32);
+
+ /* Switch to 3D pipe. */
+ index += _SwitchPipe(Context, index, gcvPIPE_3D);
+
+ /* Store the location of the link. */
+ Context->linkIndexXD = (gctUINT)index;
+
+ if (buffer != gcvNULL)
+ {
+ buffer[index + 0]
+ = ((((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) (0x08 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ buffer[index + 1]
+ = 0;
+ }
+
+ index += 2;
+
+
+ /**************************************************************************/
+ /* Save size for buffer. **************************************************/
+
+ Context->totalSize = index * gcmSIZEOF(gctUINT32);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+#endif
+
+static gceSTATUS
+_DestroyContext(
+ IN gckCONTEXT Context
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ if (Context != gcvNULL)
+ {
+ gcsCONTEXT_PTR bufferHead;
+
+ /* Free context buffers. */
+ for (bufferHead = Context->buffer; Context->buffer != gcvNULL;)
+ {
+ /* Get a shortcut to the current buffer. */
+ gcsCONTEXT_PTR buffer = Context->buffer;
+
+ /* Get the next buffer. */
+ gcsCONTEXT_PTR next = buffer->next;
+
+ /* Last item? */
+ if (next == bufferHead)
+ {
+ next = gcvNULL;
+ }
+
+ /* Destroy the signal. */
+ if (buffer->signal != gcvNULL)
+ {
+ /* Wait until the context buffer becomes available;
+ this avoid GPU hang due to context command corruption */
+ gcmkONERROR(gckOS_WaitSignal(
+ Context->os, buffer->signal, gcvFALSE, gcvINFINITE
+ ));
+
+ gcmkONERROR(gckOS_DestroySignal(
+ Context->os, buffer->signal
+ ));
+
+ buffer->signal = gcvNULL;
+ }
+
+ /* Free state delta map. */
+ if (buffer->logical != gcvNULL)
+ {
+ gckKERNEL kernel = Context->hardware->kernel;
+
+ /* End cpu access. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ kernel,
+ buffer->videoMem,
+ 0,
+ gcvFALSE,
+ gcvFALSE
+ ));
+
+ /* Synchronized unlock. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Unlock(
+ kernel,
+ buffer->videoMem,
+ 0,
+ gcvNULL
+ ));
+
+ /* Free video memory. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(
+ kernel,
+ buffer->videoMem
+ ));
+
+ buffer->logical = gcvNULL;
+ }
+
+ /* Free context buffer. */
+ gcmkONERROR(gcmkOS_SAFE_FREE(Context->os, buffer));
+
+ /* Remove from the list. */
+ Context->buffer = next;
+ }
+
+ /* Mark the gckCONTEXT object as unknown. */
+ Context->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the gckCONTEXT object. */
+ gcmkONERROR(gcmkOS_SAFE_FREE(Context->os, Context));
+ }
+
+OnError:
+ return status;
+}
+
+#if (gcdENABLE_3D || gcdENABLE_2D)
+static gceSTATUS
+_AllocateContextBuffer(
+ IN gckCONTEXT Context,
+ IN gcsCONTEXT_PTR Buffer
+ )
+{
+ gceSTATUS status;
+ gckKERNEL kernel = Context->hardware->kernel;
+ gcePOOL pool = gcvPOOL_DEFAULT;
+ gctSIZE_T totalSize = Context->totalSize;
+ gctUINT32 allocFlag = 0;
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ allocFlag = gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+ /* Allocate video memory node for command buffers. */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ kernel,
+ 64,
+ gcvVIDMEM_TYPE_COMMAND,
+ allocFlag,
+ &totalSize,
+ &pool,
+ &Buffer->videoMem
+ ));
+
+ /* Lock for GPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_Lock(
+ kernel,
+ Buffer->videoMem,
+ &Buffer->address
+ ));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ kernel,
+ Buffer->videoMem,
+ gcvFALSE,
+ gcvFALSE,
+ (gctPOINTER *)&Buffer->logical
+ ));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+#endif
+
+/******************************************************************************\
+**************************** Context Management API ****************************
+\******************************************************************************/
+
+/******************************************************************************\
+**
+** gckCONTEXT_Construct
+**
+** Construct a new gckCONTEXT object.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to gckOS object.
+**
+** gctUINT32 ProcessID
+** Current process ID.
+**
+** gckHARDWARE Hardware
+** Pointer to gckHARDWARE object.
+**
+** OUTPUT:
+**
+** gckCONTEXT * Context
+** Pointer to a variable thet will receive the gckCONTEXT object
+** pointer.
+*/
+#if (gcdENABLE_3D || gcdENABLE_2D)
+gceSTATUS
+gckCONTEXT_Construct(
+ IN gckOS Os,
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 ProcessID,
+ OUT gckCONTEXT * Context
+ )
+{
+ gceSTATUS status;
+ gckCONTEXT context = gcvNULL;
+ gctUINT32 allocationSize;
+ gctUINT i;
+ gctPOINTER pointer = gcvNULL;
+
+ gcmkHEADER_ARG("Os=%p Hardware=%p", Os, Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Context != gcvNULL);
+
+
+ /**************************************************************************/
+ /* Allocate and initialize basic fields of gckCONTEXT. ********************/
+
+ /* The context object size. */
+ allocationSize = gcmSIZEOF(struct _gckCONTEXT);
+
+ /* Allocate the object. */
+ gcmkONERROR(gckOS_Allocate(
+ Os, allocationSize, &pointer
+ ));
+
+ context = pointer;
+
+ /* Reset the entire object. */
+ gcmkONERROR(gckOS_ZeroMemory(context, allocationSize));
+
+ /* Initialize the gckCONTEXT object. */
+ context->object.type = gcvOBJ_CONTEXT;
+ context->os = Os;
+ context->hardware = Hardware;
+
+
+#if !gcdENABLE_3D
+ context->entryPipe = gcvPIPE_2D;
+ context->exitPipe = gcvPIPE_2D;
+#elif gcdCMD_NO_2D_CONTEXT
+ context->entryPipe = gcvPIPE_3D;
+ context->exitPipe = gcvPIPE_3D;
+#else
+ context->entryPipe
+ = (((((gctUINT32) (context->hardware->identity.chipFeatures)) >> (0 ? 9:9)) & ((gctUINT32) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1)))))) )
+ ? gcvPIPE_2D
+ : gcvPIPE_3D;
+ context->exitPipe = gcvPIPE_3D;
+#endif
+
+ /* Get the command buffer requirements. */
+ gcmkONERROR(gckHARDWARE_QueryCommandBuffer(
+ Hardware,
+ gcvENGINE_RENDER,
+ &context->alignment,
+ &context->reservedHead,
+ gcvNULL
+ ));
+
+ /**************************************************************************/
+ /* Get the size of the context buffer. ************************************/
+
+ gcmkONERROR(_InitializeContextBuffer(context));
+
+ if (context->maxState > 0)
+ {
+ /**************************************************************************/
+ /* Allocate and reset the state mapping table. ****************************/
+ if (context->hardware->kernel->command->stateMap == gcvNULL)
+ {
+ /* Allocate the state mapping table. */
+ gcmkONERROR(gckOS_Allocate(
+ Os,
+ gcmSIZEOF(gcsSTATE_MAP) * context->maxState,
+ &pointer
+ ));
+
+ context->map = pointer;
+
+ /* Zero the state mapping table. */
+ gcmkONERROR(gckOS_ZeroMemory(
+ context->map, gcmSIZEOF(gcsSTATE_MAP) * context->maxState
+ ));
+
+ context->hardware->kernel->command->stateMap = pointer;
+ }
+ else
+ {
+ context->map = context->hardware->kernel->command->stateMap;
+ }
+ }
+
+ /**************************************************************************/
+ /* Allocate the context and state delta buffers. **************************/
+
+ for (i = 0; i < gcdCONTEXT_BUFFER_COUNT; i += 1)
+ {
+ /* Allocate a context buffer. */
+ gcsCONTEXT_PTR buffer;
+
+ /* Allocate the context buffer structure. */
+ gcmkONERROR(gckOS_Allocate(
+ Os,
+ gcmSIZEOF(gcsCONTEXT),
+ &pointer
+ ));
+
+ buffer = pointer;
+
+ /* Reset the context buffer structure. */
+ gcmkVERIFY_OK(gckOS_ZeroMemory(
+ buffer, gcmSIZEOF(gcsCONTEXT)
+ ));
+
+ /* Append to the list. */
+ if (context->buffer == gcvNULL)
+ {
+ buffer->next = buffer;
+ context->buffer = buffer;
+ }
+ else
+ {
+ buffer->next = context->buffer->next;
+ context->buffer->next = buffer;
+ }
+
+ /* Set the number of delta in the order of creation. */
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+ buffer->num = i;
+#endif
+
+ /* Create the busy signal. */
+ gcmkONERROR(gckOS_CreateSignal(
+ Os, gcvFALSE, &buffer->signal
+ ));
+
+ /* Set the signal, buffer is currently not busy. */
+ gcmkONERROR(gckOS_Signal(
+ Os, buffer->signal, gcvTRUE
+ ));
+
+ /* Create a new physical context buffer. */
+ gcmkONERROR(_AllocateContextBuffer(
+ context, buffer
+ ));
+
+ /* Set gckEVENT object pointer. */
+ buffer->eventObj = Hardware->kernel->eventObj;
+
+ /* Set the pointers to the LINK commands. */
+ if (context->linkIndex2D != 0)
+ {
+ buffer->link2D = &buffer->logical[context->linkIndex2D];
+ }
+
+ if (context->linkIndex3D != 0)
+ {
+ buffer->link3D = &buffer->logical[context->linkIndex3D];
+ }
+
+ if (context->linkIndexXD != 0)
+ {
+ gctPOINTER xdLink;
+ gctUINT32 xdEntryAddress;
+ gctUINT32 xdEntrySize;
+ gctUINT32 linkBytes;
+
+ /* Determine LINK parameters. */
+ xdLink
+ = &buffer->logical[context->linkIndexXD];
+
+ xdEntryAddress
+ = buffer->address
+ + context->entryOffsetXDFrom3D;
+
+ xdEntrySize
+ = context->bufferSize
+ - context->entryOffsetXDFrom3D;
+
+ /* Query LINK size. */
+ gcmkONERROR(gckWLFE_Link(
+ Hardware, gcvNULL, 0, 0, &linkBytes, gcvNULL, gcvNULL
+ ));
+
+ /* Generate a LINK. */
+ gcmkONERROR(gckWLFE_Link(
+ Hardware,
+ xdLink,
+ xdEntryAddress,
+ xdEntrySize,
+ &linkBytes,
+ gcvNULL,
+ gcvNULL
+ ));
+ }
+ }
+
+
+ /**************************************************************************/
+ /* Initialize the context buffers. ****************************************/
+
+ /* Initialize the current context buffer. */
+ gcmkONERROR(_InitializeContextBuffer(context));
+
+ /* Make all created contexts equal. */
+ {
+ gcsCONTEXT_PTR currContext, tempContext;
+
+ /* Set the current context buffer. */
+ currContext = context->buffer;
+
+ /* Get the next context buffer. */
+ tempContext = currContext->next;
+
+ /* Loop through all buffers. */
+ while (tempContext != currContext)
+ {
+ if (tempContext == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+
+ /* Copy the current context. */
+ gckOS_MemCopy(
+ tempContext->logical,
+ currContext->logical,
+ context->totalSize
+ );
+
+ /* Get the next context buffer. */
+ tempContext = tempContext->next;
+ }
+ }
+
+ /* Return pointer to the gckCONTEXT object. */
+ *Context = context;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Context=0x%08X", *Context);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back on error. */
+ gcmkVERIFY_OK(_DestroyContext(context));
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+#endif
+
+/******************************************************************************\
+**
+** gckCONTEXT_Destroy
+**
+** Destroy a gckCONTEXT object.
+**
+** INPUT:
+**
+** gckCONTEXT Context
+** Pointer to an gckCONTEXT object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCONTEXT_Destroy(
+ IN gckCONTEXT Context
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Context=%p", Context);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Context, gcvOBJ_CONTEXT);
+
+ /* Destroy the context and all related objects. */
+ status = _DestroyContext(Context);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return status;
+}
+
+/******************************************************************************\
+**
+** gckCONTEXT_Update
+**
+** Merge all pending state delta buffers into the current context buffer.
+**
+** INPUT:
+**
+** gckCONTEXT Context
+** Pointer to an gckCONTEXT object.
+**
+** gctUINT32 ProcessID
+** Current process ID.
+**
+** gcsSTATE_DELTA_PTR StateDelta
+** Pointer to the state delta.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCONTEXT_Update(
+ IN gckCONTEXT Context,
+ IN gctUINT32 ProcessID,
+ IN gcsSTATE_DELTA_PTR StateDelta
+ )
+{
+#if gcdENABLE_3D
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsSTATE_DELTA _stateDelta;
+ gckKERNEL kernel;
+ gcsCONTEXT_PTR buffer;
+ gcsSTATE_MAP_PTR map;
+ gctBOOL needCopy = gcvFALSE;
+ gcsSTATE_DELTA_PTR uDelta = gcvNULL;
+ gcsSTATE_DELTA_PTR kDelta = gcvNULL;
+ gcsSTATE_DELTA_RECORD_PTR record;
+ gcsSTATE_DELTA_RECORD_PTR recordArray = gcvNULL;
+ gctUINT elementCount;
+ gctUINT address;
+ gctUINT32 mask;
+ gctUINT32 data;
+ gctUINT index;
+ gctUINT i, j;
+ gctUINT32 dirtyRecordArraySize = 0;
+
+ gcmkHEADER_ARG(
+ "Context=%p ProcessID=%d StateDelta=%p",
+ Context, ProcessID, StateDelta
+ );
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Context, gcvOBJ_CONTEXT);
+
+ /* Get a shortcut to the kernel object. */
+ kernel = Context->hardware->kernel;
+
+ /* Check wehther we need to copy the structures or not. */
+ gcmkONERROR(gckOS_QueryNeedCopy(Context->os, ProcessID, &needCopy));
+
+ /* Get the current context buffer. */
+ buffer = Context->buffer;
+
+ /* Wait until the context buffer becomes available; this will
+ also reset the signal and mark the buffer as busy. */
+ gcmkONERROR(gckOS_WaitSignal(
+ Context->os, buffer->signal, gcvFALSE, gcvINFINITE
+ ));
+
+#if gcmIS_DEBUG(gcdDEBUG_CODE) && 1 && gcdENABLE_3D
+ /* Update current context token. */
+ buffer->logical[Context->map[0x0E14].index]
+ = (gctUINT32)gcmPTR2INT32(Context);
+#endif
+
+ if (StateDelta != gcvNULL)
+ {
+ /* Get the state map. */
+ map = Context->map;
+
+ /* Get the first delta item. */
+ uDelta = StateDelta;
+
+ /* Reset the vertex stream count. */
+ elementCount = 0;
+
+ /* Merge all pending deltas. */
+ {
+ /* Get access to the state delta. */
+ gcmkONERROR(gckKERNEL_OpenUserData(
+ kernel, needCopy,
+ &_stateDelta,
+ uDelta, gcmSIZEOF(gcsSTATE_DELTA),
+ (gctPOINTER *) &kDelta
+ ));
+
+ dirtyRecordArraySize
+ = gcmSIZEOF(gcsSTATE_DELTA_RECORD) * kDelta->recordCount;
+
+ if (dirtyRecordArraySize)
+ {
+ /* Get access to the state records. */
+ gcmkONERROR(gckOS_MapUserPointer(
+ kernel->os,
+ gcmUINT64_TO_PTR(kDelta->recordArray),
+ dirtyRecordArraySize,
+ (gctPOINTER *) &recordArray
+ ));
+
+ if (recordArray == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ /* Merge all pending states. */
+ for (j = 0; j < kDelta->recordCount; j += 1)
+ {
+ if (j >= Context->numStates)
+ {
+ break;
+ }
+
+ /* Get the current state record. */
+ record = &recordArray[j];
+
+ /* Get the state address. */
+ gcmkONERROR(gckOS_ReadMappedPointer(kernel->os, &record->address, &address));
+
+ /* Make sure the state is a part of the mapping table. */
+ if (address >= Context->maxState)
+ {
+ gcmkTRACE(
+ gcvLEVEL_ERROR,
+ "%s(%d): State 0x%04X (0x%04X) is not mapped.\n",
+ __FUNCTION__, __LINE__,
+ address, address << 2
+ );
+
+ continue;
+ }
+
+ /* Get the state index. */
+ index = map[address].index;
+
+ /* Skip the state if not mapped. */
+ if (index == 0)
+ {
+ continue;
+ }
+
+ /* Get the data mask. */
+ gcmkONERROR(gckOS_ReadMappedPointer(kernel->os, &record->mask, &mask));
+
+ /* Get the new data value. */
+ gcmkONERROR(gckOS_ReadMappedPointer(kernel->os, &record->data, &data));
+
+ /* Masked states that are being completly reset or regular states. */
+ if ((mask == 0) || (mask == ~0U))
+ {
+ /* Process special states. */
+ if (address == 0x0595)
+ {
+ /* Force auto-disable to be disabled. */
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)));
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1))))))) << (0 ?
+ 4:4))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4)));
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 13:13) - (0 ?
+ 13:13) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 13:13) - (0 ?
+ 13:13) + 1))))))) << (0 ?
+ 13:13))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 13:13) - (0 ?
+ 13:13) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 13:13) - (0 ? 13:13) + 1))))))) << (0 ? 13:13)));
+ }
+
+ /* Set new data. */
+ buffer->logical[index] = data;
+ }
+
+ /* Masked states that are being set partially. */
+ else
+ {
+ buffer->logical[index]
+ = (~mask & buffer->logical[index])
+ | (mask & data);
+ }
+ }
+ }
+
+ /* Get the element count. */
+ if (kDelta->elementCount != 0)
+ {
+ elementCount = kDelta->elementCount;
+ }
+
+ if (dirtyRecordArraySize)
+ {
+ /* Get access to the state records. */
+ gcmkONERROR(gckOS_UnmapUserPointer(
+ kernel->os,
+ gcmUINT64_TO_PTR(kDelta->recordArray),
+ dirtyRecordArraySize,
+ recordArray
+ ));
+
+ recordArray = gcvNULL;
+ }
+
+ /* Close access to the current state delta. */
+ gcmkONERROR(gckKERNEL_CloseUserData(
+ kernel, needCopy,
+ gcvTRUE,
+ uDelta, gcmSIZEOF(gcsSTATE_DELTA),
+ (gctPOINTER *) &kDelta
+ ));
+ }
+
+ /* Hardware disables all input attribute when the attribute 0 is programmed,
+ it then reenables those attributes that were explicitely programmed by
+ the software. Because of this we cannot program the entire array of
+ values, otherwise we'll get all attributes reenabled, but rather program
+ only those that are actully needed by the software.
+ elementCount = attribCount + 1 to make sure 0 is a flag to indicate if UMD
+ touches it.
+ */
+ if (elementCount != 0)
+ {
+ gctUINT base;
+ gctUINT nopCount;
+ gctUINT32_PTR nop;
+ gctUINT fe2vsCount;
+ gctUINT attribCount = elementCount -1;
+ gctUINT32 feAttributeStatgeAddr = 0x0180;
+ if (gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_HALTI5))
+ {
+ fe2vsCount = 32;
+ base = map[0x5E00].index;
+ feAttributeStatgeAddr = 0x5E00;
+ }
+ else if (gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_HALTI0))
+ {
+ fe2vsCount = 16;
+ base = map[0x0180].index;
+ }
+ else
+ {
+ fe2vsCount = 12;
+ base = map[0x0180].index;
+ }
+
+ /* Set the proper state count. */
+ if (attribCount == 0)
+ {
+ gcmkASSERT(gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_ZERO_ATTRIB_SUPPORT));
+
+ buffer->logical[base - 1]
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1))))))) << (0 ?
+ 26:26))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 26:26) - (0 ? 26:26) + 1))))))) << (0 ? 26:26)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (feAttributeStatgeAddr) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ /* Set the proper state count. */
+ buffer->logical[base + 1] =
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1))))))) << (0 ?
+ 26:26))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 26:26) - (0 ? 26:26) + 1))))))) << (0 ? 26:26)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x01F2) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+ buffer->logical[base + 2] = 0x1;
+ attribCount = 3;
+ }
+ else
+ {
+ buffer->logical[base - 1]
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1))))))) << (0 ?
+ 26:26))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 26:26) - (0 ?
+ 26:26) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 26:26) - (0 ? 26:26) + 1))))))) << (0 ? 26:26)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (attribCount) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (feAttributeStatgeAddr) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+ }
+
+ /* Determine the number of NOP commands. */
+ nopCount = (fe2vsCount / 2) - (attribCount / 2);
+ /* Determine the location of the first NOP. */
+ nop = &buffer->logical[base + (attribCount | 1)];
+
+ /* Fill the unused space with NOPs. */
+ for (i = 0; i < nopCount; i += 1)
+ {
+ if (nop >= buffer->logical + Context->totalSize)
+ {
+ break;
+ }
+
+ /* Generate a NOP command. */
+ *nop = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ /* Advance. */
+ nop += 2;
+ }
+ }
+
+ if (gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_SMALL_BATCH) &&
+ Context->hardware->options.smallBatch)
+ {
+ gctUINT numConstant = (gctUINT)Context->hardware->identity.numConstants;
+ gctUINT32 constCount = 0;
+
+ /* Get the const number after merge. */
+ index = map[0x042B].index;
+ data = buffer->logical[index];
+ constCount = (((((gctUINT32) (data)) >> (0 ? 8:0)) & ((gctUINT32) ((((1 ? 8:0) - (0 ? 8:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 8:0) - (0 ? 8:0) + 1)))))) );
+
+ _UpdateUnifiedReg(Context, 0xD000, numConstant << 2, constCount << 2);
+ }
+
+ if (gckHARDWARE_IsFeatureAvailable(Context->hardware, gcvFEATURE_SMALL_BATCH) &&
+ Context->hardware->options.smallBatch)
+ {
+ gctUINT numSamplers = 80;
+ gctUINT32 samplerCount = 0;
+
+ /* Get the sampler number after merge. */
+ index = map[0x042C].index;
+ data = buffer->logical[index];
+ samplerCount = (((((gctUINT32) (data)) >> (0 ? 6:0)) & ((gctUINT32) ((((1 ? 6:0) - (0 ? 6:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 6:0) - (0 ? 6:0) + 1)))))) );
+
+ _UpdateUnifiedReg(Context, 0x5800, numSamplers, samplerCount);
+ _UpdateUnifiedReg(Context, 0x5880, numSamplers, samplerCount);
+ _UpdateUnifiedReg(Context, 0x5900, numSamplers, samplerCount);
+ _UpdateUnifiedReg(Context, 0x5980, numSamplers, samplerCount);
+ _UpdateUnifiedReg(Context, 0x5A00, numSamplers, samplerCount);
+ _UpdateUnifiedReg(Context, 0x5600, numSamplers, samplerCount);
+ _UpdateUnifiedReg(Context, 0x5680, numSamplers, samplerCount);
+ }
+ }
+
+ /* Schedule an event to mark the context buffer as available. */
+ gcmkONERROR(gckEVENT_Signal(
+ buffer->eventObj, buffer->signal, gcvKERNEL_PIXEL
+ ));
+
+ /* Advance to the next context buffer. */
+ Context->buffer = buffer->next;
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Get access to the state records. */
+ if (kDelta != gcvNULL && recordArray != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ kernel->os,
+ gcmUINT64_TO_PTR(kDelta->recordArray),
+ dirtyRecordArraySize,
+ (gctPOINTER *) &recordArray
+ ));
+ }
+
+ /* Close access to the current state delta. */
+ gcmkVERIFY_OK(gckKERNEL_CloseUserData(
+ kernel, needCopy,
+ gcvTRUE,
+ uDelta, gcmSIZEOF(gcsSTATE_DELTA),
+ (gctPOINTER *) &kDelta
+ ));
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+#else
+ return gcvSTATUS_OK;
+#endif
+}
+
+gceSTATUS
+gckCONTEXT_MapBuffer(
+ IN gckCONTEXT Context,
+ OUT gctUINT64 *Logicals,
+ OUT gctUINT32 *Bytes
+ )
+{
+ gceSTATUS status;
+ int i = 0;
+ gckKERNEL kernel = Context->hardware->kernel;
+ gctPOINTER logical;
+ gcsCONTEXT_PTR buffer;
+
+ gcmkHEADER_ARG("Context=%p", Context);
+
+ buffer = Context->buffer;
+
+ for (i = 0; i < gcdCONTEXT_BUFFER_COUNT; i++)
+ {
+ /* Lock for userspace CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ kernel,
+ buffer->videoMem,
+ gcvFALSE,
+ gcvTRUE,
+ &logical
+ ));
+
+ Logicals[i] = gcmPTR_TO_UINT64(logical);
+ buffer = buffer->next;
+ }
+
+ *Bytes = (gctUINT)Context->totalSize;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
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
new file mode 100644
index 000000000000..40f87856e6ee
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_context.h
@@ -0,0 +1,183 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_context_h_
+#define __gc_hal_kernel_context_h_
+
+#include "gc_hal_kernel_buffer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Maps state locations within the context buffer. */
+typedef struct _gcsSTATE_MAP * gcsSTATE_MAP_PTR;
+typedef struct _gcsSTATE_MAP
+{
+ /* Index of the state in the context buffer. */
+ gctUINT index;
+
+ /* State mask. */
+ gctUINT32 mask;
+}
+gcsSTATE_MAP;
+
+/* Context buffer. */
+typedef struct _gcsCONTEXT * gcsCONTEXT_PTR;
+typedef struct _gcsCONTEXT
+{
+ /* For debugging: the number of context buffer in the order of creation. */
+ gctUINT num;
+
+ /* Pointer to gckEVENT object. */
+ gckEVENT eventObj;
+
+ /* Context busy signal. */
+ gctSIGNAL signal;
+
+ /* Video memory of the context buffer. */
+ gckVIDMEM_NODE videoMem;
+
+ /* Logical address of the context buffer. */
+ gctUINT32_PTR logical;
+
+ /* Hardware address of the context buffer. */
+ gctUINT32 address;
+
+ /* Pointer to the LINK commands. */
+ gctPOINTER link2D;
+ gctPOINTER link3D;
+
+ /* Next context buffer. */
+ gcsCONTEXT_PTR next;
+}
+gcsCONTEXT;
+
+typedef struct _gcsRECORD_ARRAY_MAP * gcsRECORD_ARRAY_MAP_PTR;
+struct _gcsRECORD_ARRAY_MAP
+{
+ /* User pointer key. */
+ gctUINT64 key;
+
+ /* Kernel memory buffer. */
+ gcsSTATE_DELTA_RECORD_PTR kData;
+
+ /* Next map. */
+ gcsRECORD_ARRAY_MAP_PTR next;
+
+};
+
+#define USE_SW_RESET 1
+
+/* gckCONTEXT structure that hold the current context. */
+struct _gckCONTEXT
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* Pointer to gckOS object. */
+ gckOS os;
+
+ /* Pointer to gckHARDWARE object. */
+ gckHARDWARE hardware;
+
+ /* Command buffer alignment. */
+ gctUINT32 alignment;
+ gctUINT32 reservedHead;
+
+ /* Context buffer metrics. */
+ gctSIZE_T maxState;
+ gctUINT32 numStates;
+ gctUINT32 totalSize;
+ gctUINT32 bufferSize;
+ gctUINT32 linkIndex2D;
+ gctUINT32 linkIndex3D;
+ gctUINT32 linkIndexXD;
+ gctUINT32 entryOffset3D;
+ gctUINT32 entryOffsetXDFrom2D;
+ gctUINT32 entryOffsetXDFrom3D;
+
+ /* State mapping. */
+ gcsSTATE_MAP_PTR map;
+
+ /* List of context buffers. */
+ gcsCONTEXT_PTR buffer;
+
+ /* Requested pipe select for context. */
+ gcePIPE_SELECT entryPipe;
+ gcePIPE_SELECT exitPipe;
+
+ /* Variables used for building state buffer. */
+ gctUINT32 lastAddress;
+ gctSIZE_T lastSize;
+ gctUINT32 lastIndex;
+ gctBOOL lastFixed;
+
+ gctUINT32 pipeSelectBytes;
+
+ 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
+}
+#endif
+
+#endif /* __gc_hal_kernel_context_h_ */
+
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
new file mode 100644
index 000000000000..e3d4697e7cfa
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.c
@@ -0,0 +1,17712 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal.h"
+#include "gc_hal_kernel.h"
+#include "gc_hal_kernel_context.h"
+
+#include "gc_feature_database.h"
+#include <gc_hal_kernel_debug.h>
+
+#define _GC_OBJ_ZONE gcvZONE_HARDWARE
+
+/*
+There is a afifo that is receiving the “write-done” signal coming from AXI bus for each write request from GPU.
+In normal situation, these “write-done” are coming back in several cycles apart since the write request is generally multiple bursts.
+Things are working as expected in normal frequency working mode for AXI and GPU core clock.
+When the AXI clock is much faster than the GPU core clock, and the “write-done” traffic coming to GPU grouped together,
+This afifo could become full for it has depth of 5 entries, and GPU clock is too slow to latch-in the data.
+This causes the problem observed in the ticket.
+Suggest to keep AXI to GPU core clocks ratio not more than 2:1.
+*/
+#define MIN_FSCALE_LIMIT 32
+
+#define gcmSEMAPHORESTALL(buffer) \
+ do \
+ { \
+ /* Arm the PE-FE Semaphore. */ \
+ *buffer++ \
+ = gcmSETFIELDVALUE(0, AQ_COMMAND_LOAD_STATE_COMMAND, OPCODE, LOAD_STATE) \
+ | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, COUNT, 1) \
+ | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, ADDRESS, 0x0E02); \
+ \
+ *buffer++ \
+ = gcmSETFIELDVALUE(0, AQ_SEMAPHORE, SOURCE, FRONT_END) \
+ | gcmSETFIELDVALUE(0, AQ_SEMAPHORE, DESTINATION, PIXEL_ENGINE);\
+ \
+ /* STALL FE until PE is done flushing. */ \
+ *buffer++ \
+ = gcmSETFIELDVALUE(0, STALL_COMMAND, OPCODE, STALL); \
+ \
+ *buffer++ \
+ = gcmSETFIELDVALUE(0, STALL_STALL, SOURCE, FRONT_END) \
+ | gcmSETFIELDVALUE(0, STALL_STALL, DESTINATION, PIXEL_ENGINE); \
+ } while(0)
+
+typedef struct _gcsiDEBUG_REGISTERS * gcsiDEBUG_REGISTERS_PTR;
+typedef struct _gcsiDEBUG_REGISTERS
+{
+ gctSTRING module;
+ gctUINT index;
+ gctUINT shift;
+ gctUINT data;
+ gctUINT count;
+ gctUINT32 pipeMask;
+ gctUINT32 selectStart;
+ gctBOOL avail;
+ gctBOOL inCluster;
+}
+gcsiDEBUG_REGISTERS;
+
+typedef struct _gcsFE_STACK
+{
+ gctSTRING name;
+ gctINT count;
+ gctUINT32 highSelect;
+ gctUINT32 lowSelect;
+ gctUINT32 linkSelect;
+ gctUINT32 clear;
+ gctUINT32 next;
+}
+gcsFE_STACK;
+
+/******************************************************************************\
+********************************* Support Code *********************************
+\******************************************************************************/
+static gctBOOL
+_IsHardwareMatch(
+ IN gckHARDWARE Hardware,
+ IN gctINT32 ChipModel,
+ IN gctUINT32 ChipRevision
+ )
+{
+ return ((Hardware->identity.chipModel == ChipModel) &&
+ (Hardware->identity.chipRevision == ChipRevision));
+}
+
+static gceSTATUS
+_ResetGPU(
+ IN gckHARDWARE Hardware,
+ IN gckOS Os,
+ IN gceCORE Core
+ );
+
+static void
+_GetEcoID(
+ IN gckHARDWARE Hardware,
+ IN OUT gcsHAL_QUERY_CHIP_IDENTITY_PTR Identity
+ )
+{
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x000E8,
+ &Identity->ecoID
+ ));
+
+ if (_IsHardwareMatch(Hardware, 0x1000, 0x5037) && (Identity->chipDate == 0x20120617))
+ {
+ Identity->ecoID = 1;
+ }
+
+ if (_IsHardwareMatch(Hardware, 0x320, 0x5303) && (Identity->chipDate == 0x20140511))
+ {
+ Identity->ecoID = 1;
+ }
+
+}
+
+static gceSTATUS
+_IdentifyHardwareByDatabase(
+ IN gckHARDWARE Hardware,
+ IN gckOS Os,
+ IN gckDEVICE Device,
+ IN gceCORE Core,
+ OUT gcsHAL_QUERY_CHIP_IDENTITY_PTR Identity
+ )
+{
+ gceSTATUS status;
+ gctUINT32 chipIdentity;
+ gctUINT32 debugControl0;
+ gctUINT32 chipInfo;
+ gcsFEATURE_DATABASE *database;
+ gctUINT i = 0;
+
+ gcmkHEADER_ARG("Os=0x%x", Os);
+
+ /* Get chip date. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00028, &Identity->chipDate));
+
+ /***************************************************************************
+ ** Get chip ID and revision.
+ */
+
+ /* Read chip identity register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00018,
+ &chipIdentity));
+
+ /* Special case for older graphic cores. */
+ if (((((gctUINT32) (chipIdentity)) >> (0 ?
+ 31:24) & ((gctUINT32) ((((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1)))))) == (0x01 & ((gctUINT32) ((((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ? 31:24) + 1))))))))
+ {
+ Identity->chipModel = gcv500;
+ Identity->chipRevision = (((((gctUINT32) (chipIdentity)) >> (0 ? 15:12)) & ((gctUINT32) ((((1 ? 15:12) - (0 ? 15:12) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:12) - (0 ? 15:12) + 1)))))) );
+ }
+
+ else
+ {
+ /* Read chip identity register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00020,
+ (gctUINT32_PTR) &Identity->chipModel));
+
+ if (((Identity->chipModel & 0xFF00) == 0x0400)
+ && (Identity->chipModel != 0x0420)
+ && (Identity->chipModel != 0x0428))
+ {
+ Identity->chipModel = (gceCHIPMODEL) (Identity->chipModel & 0x0400);
+ }
+
+ /* Read CHIP_REV register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00024,
+ &Identity->chipRevision));
+
+ if ((Identity->chipModel == gcv300)
+ && (Identity->chipRevision == 0x2201)
+ )
+ {
+ gctUINT32 chipDate;
+ gctUINT32 chipTime;
+
+ /* Read date and time registers. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00028,
+ &chipDate));
+
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x0002C,
+ &chipTime));
+
+ if ((chipDate == 0x20080814) && (chipTime == 0x12051100))
+ {
+ /* This IP has an ECO; put the correct revision in it. */
+ Identity->chipRevision = 0x1051;
+ }
+ }
+
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x000A8,
+ &Identity->productID));
+ }
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "Identity: chipModel=%X",
+ Identity->chipModel);
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "Identity: chipRevision=%X",
+ Identity->chipRevision);
+
+ _GetEcoID(Hardware, Identity);
+
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00030,
+ &Identity->customerID));
+
+ /*get hw minor features*/
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x0001C,
+ &Identity->chipFeatures));
+
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00034,
+ &Identity->chipMinorFeatures));
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00074,
+ &Identity->chipMinorFeatures1));
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00084,
+ &Identity->chipMinorFeatures2));
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00088,
+ &Identity->chipMinorFeatures3));
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00094,
+ &Identity->chipMinorFeatures4));
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x000A0,
+ &Identity->chipMinorFeatures5));
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x000DC,
+ &Identity->chipMinorFeatures6));
+
+ /***************************************************************************
+ ** Get chip features.
+ */
+
+ database =
+ Hardware->featureDatabase =
+ gcQueryFeatureDB(
+ Hardware->identity.chipModel,
+ Hardware->identity.chipRevision,
+ Hardware->identity.productID,
+ Hardware->identity.ecoID,
+ Hardware->identity.customerID);
+
+ if (database == gcvNULL)
+ {
+ gcmkPRINT("[galcore]: Feature database is not found,"
+ "chipModel=0x%0x, chipRevision=0x%x, productID=0x%x, ecoID=0x%x, customerID=0x%x",
+ Hardware->identity.chipModel,
+ Hardware->identity.chipRevision,
+ Hardware->identity.productID,
+ Hardware->identity.ecoID,
+ Hardware->identity.customerID);
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+
+
+ Identity->pixelPipes = database->NumPixelPipes;
+ Identity->resolvePipes = database->NumResolvePipes;
+ Identity->instructionCount = database->InstructionCount;
+ Identity->numConstants = database->NumberOfConstants;
+ Identity->varyingsCount = database->VaryingCount;
+ Identity->gpuCoreCount = database->CoreCount;
+ Identity->streamCount = database->Streams;
+ Identity->clusterAvailMask = database->ClusterAliveMask;
+
+ if (gcmIS_SUCCESS(gckOS_QueryOption(Hardware->os, "sRAMBases", Device->sRAMBases[0])))
+ {
+ gckOS_MemCopy(
+ Identity->sRAMBases,
+ Device->sRAMBases[Core],
+ sizeof(gctUINT64) * gcvSRAM_INTER_COUNT
+ );
+ }
+ else
+ {
+ for (i = 0; i < gcvSRAM_INTER_COUNT; i++)
+ {
+ Identity->sRAMBases[i] = gcvINVALID_PHYSICAL_ADDRESS;
+ }
+ }
+
+ if (gcmIS_SUCCESS(gckOS_QueryOption(Hardware->os, "sRAMSizes", (gctUINT64 *)Device->sRAMSizes[0])))
+ {
+ gckOS_MemCopy(
+ Identity->sRAMSizes,
+ Device->sRAMSizes[Core],
+ sizeof(gctUINT32) * gcvSRAM_INTER_COUNT
+ );
+ }
+
+ for (i = gcvSRAM_INTERNAL0; i < gcvSRAM_INTER_COUNT; i++)
+ {
+ if (Identity->sRAMSizes[i])
+ {
+ break;
+ }
+ }
+
+ /* If module parameter doesn't set per-core SRAM sizes. */
+ if (i == gcvSRAM_INTER_COUNT)
+ {
+ for (i = gcvSRAM_INTERNAL0; i < gcvSRAM_INTER_COUNT; i++)
+ {
+ /* Try to get SRAM sizes from database. */
+ Device->sRAMSizes[Core][i] = Identity->sRAMSizes[i] = database->VIP_SRAM_SIZE;
+ }
+ }
+
+ gckOS_QueryOption(Hardware->os, "extSRAMBases", Device->extSRAMBases);
+
+ gckOS_QueryOption(Hardware->os, "extSRAMSizes", (gctUINT64 *)Device->extSRAMSizes);
+
+ for (i = gcvSRAM_EXTERNAL0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ if (Device->extSRAMSizes[i])
+ {
+ break;
+ }
+ }
+
+ /* If module parameter doesn't set external SRAM sizes. */
+ if (i == gcvSRAM_EXT_COUNT)
+ {
+ for (i = gcvSRAM_EXTERNAL0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ /* Try to get SRAM sizes from database. */
+ Device->extSRAMSizes[i] = database->AXI_SRAM_SIZE;
+ }
+ }
+
+ if (Identity->chipModel == gcv320)
+ {
+ gctUINT32 data;
+
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os,
+ Core,
+ 0x0002C,
+ &data));
+
+ if ((data != 33956864) &&
+ ((Identity->chipRevision == 0x5007) ||
+ (Identity->chipRevision == 0x5220)))
+ {
+ Hardware->maxOutstandingReads = 0xFF &
+ (Identity->chipRevision == 0x5220 ? 8 :
+ (Identity->chipRevision == 0x5007 ? 12 : 0));
+ }
+ }
+
+ if (_IsHardwareMatch(Hardware, gcv880, 0x5107))
+ {
+ Hardware->maxOutstandingReads = 0x00010;
+ }
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00470, &debugControl0));
+
+ if (debugControl0 & (1 << 16))
+ {
+ Identity->chipFlags |= gcvCHIP_FLAG_MSAA_COHERENCEY_ECO_FIX;
+ }
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x000A4, &chipInfo));
+
+ if (((((gctUINT32) (chipInfo)) >> (0 ?
+ 21:21) & ((gctUINT32) ((((1 ?
+ 21:21) - (0 ?
+ 21:21) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 21:21) - (0 ?
+ 21:21) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ?
+ 21:21) - (0 ?
+ 21:21) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 21:21) - (0 ? 21:21) + 1))))))))
+ {
+ Identity->chipFlags |= gcvCHIP_AXI_BUS128_BITS;
+ }
+
+ gckOS_QueryOption(Os, "platformFlagBits", &Identity->platformFlagBits);
+
+ /* Success. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_GetHardwareSignature(
+ IN gckHARDWARE Hardware,
+ IN gckOS Os,
+ IN gceCORE Core,
+ OUT gcsHARDWARE_SIGNATURE * Signature
+ )
+{
+ gceSTATUS status;
+
+ gctUINT32 chipIdentity;
+
+ gcmkHEADER_ARG("Os=0x%x", Os);
+
+ /***************************************************************************
+ ** Get chip ID and revision.
+ */
+
+ /* Read chip identity register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00018,
+ &chipIdentity));
+
+ /* Special case for older graphic cores. */
+ if (((((gctUINT32) (chipIdentity)) >> (0 ?
+ 31:24) & ((gctUINT32) ((((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1)))))) == (0x01 & ((gctUINT32) ((((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ? 31:24) + 1))))))))
+ {
+ Signature->chipModel = gcv500;
+ Signature->chipRevision = (((((gctUINT32) (chipIdentity)) >> (0 ? 15:12)) & ((gctUINT32) ((((1 ? 15:12) - (0 ? 15:12) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:12) - (0 ? 15:12) + 1)))))) );
+ }
+
+ else
+ {
+ /* Read chip identity register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00020,
+ (gctUINT32_PTR) &Signature->chipModel));
+
+ /* Read CHIP_REV register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00024,
+ &Signature->chipRevision));
+ }
+
+ /***************************************************************************
+ ** Get chip features.
+ */
+
+ /* Read chip feature register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x0001C,
+ &Signature->chipFeatures));
+
+ if (((Signature->chipModel == gcv500) && (Signature->chipRevision < 2))
+ || ((Signature->chipModel == gcv300) && (Signature->chipRevision < 0x2000))
+ )
+ {
+ /* GC500 rev 1.x and GC300 rev < 2.0 doesn't have these registers. */
+ Signature->chipMinorFeatures = 0;
+ Signature->chipMinorFeatures1 = 0;
+ Signature->chipMinorFeatures2 = 0;
+ }
+ else
+ {
+ /* Read chip minor feature register #0. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00034,
+ &Signature->chipMinorFeatures));
+
+ if (((((gctUINT32) (Signature->chipMinorFeatures)) >> (0 ?
+ 21:21) & ((gctUINT32) ((((1 ?
+ 21:21) - (0 ?
+ 21:21) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 21:21) - (0 ?
+ 21:21) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ?
+ 21:21) - (0 ?
+ 21:21) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 21:21) - (0 ? 21:21) + 1)))))))
+ )
+ {
+ /* Read chip minor features register #1. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00074,
+ &Signature->chipMinorFeatures1));
+
+ /* Read chip minor features register #2. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Os, Core,
+ 0x00084,
+ &Signature->chipMinorFeatures2));
+ }
+ else
+ {
+ /* Chip doesn't has minor features register #1 or 2 or 3 or 4 or 5. */
+ Signature->chipMinorFeatures1 = 0;
+ Signature->chipMinorFeatures2 = 0;
+ }
+ }
+
+ /* Success. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/* Set to 1 to enable module clock gating debug function.
+* Following options take effect when it is set to 1.
+*/
+#define gcdDEBUG_MODULE_CLOCK_GATING 0
+/* Set to 1 to disable module clock gating of all modules. */
+#define gcdDISABLE_MODULE_CLOCK_GATING 0
+/* Set to 1 to disable module clock gating of each module. */
+#define gcdDISABLE_STARVE_MODULE_CLOCK_GATING 0
+#define gcdDISABLE_FE_CLOCK_GATING 0
+#define gcdDISABLE_PE_CLOCK_GATING 0
+#define gcdDISABLE_SH_CLOCK_GATING 0
+#define gcdDISABLE_PA_CLOCK_GATING 0
+#define gcdDISABLE_SE_CLOCK_GATING 0
+#define gcdDISABLE_RA_CLOCK_GATING 0
+#define gcdDISABLE_RA_EZ_CLOCK_GATING 0
+#define gcdDISABLE_RA_HZ_CLOCK_GATING 0
+#define gcdDISABLE_TX_CLOCK_GATING 0
+#define gcdDISABLE_TFB_CLOCK_GATING 0
+#define gcdDISABLE_GPIPE_CLOCK_GATING 0
+#define gcdDISABLE_BLT_CLOCK_GATING 0
+#define gcdDISABLE_TPG_CLOCK_GATING 0
+#define gcdDISABLE_VX_CLOCK_GATING 0
+
+#if gcdDEBUG_MODULE_CLOCK_GATING
+gceSTATUS
+_ConfigureModuleLevelClockGating(
+ gckHARDWARE Hardware
+ )
+{
+ gctUINT32 data;
+
+ gcmkVERIFY_OK(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &data));
+
+#if gcdDISABLE_FE_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1))))))) << (0 ?
+ 0:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
+#endif
+
+#if gcdDISABLE_PE_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)));
+#endif
+
+#if gcdDISABLE_SH_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)));
+#endif
+
+#if gcdDISABLE_PA_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1))))))) << (0 ?
+ 4:4))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4)));
+#endif
+
+#if gcdDISABLE_SE_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)));
+#endif
+
+#if gcdDISABLE_RA_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)));
+#endif
+
+#if gcdDISABLE_TX_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1))))))) << (0 ?
+ 7:7))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7)));
+#endif
+
+#if gcdDISABLE_RA_EZ_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)));
+#endif
+
+#if gcdDISABLE_RA_HZ_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1))))))) << (0 ?
+ 17:17))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 17:17) - (0 ? 17:17) + 1))))))) << (0 ? 17:17)));
+#endif
+
+#if gcdDISABLE_TFB_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1))))))) << (0 ?
+ 19:19))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)));
+#endif
+
+#if gcdDISABLE_GPIPE_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1))))))) << (0 ?
+ 22:22))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 22:22) - (0 ? 22:22) + 1))))))) << (0 ? 22:22)));
+#endif
+
+#if gcdDISABLE_BLT_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1))))))) << (0 ?
+ 20:20))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 20:20) - (0 ? 20:20) + 1))))))) << (0 ? 20:20)));
+#endif
+
+#if gcdDISABLE_TPG_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1))))))) << (0 ?
+ 18:18))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 18:18) - (0 ? 18:18) + 1))))))) << (0 ? 18:18)));
+#endif
+
+#if gcdDISABLE_VX_CLOCK_GATING
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 21:21) - (0 ?
+ 21:21) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 21:21) - (0 ?
+ 21:21) + 1))))))) << (0 ?
+ 21:21))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 21:21) - (0 ?
+ 21:21) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 21:21) - (0 ? 21:21) + 1))))))) << (0 ? 21:21)));
+#endif
+
+ gcmkVERIFY_OK(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ data));
+
+#if gcdDISABLE_STARVE_MODULE_CLOCK_GATING
+ gcmkVERIFY_OK(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress +
+ 0x00100,
+ &data));
+
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)));
+
+ gcmkVERIFY_OK(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00100,
+ data));
+
+#endif
+
+#if gcdDISABLE_MODULE_CLOCK_GATING
+ gcmkVERIFY_OK(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress +
+ 0x00100,
+ &data));
+
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1))))))) << (0 ?
+ 0:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
+
+
+ gcmkVERIFY_OK(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00100,
+ data));
+#endif
+
+ return gcvSTATUS_OK;
+}
+#endif
+
+static void
+_PowerStateTimerFunc(
+ gctPOINTER Data
+ )
+{
+ gckHARDWARE hardware = (gckHARDWARE)Data;
+
+ gcmkVERIFY_OK(gckHARDWARE_SetPowerState(hardware, hardware->nextPowerState));
+}
+
+static gceSTATUS
+_VerifyDMA(
+ IN gckOS Os,
+ IN gceCORE Core,
+ gctUINT32_PTR Address1,
+ gctUINT32_PTR Address2,
+ gctUINT32_PTR State1,
+ gctUINT32_PTR State2
+ )
+{
+ gceSTATUS status;
+ gctUINT32 i;
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00660, State1));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00660, State1));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00664, Address1));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00664, Address1));
+
+ for (i = 0; i < 500; i += 1)
+ {
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00660, State2));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00660, State2));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00664, Address2));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00664, Address2));
+
+ if (*Address1 != *Address2)
+ {
+ break;
+ }
+
+ if (*State1 != *State2)
+ {
+ break;
+ }
+ }
+
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_DumpDebugRegisters(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gcsiDEBUG_REGISTERS_PTR Descriptor
+ )
+{
+/* If this value is changed, print formats need to be changed too. */
+#define REG_PER_LINE 8
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT32 select;
+ gctUINT i, j, pipe;
+ gctUINT32 datas[REG_PER_LINE];
+ gctUINT32 oldControl, control;
+
+ gcmkHEADER_ARG("Os=0x%X Descriptor=0x%X", Os, Descriptor);
+
+ /* Record control. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x0, &oldControl));
+
+ for (pipe = 0; pipe < 4; pipe++)
+ {
+ if (!Descriptor->avail)
+ {
+ continue;
+ }
+ if (!(Descriptor->pipeMask & (1 << pipe)))
+ {
+ continue;
+ }
+
+ gcmkPRINT_N(8, " %s[%d] debug registers:\n", Descriptor->module, pipe);
+
+ /* Switch pipe. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x0, &control));
+ control &= ~(0xF << 20);
+ control |= (pipe << 20);
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x0, control));
+
+ gcmkASSERT(!(Descriptor->count % REG_PER_LINE));
+
+ for (i = 0; i < Descriptor->count; i += REG_PER_LINE)
+ {
+ /* Select of first one in the group. */
+ select = i + Descriptor->selectStart;
+
+ /* Read a group of registers. */
+ for (j = 0; j < REG_PER_LINE; j++)
+ {
+ /* Shift select to right position. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, (select + j) << Descriptor->shift));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, Descriptor->data, &datas[j]));
+ }
+
+ gcmkPRINT_N(32, " [%02X] %08X %08X %08X %08X %08X %08X %08X %08X\n",
+ select, datas[0], datas[1], datas[2], datas[3], datas[4], datas[5], datas[6], datas[7]);
+ }
+ }
+
+ /* Restore control. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x0, oldControl));
+
+OnError:
+ /* Return the error. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_DumpLinkStack(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gcsiDEBUG_REGISTERS_PTR Descriptor
+ )
+{
+ /* Get wrptr */
+ gctUINT32 shift = Descriptor->shift;
+ gctUINT32 pointerSelect = 0xE << shift;
+ gctUINT32 pointer, wrPtr, rdPtr, links[16];
+ gctUINT32 stackSize = 16;
+ gctUINT32 oldestPtr = 0;
+ gctUINT32 i;
+
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, pointerSelect));
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(Os, Core, Descriptor->data, &pointer));
+
+ wrPtr = (pointer & 0xF0) >> 4;
+ rdPtr = pointer & 0xF;
+
+ /* Move rdptr to the oldest one (next one to the latest one. ) */
+ oldestPtr = (wrPtr + 1) % stackSize;
+
+ while (rdPtr != oldestPtr)
+ {
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, 0x0));
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, 0xF << shift));
+
+
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, pointerSelect));
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(Os, Core, Descriptor->data, &pointer));
+
+ rdPtr = pointer & 0xF;
+ }
+
+ gcmkPRINT(" Link stack:");
+
+ /* Read from stack bottom*/
+ for (i = 0; i < stackSize; i++)
+ {
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, 0xD << shift));
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(Os, Core, Descriptor->data, &links[i]));
+
+ /* Advance rdPtr. */
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, 0x0));
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, 0xF << shift));
+ }
+
+ /* Print. */
+ for (i = 0; i < stackSize; i += 4)
+ {
+ gcmkPRINT_N(32, " [0x%02X] 0x%08X [0x%02X] 0x%08X [0x%02X] 0x%08X [0x%02X] 0x%08X\n",
+ i, links[i], i + 1, links[i + 1], i + 2, links[i + 2], i + 3, links[i + 3]);
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_DumpFEStack(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gcsiDEBUG_REGISTERS_PTR Descriptor
+ )
+{
+ gctUINT i;
+ gctINT j;
+ gctUINT32 stack[32][2];
+ gctUINT32 link[32];
+
+ static gcsFE_STACK _feStacks[] =
+ {
+ { "PRE_STACK", 32, 0x1A, 0x9A, 0x00, 0x1B, 0x1E },
+ { "CMD_STACK", 32, 0x1C, 0x9C, 0x1E, 0x1D, 0x1E },
+ };
+
+ for (i = 0; i < gcmCOUNTOF(_feStacks); i++)
+ {
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, _feStacks[i].clear));
+
+ for (j = 0; j < _feStacks[i].count; j++)
+ {
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, _feStacks[i].highSelect));
+
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(Os, Core, Descriptor->data, &stack[j][0]));
+
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, _feStacks[i].lowSelect));
+
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(Os, Core, Descriptor->data, &stack[j][1]));
+
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, _feStacks[i].next));
+
+ if (_feStacks[i].linkSelect)
+ {
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Os, Core, Descriptor->index, _feStacks[i].linkSelect));
+
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(Os, Core, Descriptor->data, &link[j]));
+ }
+ }
+
+ gcmkPRINT(" %s:", _feStacks[i].name);
+
+ for (j = 31; j >= 3; j -= 4)
+ {
+ gcmkPRINT(" %08X %08X %08X %08X %08X %08X %08X %08X",
+ stack[j][0], stack[j][1], stack[j - 1][0], stack[j - 1][1],
+ stack[j - 2][0], stack[j - 2][1], stack[j - 3][0], stack[j - 3][1]);
+ }
+
+ if (_feStacks[i].linkSelect)
+ {
+ gcmkPRINT(" LINK_STACK:");
+
+ for (j = 31; j >= 3; j -= 4)
+ {
+ gcmkPRINT(" %08X %08X %08X %08X %08X %08X %08X %08X",
+ link[j], link[j], link[j - 1], link[j - 1],
+ link[j - 2], link[j - 2], link[j - 3], link[j - 3]);
+ }
+ }
+
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_IsGPUPresent(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gcsHARDWARE_SIGNATURE signature;
+ gctUINT32 control;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ &control));
+
+ control = ((((gctUINT32) (control)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)));
+ control = ((((gctUINT32) (control)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1))))))) << (0 ?
+ 0:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ control));
+
+ gckOS_ZeroMemory((gctPOINTER)&signature, gcmSIZEOF(gcsHARDWARE_SIGNATURE));
+
+ /* Identify the hardware. */
+ gcmkONERROR(_GetHardwareSignature(Hardware,
+ Hardware->os,
+ Hardware->core,
+ &signature));
+
+ /* Check if these are the same values as saved before. */
+ if ((Hardware->signature.chipModel != signature.chipModel)
+ || (Hardware->signature.chipRevision != signature.chipRevision)
+ || (Hardware->signature.chipFeatures != signature.chipFeatures)
+ || (Hardware->signature.chipMinorFeatures != signature.chipMinorFeatures)
+ || (Hardware->signature.chipMinorFeatures1 != signature.chipMinorFeatures1)
+ || (Hardware->signature.chipMinorFeatures2 != signature.chipMinorFeatures2)
+ )
+ {
+ gcmkPRINT("[galcore]: GPU is not present.");
+ gcmkONERROR(gcvSTATUS_GPU_NOT_RESPONDING);
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the error. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_FlushCache(
+ gckHARDWARE Hardware,
+ gckCOMMAND Command
+ )
+{
+ gceSTATUS status;
+ gctUINT32 bytes, requested;
+ gctPOINTER buffer;
+
+ /* Get the size of the flush command. */
+ gcmkONERROR(gckHARDWARE_Flush(Hardware,
+ gcvFLUSH_ALL,
+ gcvNULL,
+ &requested));
+
+ /* Reserve space in the command queue. */
+ gcmkONERROR(gckCOMMAND_Reserve(Command,
+ requested,
+ &buffer,
+ &bytes));
+
+ /* Append a flush. */
+ gcmkONERROR(gckHARDWARE_Flush(
+ Hardware, gcvFLUSH_ALL, buffer, &bytes
+ ));
+
+ /* Execute the command queue. */
+ gcmkONERROR(gckCOMMAND_Execute(Command, requested));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+static gctBOOL
+_IsGPUIdle(
+ IN gctUINT32 Idle
+ )
+{
+ return Idle == 0x7FFFFFFF;
+}
+
+static gctBOOL
+_QueryFeatureDatabase(
+ IN gckHARDWARE Hardware,
+ IN gceFEATURE Feature
+ )
+{
+ gctBOOL available;
+
+ gcsFEATURE_DATABASE *database = Hardware->featureDatabase;
+
+ gcmkHEADER_ARG("Hardware=0x%x Feature=%d", Hardware, Feature);
+
+ /* Only features needed by common kernel logic added here. */
+ switch (Feature)
+ {
+ case gcvFEATURE_END_EVENT:
+ available = gcvFALSE;
+ break;
+
+ case gcvFEATURE_MC20:
+ available = database->REG_MC20;
+ break;
+
+ case gcvFEATURE_EARLY_Z:
+ available = database->REG_NoEZ == 0;
+ break;
+
+ case gcvFEATURE_HZ:
+ available = database->REG_HierarchicalZ;
+ break;
+
+ case gcvFEATURE_NEW_HZ:
+ available = database->REG_NewHZ;
+ break;
+
+ case gcvFEATURE_FAST_MSAA:
+ available = database->REG_FastMSAA;
+ break;
+
+ case gcvFEATURE_SMALL_MSAA:
+ available = database->REG_SmallMSAA;
+ break;
+
+ case gcvFEATURE_DYNAMIC_FREQUENCY_SCALING:
+ /* This feature doesn't apply for 2D cores. */
+ available = database->REG_DynamicFrequencyScaling && database->REG_Pipe3D;
+
+ if (Hardware->identity.chipModel == gcv1000 &&
+ (Hardware->identity.chipRevision == 0x5039 ||
+ Hardware->identity.chipRevision == 0x5040))
+ {
+ available = gcvFALSE;
+ }
+ break;
+
+ case gcvFEATURE_ACE:
+ available = database->REG_ACE;
+ break;
+
+ case gcvFEATURE_HALTI2:
+ available = database->REG_Halti2;
+ break;
+
+ case gcvFEATURE_PIPE_2D:
+ available = database->REG_Pipe2D;
+ break;
+
+ case gcvFEATURE_PIPE_3D:
+#if gcdENABLE_3D
+ available = database->REG_Pipe3D;
+#else
+ available = gcvFALSE;
+#endif
+ break;
+
+ case gcvFEATURE_FC_FLUSH_STALL:
+ available = database->REG_FcFlushStall;
+ break;
+
+ case gcvFEATURE_BLT_ENGINE:
+ available = database->REG_BltEngine;
+ break;
+
+ case gcvFEATURE_HALTI0:
+ available = database->REG_Halti0;
+ break;
+
+ case gcvFEATURE_FE_ALLOW_STALL_PREFETCH_ENG:
+ available = database->REG_FEAllowStallPrefetchEng;
+ break;
+
+ case gcvFEATURE_MMU:
+ available = database->REG_MMU;
+ break;
+
+ case gcvFEATURE_FENCE_64BIT:
+ available = database->FENCE_64BIT;
+ break;
+
+ case gcvFEATURE_TEX_BASELOD:
+ available = database->REG_Halti2;
+
+ if (_IsHardwareMatch(Hardware, gcv900, 0x5250))
+ {
+ available = gcvTRUE;
+ }
+ break;
+
+ case gcvFEATURE_TEX_CACHE_FLUSH_FIX:
+ available = database->REG_Halti5;
+ break;
+
+ case gcvFEATURE_BUG_FIXES1:
+ available = database->REG_BugFixes1;
+ break;
+
+ case gcvFEATURE_MULTI_SOURCE_BLT:
+ available = database->REG_MultiSourceBlt;
+ break;
+
+ case gcvFEATURE_HALTI5:
+ available = database->REG_Halti5;
+ break;
+
+ case gcvFEATURE_FAST_CLEAR:
+ available = database->REG_FastClear;
+
+ if (Hardware->identity.chipModel == gcv700)
+ {
+ available = gcvFALSE;
+ }
+ break;
+
+ case gcvFEATURE_BUG_FIXES7:
+ available = database->REG_BugFixes7;
+ break;
+
+ case gcvFEATURE_ZCOMPRESSION:
+ available = database->REG_ZCompression;
+ break;
+
+ case gcvFEATURE_SHADER_HAS_INSTRUCTION_CACHE:
+ available = database->REG_InstructionCache;
+ break;
+
+ case gcvFEATURE_YUV420_TILER:
+ available = database->REG_YUV420Tiler;
+ break;
+
+ case gcvFEATURE_2DPE20:
+ available = database->REG_2DPE20;
+ break;
+
+ case gcvFEATURE_DITHER_AND_FILTER_PLUS_ALPHA_2D:
+ available = database->REG_DitherAndFilterPlusAlpha2D;
+ break;
+
+ case gcvFEATURE_ONE_PASS_2D_FILTER:
+ available = database->REG_OnePass2DFilter;
+ break;
+
+ case gcvFEATURE_HALTI1:
+ available = database->REG_Halti1;
+ break;
+
+ case gcvFEATURE_HALTI3:
+ available = database->REG_Halti3;
+ break;
+
+ case gcvFEATURE_HALTI4:
+ available = database->REG_Halti4;
+ break;
+
+ case gcvFEATURE_GEOMETRY_SHADER:
+ available = database->REG_GeometryShader;
+ break;
+
+ case gcvFEATURE_TESSELLATION:
+ available = database->REG_TessellationShaders;
+ break;
+
+ case gcvFEATURE_GENERIC_ATTRIB:
+ available = database->REG_Generics;
+ break;
+
+ case gcvFEATURE_TEXTURE_LINEAR:
+ available = database->REG_LinearTextureSupport;
+ break;
+
+ case gcvFEATURE_TX_FILTER:
+ available = database->REG_TXFilter;
+ break;
+
+ case gcvFEATURE_TX_SUPPORT_DEC:
+ available = database->REG_TXSupportDEC;
+ break;
+
+ case gcvFEATURE_TX_FRAC_PRECISION_6BIT:
+ available = database->REG_TX6bitFrac;
+ break;
+
+ case gcvFEATURE_TEXTURE_ASTC:
+ available = database->REG_TXEnhancements4 && !database->NO_ASTC;
+ break;
+
+ case gcvFEATURE_SHADER_ENHANCEMENTS2:
+ available = database->REG_SHEnhancements2;
+ break;
+
+ case gcvFEATURE_BUG_FIXES18:
+ available = database->REG_BugFixes18;
+ break;
+
+ case gcvFEATURE_64K_L2_CACHE:
+ available = gcvFALSE;
+ break;
+
+ case gcvFEATURE_BUG_FIXES4:
+ available = database->REG_BugFixes4;
+ break;
+
+ case gcvFEATURE_BUG_FIXES12:
+ available = database->REG_BugFixes12;
+ break;
+
+ case gcvFEATURE_HW_TFB:
+ available = database->HWTFB;
+ break;
+
+ case gcvFEATURE_SNAPPAGE_CMD_FIX:
+ available = database->SH_SNAP2PAGE_FIX;
+ break;
+
+ case gcvFEATURE_SECURITY:
+ available = database->SECURITY;
+ break;
+
+ case gcvFEATURE_TX_DESCRIPTOR:
+ available = database->REG_Halti5;
+ break;
+
+ case gcvFEATURE_TX_DESC_CACHE_CLOCKGATE_FIX:
+ available = database->TX_DESC_CACHE_CLOCKGATE_FIX;
+ break;
+
+ case gcvFEATURE_ROBUSTNESS:
+ available = database->ROBUSTNESS;
+ break;
+
+ case gcvFEATURE_SNAPPAGE_CMD:
+ available = database->SNAPPAGE_CMD;
+ break;
+
+ case gcvFEATURE_HALF_FLOAT_PIPE:
+ available = database->REG_HalfFloatPipe;
+ break;
+
+ case gcvFEATURE_SH_INSTRUCTION_PREFETCH:
+ available = database->SH_ICACHE_PREFETCH;
+ break;
+
+ case gcvFEATURE_FE_NEED_DUMMYDRAW:
+ available = database->FE_NEED_DUMMYDRAW;
+
+ if (_IsHardwareMatch(Hardware, gcv600, 0x4653))
+ {
+ available = gcvTRUE;
+ }
+
+ break;
+
+ case gcvFEATURE_DEC300_COMPRESSION:
+ available = database->REG_DEC;
+ break;
+
+ case gcvFEATURE_DEC400_COMPRESSION:
+ available = database->G2D_DEC400;
+ break;
+
+ case gcvFEATURE_TPC_COMPRESSION:
+ available = database->REG_ThirdPartyCompression;
+ break;
+
+ case gcvFEATURE_TPCV11_COMPRESSION:
+ available = database->G2D_3rd_PARTY_COMPRESSION_1_1;
+ break;
+
+ case gcvFEATURE_USC_DEFER_FILL_FIX:
+ available = database->USC_DEFER_FILL_FIX;
+ break;
+
+ case gcvFEATURE_USC:
+ available = database->REG_Halti5;
+ break;
+
+ case gcvFEATURE_RA_CG_FIX:
+ available = database->RA_CG_FIX;
+ break;
+
+ case gcvFEATURE_MULTI_CLUSTER:
+ available = database->MULTI_CLUSTER;
+ break;
+
+ case gcvFEATURE_ZERO_ATTRIB_SUPPORT:
+ available = database->REG_Halti4;
+ break;
+
+ case gcvFEATURE_SH_CLOCK_GATE_FIX:
+ available = database->SH_CLOCK_GATE_FIX;
+ break;
+
+ case gcvFEATURE_GPIPE_CLOCK_GATE_FIX:
+ available = gcvFALSE;
+ break;
+
+ case gcvFEATURE_NEW_GPIPE:
+ available = database->NEW_GPIPE;
+ break;
+
+ case gcvFEATURE_MULTI_CORE_BLOCK_SET_CONFIG2:
+ available = database->MULTI_CORE_BLOCK_SET_CONFIG2;
+ break;
+
+ case gcvFEATURE_SECURITY_AHB:
+ available = database->SECURITY_AHB;
+ break;
+
+ case gcvFEATURE_SMALL_BATCH:
+ available = database->SMALLBATCH;
+ break;
+
+ case gcvFEATURE_ASYNC_BLIT:
+ available = database->ASYNC_BLT;
+ break;
+
+ case gcvFEATURE_PSCS_THROTTLE:
+ available = database->PSCS_THROTTLE;
+ break;
+
+ case gcvFEATURE_SEPARATE_LS:
+ available = database->SEPARATE_LS;
+ break;
+
+ case gcvFEATURE_MCFE:
+ available = database->MCFE;
+ break;
+
+ case gcvFEATURE_COMPUTE_ONLY:
+ available = database->COMPUTE_ONLY;
+ break;
+
+ case gcvFEATURE_USC_FULLCACHE_FIX:
+ available = database->USC_FULL_CACHE_FIX;
+ break;
+
+ case gcvFEATURE_PE_TILE_CACHE_FLUSH_FIX:
+ available = database->PE_TILE_CACHE_FLUSH_FIX;
+ break;
+
+ case gcvFEATURE_TILE_STATUS_2BITS:
+ available = database->REG_TileStatus2Bits;
+ break;
+
+ case gcvFEATURE_128BTILE:
+ available = database->CACHE128B256BPERLINE;
+ break;
+
+ case gcvFEATURE_COMPRESSION_DEC400:
+ available = database->DEC400;
+ break;
+
+ case gcvFEATURE_SUPPORT_GCREGTX:
+ available = database->REG_Halti1;
+
+ if (Hardware->identity.chipModel == gcv880 &&
+ ((Hardware->identity.chipRevision & 0xfff0) == 0x5120))
+ {
+ available = gcvTRUE;
+ }
+ break;
+
+ case gcvFEATURE_MSAA_FRAGMENT_OPERATION:
+ available = database->MSAA_FRAGMENT_OPERATION;
+ break;
+
+ case gcvFEATURE_OCB_COUNTER:
+ available = database->OCB_COUNTER;
+ break;
+
+ case gcvFEATURE_NN_ENGINE:
+ available = database->NNCoreCount > 0;
+ break;
+
+ case gcvFEATURE_TP_ENGINE:
+ available = database->TP_ENGINE;
+ break;
+
+ case gcvFEATURE_HI_REORDER_FIX:
+ available = database->HI_REORDER_FIX;
+ break;
+
+ default:
+ gcmkFATAL("Invalid feature has been requested.");
+ available = gcvFALSE;
+ }
+
+ gcmkFOOTER_ARG("%d", available ? gcvSTATUS_TRUE : gcvSTATUS_FALSE);
+ return available;
+}
+
+static void
+_ConfigurePolicyID(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gctUINT32 policyID;
+ gctUINT32 auxBit = ~0U;
+ gctUINT32 axiConfig;
+ gckOS os = Hardware->os;
+ gceCORE core = Hardware->core;
+ gctUINT32 i;
+ gctUINT32 offset;
+ gctUINT32 shift;
+ gctUINT32 currentAxiConfig;
+
+ status = gckOS_GetPolicyID(os, gcvVIDMEM_TYPE_GENERIC, &policyID, &axiConfig);
+
+ if (status == gcvSTATUS_NOT_SUPPORTED)
+ {
+ /* No customized policyID setting. */
+ return;
+ }
+
+ for (i = 0; i < 16; i++)
+ {
+ /* Mapping 16 surface type.*/
+ status = gckOS_GetPolicyID(os, (gceVIDMEM_TYPE) i, &policyID, &axiConfig);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ if (auxBit == ~0U)
+ {
+ /* There is a customized policyID setting for this type. */
+ auxBit = (policyID >> 4) & 0x1;
+ }
+ else
+ {
+ /* Check whether this bit changes. */
+ if (auxBit != ((policyID >> 4) & 0x1))
+ {
+ gcmkPRINT("[galcore]: AUX_BIT changes");
+ return;
+ }
+ }
+
+ offset = policyID >> 1;
+
+ shift = (policyID & 0x1) * 16;
+
+ axiConfig &= 0xFFFF;
+
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(
+ os,
+ core,
+ (0x0070 + offset) << 2,
+ &currentAxiConfig
+ ));
+
+ currentAxiConfig |= (axiConfig << shift);
+
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(
+ os,
+ core,
+ (0x0070 + offset) << 2,
+ currentAxiConfig
+ ));
+ }
+ }
+
+ if (auxBit != ~0U)
+ {
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(
+ os,
+ core,
+ 0x000EC,
+ ((((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) (0x01 & ((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1))))))) << (0 ?
+ 8:8))) | (((gctUINT32) ((gctUINT32) (auxBit) & ((gctUINT32) ((((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 8:8) - (0 ? 8:8) + 1))))))) << (0 ? 8:8)))
+ ));
+ }
+}
+/****************************
+** Initialise hardware options
+*/
+static void
+_SetHardwareOptions(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gctUINT64 data = 0;
+ gcsHAL_QUERY_CHIP_OPTIONS *options = &Hardware->options;
+ gcsFEATURE_DATABASE *database = Hardware->featureDatabase;
+ gctBOOL featureUSC = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_USC) ? gcvTRUE : gcvFALSE;
+ gctBOOL featureSeparateLS = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_SEPARATE_LS) ? gcvTRUE : gcvFALSE;
+ gctBOOL featureComputeOnly = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_COMPUTE_ONLY) ? gcvTRUE : gcvFALSE;
+ gctBOOL featureTS = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_TESSELLATION) ? gcvTRUE : gcvFALSE;
+ gctUINT32 featureL1CacheSize = database->L1CacheSize;
+ gctUINT32 featureUSCMaxPages = database->USC_MAX_PAGES;
+
+
+ status = gckOS_QueryOption(Hardware->os, "powerManagement", &data);
+ options->powerManagement = (data != 0);
+
+ if (status == gcvSTATUS_NOT_SUPPORTED)
+ {
+ /* Enable power management by default. */
+ options->powerManagement = gcvTRUE;
+ }
+
+ /* Disable profiler by default */
+ status = gckOS_QueryOption(Hardware->os, "gpuProfiler", &data);
+ options->gpuProfiler = (data != 0);
+
+ if (status == gcvSTATUS_NOT_SUPPORTED)
+ {
+ /* Disable profiler by default */
+ options->gpuProfiler= gcvFALSE;
+ }
+
+ status = gckOS_QueryOption(Hardware->os, "mmu", &data);
+ options->enableMMU = (data != 0);
+
+ if (status == gcvSTATUS_NOT_SUPPORTED)
+ {
+ /* Disable MMU if we can't get result from OS layer query */
+ options->enableMMU = gcvFALSE;
+ }
+
+ gcmCONFIGUSC2(gcmk, featureUSC, featureSeparateLS, featureComputeOnly, featureTS,
+ featureL1CacheSize, featureUSCMaxPages,
+ Hardware->options.uscAttribCacheRatio, Hardware->options.uscL1CacheRatio);
+
+ status = gckOS_QueryOption(Hardware->os, "smallBatch", &data);
+ options->smallBatch = (data != 0);
+
+ if (status == gcvSTATUS_NOT_SUPPORTED)
+ {
+ options->smallBatch = gcvTRUE;
+ }
+
+ status = gckOS_QueryOption(Hardware->os, "userClusterMask", &data);
+ options->userClusterMask = (gctUINT32)data;
+
+ if (status == gcvSTATUS_NOT_SUPPORTED || (options->userClusterMask == 0))
+ {
+ /* use all clusters identified in database */
+ options->userClusterMask = Hardware->identity.clusterAvailMask;
+ }
+ else if (options->userClusterMask & (~Hardware->identity.clusterAvailMask))
+ {
+ gcmkPRINT("%s(%d): user cluster mask(0x%x) must be a subset of available clusters(0x%x),ignored it!",
+ __FUNCTION__, __LINE__, options->userClusterMask, Hardware->identity.clusterAvailMask);
+ options->userClusterMask= Hardware->identity.clusterAvailMask;
+ }
+
+ options->secureMode = gcvSECURE_NONE;
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_SECURITY))
+ {
+ gcmkASSERT(gcvSTATUS_TRUE == gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_SECURITY_AHB));
+
+ options->secureMode = gcvSECURE_IN_NORMAL;
+
+ status = gckOS_QueryOption(Hardware->os, "TA", &data);
+
+ if (gcmIS_SUCCESS(status) && data)
+ {
+ 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.
+*/
+static void
+gckSTATETIMER_Reset(
+ IN gcsSTATETIMER * StateTimer,
+ IN gctUINT64 Start
+ )
+{
+ gctUINT64 now;
+
+ if (Start)
+ {
+ now = Start;
+ }
+ else
+ {
+ gckOS_GetProfileTick(&now);
+ }
+
+ StateTimer->recent = StateTimer->start = now;
+
+ gckOS_ZeroMemory(StateTimer->elapse, gcmSIZEOF(StateTimer->elapse));
+}
+
+gceSTATUS
+gckHARDWARE_StartTimerReset(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcmkHEADER();
+
+ gckSTATETIMER_Reset(&Hardware->powerStateCounter, 0);
+
+ gcmkFOOTER();
+ return status;
+}
+
+static void
+gckSTATETIMER_Accumulate(
+ IN gcsSTATETIMER * StateTimer,
+ IN gceCHIPPOWERSTATE OldState
+ )
+{
+ gctUINT64 now;
+ gctUINT64 elapse;
+
+ gckOS_GetProfileTick(&now);
+
+ elapse = now - StateTimer->recent;
+
+ StateTimer->recent = now;
+
+ StateTimer->elapse[OldState] += elapse;
+}
+
+static void
+gckSTATETIMER_Query(
+ IN gcsSTATETIMER * StateTimer,
+ IN gceCHIPPOWERSTATE State,
+ OUT gctUINT64_PTR On,
+ OUT gctUINT64_PTR Off,
+ OUT gctUINT64_PTR Idle,
+ OUT gctUINT64_PTR Suspend
+ )
+{
+ gckSTATETIMER_Accumulate(StateTimer, State);
+
+ *On = StateTimer->elapse[gcvPOWER_ON];
+ *Off = StateTimer->elapse[gcvPOWER_OFF];
+ *Idle = StateTimer->elapse[gcvPOWER_IDLE];
+ *Suspend = StateTimer->elapse[gcvPOWER_SUSPEND];
+}
+
+static gceSTATUS
+_PrepareFunctions(
+ IN gckHARDWARE Hardware
+ );
+
+static gceSTATUS
+_InitPageTableArray(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gcmkHEADER_ARG("Hardware=%p", Hardware);
+
+ if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL)
+ {
+ gcePOOL pool = gcvPOOL_DEFAULT;
+ gctUINT32 flags = gcvALLOC_FLAG_CONTIGUOUS;
+
+#if defined(CONFIG_ZONE_DMA32)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
+ flags |= gcvALLOC_FLAG_4GB_ADDR;
+#endif
+#endif
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ flags |= gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+ Hardware->pagetableArray.size = 1024;
+
+ /* Allocate mmu table array within 32bit space */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ Hardware->kernel,
+ 64,
+ gcvVIDMEM_TYPE_COMMAND,
+ flags,
+ &Hardware->pagetableArray.size,
+ &pool,
+ &Hardware->pagetableArray.videoMem
+ ));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ Hardware->kernel,
+ Hardware->pagetableArray.videoMem,
+ gcvFALSE,
+ gcvFALSE,
+ &Hardware->pagetableArray.logical
+ ));
+
+ /* Get CPU physical address. */
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(
+ Hardware->kernel,
+ Hardware->pagetableArray.videoMem,
+ 0,
+ &Hardware->pagetableArray.address
+ ));
+
+ /* Convert to GPU physical address. */
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(
+ Hardware->os,
+ Hardware->pagetableArray.address,
+ &Hardware->pagetableArray.address
+ ));
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (Hardware->pagetableArray.videoMem)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(
+ Hardware->kernel,
+ Hardware->pagetableArray.videoMem
+ ));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_SetupSRAMVidMem(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT i;
+
+ for (i = gcvSRAM_INTERNAL0; i < gcvSRAM_INTER_COUNT; i++)
+ {
+ if (Hardware->identity.sRAMSizes[i] &&
+ (Hardware->identity.sRAMBases[i] != gcvINVALID_PHYSICAL_ADDRESS))
+ {
+ /* If the internal SRAM usage is memory block. */
+ status = gckVIDMEM_Construct(
+ Hardware->os,
+ Hardware->identity.sRAMBases[i],
+ Hardware->identity.sRAMSizes[i],
+ 64,
+ 0,
+ &Hardware->sRAMVidMem[i]
+ );
+
+ if (gcmIS_ERROR(status))
+ {
+ Hardware->identity.sRAMSizes[i] = 0;
+ Hardware->sRAMVidMem[i] = gcvNULL;
+ }
+ else
+ {
+ char sRAMName[20];
+ gctUINT64 data = 0;
+ gctBOOL sRAMRequested;
+
+ gcmkSPRINTF(sRAMName, gcmSIZEOF(sRAMName) - 1, "Galcore core%d sram%d", Hardware->core, i);
+ status = gckOS_QueryOption(Hardware->os, "sRAMRequested", (gctUINT64 *)&data);
+ sRAMRequested = (status == gcvSTATUS_OK) ? (data != 0) : gcvFALSE;
+
+ gcmkONERROR(gckOS_RequestReservedMemory(
+ Hardware->os,
+ Hardware->identity.sRAMBases[i],
+ Hardware->identity.sRAMSizes[i],
+ sRAMName,
+ sRAMRequested,
+ &Hardware->sRAMPhysical[i]
+ ));
+
+ Hardware->sRAMVidMem[i]->physical = Hardware->sRAMPhysical[i];
+ }
+ }
+ }
+
+OnError:
+ return status;
+}
+
+/******************************************************************************\
+****************************** gckHARDWARE API code *****************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** gckHARDWARE_Construct
+**
+** Construct a new gckHARDWARE object.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an initialized gckOS object.
+**
+** gceCORE Core
+** Specified core.
+**
+** OUTPUT:
+**
+** gckHARDWARE * Hardware
+** Pointer to a variable that will hold the pointer to the gckHARDWARE
+** object.
+*/
+gceSTATUS
+gckHARDWARE_Construct(
+ IN gckOS Os,
+ IN gckDEVICE Device,
+ IN gceCORE Core,
+ OUT gckHARDWARE * Hardware
+ )
+{
+ gceSTATUS status;
+ gckHARDWARE hardware = gcvNULL;
+ gctUINT16 data = 0xff00;
+ gctPOINTER pointer = gcvNULL;
+ gctUINT i;
+
+ gcmkHEADER_ARG("Os=0x%x", Os);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Hardware != gcvNULL);
+
+ /* Enable the GPU. */
+ gcmkONERROR(gckOS_SetGPUPower(Os, Core, gcvTRUE, gcvTRUE));
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x00000,
+ 0x00000900));
+
+ /* Allocate the gckHARDWARE object. */
+ gcmkONERROR(gckOS_Allocate(Os,
+ gcmSIZEOF(struct _gckHARDWARE),
+ &pointer));
+
+ gckOS_ZeroMemory(pointer, gcmSIZEOF(struct _gckHARDWARE));
+
+ hardware = (gckHARDWARE) pointer;
+
+ /* Initialize the gckHARDWARE object. */
+ hardware->object.type = gcvOBJ_HARDWARE;
+ hardware->os = Os;
+ hardware->core = Core;
+
+ gcmkONERROR(_GetHardwareSignature(hardware, Os, Core, &hardware->signature));
+
+ /* Identify the hardware. */
+ gcmkONERROR(_IdentifyHardwareByDatabase(hardware, Os, Device, Core, &hardware->identity));
+
+ /* Setup SRAM memory heap. */
+ gcmkONERROR(_SetupSRAMVidMem(hardware));
+
+ _SetHardwareOptions(hardware);
+
+ hardware->mmuVersion = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_MMU);
+
+ /* Get the system's physical base address for old MMU */
+ if (hardware->mmuVersion == 0)
+ {
+ gcmkONERROR(gckOS_GetBaseAddress(Os, &hardware->baseAddress));
+ }
+
+ /* Determine the hardware type */
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_PIPE_3D)
+ && gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_PIPE_2D)
+ )
+ {
+ hardware->type = gcvHARDWARE_3D2D;
+ }
+ else
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_PIPE_2D))
+ {
+ hardware->type = gcvHARDWARE_2D;
+ }
+ else
+ {
+ hardware->type = gcvHARDWARE_3D;
+ }
+
+ hardware->powerBaseAddress
+ = ((hardware->identity.chipModel == gcv300)
+ && (hardware->identity.chipRevision < 0x2000))
+ ? 0x0100
+ : 0x0000;
+
+
+ /* _ResetGPU need powerBaseAddress. */
+ status = _ResetGPU(hardware, Os, Core);
+ if (status != gcvSTATUS_OK)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "_ResetGPU failed: status=%d\n", status);
+ }
+
+#if gcdDEC_ENABLE_AHB
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, gcvCORE_DEC, 0x18180, ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1))))))) << (0 ?
+ 22:22))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 22:22) - (0 ? 22:22) + 1))))))) << (0 ? 22:22)))));
+#endif
+
+ hardware->hasL2Cache = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_64K_L2_CACHE);
+
+ if (!hardware->hasL2Cache)
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x0055C,
+ 0x00FFFFFF));
+ }
+
+ hardware->powerMutex = gcvNULL;
+
+ /* Determine whether bug fixes #1 are present. */
+ hardware->extraEventStates = (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_BUG_FIXES1) == gcvFALSE);
+
+ /* Check if big endian */
+ hardware->bigEndian = (*(gctUINT8 *)&data == 0xff);
+
+ /* Initialize the fast clear. */
+ gcmkONERROR(gckHARDWARE_SetFastClear(hardware, -1, -1));
+
+#if !gcdENABLE_128B_MERGE
+
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_MULTI_SOURCE_BLT))
+ {
+ /* 128B merge is turned on by default. Disable it. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x00558, 0));
+ }
+
+#endif
+
+#if (gcdFPGA_BUILD && 1)
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_TPCV11_COMPRESSION))
+ {
+ gctUINT32 data;
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00558, &data));
+ data |= 0x1 << 27;
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x00558, data));
+ }
+#endif
+
+ {
+ gctUINT32 value;
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x00090, &value));
+#if gcdDEC_ENABLE_AHB
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_DEC300_COMPRESSION))
+ {
+ value |= ~0xFFFFFFBF;
+ }
+ else
+#endif
+ {
+ value &= 0xFFFFFFBF;
+ }
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x00090, value));
+ }
+
+ /* Set power state to ON. */
+ hardware->chipPowerState = gcvPOWER_ON;
+ hardware->clockState = gcvTRUE;
+ hardware->powerState = gcvTRUE;
+ hardware->lastWaitLink = ~0U;
+ hardware->lastEnd = ~0U;
+ hardware->globalSemaphore = gcvNULL;
+#if gcdENABLE_FSCALE_VAL_ADJUST
+ hardware->powerOnFscaleVal = 64;
+#endif
+
+ gcmkONERROR(gckOS_CreateMutex(Os, &hardware->powerMutex));
+ gcmkONERROR(gckOS_CreateSemaphore(Os, &hardware->globalSemaphore));
+
+ gcmkVERIFY_OK(gckOS_CreateTimer(Os,
+ _PowerStateTimerFunc,
+ (gctPOINTER)hardware,
+ &hardware->powerStateTimer));
+
+ for (i = 0; i < gcvENGINE_GPU_ENGINE_COUNT; i++)
+ {
+ gcmkONERROR(gckOS_AtomConstruct(Os, &hardware->pageTableDirty[i]));
+ }
+
+ gcmkONERROR(gckOS_AtomConstruct(Os, &hardware->pendingEvent));
+
+
+#if defined(LINUX) || defined(__QNXNTO__) || defined(UNDER_CE)
+ if (hardware->mmuVersion)
+ {
+ hardware->stallFEPrefetch
+ = gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_FE_ALLOW_STALL_PREFETCH_ENG);
+ }
+ else
+#endif
+ {
+ hardware->stallFEPrefetch =
+ _QueryFeatureDatabase(hardware, gcvFEATURE_MCFE) == gcvFALSE;
+ }
+
+ hardware->minFscaleValue = 1;
+ hardware->waitCount = 200;
+
+ if (_IsHardwareMatch(hardware, gcv600, 0x4653)
+ || _IsHardwareMatch(hardware, gcv400, 0x4645))
+ {
+ hardware->minFscaleValue = MIN_FSCALE_LIMIT;
+ }
+
+#if gcdLINK_QUEUE_SIZE
+ gcmkONERROR(gckQUEUE_Allocate(hardware->os, &hardware->linkQueue, gcdLINK_QUEUE_SIZE));
+#endif
+
+ /* Initialize FEs, either MCFE or wait-link FE. */
+ if (_QueryFeatureDatabase(hardware, gcvFEATURE_MCFE))
+ {
+ hardware->mcfeChannels[0] = gcvMCFE_CHANNEL_SYSTEM;
+ hardware->mcfeChannels[1] = gcvMCFE_CHANNEL_SHADER;
+ hardware->mcfeChannels[2] = gcvMCFE_CHANNEL_NN;
+ hardware->mcfeChannels[3] = gcvMCFE_CHANNEL_TP;
+
+ hardware->mcfeChannelCount = 4;
+
+ gcmkONERROR(gckMCFE_Construct(hardware, &hardware->mcFE));
+ }
+ else
+ {
+ gcmkONERROR(gckWLFE_Construct(hardware, &hardware->wlFE));
+ }
+
+ if (_QueryFeatureDatabase(hardware, gcvFEATURE_ASYNC_BLIT))
+ {
+ gcmkONERROR(gckASYNC_FE_Construct(hardware, &hardware->asyncFE));
+ }
+
+ /* Return pointer to the gckHARDWARE object. */
+ *Hardware = hardware;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Hardware=0x%x", *Hardware);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (hardware != gcvNULL)
+ {
+ /* Turn off the power. */
+ gcmkVERIFY_OK(gckOS_SetGPUPower(Os, Core, gcvFALSE, gcvFALSE));
+
+ if (hardware->globalSemaphore != gcvNULL)
+ {
+ /* Destroy the global semaphore. */
+ gcmkVERIFY_OK(gckOS_DestroySemaphore(Os,
+ hardware->globalSemaphore));
+ }
+
+ if (hardware->powerMutex != gcvNULL)
+ {
+ /* Destroy the power mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Os, hardware->powerMutex));
+ }
+
+ if (hardware->powerStateTimer != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_StopTimer(Os, hardware->powerStateTimer));
+ gcmkVERIFY_OK(gckOS_DestroyTimer(Os, hardware->powerStateTimer));
+ }
+
+ for (i = 0; i < gcvENGINE_GPU_ENGINE_COUNT; i++)
+ {
+ if (hardware->pageTableDirty[i] != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Os, hardware->pageTableDirty[i]));
+ }
+ }
+
+ if (hardware->pendingEvent != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Os, hardware->pendingEvent));
+ }
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Os, hardware));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_PostConstruct(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+
+ /* Initialize MMU page table array. */
+ gcmkONERROR(_InitPageTableArray(Hardware));
+
+ /* Initialize function commands. */
+ gcmkONERROR(_PrepareFunctions(Hardware));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_PreDestroy
+**
+** Prepare destroying an gckHARDWARE object.
+** This is to destroy resources relevant to other modules such as MMU.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object that needs to be destroyed.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHARDWARE_PreDestroy(
+ IN gckHARDWARE Hardware
+ )
+{
+ gcmkHEADER_ARG("%x", Hardware);
+
+ if (Hardware->auxFuncVideoMem)
+ {
+ /* Synchroneous unlock. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Unlock(
+ Hardware->kernel,
+ Hardware->auxFuncVideoMem,
+ 0,
+ gcvNULL
+ ));
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ Hardware->kernel,
+ Hardware->auxFuncVideoMem,
+ 0,
+ gcvFALSE,
+ gcvFALSE
+ ));
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(
+ Hardware->kernel,
+ Hardware->auxFuncVideoMem
+ ));
+
+ Hardware->auxFuncVideoMem = gcvNULL;
+ Hardware->auxFuncLogical = gcvNULL;
+ }
+
+ if (Hardware->mmuFuncVideoMem)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ Hardware->kernel,
+ Hardware->mmuFuncVideoMem,
+ 0,
+ gcvFALSE,
+ gcvFALSE
+ ));
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(
+ Hardware->kernel,
+ Hardware->mmuFuncVideoMem
+ ));
+
+ Hardware->mmuFuncVideoMem = gcvNULL;
+ Hardware->mmuFuncLogical = gcvNULL;
+ }
+
+ if (Hardware->pagetableArray.videoMem)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ Hardware->kernel,
+ Hardware->pagetableArray.videoMem,
+ 0,
+ gcvFALSE,
+ gcvFALSE
+ ));
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(
+ Hardware->kernel,
+ Hardware->pagetableArray.videoMem
+ ));
+
+ Hardware->pagetableArray.videoMem = gcvNULL;
+ Hardware->pagetableArray.logical = gcvNULL;
+ }
+
+ if (Hardware->wlFE)
+ {
+ gckWLFE_Destroy(Hardware, Hardware->wlFE);
+ Hardware->wlFE = gcvNULL;
+ }
+
+ if (Hardware->asyncFE)
+ {
+ gckASYNC_FE_Destroy(Hardware, Hardware->asyncFE);
+ Hardware->asyncFE = gcvNULL;
+ }
+
+ if (Hardware->mcFE)
+ {
+ gckMCFE_Destroy(Hardware, Hardware->mcFE);
+ Hardware->mcFE = gcvNULL;
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_Destroy
+**
+** Destroy an gckHARDWARE object.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object that needs to be destroyed.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHARDWARE_Destroy(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gctUINT i;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ /* Destroy the power semaphore. */
+ gcmkVERIFY_OK(gckOS_DestroySemaphore(Hardware->os,
+ Hardware->globalSemaphore));
+
+ /* Destroy the power mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Hardware->os, Hardware->powerMutex));
+
+ gcmkVERIFY_OK(gckOS_StopTimer(Hardware->os, Hardware->powerStateTimer));
+ gcmkVERIFY_OK(gckOS_DestroyTimer(Hardware->os, Hardware->powerStateTimer));
+
+ for (i = 0; i < gcvENGINE_GPU_ENGINE_COUNT; i++)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Hardware->os, Hardware->pageTableDirty[i]));
+ }
+
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Hardware->os, Hardware->pendingEvent));
+
+#if gcdLINK_QUEUE_SIZE
+ gckQUEUE_Free(Hardware->os, &Hardware->linkQueue);
+#endif
+
+ /* Mark the object as unknown. */
+ Hardware->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the object. */
+ gcmkONERROR(gcmkOS_SAFE_FREE(Hardware->os, Hardware));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_GetType
+**
+** Get the hardware type.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** OUTPUT:
+**
+** gceHARDWARE_TYPE * Type
+** Pointer to a variable that receives the type of hardware object.
+*/
+gceSTATUS
+gckHARDWARE_GetType(
+ IN gckHARDWARE Hardware,
+ OUT gceHARDWARE_TYPE * Type
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+ gcmkVERIFY_ARGUMENT(Type != gcvNULL);
+
+ *Type = Hardware->type;
+
+ gcmkFOOTER_ARG("*Type=%d", *Type);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_InitializeHardware
+**
+** Initialize the hardware.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHARDWARE_InitializeHardware(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gctUINT32 control;
+ gctUINT32 data;
+ gctUINT32 regPMC = 0;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ /* Disable isolate GPU bit. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ ((((gctUINT32) (0x00000900)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1))))))) << (0 ?
+ 19:19))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)))));
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ &control));
+
+ /* Enable debug register. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ ((((gctUINT32) (control)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1))))))) << (0 ?
+ 11:11))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 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))
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x003A8,
+ ((((gctUINT32) (0)) & ~(((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,
+ 0x0003C,
+ ~0U));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0003C,
+ 0));
+
+ if (Hardware->mmuVersion == 0)
+ {
+ /* Program the base addesses. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0041C,
+ Hardware->baseAddress));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00418,
+ Hardware->baseAddress));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00428,
+ Hardware->baseAddress));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00420,
+ Hardware->baseAddress));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00424,
+ Hardware->baseAddress));
+ }
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress +
+ 0x00100,
+ &data));
+
+ /* Enable clock gating. */
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1))))))) << (0 ?
+ 0:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
+
+ if ((Hardware->identity.chipRevision == 0x4301)
+ || (Hardware->identity.chipRevision == 0x4302)
+ )
+ {
+ /* Disable stall module level clock gating for 4.3.0.1 and 4.3.0.2
+ ** revisions. */
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)));
+ }
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00100,
+ data));
+
+ /* Initialize FE. */
+ if (Hardware->wlFE)
+ {
+ gckWLFE_Initialize(Hardware, Hardware->wlFE);
+ }
+ else if (Hardware->mcFE)
+ {
+ gckMCFE_Initialize(Hardware, gcvFALSE, Hardware->mcFE);
+ }
+
+ if (Hardware->asyncFE)
+ {
+ gckASYNC_FE_Initialize(Hardware, Hardware->asyncFE);
+ }
+
+#if gcdENABLE_3D
+ /* Disable PE clock gating on revs < 5.0 when HZ is present without a
+ ** bug fix. */
+ if ((Hardware->identity.chipRevision < 0x5000)
+ && gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HZ)
+ && !gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_BUG_FIXES4)
+ )
+ {
+ if (regPMC == 0)
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &regPMC));
+ }
+
+ /* Disable PE clock gating. */
+ regPMC = ((((gctUINT32) (regPMC)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)));
+ }
+#endif
+
+ if (Hardware->identity.chipModel == gcv4000 &&
+ ((Hardware->identity.chipRevision == 0x5208) || (Hardware->identity.chipRevision == 0x5222)))
+ {
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ ((((gctUINT32) (0x01590880)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 23:23) - (0 ?
+ 23:23) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 23:23) - (0 ?
+ 23:23) + 1))))))) << (0 ?
+ 23:23))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 23:23) - (0 ?
+ 23:23) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 23:23) - (0 ? 23:23) + 1))))))) << (0 ? 23:23)))));
+ }
+
+ if ((Hardware->identity.chipModel == gcv1000 &&
+ (Hardware->identity.chipRevision == 0x5039 ||
+ Hardware->identity.chipRevision == 0x5040))
+ ||
+ (Hardware->identity.chipModel == gcv2000 &&
+ Hardware->identity.chipRevision == 0x5140)
+ )
+ {
+ gctUINT32 pulseEater;
+
+ pulseEater = ((((gctUINT32) (0x01590880)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)));
+
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ ((((gctUINT32) (pulseEater)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1))))))) << (0 ?
+ 17:17))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 17:17) - (0 ? 17:17) + 1))))))) << (0 ? 17:17)))));
+ }
+
+ if ((gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HALTI2) == gcvSTATUS_FALSE)
+ || (Hardware->identity.chipRevision < 0x5422)
+ )
+ {
+ if (regPMC == 0)
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &regPMC));
+ }
+
+ regPMC = ((((gctUINT32) (regPMC)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:15) - (0 ?
+ 15:15) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:15) - (0 ?
+ 15:15) + 1))))))) << (0 ?
+ 15:15))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 15:15) - (0 ?
+ 15:15) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:15) - (0 ? 15:15) + 1))))))) << (0 ? 15:15)));
+ }
+
+ if (_IsHardwareMatch(Hardware, gcv2000, 0x5108))
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00480,
+ &data));
+
+ /* Set FE bus to one, TX bus to zero */
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)));
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1))))))) << (0 ?
+ 7:7))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7)));
+
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00480,
+ data));
+ }
+
+ gcmkONERROR(
+ gckHARDWARE_SetMMU(Hardware,
+ Hardware->kernel->mmu));
+
+ if (Hardware->mcFE)
+ {
+ /* Reinitialize MCFE, now MMU is enabled. */
+ gckMCFE_Initialize(Hardware, gcvTRUE, Hardware->mcFE);
+ }
+
+ if (Hardware->identity.chipModel >= gcv400
+ && Hardware->identity.chipModel != gcv420
+ && !gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_BUG_FIXES12))
+ {
+ if (regPMC == 0)
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &regPMC));
+ }
+
+ /* Disable PA clock gating. */
+ regPMC = ((((gctUINT32) (regPMC)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1))))))) << (0 ?
+ 4:4))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4)));
+ }
+
+ /* Limit 2D outstanding request. */
+ if (Hardware->maxOutstandingReads)
+ {
+ gctUINT32 data;
+
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00414,
+ &data));
+
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1))))))) << (0 ?
+ 7:0))) | (((gctUINT32) ((gctUINT32) (Hardware->maxOutstandingReads & 0xFF) & ((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,
+ 0x00414,
+ data));
+ }
+
+ if (_IsHardwareMatch(Hardware, gcv1000, 0x5035))
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00414,
+ &data));
+
+ /* Disable HZ-L2. */
+ data = ((((gctUINT32) (data)) & ~(((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)));
+
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00414,
+ data));
+ }
+
+ if (_IsHardwareMatch(Hardware, gcv4000, 0x5222)
+ || _IsHardwareMatch(Hardware, gcv2000, 0x5108)
+ || _IsHardwareMatch(Hardware, gcv7000, 0x6202)
+ || _IsHardwareMatch(Hardware, gcv7000, 0x6203)
+ || (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_TX_DESCRIPTOR)
+ && !gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_TX_DESC_CACHE_CLOCKGATE_FIX)
+ )
+ )
+ {
+ if (regPMC == 0)
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &regPMC));
+ }
+
+ /* Disable TX clock gating. */
+ regPMC = ((((gctUINT32) (regPMC)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1))))))) << (0 ?
+ 7:7))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7)));
+ }
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_NEW_GPIPE) &&
+ !gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_GPIPE_CLOCK_GATE_FIX))
+ {
+ if (regPMC == 0)
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &regPMC));
+ }
+
+ /* Disable GPIPE clock gating. */
+ regPMC = ((((gctUINT32) (regPMC)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1))))))) << (0 ?
+ 22:22))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 22:22) - (0 ? 22:22) + 1))))))) << (0 ? 22:22)));
+ }
+
+ if (_IsHardwareMatch(Hardware, gcv880, 0x5106))
+ {
+ Hardware->kernel->timeOut = 140 * 1000;
+ }
+
+ if (regPMC == 0)
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &regPMC));
+ }
+
+ /* Disable RA HZ clock gating. */
+ regPMC = ((((gctUINT32) (regPMC)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1))))))) << (0 ?
+ 17:17))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 17:17) - (0 ? 17:17) + 1))))))) << (0 ? 17:17)));
+
+ /* Disable RA EZ clock gating. */
+ regPMC = ((((gctUINT32) (regPMC)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)));
+
+ if ((gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HALTI5)
+ && !gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_RA_CG_FIX)
+ )
+ )
+ {
+ if (regPMC == 0)
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &regPMC));
+ }
+
+ /* Disable RA clock gating. */
+ regPMC = ((((gctUINT32) (regPMC)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)));
+ }
+
+ if ((gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HALTI5)
+ && !gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_SH_CLOCK_GATE_FIX)
+ )
+ )
+ {
+ if (regPMC == 0)
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &regPMC));
+ }
+
+ /* Disable SH clock gating. */
+ regPMC = ((((gctUINT32) (regPMC)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)));
+ }
+
+ if (regPMC != 0)
+ {
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ regPMC));
+ }
+
+ if (_IsHardwareMatch(Hardware, gcv2000, 0x5108)
+ || (_IsHardwareMatch(Hardware, gcv2000, 0xffff5450))
+ || _IsHardwareMatch(Hardware, gcv320, 0x5007)
+ || _IsHardwareMatch(Hardware, gcv320, 0x5303)
+ || _IsHardwareMatch(Hardware, gcv880, 0x5106)
+ || _IsHardwareMatch(Hardware, gcv400, 0x4645)
+ )
+ {
+ /* Update GPU AXI cache atttribute. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00008,
+ 0x00002200));
+ }
+
+ if ((Hardware->identity.chipRevision > 0x5420)
+ && gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_PIPE_3D))
+ {
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ &data));
+
+ /* Disable internal DFS. */
+ data =
+#if gcdDVFS
+ ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1))))))) << (0 ?
+ 18:18))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 18:18) - (0 ? 18:18) + 1))))))) << (0 ? 18:18))) |
+#endif
+ ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16))) |
+ ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1))))))) << (0 ?
+ 17:17))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 17:17) - (0 ? 17:17) + 1))))))) << (0 ? 17:17)));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ data));
+ }
+
+ if (_IsHardwareMatch(Hardware, gcv2500, 0x5422))
+ {
+ gcmkONERROR(gckOS_ReadRegisterEx(
+ Hardware->os, Hardware->core, 0x00090, &data));
+
+ /* AXI switch setup to SPLIT_TO64 mode */
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) (0x2 & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0)));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(
+ Hardware->os, Hardware->core, 0x00090, data));
+ }
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_NN_ENGINE) &&
+ (!gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HI_REORDER_FIX) ||
+ (((gcsFEATURE_DATABASE *)Hardware->featureDatabase)->AXI_SRAM_SIZE == 0))
+ )
+ {
+ gcmkONERROR(gckOS_ReadRegisterEx(
+ Hardware->os, Hardware->core, 0x00090, &data));
+
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(
+ Hardware->os, Hardware->core, 0x00090, data));
+ }
+ /* Disable RA SE clock gating */
+ if (_IsHardwareMatch(Hardware, gcv7000, 0x6202))
+ {
+ gcmkVERIFY_OK(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &data));
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ? 5:5) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 5:5) - (0 ?
+ 5:5) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ?
+ 5:5)));
+
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ? 6:6) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ? 6:6) - (0 ?
+ 6:6) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ?
+ 6:6)));
+
+ gcmkVERIFY_OK(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ data));
+ }
+
+ _ConfigurePolicyID(Hardware);
+
+#if gcdDEBUG_MODULE_CLOCK_GATING
+ _ConfigureModuleLevelClockGating(Hardware);
+#endif
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the error. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_QueryMemory
+**
+** Query the amount of memory available on the hardware.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object.
+**
+** OUTPUT:
+**
+** gctSIZE_T * InternalSize
+** Pointer to a variable that will hold the size of the internal video
+** memory in bytes. If 'InternalSize' is gcvNULL, no information of the
+** internal memory will be returned.
+**
+** gctUINT32 * InternalBaseAddress
+** Pointer to a variable that will hold the hardware's base address for
+** the internal video memory. This pointer cannot be gcvNULL if
+** 'InternalSize' is also non-gcvNULL.
+**
+** gctUINT32 * InternalAlignment
+** Pointer to a variable that will hold the hardware's base address for
+** the internal video memory. This pointer cannot be gcvNULL if
+** 'InternalSize' is also non-gcvNULL.
+**
+** gctSIZE_T * ExternalSize
+** Pointer to a variable that will hold the size of the external video
+** memory in bytes. If 'ExternalSize' is gcvNULL, no information of the
+** external memory will be returned.
+**
+** gctUINT32 * ExternalBaseAddress
+** Pointer to a variable that will hold the hardware's base address for
+** the external video memory. This pointer cannot be gcvNULL if
+** 'ExternalSize' is also non-gcvNULL.
+**
+** gctUINT32 * ExternalAlignment
+** Pointer to a variable that will hold the hardware's base address for
+** the external video memory. This pointer cannot be gcvNULL if
+** 'ExternalSize' is also non-gcvNULL.
+**
+** gctUINT32 * HorizontalTileSize
+** Number of horizontal pixels per tile. If 'HorizontalTileSize' is
+** gcvNULL, no horizontal pixel per tile will be returned.
+**
+** gctUINT32 * VerticalTileSize
+** Number of vertical pixels per tile. If 'VerticalTileSize' is
+** gcvNULL, no vertical pixel per tile will be returned.
+*/
+gceSTATUS
+gckHARDWARE_QueryMemory(
+ IN gckHARDWARE Hardware,
+ OUT gctSIZE_T * InternalSize,
+ OUT gctUINT32 * InternalBaseAddress,
+ OUT gctUINT32 * InternalAlignment,
+ OUT gctSIZE_T * ExternalSize,
+ OUT gctUINT32 * ExternalBaseAddress,
+ OUT gctUINT32 * ExternalAlignment,
+ OUT gctUINT32 * HorizontalTileSize,
+ OUT gctUINT32 * VerticalTileSize
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ if (InternalSize != gcvNULL)
+ {
+ /* No internal memory. */
+ *InternalSize = 0;
+ }
+
+ if (ExternalSize != gcvNULL)
+ {
+ /* No external memory. */
+ *ExternalSize = 0;
+ }
+
+ if (HorizontalTileSize != gcvNULL)
+ {
+ /* 4x4 tiles. */
+ *HorizontalTileSize = 4;
+ }
+
+ if (VerticalTileSize != gcvNULL)
+ {
+ /* 4x4 tiles. */
+ *VerticalTileSize = 4;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*InternalSize=%lu *InternalBaseAddress=0x%08x "
+ "*InternalAlignment=0x%08x *ExternalSize=%lu "
+ "*ExternalBaseAddress=0x%08x *ExtenalAlignment=0x%08x "
+ "*HorizontalTileSize=%u *VerticalTileSize=%u",
+ gcmOPT_VALUE(InternalSize),
+ gcmOPT_VALUE(InternalBaseAddress),
+ gcmOPT_VALUE(InternalAlignment),
+ gcmOPT_VALUE(ExternalSize),
+ gcmOPT_VALUE(ExternalBaseAddress),
+ gcmOPT_VALUE(ExternalAlignment),
+ gcmOPT_VALUE(HorizontalTileSize),
+ gcmOPT_VALUE(VerticalTileSize));
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_QueryChipIdentity
+**
+** Query the identity of the hardware.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object.
+**
+** OUTPUT:
+**
+** gcsHAL_QUERY_CHIP_IDENTITY_PTR Identity
+** Pointer to the identity structure.
+**
+*/
+gceSTATUS
+gckHARDWARE_QueryChipIdentity(
+ IN gckHARDWARE Hardware,
+ OUT gcsHAL_QUERY_CHIP_IDENTITY_PTR Identity
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Identity != gcvNULL);
+
+ *Identity = Hardware->identity;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** 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.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object.
+**
+** gctUINT32 Address
+** Address in hardware specific format.
+**
+** OUTPUT:
+**
+** gcePOOL * Pool
+** Pointer to a variable that will hold the pool type for the address.
+**
+** gctUINT32 * Offset
+** Pointer to a variable that will hold the offset for the address.
+*/
+gceSTATUS
+gckHARDWARE_SplitMemory(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Address,
+ OUT gcePOOL * Pool,
+ OUT gctUINT32 * Offset
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x Addres=0x%08x", Hardware, Address);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Pool != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Offset != gcvNULL);
+
+ if (Hardware->mmuVersion == 0)
+ {
+ /* Dispatch on memory type. */
+ switch ((((((gctUINT32) (Address)) >> (0 ? 31:31)) & ((gctUINT32) ((((1 ? 31:31) - (0 ? 31:31) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:31) - (0 ? 31:31) + 1)))))) ))
+ {
+ case 0x0:
+ /* System memory. */
+ *Pool = gcvPOOL_SYSTEM;
+ break;
+
+ case 0x1:
+ /* Virtual memory. */
+ *Pool = gcvPOOL_VIRTUAL;
+ break;
+
+ default:
+ /* Invalid memory type. */
+ gcmkFOOTER_ARG("status=%d", gcvSTATUS_INVALID_ARGUMENT);
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ /* Return offset of address. */
+ *Offset = (((((gctUINT32) (Address)) >> (0 ? 30:0)) & ((gctUINT32) ((((1 ? 30:0) - (0 ? 30:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 30:0) - (0 ? 30:0) + 1)))))) );
+ }
+ else
+ {
+ *Pool = gcvPOOL_SYSTEM;
+ *Offset = Address;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Pool=%d *Offset=0x%08x", *Pool, *Offset);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_PipeSelect
+**
+** Append a PIPESELECT command at the specified user logical memory.
+**
+** WARNING: Only for writing to USERSPACE!
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command queue to append
+** the PIPESELECT command at or gcvNULL just to query the size of the
+** PIPESELECT command.
+**
+** gcePIPE_SELECT Pipe
+** Pipe value to select.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the PIPESELECT command.
+** If 'Logical' is gcvNULL, this argument will be ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the PIPESELECT command. If 'Bytes' is gcvNULL, nothing will be
+** returned.
+*/
+gceSTATUS
+gckHARDWARE_PipeSelect(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gcePIPE_SELECT Pipe,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Pipe=%d *Bytes=%lu",
+ Hardware, Logical, Pipe, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+
+ /* Append a PipeSelect. */
+ if (Logical != gcvNULL)
+ {
+ gctUINT32 flush, stall;
+
+ if (*Bytes < 32)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ flush = (Pipe == gcvPIPE_2D)
+ ?
+ ((((gctUINT32) (0)) & ~(((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)))
+ | ((((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)))
+ : ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)));
+
+ stall = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* LoadState(AQFlush, 1), flush. */
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ logical,
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E03) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ ));
+
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ logical + 1,
+ flush
+ ));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%x: FLUSH 0x%x", logical, flush);
+
+ /* LoadState(AQSempahore, 1), stall. */
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ logical + 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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)))
+ ));
+
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ logical + 3,
+ stall
+ ));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%x: SEMAPHORE 0x%x", logical + 2, stall);
+
+ /* Stall, stall. */
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ logical + 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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ ));
+
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ logical + 5,
+ stall
+ ));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%x: STALL 0x%x", logical + 4, stall);
+
+ /* LoadState(AQPipeSelect, 1), pipe. */
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ logical + 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) (0x01 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E00) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ ));
+
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ logical + 7,
+ (Pipe == gcvPIPE_2D)
+ ? 0x1
+ : 0x0
+ ));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%x: PIPE %d", logical + 6, Pipe);
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the PIPESELECT command. */
+ *Bytes = 32;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_FenceRender(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FenceAddress,
+ IN gctUINT64 FenceData,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gckOS os = Hardware->os;
+ gctUINT32_PTR logical = (gctUINT32_PTR)Logical;
+
+ gctUINT32 dataLow = (gctUINT32)FenceData;
+ gctUINT32 dataHigh = (gctUINT32)(FenceData >> 32);
+
+ if (logical)
+ {
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E1A) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ FenceAddress
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E26) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ dataHigh
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E1B) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ dataLow
+ );
+ }
+
+ if (Bytes)
+ {
+ *Bytes = gcdRENDER_FENCE_LENGTH;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_FenceBlt(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FenceAddress,
+ IN gctUINT64 FenceData,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gckOS os = Hardware->os;
+ gctUINT32_PTR logical = (gctUINT32_PTR)Logical;
+
+ gctUINT32 dataLow = (gctUINT32)FenceData;
+ gctUINT32 dataHigh = (gctUINT32)(FenceData >> 32);
+
+ if (logical)
+ {
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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)))
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x5029) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ FenceAddress
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502D) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ dataHigh
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502A) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ dataLow
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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)))
+ );
+ }
+
+ if (Bytes)
+ {
+ *Bytes = gcdBLT_FENCE_LENGTH;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_Fence
+**
+** Append a HW FENCE states at the specified user logical memory.
+**
+** WARNING: Only for writing to USERSPACE!
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** gceENGINE Engine
+** Engine type, render or 3d-blit currently.
+**
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command queue to append
+** the PIPESELECT command at or gcvNULL just to query the size of the
+** PIPESELECT command.
+**
+** gctUINT32 FenceAddress
+** GPU address to write out the data.
+**
+** gctUINT64 FenceData
+** The 64bit data to write out.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the PIPESELECT command.
+** If 'Logical' is gcvNULL, this argument will be ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the PIPESELECT command. If 'Bytes' is gcvNULL, nothing will be
+** returned.
+*/
+gceSTATUS
+gckHARDWARE_Fence(
+ IN gckHARDWARE Hardware,
+ IN gceENGINE Engine,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FenceAddress,
+ IN gctUINT64 FenceData,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ if (Engine == gcvENGINE_RENDER)
+ {
+ return _FenceRender(Hardware, Logical, FenceAddress, FenceData, Bytes);
+ }
+ else
+ {
+ return _FenceBlt(Hardware, Logical, FenceAddress, FenceData, Bytes);
+ }
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_UpdateQueueTail
+**
+** Update the tail of the command queue.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** gctPOINTER Logical
+** Logical address of the start of the command queue.
+**
+** gctUINT32 Offset
+** Offset into the command queue of the tail (last command).
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHARDWARE_UpdateQueueTail(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Offset
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Offset=0x%08x",
+ Hardware, Logical, Offset);
+
+ /* Verify the hardware. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ /* Force a barrier. */
+ gcmkONERROR(
+ gckOS_MemoryBarrier(Hardware->os, Logical));
+
+ /* Notify gckKERNEL object of change. */
+ gcmkONERROR(
+ gckKERNEL_Notify(Hardware->kernel,
+ gcvNOTIFY_COMMAND_QUEUE));
+
+ if (status == gcvSTATUS_CHIP_NOT_READY)
+ {
+ gcmkONERROR(gcvSTATUS_DEVICE);
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+
+static void
+_ResumeWaitLinkFE(
+ gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gctUINT32 resume;
+ gctUINT32 bytes;
+ gctUINT32 idle;
+
+ /* Make sure FE is idle. */
+ do
+ {
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00004,
+ &idle));
+ }
+ while (idle != 0x7FFFFFFF);
+
+ gcmkDUMP(Hardware->os, "@[register.wait 0x%05X 0x%08X 0x%08X]",
+ 0x00004,
+ ((((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) ((gctUINT32) (~0U) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))),
+ idle);
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00664,
+ &resume));
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00664,
+ &resume));
+
+ bytes = Hardware->hasL2Cache ? 24 : 16;
+
+ /* Start Command Parser. */
+ gckWLFE_AtomicExecute(Hardware, resume, bytes);
+
+OnError:
+ return;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_Interrupt
+**
+** Process an interrupt. This function will read the interrupt acknowledge
+** register, stores the data, and return whether the interrupt is from us.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHARDWARE_Interrupt(
+ IN gckHARDWARE Hardware
+ )
+{
+ gctUINT32 data = 0;
+ gctUINT32 dataEx = 0;
+ gceSTATUS status;
+ gceSTATUS statusEx;
+
+ /*
+ * Notice:
+ * In isr here.
+ * We should return success when either FE or AsyncFE reports correct
+ * interrupts, so that isr can wake up threadRoutine for either FE.
+ * That means, only need return ERROR when both FEs reports ERROR.
+ */
+ /* Read AQIntrAcknowledge register. */
+ status = gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00010,
+ &data);
+
+ if (gcmIS_ERROR(status))
+ {
+ goto OnError;
+ }
+
+ if (data == 0)
+ {
+ /* Not our interrupt. */
+ status = gcvSTATUS_NOT_OUR_INTERRUPT;
+ }
+ else
+ {
+#if gcdINTERRUPT_STATISTIC
+ gckOS_AtomClearMask(Hardware->pendingEvent, data);
+#endif
+
+ if (data & (1 << 29))
+ {
+ /* Event ID 29 is not a normal event, but for invalidating pipe. */
+ _ResumeWaitLinkFE(Hardware);
+ data &= ~(1 << 29);
+ }
+
+ /* Inform gckEVENT of the interrupt. */
+ status = gckEVENT_Interrupt(Hardware->kernel->eventObj, data);
+ }
+
+ if (!Hardware->asyncFE)
+ {
+ /* Done. */
+ goto OnError;
+ }
+
+ /* Read BLT interrupt. */
+ statusEx = gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x000D4,
+ &dataEx
+ );
+
+ if (gcmIS_ERROR(statusEx))
+ {
+ /*
+ * Do not overwrite status here, so that former status from
+ * AQIntrAck is returned.
+ */
+ goto OnError;
+ }
+
+ /*
+ * This bit looks useless now, we can use this check if this interrupt is
+ * from FE.
+ */
+ dataEx &= ~0x80000000;
+
+ /*
+ * Descriptor fetched, update counter.
+ * We can't do this at dataEx != 0 only, because read HW acknowledge
+ * register will overwrite 0x007E4. If one
+ * interrupt we don't read it, we will miss it for ever.
+ */
+ gckASYNC_FE_UpdateAvaiable(Hardware);
+
+ /* Do not need report NOT_OUT_INTERRUPT error if dataEx is 0. */
+ if (dataEx)
+ {
+ statusEx = gckEVENT_Interrupt(Hardware->kernel->asyncEvent, dataEx);
+
+ if (gcmIS_SUCCESS(statusEx))
+ {
+ /* At least AsyncFE is success, treat all as success. */
+ status = gcvSTATUS_OK;
+ }
+ }
+
+OnError:
+ /* Return the status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_Notify
+**
+** This functions will handle the event notifications.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHARDWARE_Notify(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gcmkHEADER_ARG("Hardware=%p", Hardware);
+
+ /* Handle events. */
+ status = gckEVENT_Notify(Hardware->kernel->eventObj, 0);
+
+ if (Hardware->asyncFE)
+ {
+ status = gckEVENT_Notify(Hardware->kernel->asyncEvent, 0);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_QueryCommandBuffer
+**
+** Query the command buffer alignment and number of reserved bytes.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Alignment
+** Pointer to a variable receiving the alignment for each command.
+**
+** gctSIZE_T * ReservedHead
+** Pointer to a variable receiving the number of reserved bytes at the
+** head of each command buffer.
+**
+** gctSIZE_T * ReservedTail
+** Pointer to a variable receiving the number of bytes reserved at the
+** tail of each command buffer.
+*/
+gceSTATUS
+gckHARDWARE_QueryCommandBuffer(
+ IN gckHARDWARE Hardware,
+ IN gceENGINE Engine,
+ OUT gctUINT32 * Alignment,
+ OUT gctUINT32 * ReservedHead,
+ OUT gctUINT32 * ReservedTail
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ if (Alignment != gcvNULL)
+ {
+ /* Align every 8 bytes. */
+ *Alignment = 8;
+ }
+
+ if (ReservedHead != gcvNULL)
+ {
+ /* Reserve space for SelectPipe(). */
+ *ReservedHead = 32;
+ }
+
+ if (ReservedTail != gcvNULL)
+ {
+ if (Engine == gcvENGINE_RENDER)
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_NOT_SUPPORTED;
+ }
+ else
+ {
+ *ReservedTail = gcdBLT_FENCE_LENGTH;
+ }
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Alignment=%lu *ReservedHead=%lu *ReservedTail=%lu",
+ gcmOPT_VALUE(Alignment), gcmOPT_VALUE(ReservedHead),
+ gcmOPT_VALUE(ReservedTail));
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_QuerySystemMemory
+**
+** Query the command buffer alignment and number of reserved bytes.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** OUTPUT:
+**
+** gctSIZE_T * SystemSize
+** Pointer to a variable that receives the maximum size of the system
+** memory.
+**
+** gctUINT32 * SystemBaseAddress
+** Poinetr to a variable that receives the base address for system
+** memory.
+*/
+gceSTATUS
+gckHARDWARE_QuerySystemMemory(
+ IN gckHARDWARE Hardware,
+ OUT gctSIZE_T * SystemSize,
+ OUT gctUINT32 * SystemBaseAddress
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ if (SystemSize != gcvNULL)
+ {
+ /* Maximum system memory can be 2GB. */
+ *SystemSize = 1U << 31;
+ }
+
+ if (SystemBaseAddress != gcvNULL)
+ {
+ /* Set system memory base address. */
+ *SystemBaseAddress = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1))))))) << (0 ?
+ 31:31))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31)));
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*SystemSize=%lu *SystemBaseAddress=%lu",
+ gcmOPT_VALUE(SystemSize), gcmOPT_VALUE(SystemBaseAddress));
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_SetMMU
+**
+** Set the page table base address.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** gckMMU Mmu
+** Pointer to mmu object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHARDWARE_SetMMU(
+ IN gckHARDWARE Hardware,
+ IN gckMMU Mmu
+ )
+{
+ gceSTATUS status;
+ gctUINT32 address = 0;
+ gctUINT32 idle;
+ gctUINT32 timer = 0, delay = 1;
+
+ gcmkHEADER_ARG("Hardware=0x%x Mmu=0x%x", Hardware, Mmu);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ if (Hardware->mmuVersion == 0)
+ {
+ /* mmu v0 only support 1 level translation, only uses stlb level mapping. */
+ gcmkSAFECASTPHYSADDRT(address, Mmu->dynamicArea4K.stlbPhysical);
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "Setting page table to 0x%08X",
+ address);
+
+ /* Trigger a possible dummy draw. */
+ Hardware->kernel->command->dummyDraw = gcvTRUE;
+
+ /* Write the AQMemoryFePageTable register. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00400,
+ address));
+
+ /* Write the AQMemoryRaPageTable register. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00410,
+ address));
+
+ /* Write the AQMemoryTxPageTable register. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00404,
+ address));
+
+
+ /* Write the AQMemoryPePageTable register. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00408,
+ address));
+
+ /* Write the AQMemoryPezPageTable register. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0040C,
+ address));
+ }
+ 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->options.secureMode == gcvSECURE_IN_NORMAL)
+ {
+ gctUINT32 regMmuCtrl = 0;
+ gcmkONERROR(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x00388,
+ &regMmuCtrl
+ ));
+
+ hwMmuDisabled = ((((((gctUINT32) (regMmuCtrl)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ) == 0x1)
+ ? gcvFALSE
+ : gcvTRUE;
+ }
+ else
+ {
+ gctUINT32 regMmuCtrl = 0;
+
+ gcmkONERROR(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x0018C,
+ &regMmuCtrl
+ ));
+
+ hwMmuDisabled = ((((((gctUINT32) (regMmuCtrl)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ) == 0x1)
+ ? gcvFALSE
+ : gcvTRUE;
+ }
+
+ if (hwMmuDisabled)
+ {
+ /* Prepared command sequence contains an END,
+ ** so update lastEnd and store executeCount to END command.
+ */
+ gcsHARDWARE_FUNCTION *function = &Hardware->functions[gcvHARDWARE_FUNCTION_MMU];
+ gctUINT32_PTR endLogical = (gctUINT32_PTR)function->endLogical;
+
+ Hardware->lastEnd = function->endAddress;
+
+ if (Hardware->wlFE)
+ {
+ /* Append a executeCount in End command, MCFE does not support such End command. */
+ *(endLogical + 1) = Hardware->executeCount + 1;
+ }
+
+ if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL)
+ {
+ gctUINT32 extSafeAddress;
+ /* Set up base address of page table array. */
+ gcmkONERROR(gckOS_WriteRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x0038C,
+ (gctUINT32)(Hardware->pagetableArray.address & 0xFFFFFFFF)
+ ));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x00390,
+ (gctUINT32)((Hardware->pagetableArray.address >> 32) & 0xFFFFFFFF)
+ ));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x00394,
+ 1
+ ));
+
+ address = (gctUINT32)(Mmu->safePagePhysical & 0xFFFFFFFF);
+ extSafeAddress = (gctUINT32)(Mmu->safePagePhysical >> 32);
+
+ if (address & 0x3F)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_ALIGNED);
+ }
+
+ /* more than 40bit physical address */
+ if (extSafeAddress & 0xFFFFFF00)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ gcmkONERROR(gckOS_WriteRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x0039C,
+ address
+ ));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x00398,
+ address
+ ));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x003A0,
+ ((((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) ((gctUINT32)extSafeAddress) & ((gctUINT32) ((((1 ?
+ 23:16) - (0 ?
+ 23:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1))))))) << (0 ?
+ 31:31))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31)))
+ | ((((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) ((gctUINT32)extSafeAddress) & ((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:15) - (0 ?
+ 15:15) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:15) - (0 ?
+ 15:15) + 1))))))) << (0 ?
+ 15:15))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 15:15) - (0 ?
+ 15:15) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:15) - (0 ? 15:15) + 1))))))) << (0 ? 15:15)))
+ ));
+ }
+
+ gcmkDUMP(Hardware->os, "#[function: set mmu]");
+ gcmkDUMP_BUFFER(
+ Hardware->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ function->logical,
+ function->address,
+ function->bytes);
+
+ /* Execute prepared command sequence. */
+ if (Hardware->mcFE)
+ {
+ gcmkONERROR(gckMCFE_Execute(
+ Hardware,
+ gcvFALSE,
+ 0,
+ function->address,
+ function->bytes
+ ));
+ }
+ else
+ {
+ gcmkONERROR(gckWLFE_Execute(
+ Hardware,
+ function->address,
+ function->bytes
+ ));
+ }
+
+#if gcdLINK_QUEUE_SIZE
+ {
+ gcuQUEUEDATA data;
+
+ gcmkVERIFY_OK(gckOS_GetProcessID(&data.linkData.pid));
+
+ data.linkData.start = function->address;
+ data.linkData.end = function->address + function->bytes;
+ data.linkData.linkLow = 0;
+ data.linkData.linkHigh = 0;
+
+ gckQUEUE_Enqueue(&Hardware->linkQueue, &data);
+ }
+#endif
+
+ /* Wait until MMU configure finishes. */
+ do
+ {
+ gckOS_Delay(Hardware->os, delay);
+
+ gcmkONERROR(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x00004,
+ &idle));
+
+ timer += delay;
+ delay *= 2;
+
+#if gcdGPU_TIMEOUT
+ if (timer >= Hardware->kernel->timeOut)
+ {
+ gckHARDWARE_DumpGPUState(Hardware);
+
+ if (Hardware->kernel->command)
+ {
+ gckCOMMAND_DumpExecutingBuffer(Hardware->kernel->command);
+ }
+
+ /* Even if hardware is not reset correctly, let software
+ ** continue to avoid software stuck. Software will timeout again
+ ** and try to recover GPU in next timeout.
+ */
+ gcmkONERROR(gcvSTATUS_DEVICE);
+ }
+#endif
+ }
+ while (!(((((gctUINT32) (idle)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ));
+
+ gcmkDUMP(Hardware->os, "@[register.wait 0x%05X 0x%08X 0x%08X]",
+ 0x00004,
+ ((((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) ((gctUINT32) (~0U) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))),
+ idle);
+
+ /* Enable MMU. */
+ if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL)
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx_NoDump(
+ Hardware->os,
+ Hardware->core,
+ 0x00388,
+ ((((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
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x0018C,
+ ((((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) ((gctUINT32) (gcvTRUE) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))
+ ));
+ }
+
+ /* Trigger a possible dummy draw. */
+ Hardware->kernel->command->dummyDraw = gcvTRUE;
+ }
+ }
+
+ /* Return the status. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_FlushMMU
+**
+** Flush the page table.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHARDWARE_FlushMMU(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN gctUINT32 SubsequentBytes,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gceSTATUS status;
+ gctUINT32_PTR buffer;
+ gctUINT32 flushSize;
+ gctBOOL bltEngine = gcvFALSE;
+ gctBOOL multiCluster = gcvFALSE;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ if (Hardware->mmuVersion == 0)
+ {
+ flushSize = 8;
+ }
+ else
+ {
+ flushSize = 10 * 4;
+
+ bltEngine = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_BLT_ENGINE);
+ multiCluster = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_MULTI_CLUSTER);
+
+ if (bltEngine)
+ {
+ flushSize += 4 * 4;
+
+ if (multiCluster)
+ {
+ flushSize += 2 * 4;
+ }
+ }
+ }
+
+ if (Logical)
+ {
+ if (*Bytes < flushSize)
+ {
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ /* Flush the memory controller. */
+ if (Hardware->mmuVersion == 0)
+ {
+ buffer = (gctUINT32_PTR)Logical;
+
+ buffer[0] = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E04) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)))
+ | ((((gctUINT32) (0)) & ~(((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)));
+ }
+ else
+ {
+ gctUINT32 count;
+ gctUINT32 offset = 2;
+ gctUINT32 prefetchCount = 4;
+ gctUINT32 semaphore, stall;
+
+ if (bltEngine)
+ {
+ prefetchCount += 2;
+ if (multiCluster)
+ {
+ prefetchCount++;
+ }
+ }
+
+ buffer = (gctUINT32_PTR)Logical;
+
+ count = SubsequentBytes >> 3;
+
+ /* LINK to next slot to flush FE FIFO. */
+ *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) (0x08 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (prefetchCount) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++ = Address + offset * gcmSIZEOF(gctUINT32);
+
+ /* Flush MMU cache. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0061) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = (((((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))));
+
+ if (bltEngine)
+ {
+ /* Blt lock. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++ = ((((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)));
+
+ if (multiCluster)
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x50CE) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++ = ((((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) (Hardware->identity.clusterAvailMask & Hardware->options.userClusterMask) & ((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0)));
+ }
+ }
+
+ /* Arm the PE-FE Semaphore. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ semaphore = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)));
+
+ if (Hardware->stallFEPrefetch)
+ {
+ semaphore |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1))))))) << (0 ?
+ 29:28))) | (((gctUINT32) (0x3 & ((gctUINT32) ((((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 29:28) - (0 ? 29:28) + 1))))))) << (0 ? 29:28)));
+ }
+
+ if (bltEngine)
+ {
+ semaphore |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+ else
+ {
+ semaphore |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+
+ *buffer++ = semaphore;
+
+ /* STALL FE until PE is done flushing. */
+ *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~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 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)));
+
+ if (Hardware->stallFEPrefetch)
+ {
+ stall |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1))))))) << (0 ?
+ 29:28))) | (((gctUINT32) (0x3 & ((gctUINT32) ((((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 29:28) - (0 ? 29:28) + 1))))))) << (0 ? 29:28)));
+ }
+
+ if (bltEngine)
+ {
+ stall |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+ else
+ {
+ stall |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+
+ *buffer++ = stall;
+
+ if (bltEngine)
+ {
+ /* Blt unlock. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++ = ((((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)));
+ }
+
+ /* LINK to next slot to flush FE FIFO. */
+ *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) (0x08 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (count) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *buffer++ = Address + flushSize;
+ }
+ }
+
+ if (Bytes)
+ {
+ *Bytes = flushSize;
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_FlushAsyncMMU(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT32 semaphore, stall;
+ gctUINT32_PTR buffer;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x *Bytes=%lu",
+ Hardware, Logical, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+
+ if (Logical != gcvNULL)
+ {
+ buffer = (gctUINT32_PTR) Logical;
+
+ 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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ ));
+
+ 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)))
+ ));
+
+ 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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0061) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ ));
+
+ 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))))
+ ));
+
+ 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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)))
+ ));
+
+ semaphore = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ if (Hardware->stallFEPrefetch)
+ {
+ semaphore |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1))))))) << (0 ?
+ 29:28))) | (((gctUINT32) (0x3 & ((gctUINT32) ((((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 29:28) - (0 ? 29:28) + 1))))))) << (0 ? 29:28)));
+ }
+
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 5,
+ semaphore));
+
+ 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)))
+ ));
+
+ stall = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ if (Hardware->stallFEPrefetch)
+ {
+ stall |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1))))))) << (0 ?
+ 29:28))) | (((gctUINT32) (0x3 & ((gctUINT32) ((((1 ?
+ 29:28) - (0 ?
+ 29:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 29:28) - (0 ? 29:28) + 1))))))) << (0 ? 29:28)));
+ }
+
+ gcmkONERROR(gckOS_WriteMemory(
+ Hardware->os,
+ buffer + 7,
+ stall));
+
+ 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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ ));
+
+ 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)))
+ ));
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the PIPESELECT command. */
+ *Bytes = 40;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_FlushMcfeMMU(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gceSTATUS status;
+ gctUINT32_PTR buffer;
+ gctUINT32 flushSize;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* MCFE with old mmu? nonsense!. */
+ gcmkASSERT(Hardware->mmuVersion > 0);
+
+ flushSize = 4 * 6;
+
+ if (Logical)
+ {
+ if (*Bytes < flushSize)
+ {
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ buffer = (gctUINT32_PTR)Logical;
+
+ /* Flush MMU cache. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0061) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = (((((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))));
+
+ /*
+ * System channel can only take one command at a time, Trigger and
+ * SubmitJob are not required.
+ */
+
+ /* AQHiIdle to trigger. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0001) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = 0;
+
+ /* SubmitJob. */
+ *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) (0x16 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) (0x001 & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
+
+ *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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+ }
+
+ if (Bytes)
+ {
+ *Bytes = flushSize;
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_ProgramMMUStates(
+ IN gckHARDWARE Hardware,
+ IN gckMMU Mmu,
+ IN gceMMU_MODE Mode,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT32 config, address;
+ gctUINT32 extMtlb, extSafeAddress, configEx = 0;
+ gctPHYS_ADDR_T physical;
+ gctUINT32_PTR buffer;
+ gctBOOL ace;
+ gctUINT32 reserveBytes = 0;
+
+ gctBOOL config2D;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Hardware->mmuVersion != 0);
+
+ ace = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_ACE);
+
+ switch (Hardware->options.secureMode)
+ {
+ case gcvSECURE_IN_NORMAL:
+ reserveBytes = 8 + 4 * 4;
+ break;
+ case gcvSECURE_NONE:
+ reserveBytes = 16 + 4 * 4;
+ if (ace)
+ {
+ reserveBytes += 8;
+ }
+ break;
+ case gcvSECURE_IN_TA:
+ default:
+ gcmkASSERT(gcvFALSE);
+ gcmkPRINT("%s(%d): secureMode is wrong", __FUNCTION__, __LINE__);
+ break;
+ }
+
+ config2D = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_PIPE_3D)
+ && gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_PIPE_2D);
+
+ if (config2D)
+ {
+ reserveBytes +=
+ /* Pipe Select. */
+ 4 * 4
+ /* Configure MMU States. */
+ + 4 * 4
+ /* Semaphore stall */
+ + 4 * 8;
+
+ if (ace)
+ {
+ reserveBytes += 8;
+ }
+ }
+
+ reserveBytes += 8;
+
+ physical = Mmu->mtlbPhysical;
+
+ config = (gctUINT32)(physical & 0xFFFFFFFF);
+ extMtlb = (gctUINT32)(physical >> 32);
+
+ /* more than 40bit physical address */
+ if (extMtlb & 0xFFFFFF00)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ physical = Mmu->safePagePhysical;
+
+ address = (gctUINT32)(physical & 0xFFFFFFFF);
+ extSafeAddress = (gctUINT32)(physical >> 32);
+
+ if (address & 0x3F)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_ALIGNED);
+ }
+
+ /* more than 40bit physical address */
+ if (extSafeAddress & 0xFFFFFF00)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ if (ace)
+ {
+ configEx = ((((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) (extSafeAddress) & ((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0)))
+ | ((((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) (extMtlb) & ((gctUINT32) ((((1 ?
+ 23:16) - (0 ?
+ 23:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)));
+ }
+
+ switch (Mode)
+ {
+ case gcvMMU_MODE_1K:
+ if (config & 0x3FF)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_ALIGNED);
+ }
+
+ config |= ((((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)));
+
+ break;
+
+ case gcvMMU_MODE_4K:
+ if (config & 0xFFF)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_ALIGNED);
+ }
+
+ config |= ((((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)));
+
+ break;
+
+ default:
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (Logical != gcvNULL)
+ {
+ buffer = Logical;
+
+ if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL)
+ {
+ gcsMMU_TABLE_ARRAY_ENTRY * entry;
+ entry = (gcsMMU_TABLE_ARRAY_ENTRY *) Hardware->pagetableArray.logical;
+
+ /* Setup page table array entry. */
+ if (Hardware->bigEndian)
+ {
+ entry->low = gcmBSWAP32(config);
+ entry->high = gcmBSWAP32(extMtlb);
+ }
+ else
+ {
+ entry->low = config;
+ entry->high = extMtlb;
+ }
+
+ gcmkDUMP(Mmu->os, "#[mmu: page table array]");
+
+ gcmkDUMP(Mmu->os, "@[physical.fill 0x%010llX 0x%08X 0x%08X]",
+ (unsigned long long)Hardware->pagetableArray.address, entry->low, 4);
+
+ gcmkDUMP(Mmu->os, "@[physical.fill 0x%010llX 0x%08X 0x%08X]",
+ (unsigned long long)Hardware->pagetableArray.address + 4, entry->high, 4);
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_CleanCache(
+ Hardware->kernel,
+ Hardware->pagetableArray.videoMem,
+ 0,
+ entry,
+ 8
+ ));
+
+ /* Setup command buffer to load index 0 of page table array. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x006B) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++
+ = (((((gctUINT32) (~0U)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) &((((gctUINT32) (~0U)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16))));
+ }
+ else
+ {
+ gcmkASSERT(Hardware->options.secureMode == gcvSECURE_NONE);
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0061) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = config;
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0060) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = address;
+
+ if (ace)
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0068) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++
+ = configEx;
+ }
+ }
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E12) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)));
+
+ do{*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) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1))))))) << (0 ?
+ 31:27))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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))); *buffer++ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))); *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))); *buffer++ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));} while(0);
+;
+
+
+ if (config2D)
+ {
+ /* LoadState(AQPipeSelect, 1), pipe. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E00) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = 0x1;
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0061) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = config;
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0060) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = address;
+
+ if (ace)
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0068) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++
+ = configEx;
+ }
+
+ do{*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) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1))))))) << (0 ?
+ 31:27))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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))); *buffer++ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))); *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))); *buffer++ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));} while(0);
+;
+
+
+ /* LoadState(AQPipeSelect, 1), pipe. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E00) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = 0x0;
+
+ do{*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) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1))))))) << (0 ?
+ 31:27))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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))); *buffer++ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))); *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) (0x09 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))); *buffer++ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));} while(0);
+;
+
+ }
+
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ *Bytes = reserveBytes;
+ }
+
+ /* Return the status. */
+ gcmkFOOTER_NO();
+ return status;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_ProgramMMUStatesMCFE(
+ IN gckHARDWARE Hardware,
+ IN gckMMU Mmu,
+ IN gceMMU_MODE Mode,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT32 config, address;
+ gctUINT32 extMtlb, extSafeAddress, configEx = 0;
+ gctPHYS_ADDR_T physical;
+ gctUINT32_PTR buffer;
+ gctBOOL ace;
+ gctUINT32 reserveBytes = 0;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Hardware->mmuVersion != 0);
+
+ ace = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_ACE);
+
+ switch (Hardware->options.secureMode)
+ {
+ case gcvSECURE_IN_NORMAL:
+ reserveBytes = 8;
+ reserveBytes += 8;
+ break;
+ case gcvSECURE_NONE:
+ reserveBytes = 16;;
+ if (ace)
+ {
+ reserveBytes += 8;
+ reserveBytes += 8;
+ }
+ break;
+ case gcvSECURE_IN_TA:
+ default:
+ gcmkASSERT(gcvFALSE);
+ gcmkPRINT("%s(%d): secureMode is wrong", __FUNCTION__, __LINE__);
+ break;
+ }
+
+ physical = Mmu->mtlbPhysical;
+
+ config = (gctUINT32)(physical & 0xFFFFFFFF);
+ extMtlb = (gctUINT32)(physical >> 32);
+
+ /* more than 40bit physical address */
+ if (extMtlb & 0xFFFFFF00)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ physical = Mmu->safePagePhysical;
+
+ address = (gctUINT32)(physical & 0xFFFFFFFF);
+ extSafeAddress = (gctUINT32)(physical >> 32);
+
+ if (address & 0x3F)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_ALIGNED);
+ }
+
+ /* more than 40bit physical address */
+ if (extSafeAddress & 0xFFFFFF00)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ if (ace)
+ {
+ configEx = ((((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) (extSafeAddress) & ((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0)))
+ | ((((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) (extMtlb) & ((gctUINT32) ((((1 ?
+ 23:16) - (0 ?
+ 23:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)));
+ }
+
+ switch (Mode)
+ {
+ case gcvMMU_MODE_1K:
+ if (config & 0x3FF)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_ALIGNED);
+ }
+
+ config |= ((((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)));
+
+ break;
+
+ case gcvMMU_MODE_4K:
+ if (config & 0xFFF)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_ALIGNED);
+ }
+
+ config |= ((((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)));
+
+ break;
+
+ default:
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (Logical != gcvNULL)
+ {
+ buffer = Logical;
+
+ if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL)
+ {
+ gcsMMU_TABLE_ARRAY_ENTRY * entry;
+ entry = (gcsMMU_TABLE_ARRAY_ENTRY *) Hardware->pagetableArray.logical;
+
+ /* Setup page table array entry. */
+ if (Hardware->bigEndian)
+ {
+ entry->low = gcmBSWAP32(config);
+ entry->high = gcmBSWAP32(extMtlb);
+ }
+ else
+ {
+ entry->low = config;
+ entry->high = extMtlb;
+ }
+
+ gcmkDUMP(Mmu->os, "#[mmu: page table array]");
+
+ gcmkDUMP(Mmu->os, "@[physical.fill 0x%010llX 0x%08X 0x%08X]",
+ (unsigned long long)Hardware->pagetableArray.address, entry->low, 4);
+
+ gcmkDUMP(Mmu->os, "@[physical.fill 0x%010llX 0x%08X 0x%08X]",
+ (unsigned long long)Hardware->pagetableArray.address + 4, entry->high, 4);
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_CleanCache(
+ Hardware->kernel,
+ Hardware->pagetableArray.videoMem,
+ 0,
+ entry,
+ 8
+ ));
+
+ /* Setup command buffer to load index 0 of page table array. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x006B) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++
+ = (((((gctUINT32) (~0U)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) &((((gctUINT32) (~0U)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16))));
+
+ *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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+ *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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+ }
+ else
+ {
+ gcmkASSERT(Hardware->options.secureMode == gcvSECURE_NONE);
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0061) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = config;
+
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0060) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = address;
+
+ if (ace)
+ {
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0068) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++ = configEx;
+
+ *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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+ *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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+ }
+ }
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ *Bytes = reserveBytes;
+ }
+
+ /* Return the status. */
+ gcmkFOOTER_NO();
+ return status;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_BuildVirtualAddress
+**
+** Build a virtual address.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** gctUINT32 Index
+** Index into page table.
+**
+** gctUINT32 Offset
+** Offset into page.
+**
+** OUTPUT:
+**
+** gctUINT32 * Address
+** Pointer to a variable receiving te hardware address.
+*/
+gceSTATUS
+gckHARDWARE_BuildVirtualAddress(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Index,
+ IN gctUINT32 Offset,
+ OUT gctUINT32 * Address
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x Index=%u Offset=%u", Hardware, Index, Offset);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Address != gcvNULL);
+
+ /* Build virtual address. */
+ *Address = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1))))))) << (0 ?
+ 31:31))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 30:0) - (0 ?
+ 30:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 30:0) - (0 ?
+ 30:0) + 1))))))) << (0 ?
+ 30:0))) | (((gctUINT32) ((gctUINT32) (Offset | (Index << 12)) & ((gctUINT32) ((((1 ?
+ 30:0) - (0 ?
+ 30:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 30:0) - (0 ? 30:0) + 1))))))) << (0 ? 30:0)));
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Address=0x%08x", *Address);
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckHARDWARE_GetIdle(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL Wait,
+ OUT gctUINT32 * Data
+ )
+{
+ gceSTATUS status;
+ gctUINT32 idle = 0;
+ gctINT retry, poll, pollCount;
+ gctUINT32 address;
+
+ gcmkHEADER_ARG("Hardware=0x%x Wait=%d", Hardware, Wait);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Data != gcvNULL);
+
+
+ /* If we have to wait, try 100 polls per millisecond. */
+ pollCount = Wait ? 100 : 1;
+
+ /* At most, try for 1 second. */
+ for (retry = 0; retry < 1000; ++retry)
+ {
+ /* If we have to wait, try 100 polls per millisecond. */
+ for (poll = pollCount; poll > 0; --poll)
+ {
+ /* Read register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00004, &idle));
+
+ /* Read the current FE address. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00664,
+ &address));
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00664,
+ &address));
+
+ /* See if we have to wait for FE idle. */
+ if (_IsGPUIdle(idle)
+ && (address == Hardware->lastEnd + 8)
+ )
+ {
+ /* FE is idle. */
+ break;
+ }
+ }
+
+ /* Check if we need to wait for FE and FE is busy. */
+ if (Wait && !_IsGPUIdle(idle))
+ {
+ /* Wait a little. */
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "%s: Waiting for idle: 0x%08X",
+ __FUNCTION__, idle);
+
+ gcmkVERIFY_OK(gckOS_Delay(Hardware->os, 1));
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ /* Return idle to caller. */
+ *Data = idle;
+
+#if defined(EMULATOR)
+ /* Wait a little while until CModel FE gets END.
+ * END is supposed to be appended by caller.
+ */
+ gckOS_Delay(Hardware->os, 100);
+#endif
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Data=0x%08x", *Data);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/* Flush the caches. */
+gceSTATUS
+gckHARDWARE_Flush(
+ IN gckHARDWARE Hardware,
+ IN gceKERNEL_FLUSH Flush,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT32 pipe;
+ gctUINT32 flush = 0;
+ gctUINT32 flushVST = 0;
+ gctBOOL flushTileStatus;
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+ gctBOOL halti5;
+ gctBOOL flushICache;
+ gctBOOL flushTXDescCache;
+ gctBOOL flushTFB;
+ gctBOOL hwTFB;
+ gctBOOL blt;
+ gctBOOL peTSFlush;
+ gctBOOL multiCluster;
+
+ gcmkHEADER_ARG("Hardware=0x%x Flush=0x%x Logical=0x%x *Bytes=%lu",
+ Hardware, Flush, Logical, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ /* Get current pipe. */
+ pipe = Hardware->kernel->command->pipeSelect;
+
+ halti5 = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HALTI5);
+
+ hwTFB = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HW_TFB);
+
+ blt = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_BLT_ENGINE);
+ multiCluster = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_MULTI_CLUSTER);
+
+ peTSFlush = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_PE_TILE_CACHE_FLUSH_FIX);
+
+ /* Flush tile status cache. */
+ flushTileStatus = Flush & gcvFLUSH_TILE_STATUS;
+
+ /* Flush Icache for halti5 hardware as we dont do it when program or context switches*/
+ flushICache = (Flush & gcvFLUSH_ICACHE) && halti5;
+
+ /* Flush texture descriptor cache */
+ flushTXDescCache = Flush & gcvFLUSH_TXDESC;
+
+ /* Flush USC cache for TFB client */
+ flushTFB = (Flush & gcvFLUSH_TFBHEADER) && hwTFB;
+
+ /* Flush TFB for vertex buffer */
+ if (Flush & gcvFLUSH_VERTEX)
+ {
+ if (hwTFB)
+ {
+ flushTFB = gcvTRUE;
+ }
+
+ if (multiCluster)
+ {
+ flush |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 14:14) - (0 ?
+ 14:14) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 14:14) - (0 ?
+ 14:14) + 1))))))) << (0 ?
+ 14:14))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 14:14) - (0 ?
+ 14:14) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 14:14) - (0 ? 14:14) + 1))))))) << (0 ? 14:14)));
+ }
+ }
+
+ /* Flush 3D color cache. */
+ if ((Flush & gcvFLUSH_COLOR) && (pipe == 0x0))
+ {
+ flush |= ((((gctUINT32) (0)) & ~(((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)));
+ }
+
+ /* Flush 3D depth cache. */
+ if ((Flush & gcvFLUSH_DEPTH) && (pipe == 0x0))
+ {
+ flush |= ((((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)));
+ }
+
+ /* Flush 3D texture cache. */
+ if ((Flush & gcvFLUSH_TEXTURE) && (pipe == 0x0))
+ {
+ flush |= multiCluster ?
+ 0 : ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)));
+ flushVST = ((((gctUINT32) (0)) & ~(((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)));
+ }
+
+ /* Flush 2D cache. */
+ if ((Flush & gcvFLUSH_2D) && (pipe == 0x1))
+ {
+ flush |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)));
+ }
+
+ /* Flush L2 cache. */
+ if ((Flush & gcvFLUSH_L2) && (pipe == 0x0))
+ {
+ flush |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)));
+ }
+
+ /* Vertex buffer and texture could be touched by SHL1 for SSBO and image load/store */
+ if ((Flush & (gcvFLUSH_VERTEX | gcvFLUSH_TEXTURE)) && (pipe == 0x0))
+ {
+ if (Hardware->identity.chipModel != 0x8000 || Hardware->identity.chipRevision != 0x7120 || !Hardware->options.enableNNTPParallel)
+ {
+ flush |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 10:10) - (0 ?
+ 10:10) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 10:10) - (0 ?
+ 10:10) + 1))))))) << (0 ?
+ 10:10))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 10:10) - (0 ?
+ 10:10) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 10:10) - (0 ? 10:10) + 1))))))) << (0 ? 10:10)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1))))))) << (0 ?
+ 11:11))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 11:11) - (0 ? 11:11) + 1))))))) << (0 ? 11:11)));
+ }
+ else
+ {
+ flush |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 10:10) - (0 ?
+ 10:10) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 10:10) - (0 ?
+ 10:10) + 1))))))) << (0 ?
+ 10:10))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 10:10) - (0 ?
+ 10:10) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 10:10) - (0 ? 10:10) + 1))))))) << (0 ? 10:10)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1))))))) << (0 ?
+ 11:11))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 11:11) - (0 ? 11:11) + 1))))))) << (0 ? 11:11)));
+ }
+ }
+
+ /* See if there is a valid flush. */
+ if ((flush == 0) &&
+ (flushTileStatus == gcvFALSE) &&
+ (flushICache == gcvFALSE) &&
+ (flushTXDescCache == gcvFALSE) &&
+ (flushTFB == gcvFALSE))
+ {
+ if (Bytes != gcvNULL)
+ {
+ /* No bytes required. */
+ *Bytes = 0;
+ }
+ }
+ else
+ {
+ gctBOOL appendNop = gcvFALSE;
+ gctUINT32 reserveBytes = 0;
+ gctBOOL txCacheFix = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_TEX_CACHE_FLUSH_FIX)
+ ? gcvTRUE : gcvFALSE;
+
+ /* Determine reserve bytes. */
+ if (!txCacheFix || flushICache || flushTXDescCache)
+ {
+ /* Semaphore/Stall */
+ reserveBytes += blt ? (8 * gcmSIZEOF(gctUINT32)) : (4 * gcmSIZEOF(gctUINT32));
+ }
+
+ if (flush)
+ {
+ reserveBytes += 2 * gcmSIZEOF(gctUINT32);
+ }
+
+ if (flushVST)
+ {
+ reserveBytes += 2 * gcmSIZEOF(gctUINT32);
+ }
+
+ if (flushTileStatus)
+ {
+ reserveBytes += (!peTSFlush && blt) ? 6 * gcmSIZEOF(gctUINT32) : 2 * gcmSIZEOF(gctUINT32);
+ }
+
+ if (flushICache)
+ {
+ reserveBytes += 2 * gcmSIZEOF(gctUINT32);
+ }
+
+ if (flushTXDescCache)
+ {
+ reserveBytes += 2 * gcmSIZEOF(gctUINT32);
+ }
+
+ if (flushTFB)
+ {
+ reserveBytes += 2 * gcmSIZEOF(gctUINT32);
+ }
+
+ /* Semaphore/Stall */
+ reserveBytes += blt ? (8 * gcmSIZEOF(gctUINT32)) : (4 * gcmSIZEOF(gctUINT32));
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_MCFE) && (reserveBytes & 8))
+ {
+ appendNop = gcvTRUE;
+ reserveBytes += 8;
+ }
+
+ /* Copy to command queue. */
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < reserveBytes)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ if (!txCacheFix || flushICache || flushTXDescCache)
+ {
+ if (blt)
+ {
+ /* Semaphore from FE to BLT. */
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *logical++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to BLT. */
+ *logical++
+ = ((((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)));
+
+ *logical++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+ }
+ else
+ {
+ /* Semaphore. */
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *logical++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall. */
+ *logical++
+ = ((((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)));
+
+ *logical++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+ }
+
+ if (flush)
+ {
+ /* Append LOAD_STATE to AQFlush. */
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E03) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++ = flush;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%x: FLUSH 0x%x", logical - 1, flush);
+ }
+
+ if (flushVST)
+ {
+ /* Append LOAD_STATE to AQFlush. */
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E03) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++ = flushVST;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%x: FLUSH 0x%x", logical - 1, flush);
+ }
+
+ if (flushTileStatus)
+ {
+ if (!peTSFlush && blt)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502B) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++
+ = ((((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)));
+
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+ }
+ else
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0594) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++
+ = ((((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)));
+ }
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%x: FLUSH TILE STATUS 0x%x", logical - 1, logical[-1]);
+ }
+
+ if (flushICache)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x022C) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++
+ = ((((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) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1))))))) << (0 ?
+ 4:4))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4)));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%x: FLUSH Icache 0x%x", logical - 1, logical[-1]);
+
+ }
+
+ if (flushTXDescCache)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x5311) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1))))))) << (0 ?
+ 31:28))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28)));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%x: FLUSH Icache 0x%x", logical - 1, logical[-1]);
+
+ }
+
+ if (flushTFB)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x7003) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++
+ = 0x1;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%x: FLUSH TFB cache 0x%x", logical - 1, logical[-1]);
+
+ }
+
+ if (blt)
+ {
+ /* Semaphore from FE to BLT. */
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *logical++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall from FE to BLT. */
+ *logical++
+ = ((((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)));
+
+ *logical++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x10 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+ }
+ else
+ {
+ /* Semaphore. */
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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)));
+
+ *logical++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+
+ /* Stall. */
+ *logical++
+ = ((((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)));
+
+ *logical++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+ if (appendNop)
+ {
+ *logical++
+ = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ *logical++
+ = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+ }
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* bytes required. */
+ *Bytes = reserveBytes;
+ }
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_SetFastClear(
+ IN gckHARDWARE Hardware,
+ IN gctINT Enable,
+ IN gctINT Compression
+ )
+{
+#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);
+
+ /* Only process if fast clear is available. */
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_FAST_CLEAR))
+ {
+ if (Enable == -1)
+ {
+ /* Determine automatic value for fast clear. */
+ Enable = ((Hardware->identity.chipModel != gcv500)
+ || (Hardware->identity.chipRevision >= 3)
+ ) ? 1 : 0;
+ }
+
+ if (compression == gcvCOMPRESSION_OPTION_DEFAULT)
+ {
+ /* Determine automatic value for compression. */
+ if (Enable)
+ {
+ if (gcvSTATUS_FALSE == gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_ZCOMPRESSION))
+ {
+ compression &= ~gcvCOMPRESSION_OPTION_DEPTH;
+ }
+ }
+ else
+ {
+ compression = gcvCOMPRESSION_OPTION_NONE;
+ }
+ }
+
+ /* Read AQMemoryDebug register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00414, &debug));
+
+ /* Set fast clear bypass. */
+ debug = ((((gctUINT32) (debug)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1))))))) << (0 ?
+ 20:20))) | (((gctUINT32) ((gctUINT32) (Enable == 0) & ((gctUINT32) ((((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 20:20) - (0 ? 20:20) + 1))))))) << (0 ? 20:20)));
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_BUG_FIXES7) ||
+ (Hardware->identity.chipModel >= gcv4000))
+ {
+ /* 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) ((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. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00414,
+ debug));
+
+ /* Store fast clear and comprersison flags. */
+ Hardware->options.allowFastClear = Enable;
+ Hardware->options.allowCompression = compression;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "FastClear=%d Compression=%d", Enable, Compression);
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+#else
+ return gcvSTATUS_OK;
+#endif
+}
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+static gctCONST_STRING
+_PowerEnum(gceCHIPPOWERSTATE State)
+{
+ const gctCONST_STRING baseStates[] =
+ {
+ "ON",
+ "IDLE",
+ "SUSPEND",
+ "OFF",
+ "ON[auto]",
+ };
+
+ const gctCONST_STRING broadcastStates[] =
+ {
+ "",
+ "IDLE[broadcast]",
+ "SUSPEND[broadcast]",
+ "OFF[broadcast]",
+ };
+
+ const gctCONST_STRING timeoutStates[] =
+ {
+ "",
+ "IDLE[timeout]",
+ "SUSPEND[timeout]",
+ "OFF[timeout]",
+ };
+
+ gcmSTATIC_ASSERT(gcvPOWER_ON == 0 && gcvPOWER_IDLE == 1 &&
+ gcvPOWER_SUSPEND == 2 && gcvPOWER_OFF == 3 &&
+ gcvPOWER_ON_AUTO == 4,
+ "array subscript does not match");
+
+ if (State & gcvPOWER_FLAG_BROADCAST)
+ {
+ return broadcastStates[State & ~gcvPOWER_FLAG_BROADCAST];
+ }
+ else if (State & gcvPOWER_FLAG_TIMEOUT)
+ {
+ return timeoutStates[State & ~gcvPOWER_FLAG_TIMEOUT];
+ }
+ else if ((State >= gcvPOWER_ON) && (State <= gcvPOWER_ON_AUTO))
+ {
+ return baseStates[State - gcvPOWER_ON];
+ }
+
+ return "unknown";
+}
+#endif
+
+static gceSTATUS
+_PmClockOn(
+ IN gckHARDWARE Hardware,
+ OUT gctBOOL * RequireInit
+ )
+{
+ gceSTATUS status;
+
+ /* Turn on the power. */
+ gcmkONERROR(gckOS_SetGPUPower(Hardware->os, Hardware->core,
+ gcvTRUE, gcvTRUE));
+
+ Hardware->clockState = Hardware->powerState = gcvTRUE;
+
+ /* Check if GPU is present and awake. */
+ while (_IsGPUPresent(Hardware) == gcvSTATUS_GPU_NOT_RESPONDING)
+ {
+ /* Turn off the power and clock. */
+ gcmkONERROR(gckOS_SetGPUPower(Hardware->os, Hardware->core,
+ gcvFALSE, gcvFALSE));
+
+ Hardware->clockState = Hardware->powerState = gcvFALSE;
+
+ /* Wait a little. */
+ gckOS_Delay(Hardware->os, 1);
+
+ /* Turn on the power and clock. */
+ gcmkONERROR(gckOS_SetGPUPower(Hardware->os, Hardware->core,
+ gcvTRUE, gcvTRUE));
+
+ Hardware->clockState = Hardware->powerState = gcvTRUE;
+
+ if (RequireInit)
+ {
+ *RequireInit = gcvTRUE;
+ }
+ }
+
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_PmClockOff(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL PowerState
+ )
+{
+ gceSTATUS status;
+
+ gcmkONERROR(gckOS_SetGPUPower(Hardware->os, Hardware->core,
+ gcvFALSE, PowerState));
+
+ Hardware->clockState = gcvFALSE;
+ Hardware->powerState = PowerState;
+
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_PmClockControl(
+ IN gckHARDWARE Hardware,
+ IN gceCHIPPOWERSTATE State
+ )
+{
+ gceSTATUS status;
+ gctUINT32 clock;
+
+ static const gctUINT clocks[4] =
+ {
+ /* gcvPOWER_ON */
+ ((((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) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1))))))) << (0 ?
+ 8:2))) | (((gctUINT32) ((gctUINT32) (64) & ((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))),
+
+ /* gcvPOWER_IDLE */
+ ((((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) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1))))))) << (0 ?
+ 8:2))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))),
+
+ /* gcvPOWER_SUSPEND */
+ ((((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) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1))))))) << (0 ?
+ 8:2))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))),
+
+ /* gcvPOWER_OFF */
+ ((((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) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1))))))) << (0 ?
+ 8:2))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9))),
+
+ };
+
+ clock = clocks[State];
+
+#if gcdENABLE_FSCALE_VAL_ADJUST
+ if (State == gcvPOWER_ON)
+ {
+ clock = ((((gctUINT32) (clock)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1))))))) << (0 ?
+ 8:2))) | (((gctUINT32) ((gctUINT32) (Hardware->powerOnFscaleVal) & ((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2)));
+ }
+#endif
+
+ if (Hardware->clockState && Hardware->powerState
+#if gcdDVFS
+ /* Don't touch clock control if dynamic frequency scaling is available. */
+ && !gckHARDWARE_IsFeatureAvailable(Hardware,
+ gcvFEATURE_DYNAMIC_FREQUENCY_SCALING)
+#endif
+ )
+ {
+ if ((State == gcvPOWER_OFF) &&
+ (Hardware->identity.chipModel == gcv4000) &&
+ ((Hardware->identity.chipRevision == 0x5208) ||
+ (Hardware->identity.chipRevision == 0x5222)))
+ {
+ clock &= ~2U;
+ }
+
+ /* Write the clock control register. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core,
+ 0x00000,
+ clock));
+
+ clock = ((((gctUINT32) (clock)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9)));
+
+ /* Done loading the frequency scaler. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core,
+ 0x00000,
+ clock));
+#if gcdENABLE_FSCALE_VAL_ADJUST
+ if (State == gcvPOWER_ON)
+ {
+ gcmkVERIFY_OK(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ &clock));
+
+ /* fscaleSh_clkSh = clkSh[7 :1 ];
+ fscaleShLoad_clkSh = clkSh [0 ];
+ enableAutoSh_clkSh = clkSh[16 ];
+ disableAuto_clkSh = clkSh[17 ];
+ */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ (clock & ~0xFE) | (Hardware->powerOnFscaleVal << 1) | 0x20001
+ ));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ clock));
+ }
+#endif
+ }
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_PmInitializeGPU(
+ IN gckHARDWARE Hardware,
+ IN gckCOMMAND Command
+ )
+{
+ gceSTATUS status;
+
+ /* Initialize hardware. */
+ gcmkONERROR(gckHARDWARE_InitializeHardware(Hardware));
+
+ gcmkONERROR(gckHARDWARE_SetFastClear(Hardware,
+ Hardware->options.allowFastClear,
+ Hardware->options.allowCompression));
+
+ /* Force the command queue to reload the next context. */
+ Command->currContext = gcvNULL;
+
+OnError:
+ return status;
+}
+
+/*
+ * Notice: this function may return gcvSTATUS_NOT_READY, which is not an error,
+ * but either not success.
+ */
+static gceSTATUS
+_PmStallCommand(
+ gckHARDWARE Hardware,
+ gckCOMMAND Command,
+ gctBOOL Broadcast
+ )
+{
+ gceSTATUS status;
+ gctBOOL idle;
+
+ if (Broadcast)
+ {
+ /* Check for idle. */
+ gcmkONERROR(gckHARDWARE_QueryIdle(Hardware, &idle));
+
+ if (!idle)
+ {
+ status = gcvSTATUS_CHIP_NOT_READY;
+ goto OnError;
+ }
+ }
+ else
+ {
+ /* Wait to finish all commands. */
+ status = gckCOMMAND_Stall(Command, gcvTRUE);
+
+ if (!gcmIS_SUCCESS(status))
+ {
+ goto OnError;
+ }
+
+ for (;;)
+ {
+ gcmkONERROR(gckHARDWARE_QueryIdle(Hardware, &idle));
+
+ if (idle)
+ {
+ break;
+ }
+
+ gcmkVERIFY_OK(gckOS_Delay(Hardware->os, 1));
+ }
+ }
+
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_PmFlushCache(
+ gckHARDWARE Hardware,
+ gckCOMMAND Command
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ if (Hardware->clockState == gcvFALSE)
+ {
+ /* Turn on the GPU power. */
+ gcmkONERROR(gckOS_SetGPUPower(Hardware->os, Hardware->core,
+ gcvTRUE, gcvTRUE));
+
+ Hardware->clockState = gcvTRUE;
+
+ /* Clock control, to ON state. */
+ gcmkONERROR(_PmClockControl(Hardware, gcvPOWER_ON));
+ }
+
+ if (_IsHardwareMatch(Hardware, gcv400, 0x4645))
+ {
+ gcmkONERROR(gckCOMMAND_Start(Command));
+
+ gcmkONERROR(_FlushCache(Hardware, Command));
+ gckOS_Delay(gcvNULL, 1);
+
+ /* Stop the command parser. */
+ gcmkONERROR(gckCOMMAND_Stop(Command));
+ }
+ else
+ {
+ gckHARDWARE_ExecuteFunctions(Hardware, gcvHARDWARE_FUNCTION_FLUSH);
+ gckOS_Delay(gcvNULL, 1);
+ }
+
+OnError:
+ return status;
+}
+
+/*
+ * Put power to on direction:
+ * Off -> Suspend
+ * Off -> Idle
+ * Off -> On
+ * Suspend -> Idle
+ * Suspend -> On
+ * Idle -> On
+ */
+static gceSTATUS
+_PmSetPowerOnDirection(
+ IN gckHARDWARE Hardware,
+ IN gceCHIPPOWERSTATE State
+ )
+{
+ gceSTATUS status;
+ gckCOMMAND command = Hardware->kernel->command;
+ gctBOOL clockOn = gcvFALSE;
+ gctBOOL requireInit = gcvFALSE;
+
+ switch (Hardware->chipPowerState)
+ {
+ case gcvPOWER_OFF:
+ if (State == gcvPOWER_SUSPEND)
+ {
+ gcmkONERROR(_PmClockOn(Hardware, gcvNULL));
+ clockOn = gcvTRUE;
+
+ /* Clock control, put to suspend. */
+ gcmkONERROR(_PmClockControl(Hardware, gcvPOWER_SUSPEND));
+
+ /* Initialize GPU. */
+ gcmkONERROR(_PmInitializeGPU(Hardware, command));
+
+ /* Suspend: clock off, power on. */
+ gcmkONERROR(_PmClockOff(Hardware, gcvTRUE));
+ break;
+ }
+
+ requireInit = gcvTRUE;
+
+ case gcvPOWER_SUSPEND:
+ /* Clock on. */
+ gcmkONERROR(_PmClockOn(Hardware, &requireInit));
+ clockOn = gcvTRUE;
+
+ /* Clock control, put to target state (On or idle). */
+ gcmkONERROR(_PmClockControl(Hardware, State));
+
+ /* Delay. */
+ gcmkONERROR(gckOS_Delay(Hardware->os, gcdPOWER_CONTROL_DELAY));
+
+ if (requireInit)
+ {
+ /* Initialize. */
+ gcmkONERROR(_PmInitializeGPU(Hardware, command));
+ }
+
+ /* Start. */
+ gcmkONERROR(gckCOMMAND_Start(command));
+ break;
+
+ case gcvPOWER_IDLE:
+ /* Clock control, put to ON state. */
+ gcmkONERROR(_PmClockControl(Hardware, gcvPOWER_ON));
+ break;
+
+ default:
+ break;
+ }
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (clockOn)
+ {
+ gctBOOL powerState =
+ (Hardware->chipPowerState == gcvPOWER_SUSPEND);
+
+ _PmClockOff(Hardware, powerState);
+ }
+
+ return status;
+}
+
+/*
+ * Put power to off direction:
+ * On -> Idle
+ * On -> Suspend
+ * On -> Off
+ * Idle -> Suspend
+ * Idle -> Off
+ * Suspend -> Off
+ */
+static gceSTATUS
+_PmSetPowerOffDirection(
+ IN gckHARDWARE Hardware,
+ IN gceCHIPPOWERSTATE State,
+ IN gctBOOL Broadcast
+ )
+{
+ gceSTATUS status;
+ gckCOMMAND command = Hardware->kernel->command;
+
+ switch (Hardware->chipPowerState)
+ {
+ case gcvPOWER_ON:
+ /* Stall. */
+ status = _PmStallCommand(Hardware, command, Broadcast);
+
+ if (!gcmIS_SUCCESS(status))
+ {
+ /* abort for error and NOT READY. */
+ goto OnError;
+ }
+
+ if (State == gcvPOWER_IDLE)
+ {
+ gcmkONERROR(_PmClockControl(Hardware, gcvPOWER_IDLE));
+ break;
+ }
+
+ case gcvPOWER_IDLE:
+ /* Stop. */
+ gcmkONERROR(gckCOMMAND_Stop(command));
+
+ if (State == gcvPOWER_SUSPEND)
+ {
+ /* Clock control, put to suspend state. */
+ gcmkONERROR(_PmClockControl(Hardware, gcvPOWER_SUSPEND));
+
+ /* Power on, clock off. */
+ gcmkONERROR(_PmClockOff(Hardware, gcvTRUE));
+ break;
+ }
+
+ case gcvPOWER_SUSPEND:
+ /* Flush. */
+ gcmkONERROR(_PmFlushCache(Hardware, command));
+
+ /* Clock control. */
+ gcmkONERROR(_PmClockControl(Hardware, gcvPOWER_OFF));
+
+ /* Power off, clock off. */
+ gcmkONERROR(_PmClockOff(Hardware, gcvFALSE));
+
+ break;
+
+ default:
+ break;
+ }
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_SetPowerState
+**
+** Set GPU to a specified power state.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** gceCHIPPOWERSTATE State
+** Power State.
+**
+*/
+gceSTATUS
+gckHARDWARE_SetPowerState(
+ IN gckHARDWARE Hardware,
+ IN gceCHIPPOWERSTATE State
+ )
+{
+ gceSTATUS status;
+ gckCOMMAND command = gcvNULL;
+ gckOS os;
+ gctBOOL acquired = gcvFALSE;
+ gctBOOL mutexAcquired = gcvFALSE;
+ gctBOOL broadcast = gcvFALSE;
+ gctBOOL timeout = gcvFALSE;
+ gceCHIPPOWERSTATE state = gcvPOWER_INVALID;
+
+ /*
+ * Acquire globalSempahore when set to to global OFF, IDLE, SUSPEND, then
+ * can not switch to non-global state unless global ON comes and release
+ * the globalSemaphore.
+ */
+ gctBOOL global = gcvFALSE;
+ gctBOOL globalAcquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Hardware=0x%x State=%d", Hardware, State);
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "Switching to power state %d(%s)",
+ State, _PowerEnum(State));
+#endif
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ os = Hardware->os;
+ command = Hardware->kernel->command;
+
+ /* Convert power state. */
+ switch (State)
+ {
+ case gcvPOWER_ON:
+ case gcvPOWER_OFF:
+ case gcvPOWER_IDLE:
+ case gcvPOWER_SUSPEND:
+ global = gcvTRUE;
+ state = State;
+ break;
+
+ case gcvPOWER_ON_AUTO:
+ state = gcvPOWER_ON;
+ break;
+
+ case gcvPOWER_OFF_TIMEOUT:
+ case gcvPOWER_IDLE_TIMEOUT:
+ case gcvPOWER_SUSPEND_TIMEOUT:
+ timeout = gcvTRUE;
+ case gcvPOWER_OFF_BROADCAST:
+ case gcvPOWER_IDLE_BROADCAST:
+ case gcvPOWER_SUSPEND_BROADCAST:
+ broadcast = gcvTRUE;
+ state = State & ~(gcvPOWER_FLAG_BROADCAST | gcvPOWER_FLAG_TIMEOUT);
+ break;
+
+ case gcvPOWER_INVALID:
+ /* Canceled, nothing to do. */
+ status = gcvSTATUS_OK;
+ goto OnError;
+
+ default:
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (Hardware->options.powerManagement == gcvFALSE &&
+ (Hardware->chipPowerState == gcvPOWER_ON || state != gcvPOWER_ON))
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ if (broadcast)
+ {
+ /* Try to acquire the power mutex. */
+ status = gckOS_AcquireMutex(os, Hardware->powerMutex, 0);
+
+ if (status == gcvSTATUS_TIMEOUT)
+ {
+ /* Pm in progress, abort. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ }
+ else
+ {
+ /* Acquire the power mutex. */
+ status = gckOS_AcquireMutex(os, Hardware->powerMutex, gcvINFINITE);
+ }
+
+ gcmkONERROR(status);
+ mutexAcquired = gcvTRUE;
+
+ if (Hardware->chipPowerState == state)
+ {
+ /* No state change. */
+ gckOS_ReleaseMutex(os, Hardware->powerMutex)
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ if (broadcast &&
+ state == gcvPOWER_SUSPEND && Hardware->chipPowerState == gcvPOWER_OFF)
+ {
+ /* Do nothing, donot change chipPowerState. */
+ gckOS_ReleaseMutex(os, Hardware->powerMutex)
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ if (timeout)
+ {
+ if (Hardware->nextPowerState == gcvPOWER_INVALID)
+ {
+ /* delayed power state change is canceled. */
+ gckOS_ReleaseMutex(os, Hardware->powerMutex)
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ }
+
+ if (global)
+ {
+ if (state != gcvPOWER_ON)
+ {
+ /*
+ * Switch to global non-ON (OFF, IDLE or SUSPEND), try acquire the
+ * global semaphore if it has not been acquired.
+ */
+ status = gckOS_TryAcquireSemaphore(os, Hardware->globalSemaphore);
+
+ if (status == gcvSTATUS_OK)
+ {
+ globalAcquired = gcvTRUE;
+ }
+ else if (status == gcvSTATUS_TIMEOUT)
+ {
+ /*
+ * Ignore and leave globalSemaphore not acquired in this try.
+ * In this condition, power state is changing between global
+ * OFF, SUSPEND and IDLE, which is allowed.
+ */
+ gcmkASSERT(Hardware->chipPowerState != gcvPOWER_ON);
+ }
+ else
+ {
+ /* Other errors. */
+ gcmkONERROR(status);
+ }
+ }
+ }
+ else
+ {
+ /* Try to acquire the global semaphore. */
+ status = gckOS_TryAcquireSemaphore(os, Hardware->globalSemaphore);
+
+ if (status == gcvSTATUS_TIMEOUT)
+ {
+ /* In global SUSPEND, IDLE, or OFF state. */
+ gcmkONERROR(gckOS_ReleaseMutex(os, Hardware->powerMutex));
+ mutexAcquired = gcvFALSE;
+
+ if (broadcast)
+ {
+ /* Abort power state change. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ /*
+ * Only ON_AUTO can run here.
+ * ON_AUTO state can not be skipped, either can not change a global
+ * state.
+ * So we need to wait until global ON state here.
+ */
+ gcmkONERROR(gckOS_AcquireSemaphore(os, Hardware->globalSemaphore));
+ globalAcquired = gcvTRUE;
+
+ /* Acquire the power mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(os,
+ Hardware->powerMutex,
+ gcvINFINITE));
+ mutexAcquired = gcvTRUE;
+
+ if (Hardware->chipPowerState == state)
+ {
+ /* Done. */
+ status = gcvSTATUS_OK;
+ goto OnError;
+ }
+ }
+ else
+ {
+ /* Check error. */
+ gcmkONERROR(status);
+ }
+
+ /* We just check if in non-global state, but need not to acquire it. */
+ gcmkONERROR(gckOS_ReleaseSemaphore(os, Hardware->globalSemaphore));
+ globalAcquired = gcvFALSE;
+ }
+
+ if (Hardware->chipPowerState == gcvPOWER_ON)
+ {
+ /* Switch from power ON to other non-runnable states. */
+ if (broadcast)
+ {
+ gctINT32 atomValue;
+
+ /* Try to acquire the semaphore to block/sync with commit. */
+ status = gckOS_TryAcquireSemaphore(os, command->powerSemaphore);
+
+ if (gcmIS_ERROR(status))
+ {
+ status = gcvSTATUS_CHIP_NOT_READY;
+ goto OnError;
+ }
+
+ acquired = gcvTRUE;
+
+ /* Check commit atom, abort when commit is in progress. */
+ gcmkONERROR(gckOS_AtomGet(Hardware->os,
+ command->atomCommit,
+ &atomValue));
+
+ if (atomValue > 0)
+ {
+ status = gcvSTATUS_CHIP_NOT_READY;
+ goto OnError;
+ }
+ }
+ else
+ {
+ /* Acquire/wait the semaphore to block/sync with command commit. */
+ gcmkONERROR(gckOS_AcquireSemaphore(os, command->powerSemaphore));
+ acquired = gcvTRUE;
+ }
+ }
+
+ /* Do hardware power state change. */
+ if (Hardware->chipPowerState < state)
+ {
+ /* On to off direction. */
+ gcmkONERROR(_PmSetPowerOffDirection(Hardware, state, broadcast));
+ }
+ else
+ {
+ /* Off to on direction. */
+ gcmkONERROR(_PmSetPowerOnDirection(Hardware, state));
+ }
+
+ if (status == gcvSTATUS_CHIP_NOT_READY)
+ {
+ /* CHIP_NOT_READY is not an error, either not success. */
+ goto OnError;
+ }
+
+ if (state == gcvPOWER_ON)
+ {
+ /* Switched to power ON from other non-runnable states. */
+ gcmkONERROR(gckOS_ReleaseSemaphore(os, command->powerSemaphore));
+ acquired = gcvFALSE;
+
+ if (global)
+ {
+ /*
+ * Global semaphore should be acquired already before, when
+ * global OFF, IDLE or SUSPEND.
+ */
+ status = gckOS_TryAcquireSemaphore(os, Hardware->globalSemaphore);
+ if (status != gcvSTATUS_TIMEOUT && Hardware->isLastPowerGlobal)
+ {
+ gcmkONERROR(status);
+ }
+
+ /* Switched to global ON, now release the global semaphore. */
+ gcmkONERROR(gckOS_ReleaseSemaphore(os, Hardware->globalSemaphore));
+ globalAcquired = gcvFALSE;
+ }
+ }
+
+ gckSTATETIMER_Accumulate(&Hardware->powerStateCounter,
+ Hardware->chipPowerState);
+
+ /* Save the new power state. */
+ Hardware->chipPowerState = state;
+ Hardware->isLastPowerGlobal = global;
+
+#if gcdDVFS
+ if (state == gcvPOWER_ON && Hardware->kernel->dvfs)
+ {
+ gckDVFS_Start(Hardware->kernel->dvfs);
+ }
+#endif
+
+ if (!broadcast)
+ {
+ /*
+ * Cancel delayed power state change.
+ * Stop timer is not as good as set as no state change. Timer may run
+ * into this function already when try to to stop the timer.
+ */
+ Hardware->nextPowerState = gcvPOWER_INVALID;
+ }
+
+#if gcdPOWEROFF_TIMEOUT
+ if (state == gcvPOWER_IDLE || state == gcvPOWER_SUSPEND)
+ {
+ /* Delayed power off. */
+ Hardware->nextPowerState = gcvPOWER_OFF_TIMEOUT;
+
+ /* Start a timer to power off GPU when GPU enters IDLE or SUSPEND. */
+ gcmkVERIFY_OK(gckOS_StartTimer(os, Hardware->powerStateTimer, gcdPOWEROFF_TIMEOUT));
+ }
+#endif
+
+ /* Release the power mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(os, Hardware->powerMutex));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Release semaphore. */
+ gcmkVERIFY_OK(gckOS_ReleaseSemaphore(Hardware->os,
+ command->powerSemaphore));
+ }
+
+ if (globalAcquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseSemaphore(Hardware->os,
+ Hardware->globalSemaphore));
+ }
+
+ if (mutexAcquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_QueryPowerState
+**
+** Get GPU power state.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** gceCHIPPOWERSTATE* State
+** Power State.
+**
+*/
+gceSTATUS
+gckHARDWARE_QueryPowerState(
+ IN gckHARDWARE Hardware,
+ OUT gceCHIPPOWERSTATE* State
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(State != gcvNULL);
+
+ /* Return the statue. */
+ *State = Hardware->chipPowerState;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*State=%d", *State);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_EnablePowerManagement
+**
+** Configure GPU power management function.
+** Only used in driver initialization stage.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** gctBOOL Enable
+** Power Mangement Enabling State.
+**
+*/
+gceSTATUS
+gckHARDWARE_EnablePowerManagement(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL Enable
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ if (_IsHardwareMatch(Hardware, gcv7000, 0x6008))
+ {
+ Enable = gcvFALSE;
+ }
+
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(Hardware->os, Hardware->powerMutex, gcvINFINITE));
+
+ Hardware->options.powerManagement = Enable;
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_SetGpuProfiler
+**
+** Configure GPU profiler function.
+** Only used in driver initialization stage.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** gctBOOL GpuProfiler
+** GOU Profiler State.
+**
+*/
+gceSTATUS
+gckHARDWARE_SetGpuProfiler(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL GpuProfiler
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ if (GpuProfiler == gcvTRUE)
+ {
+ gctUINT32 data = 0;
+
+ /* Need to disable clock gating when doing profiling. */
+ gcmkVERIFY_OK(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress +
+ 0x00100,
+ &data));
+
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1))))))) << (0 ?
+ 0:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
+
+
+ gcmkVERIFY_OK(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00100,
+ data));
+ }
+
+ Hardware->options.gpuProfiler= GpuProfiler;
+
+ if (GpuProfiler == gcvTRUE)
+ {
+ Hardware->waitCount = 200 * 100;
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+#if gcdENABLE_FSCALE_VAL_ADJUST
+gceSTATUS
+gckHARDWARE_SetFscaleValue(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 FscaleValue,
+ IN gctUINT32 ShaderFscaleValue
+ )
+{
+ gceSTATUS status;
+ gctUINT32 clock;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Hardware=0x%x FscaleValue=%d", Hardware, FscaleValue);
+
+ gcmkVERIFY_ARGUMENT(FscaleValue > 0 && FscaleValue <= 64);
+
+ gcmkONERROR(
+ gckOS_AcquireMutex(Hardware->os, Hardware->powerMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ Hardware->kernel->timeOut = Hardware->kernel->timeOut * Hardware->powerOnFscaleVal / 64;
+
+ Hardware->powerOnFscaleVal = FscaleValue;
+
+ Hardware->kernel->timeOut = Hardware->kernel->timeOut * 64 / Hardware->powerOnFscaleVal;
+
+ if (Hardware->chipPowerState == gcvPOWER_ON)
+ {
+ gctUINT32 data;
+
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ &data));
+
+ /* Disable all clock gating. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ ((((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) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1))))))) << (0 ?
+ 4:4))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1))))))) << (0 ?
+ 7:7))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1))))))) << (0 ?
+ 8:8))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 8:8) - (0 ? 8:8) + 1))))))) << (0 ? 8:8)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1))))))) << (0 ?
+ 11:11))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 11:11) - (0 ? 11:11) + 1))))))) << (0 ? 11:11)))));
+
+ /* Scale the core clock. */
+ clock = ((((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) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1))))))) << (0 ?
+ 8:2))) | (((gctUINT32) ((gctUINT32) (FscaleValue) & ((gctUINT32) ((((1 ?
+ 8:2) - (0 ?
+ 8:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 8:2) - (0 ? 8:2) + 1))))))) << (0 ? 8:2)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9)));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ clock));
+
+ /* Done loading the frequency scaler. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ ((((gctUINT32) (clock)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9)))));
+
+ /* A option to support shader clock scaling. */
+ if (ShaderFscaleValue != ~0U && ShaderFscaleValue > 0 && ShaderFscaleValue < 64)
+ {
+ /* Scale the shader clock. */
+ clock = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1))))))) << (0 ?
+ 17:17))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 17:17) - (0 ? 17:17) + 1))))))) << (0 ? 17:17)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:1) - (0 ?
+ 7:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:1) - (0 ?
+ 7:1) + 1))))))) << (0 ?
+ 7:1))) | (((gctUINT32) ((gctUINT32) (ShaderFscaleValue) & ((gctUINT32) ((((1 ?
+ 7:1) - (0 ?
+ 7:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:1) - (0 ? 7:1) + 1))))))) << (0 ? 7: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) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
+
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ clock));
+
+ /* Done loading the frequency scaler. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ ((((gctUINT32) (clock)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1))))))) << (0 ?
+ 0:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))));
+ }
+
+ /* Restore all clock gating. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ Hardware->powerBaseAddress
+ + 0x00104,
+ data));
+ }
+
+ gcmkVERIFY(gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ gcmkVERIFY(gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_GetFscaleValue(
+ IN gckHARDWARE Hardware,
+ IN gctUINT * FscaleValue,
+ IN gctUINT * MinFscaleValue,
+ IN gctUINT * MaxFscaleValue
+ )
+{
+ *FscaleValue = Hardware->powerOnFscaleVal;
+ *MinFscaleValue = Hardware->minFscaleValue;
+ *MaxFscaleValue = 64;
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckHARDWARE_SetMinFscaleValue(
+ IN gckHARDWARE Hardware,
+ IN gctUINT MinFscaleValue
+ )
+{
+ if (_IsHardwareMatch(Hardware, gcv600, 0x4653)
+ || _IsHardwareMatch(Hardware, gcv400, 0x4645))
+ {
+ if (MinFscaleValue < MIN_FSCALE_LIMIT)
+ {
+ MinFscaleValue = MIN_FSCALE_LIMIT;
+ }
+ }
+
+ if (MinFscaleValue >= 1 && MinFscaleValue <= 64)
+ {
+ Hardware->minFscaleValue = MinFscaleValue;
+ }
+
+ return gcvSTATUS_OK;
+}
+#endif
+
+gceSTATUS
+gckHARDWARE_QueryIdle(
+ IN gckHARDWARE Hardware,
+ OUT gctBOOL_PTR IsIdle
+ )
+{
+ gceSTATUS status;
+ gctUINT32 idle;
+#if !gcdSECURITY
+ gctUINT32 address;
+ gctUINT32 dmaLow;
+ gctUINT32 opCode;
+#endif
+ gctBOOL isIdle = gcvFALSE;
+
+#if gcdINTERRUPT_STATISTIC
+ gckEVENT eventObj = Hardware->kernel->eventObj;
+ gctINT32 pendingInterrupt;
+#endif
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(IsIdle != gcvNULL);
+
+ do
+ {
+ /* We are idle when the power is not ON. */
+ if (Hardware->chipPowerState != gcvPOWER_ON)
+ {
+ isIdle = gcvTRUE;
+ break;
+ }
+
+ /* Read idle register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00004, &idle));
+
+ /* Pipe must be idle. */
+ if ((idle | (1 << 14)) != 0x7ffffffe)
+ {
+ /* Something is busy. */
+ break;
+ }
+
+#if gcdSECURITY
+ isIdle = gcvTRUE;
+ break;
+#else
+ /* Read the current FE address. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00664,
+ &address));
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00664,
+ &address));
+
+ /* Test if address is inside the last WAIT/LINK sequence. */
+ if ((address < Hardware->lastWaitLink) ||
+ (address >= (gctUINT64)Hardware->lastWaitLink + 16))
+ {
+ /* FE is not in WAIT/LINK yet. */
+ break;
+ }
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00668,
+ &dmaLow));
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00668,
+ &dmaLow));
+
+ opCode = dmaLow >> 27;
+
+ /* Test if current command buffer is WAIT/LINK . */
+ if (opCode != 0x7 && opCode != 0x8)
+ {
+ /* FE is not in WAIT/LINK yet. */
+ break;
+ }
+#endif
+
+#if gcdINTERRUPT_STATISTIC
+ gcmkONERROR(gckOS_AtomGet(
+ Hardware->os,
+ eventObj->interruptCount,
+ &pendingInterrupt
+ ));
+
+ if (pendingInterrupt)
+ {
+ /* Pending interrupts, not idle. */
+ break;
+ }
+
+ if (Hardware->asyncFE)
+ {
+ gckEVENT asyncEvent = Hardware->kernel->asyncEvent;
+
+ gcmkONERROR(gckOS_AtomGet(
+ Hardware->os,
+ asyncEvent->interruptCount,
+ &pendingInterrupt
+ ));
+
+ if (pendingInterrupt)
+ {
+ /* Pending async FE interrupts, not idle. */
+ break;
+ }
+ }
+#endif
+
+ /* Is really idle. */
+ isIdle = gcvTRUE;
+ }
+ while (gcvFALSE);
+
+ *IsIdle = isIdle;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** Handy macros that will help in reading those debug registers.
+*/
+#define gcmkREAD_DEBUG_REGISTER_PART1(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_part1->data))
+
+#define gcmkREAD_DEBUG_REGISTER_PART2(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_part2->data))
+
+#define gcmkREAD_DEBUG_REGISTER_N(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, \
+ &data))
+
+#define gcmkRESET_DEBUG_REGISTER(control, block, value) \
+ gcmkONERROR(\
+ gckOS_WriteRegisterEx(Hardware->os, \
+ Hardware->core, \
+ GC_DEBUG_CONTROL##control##_Address, \
+ gcmSETFIELD(0, \
+ GC_DEBUG_CONTROL##control, \
+ block, \
+ value))); \
+ gcmkONERROR(\
+ gckOS_WriteRegisterEx(Hardware->os, \
+ Hardware->core, \
+ GC_DEBUG_CONTROL##control##_Address, \
+ gcmSETFIELD(0, \
+ GC_DEBUG_CONTROL##control, \
+ block, \
+ 0)))
+
+static gctUINT32
+CalcDelta(
+ IN gctUINT32 new,
+ IN gctUINT32 old
+ )
+{
+ if (new >= old)
+ {
+ return new - old;
+ }
+ else
+ {
+ return (gctUINT32)((gctUINT64)new + 0x100000000ll - old);
+ }
+}
+
+
+#if USE_SW_RESET
+#define gcmkRESET_PROFILE_DATA_PART1(counterName) \
+ temp = profiler_part1->counterName; \
+ profiler_part1->counterName = CalcDelta(temp, Context->preProfiler_part1.counterName); \
+ Context->preProfiler_part1.counterName = temp
+#endif
+
+#define gcmkUPDATE_PROFILE_DATA_PART1(data) \
+ profilerHistroy_part1->data += profiler_part1->data
+#define gcmkUPDATE_PROFILE_DATA_PART2(data) \
+ profilerHistroy_part2->data += profiler_part2->data
+
+gceSTATUS
+gckHARDWARE_QueryContextProfile(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL Reset,
+ IN gckCONTEXT Context,
+ OUT gcsPROFILER_COUNTERS_PART1 * Counters_part1,
+ OUT gcsPROFILER_COUNTERS_PART2 * Counters_part2
+)
+{
+ gceSTATUS status;
+ gckCOMMAND command = Hardware->kernel->command;
+ 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);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ if (!Context)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+ /* Acquire the context sequnence mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(
+ command->os, command->mutexContextSeq, gcvINFINITE
+ ));
+
+ /* Read the counters. */
+ if (Counters_part1)
+ {
+ gcmkVERIFY_OK(gckOS_MemCopy(
+ profiler_part1, &Context->histroyProfiler_part1, gcmSIZEOF(gcsPROFILER_COUNTERS_PART1)
+ ));
+ }
+ else if (Counters_part2)
+ {
+ gcmkVERIFY_OK(gckOS_MemCopy(
+ profiler_part2, &Context->histroyProfiler_part2, gcmSIZEOF(gcsPROFILER_COUNTERS_PART2)
+ ));
+ }
+
+ /* Reset counters. */
+ if (Reset)
+ {
+ if (Counters_part1)
+ {
+ gcmkVERIFY_OK(gckOS_ZeroMemory(
+ &Context->histroyProfiler_part1, gcmSIZEOF(gcsPROFILER_COUNTERS_PART1)
+ ));
+ }
+ else if (Counters_part2)
+ {
+ gcmkVERIFY_OK(gckOS_ZeroMemory(
+ &Context->histroyProfiler_part2, gcmSIZEOF(gcsPROFILER_COUNTERS_PART2)
+ ));
+ }
+ }
+
+ 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_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;
+ gctUINT32 resetValue = 0xF;
+ gctBOOL newCounters0 = gcvFALSE;
+ gctUINT32 clock;
+ gctUINT32 colorKilled = 0, colorDrawn = 0, depthKilled = 0, depthDrawn = 0;
+ gctUINT32 totalRead, totalWrite;
+ gctUINT32 mc_axi_max_min_latency;
+ gctUINT32 temp;
+ gckCOMMAND command = Hardware->kernel->command;
+ gctBOOL mutexAcquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Hardware=0x%x Context=0x%x", Hardware, Context);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_OBJECT(Context, gcvOBJ_CONTEXT);
+
+ /* Acquire the context sequnence mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(
+ command->os, command->mutexContextSeq, gcvINFINITE
+ ));
+ mutexAcquired = gcvTRUE;
+
+ chipModel = Hardware->identity.chipModel;
+ chipRevision = Hardware->identity.chipRevision;
+ if ((chipModel == gcv5000 && chipRevision == 0x5434) || (chipModel == gcv3000 && chipRevision == 0x5435))
+ {
+ resetValue = 0xFF;
+ newCounters0 = gcvTRUE;
+ }
+ if (chipModel == gcv2100 || chipModel == gcv2000 || chipModel == gcv880)
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00438,
+ &profiler_part2->hi_total_cycle_count));
+
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00078,
+ &profiler_part2->hi_total_idle_cycle_count));
+ }
+ else
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00078,
+ &profiler_part2->hi_total_cycle_count));
+
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0007C,
+ &profiler_part2->hi_total_idle_cycle_count));
+ }
+ gcmkUPDATE_PROFILE_DATA_PART2(hi_total_cycle_count);
+ gcmkUPDATE_PROFILE_DATA_PART2(hi_total_idle_cycle_count);
+
+ /* Read clock control register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ &clock));
+
+ profiler_part2->hi_total_read_8B_count = 0;
+ profiler_part2->hi_total_write_8B_count = 0;
+ profiler_part2->hi_total_readOCB_16B_count = 0;
+ profiler_part2->hi_total_writeOCB_16B_count = 0;
+ profiler_part1->pe0_pixel_count_drawn_by_color_pipe = 0;
+ profiler_part1->pe0_pixel_count_drawn_by_depth_pipe = 0;
+ profiler_part1->pe0_pixel_count_killed_by_color_pipe = 0;
+ profiler_part1->pe0_pixel_count_killed_by_depth_pipe = 0;
+ profiler_part1->pe1_pixel_count_drawn_by_color_pipe = 0;
+ profiler_part1->pe1_pixel_count_drawn_by_depth_pipe = 0;
+ profiler_part1->pe1_pixel_count_killed_by_color_pipe = 0;
+ profiler_part1->pe1_pixel_count_killed_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_part2->hi_total_read_8B_count += totalRead;
+ profiler_part2->hi_total_write_8B_count += totalWrite;
+
+ /* OCB-only BW */
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_OCB_COUNTER))
+ {
+ if (Hardware->identity.customerID == 0x7e ||
+ Hardware->identity.customerID == 0x7d)
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x17E00,
+ &totalRead));
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x17E10,
+ &totalWrite));
+ }
+ else
+ {
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x005C0,
+ &totalRead));
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x005D0,
+ &totalWrite));
+
+ }
+ }
+ else
+ {
+ totalRead = 0;
+ totalWrite = 0;
+ }
+
+
+ profiler_part2->hi_total_readOCB_16B_count += totalRead;
+ profiler_part2->hi_total_writeOCB_16B_count += 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 (i == 0)
+ {
+ profiler_part1->pe0_pixel_count_killed_by_color_pipe = colorKilled;
+ profiler_part1->pe0_pixel_count_killed_by_depth_pipe = depthKilled;
+ profiler_part1->pe0_pixel_count_drawn_by_color_pipe = colorDrawn;
+ profiler_part1->pe0_pixel_count_drawn_by_depth_pipe = depthDrawn;
+ }
+ else if (i == 1)
+ {
+ profiler_part1->pe1_pixel_count_killed_by_color_pipe = colorKilled;
+ profiler_part1->pe1_pixel_count_killed_by_depth_pipe = depthKilled;
+ profiler_part1->pe1_pixel_count_drawn_by_color_pipe = colorDrawn;
+ profiler_part1->pe1_pixel_count_drawn_by_depth_pipe = depthDrawn;
+ }
+ }
+
+ gcmkUPDATE_PROFILE_DATA_PART2(hi_total_read_8B_count);
+ gcmkUPDATE_PROFILE_DATA_PART2(hi_total_write_8B_count);
+ gcmkUPDATE_PROFILE_DATA_PART2(hi_total_readOCB_16B_count);
+ gcmkUPDATE_PROFILE_DATA_PART2(hi_total_writeOCB_16B_count);
+#if USE_SW_RESET
+ 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);
+ gcmkUPDATE_PROFILE_DATA_PART1(pe0_pixel_count_drawn_by_color_pipe);
+ gcmkUPDATE_PROFILE_DATA_PART1(pe0_pixel_count_drawn_by_depth_pipe);
+ gcmkUPDATE_PROFILE_DATA_PART1(pe1_pixel_count_killed_by_color_pipe);
+ gcmkUPDATE_PROFILE_DATA_PART1(pe1_pixel_count_killed_by_depth_pipe);
+ gcmkUPDATE_PROFILE_DATA_PART1(pe1_pixel_count_drawn_by_color_pipe);
+ gcmkUPDATE_PROFILE_DATA_PART1(pe1_pixel_count_drawn_by_depth_pipe);
+
+ /* Reset clock control register. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ clock));
+
+ 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
+
+ /* 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_part1->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_part1->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) (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, 0x00450, &profiler_part1->fe_cache_miss_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) (16) & ((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_part1->fe_cache_lk_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) (17) & ((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_part1->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) (18) & ((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_part1->fe_process_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)))
+));
+
+ gcmkUPDATE_PROFILE_DATA_PART1(fe_draw_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(fe_out_vertex_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(fe_cache_miss_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(fe_cache_lk_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(fe_process_count);
+
+ /* 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_part1->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_part1->ps_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_part1->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_part1->vs_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_part1->vs_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_part1->vs_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_part1->ps_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_part1->ps_texld_inst_counter));
+ if (newCounters0)
+ {
+ 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_part1->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_part1->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_part1->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_part1->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_part1->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_part1->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_part1->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_part1->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_part1->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_part1->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_part1->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_part1->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_part1->tx_process_count));
+ }
+#if USE_SW_RESET
+ 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 (newCounters0)
+ {
+ 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);
+ gcmkUPDATE_PROFILE_DATA_PART1(ps_rendered_pixel_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(vs_inst_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(vs_rendered_vertice_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(vs_branch_inst_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(vs_texld_inst_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(ps_branch_inst_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(ps_texld_inst_counter);
+ if (newCounters0)
+ {
+ gcmkUPDATE_PROFILE_DATA_PART1(vs_non_idle_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(vs_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(vs_stall_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(vs_process_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(ps_non_idle_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(ps_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(ps_stall_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(ps_process_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(shader_cycle_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_non_idle_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_stall_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(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_part1->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_part1->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_part1->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_part1->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_part1->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_part1->pa_culled_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) (9) & ((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_part1->pa_droped_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) (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, 0x00460, &profiler_part1->pa_frustum_clipped_prim_counter));
+ if (newCounters0)
+ {
+ 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_part1->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_part1->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_part1->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_part1->pa_process_count));
+ }
+#if USE_SW_RESET
+ 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 (newCounters0)
+ {
+ 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);
+ gcmkUPDATE_PROFILE_DATA_PART1(pa_input_prim_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(pa_output_prim_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(pa_depth_clipped_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(pa_trivial_rejected_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(pa_culled_prim_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(pa_droped_prim_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(pa_frustum_clipped_prim_counter);
+ if (newCounters0)
+ {
+ gcmkUPDATE_PROFILE_DATA_PART1(pa_non_idle_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(pa_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(pa_stall_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(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
+
+ 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) (15) & ((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_part1->se_clipped_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) (16) & ((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_part1->se_clipped_line_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) (17) & ((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_part1->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) (18) & ((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_part1->se_culled_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_part1->se_trivial_rejected_line_count));
+ if (newCounters0)
+ {
+ 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_part1->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_part1->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_part1->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_part1->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_part1->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_part1->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) (14) & ((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_part1->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_part1->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)))
+));
+
+ gcmkUPDATE_PROFILE_DATA_PART1(se_clipped_triangle_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_clipped_line_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_culled_triangle_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_culled_lines_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_trivial_rejected_line_count);
+ if (newCounters0)
+ {
+ gcmkUPDATE_PROFILE_DATA_PART1(se_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_stall_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_receive_triangle_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_send_triangle_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_receive_lines_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_send_lines_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_process_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(se_non_idle_starve_count);
+ }
+
+ /* 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_part1->ra_valid_pixel_count_to_render));
+ 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_part1->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_part1->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_part1->ra_input_prim_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_part1->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_part1->ra_prefetch_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) (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, 0x00448, &profiler_part1->ra_eez_culled_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) (17) & ((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_part1->ra_pipe_hz_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) (18) & ((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_part1->ra_prefetch_hz_cache_miss_counter));
+ if (newCounters0)
+ {
+ 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_part1->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_part1->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_part1->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_part1->ra_process_count));
+ }
+#if USE_SW_RESET
+ 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 (newCounters0)
+ {
+ 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);
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_total_quad_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_valid_quad_count_after_early_z);
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_input_prim_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_pipe_cache_miss_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_prefetch_cache_miss_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_eez_culled_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_pipe_hz_cache_miss_counter);
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_prefetch_hz_cache_miss_counter);
+ if (newCounters0)
+ {
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_non_idle_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_starve_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(ra_stall_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(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_part1->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_part1->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_part1->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_part1->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_part1->tx_mc0_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) (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_part1->tx_mc0_request_byte_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_part1->tx_mc1_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_part1->tx_mc1_request_byte_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)))
+));
+
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_total_bilinear_requests);
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_total_trilinear_requests);
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_total_discarded_texture_requests);
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_total_texture_requests);
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_mc0_miss_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_mc0_request_byte_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_mc1_miss_count);
+ gcmkUPDATE_PROFILE_DATA_PART1(tx_mc1_request_byte_count);
+
+ /* 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_part2->mcc_total_read_req_8B_from_colorpipe));
+ 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_part2->mcc_total_read_req_8B_sentout_from_colorpipe));
+ 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_part2->mcc_total_write_req_8B_from_colorpipe));
+ 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) (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, 0x00468, &profiler_part2->mcc_total_read_req_sentout_from_colorpipe));
+ 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) (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, 0x00468, &profiler_part2->mcc_total_write_req_from_colorpipe));
+ 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) (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, 0x00468, &profiler_part2->mcc_total_read_req_8B_from_depthpipe));
+ 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) (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, 0x00468, &profiler_part2->mcc_total_read_req_8B_sentout_from_depthpipe));
+ 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) (9) & ((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->mcc_total_write_req_8B_from_depthpipe));
+ 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) (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, 0x00468, &profiler_part2->mcc_total_read_req_sentout_from_depthpipe));
+ 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) (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, 0x00468, &profiler_part2->mcc_total_write_req_from_depthpipe));
+ 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) (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, 0x00468, &profiler_part2->mcc_total_read_req_8B_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) (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, 0x00468, &profiler_part2->mcc_total_write_req_8B_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) (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, 0x00468, &profiler_part2->mcc_total_read_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) (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, 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 ?
+ 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)))
+));
+
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_read_req_8B_from_colorpipe);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_read_req_8B_sentout_from_colorpipe);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_write_req_8B_from_colorpipe);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_read_req_sentout_from_colorpipe);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_write_req_from_colorpipe);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_read_req_8B_from_depthpipe);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_read_req_8B_sentout_from_depthpipe);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_write_req_8B_from_depthpipe);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_read_req_sentout_from_depthpipe);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_write_req_from_depthpipe);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_total_read_req_8B_from_others);
+ 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 (newCounters0)
+ {
+ /* latency */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0056C,
+ &mc_axi_max_min_latency));
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00570,
+ &profiler_part2->mcc_axi_total_latency));
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00574,
+ &profiler_part2->mcc_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_part2->mcc_axi_min_latency = (mc_axi_max_min_latency & 0xffff0000) >> 16;
+ profiler_part2->mcc_axi_max_latency = (mc_axi_max_min_latency & 0x0000ffff);
+ if (profiler_part2->mcc_axi_min_latency == 4095)
+ profiler_part2->mcc_axi_min_latency = 0;
+
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_axi_min_latency);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_axi_max_latency);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_axi_total_latency);
+ gcmkUPDATE_PROFILE_DATA_PART2(mcc_axi_sample_count);
+ }
+
+ /* 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_part2->hi0_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_part2->hi0_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_part2->hi0_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)))
+));
+
+ gcmkUPDATE_PROFILE_DATA_PART2(hi0_axi_cycles_read_request_stalled);
+ gcmkUPDATE_PROFILE_DATA_PART2(hi0_axi_cycles_write_request_stalled);
+ gcmkUPDATE_PROFILE_DATA_PART2(hi0_axi_cycles_write_data_stalled);
+
+ /* L2 */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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, 0x00564, &profiler_part2->l2_total_axi0_read_request_count));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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) (4) & ((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, 0x00564, &profiler_part2->l2_total_axi0_write_request_count));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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) (5) & ((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, 0x00564, &profiler_part2->l2_total_axi1_write_request_count));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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) (8) & ((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, 0x00564, &profiler_part2->l2_total_read_transactions_request_by_axi0));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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, 0x00564, &profiler_part2->l2_total_read_transactions_request_by_axi1));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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) (12) & ((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, 0x00564, &profiler_part2->l2_total_write_transactions_request_by_axi0));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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, 0x00564, &profiler_part2->l2_total_write_transactions_request_by_axi1));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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, 0x00564, &profiler_part2->l2_axi0_minmax_latency));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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) (17) & ((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, 0x00564, &profiler_part2->l2_axi0_total_latency));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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) (18) & ((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, 0x00564, &profiler_part2->l2_axi0_total_request_count));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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) (19) & ((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, 0x00564, &profiler_part2->l2_axi1_minmax_latency));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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) (20) & ((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, 0x00564, &profiler_part2->l2_axi1_total_latency));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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) (21) & ((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, 0x00564, &profiler_part2->l2_axi1_total_request_count));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00478, ((((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, 0x00478, ((((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)))
+));
+
+ profiler_part2->l2_axi0_min_latency = (profiler_part2->l2_axi0_minmax_latency & 0xffff0000) >> 16;
+ profiler_part2->l2_axi0_max_latency = (profiler_part2->l2_axi0_minmax_latency & 0x0000ffff);
+ profiler_part2->l2_axi1_min_latency = (profiler_part2->l2_axi0_minmax_latency & 0xffff0000) >> 16;
+ profiler_part2->l2_axi1_max_latency = (profiler_part2->l2_axi0_minmax_latency & 0x0000ffff);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_total_axi0_read_request_count);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_total_axi1_read_request_count);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_total_axi0_write_request_count);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_total_axi1_write_request_count);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_total_read_transactions_request_by_axi0);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_total_read_transactions_request_by_axi1);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_total_write_transactions_request_by_axi0);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_total_write_transactions_request_by_axi1);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_axi0_min_latency);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_axi0_max_latency);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_axi0_total_latency);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_axi0_total_request_count);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_axi1_min_latency);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_axi1_max_latency);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_axi1_total_latency);
+ gcmkUPDATE_PROFILE_DATA_PART2(l2_axi1_total_request_count);
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(
+ command->os, command->mutexContextSeq
+ ));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (mutexAcquired)
+ {
+ gckOS_ReleaseMutex(
+ command->os, command->mutexContextSeq
+ );
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+
+gceSTATUS
+gckHARDWARE_InitProfiler(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gctUINT32 control;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ &control));
+ /* Enable debug register. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ ((((gctUINT32) (control)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1))))))) << (0 ?
+ 11:11))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 11:11) - (0 ?
+ 11:11) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 11:11) - (0 ? 11:11) + 1))))))) << (0 ? 11:11)))));
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_ResetGPU(
+ IN gckHARDWARE Hardware,
+ IN gckOS Os,
+ IN gceCORE Core
+ )
+{
+ gctUINT32 control, idle;
+ gceSTATUS status;
+ gctUINT32 count = 0;
+ gctUINT32 mmuEnabled;
+
+ while (count < 2)
+ {
+ /* Disable clock gating. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ Hardware->powerBaseAddress +
+ 0x00104,
+ 0x00000000));
+
+ control = ((((gctUINT32) (0x01590880)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1))))))) << (0 ?
+ 17:17))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 17:17) - (0 ? 17:17) + 1))))))) << (0 ? 17:17)));
+
+ /* Disable pulse-eater. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x0010C,
+ control));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x0010C,
+ ((((gctUINT32) (control)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1))))))) << (0 ?
+ 0:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x0010C,
+ control));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x00000,
+ ((((gctUINT32) (0x00000900)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9)))));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x00000,
+ 0x00000900));
+
+ /* Wait for clock being stable. */
+ gcmkONERROR(gckOS_Delay(Os, 1));
+
+ /* Isolate the GPU. */
+ control = ((((gctUINT32) (0x00000900)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1))))))) << (0 ?
+ 19:19))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x00000,
+ control));
+
+ 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)))));
+ }
+
+#if gcdFPGA_BUILD
+ /* Wait more time on FPGA for reset as lower frequency */
+ gcmkONERROR(gckOS_Delay(Os, 10));
+#else
+ /* Wait for reset. */
+ gcmkONERROR(gckOS_Delay(Os, 1));
+#endif
+ /* Reset soft reset bit. */
+ 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) (0) & ((gctUINT32) ((((1 ?
+ 12:12) - (0 ?
+ 12:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:12) - (0 ? 12:12) + 1))))))) << (0 ? 12:12)))));
+
+ /* Reset GPU isolation. */
+ control = ((((gctUINT32) (control)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1))))))) << (0 ?
+ 19:19))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ Core,
+ 0x00000,
+ control));
+
+ /* Read idle register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Os,
+ Core,
+ 0x00004,
+ &idle));
+
+
+ if ((((((gctUINT32) (idle)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ) == 0)
+ {
+ continue;
+ }
+
+ gcmkDUMP(Os, "@[register.wait 0x%05X 0x%08X 0x%08X]",
+ 0x00004,
+ ((((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) ((gctUINT32) (~0U) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))),
+ idle);
+
+ /* Read reset register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Os,
+ Core,
+ 0x00000,
+ &control));
+ if (((((((gctUINT32) (control)) >> (0 ? 16:16)) & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1)))))) ) == 0)
+ || ((((((gctUINT32) (control)) >> (0 ? 17:17)) & ((gctUINT32) ((((1 ? 17:17) - (0 ? 17:17) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 17:17) - (0 ? 17:17) + 1)))))) ) == 0)
+ )
+ {
+ continue;
+ }
+
+ gcmkDUMP(Os, "@[register.wait 0x%05X 0x%08X 0x%08X]",
+ 0x00000,
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) ((gctUINT32) (~0U) & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1))))))) << (0 ?
+ 17:17))) | (((gctUINT32) ((gctUINT32) (~0U) & ((gctUINT32) ((((1 ?
+ 17:17) - (0 ?
+ 17:17) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 17:17) - (0 ? 17:17) + 1))))))) << (0 ? 17:17))),
+ control);
+
+ /* Force Disable MMU to guarantee setup command be read from physical addr */
+ if (Hardware->options.secureMode == gcvSECURE_IN_NORMAL)
+ {
+ gctUINT32 regMmuCtrl = 0;
+ gcmkONERROR(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x00388,
+ &regMmuCtrl
+ ));
+
+ mmuEnabled = (((((gctUINT32) (regMmuCtrl)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) );
+ }
+ else
+ {
+ gctUINT32 regMmuCtrl = 0;
+
+ gcmkONERROR(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x0018C,
+ &regMmuCtrl
+ ));
+
+ mmuEnabled = (((((gctUINT32) (regMmuCtrl)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) );
+ }
+
+ if (mmuEnabled)
+ {
+ /* Not reset properly, reset again. */
+ continue;
+ }
+
+ count++;
+ }
+
+ /* Success. */
+ return gcvSTATUS_OK;
+
+OnError:
+
+ /* Return the error. */
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_Reset(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_OBJECT(Hardware->kernel, gcvOBJ_KERNEL);
+
+ /* Record context ID in debug register before reset. */
+ gcmkONERROR(gckHARDWARE_UpdateContextID(Hardware));
+
+ /* Hardware reset. */
+ status = gckOS_ResetGPU(Hardware->os, Hardware->core);
+
+ if (gcmIS_ERROR(status))
+ {
+ if (Hardware->identity.chipRevision < 0x4600)
+ {
+ /* Not supported - we need the isolation bit. */
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ /* Soft reset. */
+ gcmkONERROR(_ResetGPU(Hardware, Hardware->os, Hardware->core));
+ }
+
+ /* Force the command queue to reload the next context. */
+ Hardware->kernel->command->currContext = gcvNULL;
+
+ /* Initialize hardware. */
+ gcmkONERROR(gckHARDWARE_InitializeHardware(Hardware));
+
+ /* Jump to address into which GPU should run if it doesn't stuck. */
+ if (Hardware->wlFE)
+ {
+ gcmkONERROR(gckWLFE_Execute(Hardware, Hardware->kernel->restoreAddress, 16));
+ }
+
+ gcmkPRINT("[galcore]: recovery done");
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkPRINT("[galcore]: Hardware not reset successfully, give up");
+
+ /* Return the error. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_GetBaseAddress(
+ IN gckHARDWARE Hardware,
+ OUT gctUINT32_PTR BaseAddress
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(BaseAddress != gcvNULL);
+
+ /* Get the base address from the OS. */
+ *BaseAddress = Hardware->baseAddress;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*BaseAddress=0x%08x", *BaseAddress);
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckHARDWARE_NeedBaseAddress(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 State,
+ OUT gctBOOL_PTR NeedBase
+ )
+{
+ gctBOOL need = gcvFALSE;
+
+ gcmkHEADER_ARG("Hardware=0x%x State=0x%08x", Hardware, State);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(NeedBase != gcvNULL);
+
+ /* Make sure this is a load state. */
+ if (((((gctUINT32) (State)) >> (0 ?
+ 31:27) & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1)))))) == (0x01 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))))
+ {
+#if gcdENABLE_3D
+ /* Get the state address. */
+ switch ((((((gctUINT32) (State)) >> (0 ? 15:0)) & ((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1)))))) ))
+ {
+ case 0x0596:
+ case 0x0597:
+ case 0x0599:
+ case 0x059A:
+ case 0x05A9:
+ /* These states need a TRUE physical address if MC20 fix is not there */
+ need = (gcvSTATUS_FALSE == gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_MC20));
+ break;
+ }
+#else
+ /* 2D addresses don't need a base address. */
+#endif
+ }
+
+ /* Return the flag. */
+ *NeedBase = need;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*NeedBase=%d", *NeedBase);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_IsFeatureAvailable
+**
+** Verifies whether the specified feature is available in hardware.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** gceFEATURE Feature
+** Feature to be verified.
+*/
+gceSTATUS
+gckHARDWARE_IsFeatureAvailable(
+ IN gckHARDWARE Hardware,
+ IN gceFEATURE Feature
+ )
+{
+ gctBOOL available;
+
+ gcmkHEADER_ARG("Hardware=0x%x Feature=%d", Hardware, Feature);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ available = _QueryFeatureDatabase(Hardware, Feature);
+
+ /* Return result. */
+ gcmkFOOTER_ARG("%d", available ? gcvSTATUS_TRUE : gcvSTATUS_FALSE);
+ return available ? gcvSTATUS_TRUE : gcvSTATUS_FALSE;
+}
+
+gceSTATUS
+gckHARDWARE_QueryMcfe(
+ IN gckHARDWARE Hardware,
+ OUT const gceMCFE_CHANNEL_TYPE * Channels[],
+ OUT gctUINT32 * Count
+ )
+{
+ if (!_QueryFeatureDatabase(Hardware, gcvFEATURE_MCFE))
+ {
+ /* No MCFE feature. */
+ return gcvSTATUS_NOT_SUPPORTED;
+ }
+
+ if (Channels)
+ {
+ *Channels = Hardware->mcfeChannels;
+ }
+
+ if (Count)
+ {
+ *Count = Hardware->mcfeChannelCount;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+
+/*******************************************************************************
+**
+** gckHARDWARE_DumpMMUException
+**
+** Dump the MMU debug info on an MMU exception.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHARDWARE_DumpMMUException(
+ IN gckHARDWARE Hardware
+ )
+{
+ gctUINT32 mmu = 0;
+ gctUINT32 mmuStatus = 0;
+ gctUINT32 address = 0;
+ gctUINT32 i = 0;
+ gctUINT32 mtlb = 0;
+ gctUINT32 stlb = 0;
+ gctUINT32 offset = 0;
+ gctUINT32 mmuStatusRegAddress;
+ gctUINT32 mmuExceptionAddress;
+ gceAREA_TYPE areaType = gcvAREA_TYPE_UNKNOWN;
+ gctUINT32 stlbShift;
+ gctUINT32 stlbMask;
+ gctUINT32 pgoffMask;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+#if gcdENABLE_TRUST_APPLICATION
+ if (Hardware->options.secureMode == gcvSECURE_IN_TA)
+ {
+ gcmkVERIFY_OK(gckKERNEL_SecurityDumpMMUException(Hardware->kernel));
+
+ gckMMU_DumpRecentFreedAddress(Hardware->kernel->mmu);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ else
+#endif
+ if (Hardware->options.secureMode == gcvSECURE_NONE)
+ {
+ mmuStatusRegAddress = 0x00188;
+ mmuExceptionAddress = 0x00190;
+ }
+ else
+ {
+ mmuStatusRegAddress = 0x00384;
+ mmuExceptionAddress = 0x00380;
+ }
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ gcmkPRINT("GPU[%d](ChipModel=0x%x ChipRevision=0x%x):\n",
+ Hardware->core,
+ Hardware->identity.chipModel,
+ Hardware->identity.chipRevision);
+
+ gcmkPRINT("**************************\n");
+ gcmkPRINT("*** MMU ERROR DUMP ***\n");
+ gcmkPRINT("**************************\n");
+
+
+ gcmkVERIFY_OK(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ mmuStatusRegAddress,
+ &mmuStatus));
+
+ gcmkPRINT(" MMU status = 0x%08X\n", mmuStatus);
+
+ for (i = 0; i < 4; i += 1)
+ {
+ mmu = mmuStatus & 0xF;
+ mmuStatus >>= 4;
+
+ if (mmu == 0)
+ {
+ continue;
+ }
+
+ switch (mmu)
+ {
+ case 1:
+ gcmkPRINT(" MMU%d: slave not present\n", i);
+ break;
+
+ case 2:
+ gcmkPRINT(" MMU%d: page not present\n", i);
+ break;
+
+ case 3:
+ gcmkPRINT(" MMU%d: write violation\n", i);
+ break;
+
+ case 4:
+ gcmkPRINT(" MMU%d: out of bound", i);
+ break;
+
+ case 5:
+ gcmkPRINT(" MMU%d: read security violation", i);
+ break;
+
+ case 6:
+ gcmkPRINT(" MMU%d: write security violation", i);
+ break;
+
+ default:
+ gcmkPRINT(" MMU%d: unknown state\n", i);
+ }
+
+ if (Hardware->options.secureMode == gcvSECURE_NONE)
+ {
+ gcmkVERIFY_OK(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ mmuExceptionAddress + i * 4,
+ &address));
+ }
+ else
+ {
+ gcmkVERIFY_OK(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ mmuExceptionAddress,
+ &address));
+ }
+
+ gckMMU_GetAreaType(Hardware->kernel->mmu, address, &areaType);
+
+ if (areaType == gcvAREA_TYPE_UNKNOWN)
+ {
+ gcmkPRINT(" MMU%d: exception address = 0x%08X, it is not mapped.\n", i, address);
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ pgoffMask = (areaType == gcvAREA_TYPE_4K) ? gcdMMU_OFFSET_4K_MASK : gcdMMU_OFFSET_1M_MASK;
+ stlbShift = (areaType == gcvAREA_TYPE_4K) ? gcdMMU_STLB_4K_SHIFT : gcdMMU_STLB_1M_SHIFT;
+ stlbMask = (areaType == gcvAREA_TYPE_4K) ? gcdMMU_STLB_4K_MASK : gcdMMU_STLB_1M_MASK;
+
+ mtlb = (address & gcdMMU_MTLB_MASK) >> gcdMMU_MTLB_SHIFT;
+ stlb = (address & stlbMask) >> stlbShift;
+ offset = address & pgoffMask;
+
+ gcmkPRINT(" MMU%d: exception address = 0x%08X\n", i, address);
+
+ gcmkPRINT(" MTLB entry = %d\n", mtlb);
+
+ gcmkPRINT(" STLB entry = %d\n", stlb);
+
+ gcmkPRINT(" Offset = 0x%08X (%d)\n", offset, offset);
+
+ gckMMU_DumpPageTableEntry(Hardware->kernel->mmu, areaType, address);
+
+ gckMMU_DumpRecentFreedAddress(Hardware->kernel->mmu);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckHARDWARE_HandleFault(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status = gcvSTATUS_NOT_SUPPORTED;
+ gctUINT32 mmu, mmuStatus, address = gcvINVALID_ADDRESS, i = 0;
+ gctUINT32 mmuStatusRegAddress;
+ gctUINT32 mmuExceptionAddress;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ if (Hardware->options.secureMode == gcvSECURE_NONE)
+ {
+ mmuStatusRegAddress = 0x00188;
+ mmuExceptionAddress = 0x00190;
+ }
+ else
+ {
+ mmuStatusRegAddress = 0x00384;
+ mmuExceptionAddress = 0x00380;
+ }
+
+ /* Get MMU exception address. */
+#if gcdENABLE_TRUST_APPLICATION
+ if (Hardware->options.secureMode == gcvSECURE_IN_TA)
+ {
+ gckKERNEL_ReadMMUException(Hardware->kernel, &mmuStatus, &address);
+ }
+ else
+#endif
+ {
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ mmuStatusRegAddress,
+ &mmuStatus
+ ));
+
+ gcmkPRINT(" MMU status = 0x%08X\n", mmuStatus);
+
+ for (i = 0; i < 4; i += 1)
+ {
+ mmu = mmuStatus & 0xF;
+ mmuStatus >>= 4;
+
+ if (mmu == 0)
+ {
+ continue;
+ }
+
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ mmuExceptionAddress + i * 4,
+ &address
+ ));
+
+ break;
+ }
+ }
+
+ if (address != gcvINVALID_ADDRESS)
+ {
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gctUINT32 offset = 0;
+ gctPHYS_ADDR_T physicalAddress = 0;
+ gceAREA_TYPE areaType;
+ gctUINT32 pageMask;
+ gcePAGE_TYPE pageType;
+
+ gckMMU_GetAreaType(Hardware->kernel->mmu, address, &areaType);
+
+ pageMask = (areaType == gcvAREA_TYPE_4K) ? gcdMMU_PAGE_4K_MASK : gcdMMU_PAGE_1M_MASK;
+ pageType = (areaType == gcvAREA_TYPE_4K) ? gcvPAGE_TYPE_4K : gcvPAGE_TYPE_1M;
+
+#if gcdENABLE_TRUST_APPLICATION
+ address &= ~gcdMMU_PAGE_4K_MASK;
+#else
+ address &= ~pageMask;
+#endif
+
+ /* Try to allocate memory and setup map for exception address. */
+ gcmkONERROR(gckVIDMEM_NODE_Find(
+ Hardware->kernel,
+ address,
+ &nodeObject,
+ &offset
+ ));
+
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(
+ Hardware->kernel,
+ nodeObject,
+ offset,
+ &physicalAddress
+ ));
+
+#if gcdENABLE_TRUST_APPLICATION
+ if (Hardware->options.secureMode == gcvSECURE_IN_TA)
+ {
+ gckKERNEL_HandleMMUException(
+ Hardware->kernel,
+ mmuStatus,
+ physicalAddress,
+ address
+ );
+ }
+ else
+#endif
+ {
+ gctUINT32_PTR entry;
+
+ /* Setup page table. */
+ gcmkONERROR(gckMMU_GetPageEntry(Hardware->kernel->mmu, pageType, address, &entry));
+
+ gckMMU_SetPage(Hardware->kernel->mmu, physicalAddress, pageType, gcvTRUE, entry);
+
+ /* Resume hardware execution. */
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ mmuExceptionAddress + i * 4,
+ *entry
+ ));
+ }
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_DumpMCFEState(
+ IN gckOS Os,
+ IN gceCORE Core
+ )
+{
+ gctUINT32 i, j, data = 0, array[8] = { 0 };
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER();
+
+ gcmkPRINT("**************************\n");
+ gcmkPRINT("***** MCFE STATE *****\n");
+ gcmkPRINT("**************************\n");
+
+ /* Fetch address of channels. */
+ gcmkPRINT("Channel fetch addresses:\n");
+ gcmkPRINT(" [00] [01] [02] [03]\n");
+
+ for (i = 0; i < 4; i++)
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x3 + 2 * i));
+ }
+
+ for (i = 0; i < 16; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x2 + 2 * j));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &array[j]));
+ }
+
+ gcmkPRINT(" 0x%08X 0x%08X 0x%08X 0x%08X\n", array[0], array[1], array[2], array[3]);
+ }
+
+ /* Command data of channels. */
+ gcmkPRINT_N(0, "Channel command data:\n");
+ gcmkPRINT_N(0, " [00] [01] [02] [03]\n");
+ gcmkPRINT_N(0, " [Low High] [Low High] [Low High] [Low High]\n");
+
+
+ for (i = 0; i < 4; i++)
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x11 + 4 * i));
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x11 + 4 * i + 2));
+ }
+
+ for (i = 0; i < 32; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x10 + 4 * j));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &array[j * 2]));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x10 + 4 * j + 2));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &array[j * 2 + 1]));
+ }
+
+ gcmkPRINT_N(0, " 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\n",
+ array[0], array[1], array[2], array[3], array[4], array[5], array[6], array[7]);
+ }
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x00));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &data));
+ gcmkPRINT_N(0, "0x00: 0x%08X\n", data);
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x01));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &data));
+ gcmkPRINT_N(0, "0x01: 0x%08X\n", data);
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x0A));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &data));
+ gcmkPRINT_N(0, "WaitSemaphore: 0x%08X\n", data);
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x0B));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &data));
+ gcmkPRINT_N(0, "WaitEventID(channel 0 and 1): 0x%08X\n", data);
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x0C));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &data));
+ gcmkPRINT_N(0, "WaitEventID(channel 2 and 3): 0x%08X\n", data);
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x0D));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &data));
+ gcmkPRINT_N(0, "DecodeState: 0x%08X\n", data);
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x0E));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &data));
+ gcmkPRINT_N(0, "DebugSelect(0x0E): 0x%08X\n", data);
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x0F));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &data));
+ gcmkPRINT_N(0, "DebugSelect(0x0F): 0x%08X\n", data);
+
+ for (i = 0; i < 9; i++)
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx(Os, Core, 0x470, 0x20 + i));
+ gcmkONERROR(gckOS_ReadRegisterEx(Os, Core, 0x450, &data));
+ gcmkPRINT_N(0, "DebugSelect(0x%02X): 0x%08X\n", 0x20 + i, data);
+ }
+
+OnError:
+ gcmkFOOTER();
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_DumpGPUState
+**
+** Dump the GPU debug registers.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHARDWARE_DumpGPUState(
+ IN gckHARDWARE Hardware
+ )
+{
+ static gctCONST_STRING _cmdState[] =
+ {
+ "PAR_IDLE_ST", "PAR_DEC_ST", "PAR_ADR0_ST", "PAR_LOAD0_ST",
+ "PAR_ADR1_ST", "PAR_LOAD1_ST", "PAR_3DADR_ST", "PAR_3DCMD_ST",
+ "PAR_3DCNTL_ST", "PAR_3DIDXCNTL_ST", "PAR_INITREQDMA_ST", "PAR_DRAWIDX_ST",
+ "PAR_DRAW_ST", "PAR_2DRECT0_ST", "PAR_2DRECT1_ST", "PAR_2DDATA0_ST",
+ "PAR_2DDATA1_ST", "PAR_WAITFIFO_ST", "PAR_WAIT_ST", "PAR_LINK_ST",
+ "PAR_END_ST", "PAR_STALL_ST", "INVALID_PAR_ST", "INVALID_PAR_ST",
+ "INVALID_PAR_ST", "INVALID_PAR_ST", "INVALID_PAR_ST", "INVALID_PAR_ST",
+ "INVALID_PAR_ST", "INVALID_PAR_ST", "INVALID_PAR_ST", "INVALID_PAR_ST"
+ };
+
+ static gctCONST_STRING _cmdDmaState[] =
+ {
+ "CMD_IDLE_ST", "CMD_START_ST", "CMD_REQ_ST", "CMD_END_ST"
+ };
+
+ static gctCONST_STRING _cmdFetState[] =
+ {
+ "FET_IDLE_ST", "FET_RAMVALID_ST", "FET_VALID_ST", "INVALID_FET_ST"
+ };
+
+ static gctCONST_STRING _reqDmaState[] =
+ {
+ "REQ_IDLE_ST", "REQ_WAITIDX_ST", "REQ_CAL_ST", "INVALID_REQ_ST"
+ };
+
+ static gctCONST_STRING _calState[] =
+ {
+ "CAL_IDLE_ST", "CAL_LDADR_ST", "CAL_IDXCALC_ST", "INVALID_CAL_ST"
+ };
+
+ static gctCONST_STRING _veReqState[] =
+ {
+ "VER_IDLE_ST", "VER_CKCACHE_ST", "VER_MISS_ST", "INVALID_VER_ST"
+ };
+
+ enum
+ {
+ RA_INDEX = 0,
+ TX_INDEX = 1,
+ FE_INDEX = 2,
+ PE_INDEX = 3,
+ DE_INDEX = 4,
+ SH_INDEX = 5,
+ PA_INDEX = 6,
+ SE_INDEX = 7,
+ MC_INDEX = 8,
+ HI_INDEX = 9,
+ TPG_INDEX = 10,
+ TFB_INDEX = 11,
+ USC_INDEX = 12,
+ L2_INDEX = 13,
+ BLT_INDEX = 14,
+ WD_INDEX = 15,
+ VTXDATA_INDEX = 16,
+ DIR_INDEX = 17,
+ PPA_INDEX = 18,
+ NN_INDEX = 19,
+ MODULE_MAX_INDEX,
+ };
+
+ /* must keep order correctly for _dbgRegs, we need ajust some value base on the index */
+ static gcsiDEBUG_REGISTERS _dbgRegs[MODULE_MAX_INDEX] =
+ {
+ { "RA", 0x474, 16, 0x448, 256, 0x1, 0x00, gcvTRUE, gcvTRUE },
+ { "TX", 0x474, 24, 0x44C, 128, 0x1, 0x00, gcvTRUE, gcvTRUE },
+ { "FE", 0x470, 0, 0x450, 256, 0x1, 0x00, gcvTRUE, gcvFALSE },
+ { "PE", 0x470, 16, 0x454, 256, 0x3, 0x00, gcvTRUE, gcvTRUE },
+ { "DE", 0x470, 8, 0x458, 256, 0x1, 0x00, gcvTRUE, gcvFALSE },
+ { "SH", 0x470, 24, 0x45C, 256, 0x1, 0x00, gcvTRUE, gcvTRUE },
+ { "PA", 0x474, 0, 0x460, 256, 0x1, 0x00, gcvTRUE, gcvTRUE },
+ { "SE", 0x474, 8, 0x464, 256, 0x1, 0x00, gcvTRUE, gcvTRUE },
+ { "MC", 0x478, 0, 0x468, 256, 0x3, 0x00, gcvTRUE, gcvTRUE },
+ { "HI", 0x478, 8, 0x46C, 256, 0x1, 0x00, gcvTRUE, gcvFALSE },
+ { "TPG", 0x474, 24, 0x44C, 32, 0x2, 0x80, gcvFALSE, gcvTRUE },
+ { "TFB", 0x474, 24, 0x44C, 32, 0x2, 0xA0, gcvFALSE, gcvTRUE },
+ { "USC", 0x474, 24, 0x44C, 64, 0x2, 0xC0, gcvFALSE, gcvTRUE },
+ { "L2", 0x478, 0, 0x564, 256, 0x1, 0x00, gcvTRUE, gcvFALSE },
+ { "BLT", 0x478, 24, 0x1A4, 256, 0x1, 0x00, gcvFALSE, gcvTRUE },
+ { "WD", 0xF0, 16, 0xF4, 256, 0x1, 0x00, gcvFALSE, gcvFALSE },
+ { "VTXDATA", 0x474, 24, 0x44C, 64, 0x1, 0x40, gcvFALSE, gcvTRUE },
+ { "DIR", 0xF0, 24, 0xF8, 256, 0x1, 0x00, gcvFALSE, gcvTRUE },
+ { "PPA", 0x474, 0, 0x598, 256, 0x1, 0x00, gcvFALSE, gcvTRUE },
+ { "NN", 0x474, 24, 0x44C, 256, 0x2, 0x00, gcvFALSE, gcvTRUE },
+
+ };
+
+ static gctUINT32 _otherRegs[] =
+ {
+ 0x040, 0x044, 0x04C, 0x050, 0x054, 0x058, 0x05C, 0x060,
+ 0x43c, 0x440, 0x444, 0x414, 0x100
+ };
+
+ gceSTATUS status;
+ gctUINT32 idle = 0, axi = 0;
+ gctUINT32 dmaAddress1 = 0, dmaAddress2 = 0;
+ gctUINT32 dmaState1 = 0, dmaState2 = 0;
+ gctUINT32 dmaLow = 0, dmaHigh = 0;
+ gctUINT32 cmdState = 0, cmdDmaState = 0, cmdFetState = 0;
+ gctUINT32 dmaReqState = 0, calState = 0, veReqState = 0;
+ gctUINT i;
+ gctUINT pipe = 0, pipeMask = 0x1;
+ static const gctUINT maxNumOfPipes = 4;
+ gctUINT32 control = 0, oldControl = 0;
+ gckOS os = Hardware->os;
+ gceCORE core = Hardware->core;
+ gceSTATUS hwTFB = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HW_TFB);
+ gceSTATUS usc = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_USC);
+ gceSTATUS multiCluster = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_MULTI_CLUSTER);
+ gceSTATUS bltEngine = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_BLT_ENGINE);
+ gceSTATUS gsShader = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_GEOMETRY_SHADER);
+ gceSTATUS nnEngine = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_NN_ENGINE);
+
+ gcmkHEADER_ARG("Hardware=0x%X", Hardware);
+
+ gcmkPRINT_N(12, "GPU[%d](ChipModel=0x%x ChipRevision=0x%x):\n",
+ core,
+ Hardware->identity.chipModel,
+ Hardware->identity.chipRevision);
+
+ /* Reset register values. */
+ idle = axi =
+ dmaState1 = dmaState2 =
+ dmaAddress1 = dmaAddress2 =
+ dmaLow = dmaHigh = 0;
+
+ switch (Hardware->identity.pixelPipes)
+ {
+ case 2:
+ pipeMask = 0x3;
+ break;
+ case 1:
+ pipeMask = 0x1;
+ break;
+ default:
+ gcmkASSERT(0);
+ }
+ /* Verify whether DMA is running. */
+ gcmkONERROR(_VerifyDMA(
+ os, core, &dmaAddress1, &dmaAddress2, &dmaState1, &dmaState2
+ ));
+
+ cmdState = dmaState2 & 0x1F;
+ cmdDmaState = (dmaState2 >> 8) & 0x03;
+ cmdFetState = (dmaState2 >> 10) & 0x03;
+ dmaReqState = (dmaState2 >> 12) & 0x03;
+ calState = (dmaState2 >> 14) & 0x03;
+ veReqState = (dmaState2 >> 16) & 0x03;
+
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, 0x00004, &idle));
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, 0x0000C, &axi));
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, 0x00668, &dmaLow));
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, 0x00668, &dmaLow));
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, 0x0066C, &dmaHigh));
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, 0x0066C, &dmaHigh));
+
+ gcmkPRINT_N(0, "**************************\n");
+ gcmkPRINT_N(0, "*** GPU STATE DUMP ***\n");
+ gcmkPRINT_N(0, "**************************\n");
+
+ gcmkPRINT_N(4, " axi = 0x%08X\n", axi);
+
+ gcmkPRINT_N(4, " idle = 0x%08X\n", idle);
+ if ((idle & 0x00000001) == 0) gcmkPRINT_N(0, " FE not idle\n");
+ if ((idle & 0x00000002) == 0) gcmkPRINT_N(0, " DE not idle\n");
+ if ((idle & 0x00000004) == 0) gcmkPRINT_N(0, " PE not idle\n");
+ if ((idle & 0x00000008) == 0) gcmkPRINT_N(0, " SH not idle\n");
+ if ((idle & 0x00000010) == 0) gcmkPRINT_N(0, " PA not idle\n");
+ if ((idle & 0x00000020) == 0) gcmkPRINT_N(0, " SE not idle\n");
+ if ((idle & 0x00000040) == 0) gcmkPRINT_N(0, " RA not idle\n");
+ if ((idle & 0x00000080) == 0) gcmkPRINT_N(0, " TX not idle\n");
+ if ((idle & 0x00000100) == 0) gcmkPRINT_N(0, " VG not idle\n");
+ if ((idle & 0x00000200) == 0) gcmkPRINT_N(0, " IM not idle\n");
+ if ((idle & 0x00000400) == 0) gcmkPRINT_N(0, " FP not idle\n");
+ if ((idle & 0x00000800) == 0) gcmkPRINT_N(0, " TS not idle\n");
+ if ((idle & 0x00001000) == 0) gcmkPRINT_N(0, " BL not idle\n");
+ if ((idle & 0x00002000) == 0) gcmkPRINT_N(0, " ASYNCFE not idle\n");
+ if ((idle & 0x00004000) == 0) gcmkPRINT_N(0, " MC not idle\n");
+ if ((idle & 0x00008000) == 0) gcmkPRINT_N(0, " PPA not idle\n");
+ if ((idle & 0x00010000) == 0) gcmkPRINT_N(0, " DC not idle\n");
+ if ((idle & 0x00020000) == 0) gcmkPRINT_N(0, " WD not idle\n");
+ if ((idle & 0x00040000) == 0) gcmkPRINT_N(0, " NN not idle\n");
+ if ((idle & 0x00080000) == 0) gcmkPRINT_N(0, " TP not idle\n");
+ if ((idle & 0x80000000) != 0) gcmkPRINT_N(0, " AXI low power mode\n");
+
+ if ((dmaAddress1 == dmaAddress2)
+ && (dmaState1 == dmaState2))
+ {
+ gcmkPRINT_N(0, " DMA appears to be stuck at this address:\n");
+ gcmkPRINT_N(4, " 0x%08X\n", dmaAddress1);
+ }
+ else
+ {
+ if (dmaAddress1 == dmaAddress2)
+ {
+ gcmkPRINT_N(0, " DMA address is constant, but state is changing:\n");
+ gcmkPRINT_N(4, " 0x%08X\n", dmaState1);
+ gcmkPRINT_N(4, " 0x%08X\n", dmaState2);
+ }
+ else
+ {
+ gcmkPRINT_N(0, " DMA is running; known addresses are:\n");
+ gcmkPRINT_N(4, " 0x%08X\n", dmaAddress1);
+ gcmkPRINT_N(4, " 0x%08X\n", dmaAddress2);
+ }
+ }
+
+ gcmkPRINT_N(4, " dmaLow = 0x%08X\n", dmaLow);
+ gcmkPRINT_N(4, " dmaHigh = 0x%08X\n", dmaHigh);
+ gcmkPRINT_N(4, " dmaState = 0x%08X\n", dmaState2);
+ gcmkPRINT_N(8, " command state = %d (%s)\n", cmdState, _cmdState [cmdState]);
+ gcmkPRINT_N(8, " command DMA state = %d (%s)\n", cmdDmaState, _cmdDmaState[cmdDmaState]);
+ gcmkPRINT_N(8, " command fetch state = %d (%s)\n", cmdFetState, _cmdFetState[cmdFetState]);
+ gcmkPRINT_N(8, " DMA request state = %d (%s)\n", dmaReqState, _reqDmaState[dmaReqState]);
+ gcmkPRINT_N(8, " cal state = %d (%s)\n", calState, _calState [calState]);
+ gcmkPRINT_N(8, " VE request state = %d (%s)\n", veReqState, _veReqState [veReqState]);
+
+ gcmkPRINT_N(0, " Debug registers:\n");
+
+ if (bltEngine)
+ {
+ _dbgRegs[BLT_INDEX].avail = gcvTRUE;
+ }
+ if (hwTFB)
+ {
+ _dbgRegs[TFB_INDEX].avail = gcvTRUE;
+ }
+ if (usc)
+ {
+ _dbgRegs[USC_INDEX].avail = gcvTRUE;
+ }
+ if (gsShader)
+ {
+ _dbgRegs[TPG_INDEX].avail = gcvTRUE;
+ }
+ if (multiCluster)
+ {
+ _dbgRegs[WD_INDEX].avail = gcvTRUE;
+ _dbgRegs[DIR_INDEX].avail = gcvTRUE;
+ _dbgRegs[VTXDATA_INDEX].avail = gcvTRUE;
+ _dbgRegs[PPA_INDEX].avail = gcvTRUE;
+ _dbgRegs[FE_INDEX].index = 0xF0;
+ _dbgRegs[HI_INDEX].index = 0xF0;
+ /*spare 64 DWORDS debug values from TX for VTXDATA prefetch in USC */
+ _dbgRegs[TX_INDEX].count = 64;
+
+ for (i = 0; i < gcmCOUNTOF(_dbgRegs); i++)
+ {
+ if (_dbgRegs[i].inCluster)
+ {
+ _dbgRegs[i].pipeMask =
+ Hardware->identity.clusterAvailMask & Hardware->options.userClusterMask;
+ }
+ }
+ pipeMask = Hardware->identity.clusterAvailMask & Hardware->options.userClusterMask;
+ }
+ if (nnEngine)
+ {
+ _dbgRegs[NN_INDEX].avail = gcvTRUE;
+ }
+
+ for (i = 0; i < gcmCOUNTOF(_dbgRegs); i += 1)
+ {
+ gcmkONERROR(_DumpDebugRegisters(os, core, &_dbgRegs[i]));
+ }
+
+ /* Record control. */
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, 0x0, &oldControl));
+
+ for (pipe = 0; pipe < maxNumOfPipes; pipe++)
+ {
+ if (((1 << pipe) & pipeMask) == 0)
+ continue;
+
+ gcmkPRINT_N(4, " Other Registers[%d]:\n", pipe);
+
+ /* Switch pipe. */
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, 0x0, &control));
+ control &= ~(0xF << 20);
+ control |= (pipe << 20);
+ gcmkONERROR(gckOS_WriteRegisterEx(os, core, 0x0, control));
+
+ for (i = 0; i < gcmCOUNTOF(_otherRegs); i += 1)
+ {
+ gctUINT32 read;
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, _otherRegs[i], &read));
+ gcmkPRINT_N(12, " [0x%04X] 0x%08X\n", _otherRegs[i], read);
+ }
+
+ if (Hardware->mmuVersion)
+ {
+ gcmkPRINT(" MMU status from MC[%d]:", pipe);
+ gckHARDWARE_DumpMMUException(Hardware);
+ }
+ }
+
+ /* MCFE state. */
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_MCFE))
+ {
+ gcmkVERIFY_OK(_DumpMCFEState(os, core));
+ }
+
+ /* Restore control. */
+ gcmkONERROR(gckOS_WriteRegisterEx(os, core, 0x0, oldControl));
+
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_HALTI0))
+ {
+ /* FE debug register. */
+ gcmkVERIFY_OK(_DumpLinkStack(os, core, &_dbgRegs[2]));
+ }
+
+ _DumpFEStack(os, core, &_dbgRegs[2]);
+
+ gcmkPRINT_N(0, "**************************\n");
+ gcmkPRINT_N(0, "***** SW COUNTERS *****\n");
+ gcmkPRINT_N(0, "**************************\n");
+ gcmkPRINT_N(4, " Execute Count = 0x%08X\n", Hardware->executeCount);
+ gcmkPRINT_N(4, " Execute Addr = 0x%08X\n", Hardware->lastExecuteAddress);
+ gcmkPRINT_N(4, " End Addr = 0x%08X\n", Hardware->lastEnd);
+
+ /* dump stack. */
+ gckOS_DumpCallStack(os);
+
+OnError:
+
+ /* Return the error. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+gckHARDWARE_ReadPerformanceRegister(
+ IN gckHARDWARE Hardware,
+ IN gctUINT PerformanceAddress,
+ IN gctUINT IndexAddress,
+ IN gctUINT IndexShift,
+ IN gctUINT Index,
+ OUT gctUINT32_PTR Value
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x PerformanceAddress=0x%x IndexAddress=0x%x "
+ "IndexShift=%u Index=%u",
+ Hardware, PerformanceAddress, IndexAddress, IndexShift,
+ Index);
+
+ /* Write the index. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ IndexAddress,
+ Index << IndexShift));
+
+ /* Read the register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ PerformanceAddress,
+ Value));
+
+ /* Test for reset. */
+ if (Index == 15)
+ {
+ /* Index another register to get out of reset. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, IndexAddress, 0));
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Value=0x%x", *Value);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_GetFrameInfo(
+ IN gckHARDWARE Hardware,
+ OUT gcsHAL_FRAME_INFO * FrameInfo
+ )
+{
+ gceSTATUS status;
+ gctUINT i, clock;
+ gcsHAL_FRAME_INFO info;
+#if gcdFRAME_DB_RESET
+ gctUINT reset;
+#endif
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Get profile tick. */
+ gcmkONERROR(gckOS_GetProfileTick(&info.ticks));
+
+ /* Read SH counters and reset them. */
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0045C,
+ 0x00470,
+ 24,
+ 4,
+ &info.shaderCycles));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0045C,
+ 0x00470,
+ 24,
+ 9,
+ &info.vsInstructionCount));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0045C,
+ 0x00470,
+ 24,
+ 12,
+ &info.vsTextureCount));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0045C,
+ 0x00470,
+ 24,
+ 7,
+ &info.psInstructionCount));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0045C,
+ 0x00470,
+ 24,
+ 14,
+ &info.psTextureCount));
+#if gcdFRAME_DB_RESET
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0045C,
+ 0x00470,
+ 24,
+ 15,
+ &reset));
+#endif
+
+ /* Read PA counters and reset them. */
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00460,
+ 0x00474,
+ 0,
+ 3,
+ &info.vertexCount));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00460,
+ 0x00474,
+ 0,
+ 4,
+ &info.primitiveCount));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00460,
+ 0x00474,
+ 0,
+ 7,
+ &info.rejectedPrimitives));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00460,
+ 0x00474,
+ 0,
+ 8,
+ &info.culledPrimitives));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00460,
+ 0x00474,
+ 0,
+ 6,
+ &info.clippedPrimitives));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00460,
+ 0x00474,
+ 0,
+ 5,
+ &info.outPrimitives));
+#if gcdFRAME_DB_RESET
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00460,
+ 0x00474,
+ 0,
+ 15,
+ &reset));
+#endif
+
+ /* Read RA counters and reset them. */
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00448,
+ 0x00474,
+ 16,
+ 3,
+ &info.inPrimitives));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00448,
+ 0x00474,
+ 16,
+ 11,
+ &info.culledQuadCount));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00448,
+ 0x00474,
+ 16,
+ 1,
+ &info.totalQuadCount));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00448,
+ 0x00474,
+ 16,
+ 2,
+ &info.quadCount));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00448,
+ 0x00474,
+ 16,
+ 0,
+ &info.totalPixelCount));
+#if gcdFRAME_DB_RESET
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00448,
+ 0x00474,
+ 16,
+ 15,
+ &reset));
+#endif
+
+ /* Read TX counters and reset them. */
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0044C,
+ 0x00474,
+ 24,
+ 0,
+ &info.bilinearRequests));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0044C,
+ 0x00474,
+ 24,
+ 1,
+ &info.trilinearRequests));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0044C,
+ 0x00474,
+ 24,
+ 8,
+ &info.txHitCount));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0044C,
+ 0x00474,
+ 24,
+ 9,
+ &info.txMissCount));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0044C,
+ 0x00474,
+ 24,
+ 6,
+ &info.txBytes8));
+#if gcdFRAME_DB_RESET
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x0044C,
+ 0x00474,
+ 24,
+ 15,
+ &reset));
+#endif
+
+ /* Read clock control register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ &clock));
+
+ /* 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)))));
+
+ /* Read cycle registers. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00078,
+ &info.cycles[i]));
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0007C,
+ &info.idleCycles[i]));
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00438,
+ &info.mcCycles[i]));
+
+ /* Read bandwidth registers. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0005C,
+ &info.readRequests[i]));
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00040,
+ &info.readBytes8[i]));
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00050,
+ &info.writeRequests[i]));
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00044,
+ &info.writeBytes8[i]));
+
+ /* Read PE counters. */
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00454,
+ 0x00470,
+ 16,
+ 0,
+ &info.colorKilled[i]));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00454,
+ 0x00470,
+ 16,
+ 2,
+ &info.colorDrawn[i]));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00454,
+ 0x00470,
+ 16,
+ 1,
+ &info.depthKilled[i]));
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00454,
+ 0x00470,
+ 16,
+ 3,
+ &info.depthDrawn[i]));
+ }
+
+ /* Zero out remaning reserved counters. */
+ for (; i < 8; ++i)
+ {
+ info.readBytes8[i] = 0;
+ info.writeBytes8[i] = 0;
+ info.cycles[i] = 0;
+ info.idleCycles[i] = 0;
+ info.mcCycles[i] = 0;
+ info.readRequests[i] = 0;
+ info.writeRequests[i] = 0;
+ info.colorKilled[i] = 0;
+ info.colorDrawn[i] = 0;
+ info.depthKilled[i] = 0;
+ info.depthDrawn[i] = 0;
+ }
+
+ /* Reset clock control register. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ clock));
+
+ /* Reset cycle and bandwidth 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,
+ 0x00078,
+ 0));
+
+#if gcdFRAME_DB_RESET
+ /* Reset PE counters. */
+ gcmkONERROR(gckHARDWARE_ReadPerformanceRegister(
+ Hardware,
+ 0x00454,
+ 0x00470,
+ 16,
+ 15,
+ &reset));
+#endif
+
+ /* Copy to user. */
+ gcmkONERROR(gckOS_CopyToUserData(Hardware->os,
+ &info,
+ FrameInfo,
+ gcmSIZEOF(info)));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_DumpGpuProfile(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT clock, i;
+ gctUINT32 totalRead, totalWrite, read, write;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Read clock control register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00000,
+ &clock));
+
+ totalRead = 0;
+ totalWrite = 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,
+ &read));
+ totalRead += read;
+
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00044,
+ &write));
+ totalWrite += write;
+ }
+
+ gcmkPRINT("==============GPU Profile: read request : %d\n", totalRead);
+ gcmkPRINT("==============GPU Profile: write request: %d\n", totalWrite);
+
+ /* 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));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+#if gcdDVFS
+#define READ_FROM_EATER1 0
+
+gceSTATUS
+gckHARDWARE_QueryLoad(
+ IN gckHARDWARE Hardware,
+ OUT gctUINT32 * Load
+ )
+{
+ gctUINT32 debug1;
+ gceSTATUS status;
+ gcmkHEADER_ARG("Hardware=0x%X", Hardware);
+
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Load != gcvNULL);
+
+ gckOS_AcquireMutex(Hardware->os, Hardware->powerMutex, gcvINFINITE);
+
+ if (Hardware->chipPowerState == gcvPOWER_ON)
+ {
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00110,
+ Load));
+#if READ_FROM_EATER1
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00134,
+ Load));
+#endif
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00114,
+ &debug1));
+
+ /* Patch result of 0x110 with result of 0x114. */
+ if ((debug1 & 0xFF) == 1)
+ {
+ *Load &= ~0xFF;
+ *Load |= 1;
+ }
+
+ if (((debug1 & 0xFF00) >> 8) == 1)
+ {
+ *Load &= ~(0xFF << 8);
+ *Load |= 1 << 8;
+ }
+
+ if (((debug1 & 0xFF0000) >> 16) == 1)
+ {
+ *Load &= ~(0xFF << 16);
+ *Load |= 1 << 16;
+ }
+
+ if (((debug1 & 0xFF000000) >> 24) == 1)
+ {
+ *Load &= ~(0xFF << 24);
+ *Load |= 1 << 24;
+ }
+ }
+ else
+ {
+ status = gcvSTATUS_INVALID_REQUEST;
+ }
+
+OnError:
+
+ gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex);
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_SetDVFSPeroid(
+ IN gckHARDWARE Hardware,
+ OUT gctUINT32 Frequency
+ )
+{
+ gceSTATUS status;
+ gctUINT32 period;
+ gctUINT32 eater;
+
+#if READ_FROM_EATER1
+ gctUINT32 period1;
+ gctUINT32 eater1;
+#endif
+
+ gcmkHEADER_ARG("Hardware=0x%X Frequency=%d", Hardware, Frequency);
+
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ period = 0;
+
+ while((64 << period) < (gcdDVFS_ANAYLSE_WINDOW * Frequency * 1000) )
+ {
+ period++;
+ }
+
+#if READ_FROM_EATER1
+ /*
+ * Peroid = F * 1000 * 1000 / (60 * 16 * 1024);
+ */
+ period1 = Frequency * 6250 / 6114;
+#endif
+
+ gckOS_AcquireMutex(Hardware->os, Hardware->powerMutex, gcvINFINITE);
+
+ if (Hardware->chipPowerState == gcvPOWER_ON)
+ {
+ /* Get current configure. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ &eater));
+
+ /* Change peroid. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ ((((gctUINT32) (eater)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:8) - (0 ?
+ 15:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:8) - (0 ?
+ 15:8) + 1))))))) << (0 ?
+ 15:8))) | (((gctUINT32) ((gctUINT32) (period) & ((gctUINT32) ((((1 ?
+ 15:8) - (0 ?
+ 15:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1))))))) << (0 ? 15:8)))));
+
+#if READ_FROM_EATER1
+ /* Config eater1. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00130,
+ &eater1));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00130,
+ ((((gctUINT32) (eater1)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:16) - (0 ?
+ 31:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:16) - (0 ?
+ 31:16) + 1))))))) << (0 ?
+ 31:16))) | (((gctUINT32) ((gctUINT32) (period1) & ((gctUINT32) ((((1 ?
+ 31:16) - (0 ?
+ 31:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:16) - (0 ? 31:16) + 1))))))) << (0 ? 31:16)))));
+#endif
+ }
+ else
+ {
+ status = gcvSTATUS_INVALID_REQUEST;
+ }
+
+OnError:
+ gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex);
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_InitDVFS(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gctUINT32 data;
+
+ gcmkHEADER_ARG("Hardware=0x%X", Hardware);
+
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ &data));
+
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)));
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1))))))) << (0 ?
+ 18:18))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 18:18) - (0 ? 18:18) + 1))))))) << (0 ? 18:18)));
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1))))))) << (0 ?
+ 19:19))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)));
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1))))))) << (0 ?
+ 20:20))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 20:20) - (0 ? 20:20) + 1))))))) << (0 ? 20:20)));
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 23:23) - (0 ?
+ 23:23) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 23:23) - (0 ?
+ 23:23) + 1))))))) << (0 ?
+ 23:23))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 23:23) - (0 ?
+ 23:23) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 23:23) - (0 ? 23:23) + 1))))))) << (0 ? 23:23)));
+ data = ((((gctUINT32) (data)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1))))))) << (0 ?
+ 22:22))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 22:22) - (0 ?
+ 22:22) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 22:22) - (0 ? 22:22) + 1))))))) << (0 ? 22:22)));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "DVFS Configure=0x%X",
+ data);
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x0010C,
+ data));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+#endif
+
+/*******************************************************************************
+**
+** _PrepareFunctions
+**
+** Generate command buffer snippets which will be used by gckHARDWARE, by which
+** gckHARDWARE can manipulate GPU by FE command without using gckCOMMAND to avoid
+** race condition and deadlock.
+**
+** Notice:
+** 1. Each snippet can only be executed when GPU is idle.
+** 2. Execution is triggered by AHB (0x658)
+** 3. Each snippet followed by END so software can sync with GPU by checking GPU
+** idle
+** 4. It is transparent to gckCOMMAND command buffer.
+**
+** Existing Snippets:
+** 1. MMU Configure
+** For new MMU, after GPU is reset, FE execute this command sequence to enable MMU.
+*/
+gceSTATUS
+_PrepareFunctions(
+ IN gckHARDWARE Hardware
+ )
+{
+ gckOS os;
+ gceSTATUS status;
+ gcePOOL pool;
+ gctUINT32 offset = 0;
+ gctUINT32 endBytes = 0;
+ gctUINT32 flushBytes;
+ gctPHYS_ADDR_T physical;
+ gctUINT8_PTR logical;
+ gctUINT32 address;
+ gcsHARDWARE_FUNCTION *function;
+ gceDUMMY_DRAW_TYPE dummyDrawType = gcvDUMMY_DRAW_INVALID;
+ gctUINT32 allocFlag = 0;
+
+ gcmkHEADER_ARG("%x", Hardware);
+
+ os = Hardware->os;
+
+ Hardware->auxFuncBytes = Hardware->mmuFuncBytes = 1024;
+
+ if (Hardware->wlFE)
+ {
+ gcmkONERROR(gckWLFE_End(Hardware, gcvNULL, ~0U, &endBytes));
+ }
+
+ if ((Hardware->mmuVersion > 0) &&
+ Hardware->options.enableMMU &&
+ (Hardware->options.secureMode != gcvSECURE_IN_TA))
+ {
+ gctUINT32 mmuBytes = 0;
+ gctUINT32 tailBytes;
+ gctUINT32 flags = gcvALLOC_FLAG_CONTIGUOUS;
+ gceMMU_MODE mode;
+
+#if gcdENABLE_MMU_1KMODE
+ mode = gcvMMU_MODE_1K;
+#else
+ mode = gcvMMU_MODE_4K;
+#endif
+
+ flags |= gcvALLOC_FLAG_4GB_ADDR;
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ flags |= gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+ pool = gcvPOOL_DEFAULT;
+
+ /* Allocate mmu command buffer within 32bit space */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ Hardware->kernel,
+ 64,
+ gcvVIDMEM_TYPE_COMMAND,
+ flags,
+ &Hardware->mmuFuncBytes,
+ &pool,
+ &Hardware->mmuFuncVideoMem
+ ));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ Hardware->kernel,
+ Hardware->mmuFuncVideoMem,
+ gcvFALSE,
+ gcvFALSE,
+ &Hardware->mmuFuncLogical
+ ));
+
+ /* Get CPU physical address. */
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(
+ Hardware->kernel,
+ Hardware->mmuFuncVideoMem,
+ 0,
+ &physical
+ ));
+
+ /* Convert to GPU physical address. */
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(
+ os,
+ physical,
+ &physical
+ ));
+
+ if (!(flags & gcvALLOC_FLAG_4GB_ADDR) && (physical & 0xFFFFFFFF00000000ULL))
+ {
+ gcmkFATAL("%s(%d): Command buffer physical address (0x%llx) for MMU setup exceeds 32bits, "
+ "please rebuild kernel with CONFIG_ZONE_DMA32=y.",
+ __FUNCTION__, __LINE__, physical);
+ }
+
+ function = &Hardware->functions[gcvHARDWARE_FUNCTION_MMU];
+ function->logical = (gctUINT8_PTR)Hardware->mmuFuncLogical;
+ gcmkSAFECASTPHYSADDRT(function->address, physical);
+
+ if (Hardware->mcFE)
+ {
+ gcmkONERROR(_ProgramMMUStatesMCFE(
+ Hardware,
+ Hardware->kernel->mmu,
+ mode,
+ function->logical,
+ &mmuBytes
+ ));
+ }
+ else
+ {
+ gcmkONERROR(_ProgramMMUStates(
+ Hardware,
+ Hardware->kernel->mmu,
+ mode,
+ function->logical,
+ &mmuBytes
+ ));
+ }
+
+ function->endAddress = function->address + mmuBytes;
+ function->endLogical = function->logical + mmuBytes;
+
+ if (Hardware->wlFE)
+ {
+ tailBytes = (gctUINT32)(Hardware->mmuFuncBytes - mmuBytes);
+ gcmkONERROR(gckWLFE_End(Hardware, function->endLogical, function->endAddress, &tailBytes));
+ }
+ else
+ {
+ tailBytes = 0;
+ }
+
+ function->bytes = mmuBytes + tailBytes;
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Hardware->kernel,
+ Hardware->mmuFuncVideoMem,
+ 0,
+ Hardware->mmuFuncLogical,
+ function->bytes
+ ));
+ }
+
+ pool = gcvPOOL_DEFAULT;
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ allocFlag = gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+ /* Allocate video memory node for aux functions. */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ Hardware->kernel,
+ 64,
+ gcvVIDMEM_TYPE_COMMAND,
+ allocFlag,
+ &Hardware->auxFuncBytes,
+ &pool,
+ &Hardware->auxFuncVideoMem
+ ));
+
+ /* Lock for GPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_Lock(
+ Hardware->kernel,
+ Hardware->auxFuncVideoMem,
+ &Hardware->auxFuncAddress
+ ));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ Hardware->kernel,
+ Hardware->auxFuncVideoMem,
+ gcvFALSE,
+ gcvFALSE,
+ &Hardware->auxFuncLogical
+ ));
+
+ /*
+ ** All cache flush command sequence.
+ */
+ function = &Hardware->functions[gcvHARDWARE_FUNCTION_FLUSH];
+
+ function->logical = logical = (gctUINT8_PTR)Hardware->auxFuncLogical;
+ function->address = Hardware->auxFuncAddress;
+
+ /* Get the size of the flush command. */
+ gcmkONERROR(gckHARDWARE_Flush(Hardware, gcvFLUSH_ALL, gcvNULL, &flushBytes));
+
+ /* Append a flush. */
+ gcmkONERROR(gckHARDWARE_Flush(Hardware, gcvFLUSH_ALL, logical, &flushBytes));
+
+ offset += flushBytes;
+
+ logical = (gctUINT8_PTR)Hardware->auxFuncLogical + offset;
+ address = Hardware->auxFuncAddress + offset;
+
+ if (Hardware->wlFE)
+ {
+ gcmkONERROR(gckWLFE_End(Hardware, logical, address, &endBytes));
+ }
+
+ offset += endBytes;
+
+ function->bytes = flushBytes + endBytes;
+
+ function->endAddress = function->address + flushBytes;
+ function->endLogical = function->logical + flushBytes;
+
+ /************************************************************************************
+ * Dummy draw.
+ */
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_FE_NEED_DUMMYDRAW))
+ {
+ dummyDrawType = gcvDUMMY_DRAW_GC400;
+ }
+
+ if (!gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_USC_DEFER_FILL_FIX) &&
+ gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_USC))
+ {
+ dummyDrawType = gcvDUMMY_DRAW_V60;
+ }
+
+ if (dummyDrawType != gcvDUMMY_DRAW_INVALID)
+ {
+ gctUINT32 dummyDrawBytes;
+
+ function = &Hardware->functions[gcvHARDWARE_FUNCTION_DUMMY_DRAW];
+
+ function->logical = logical = (gctUINT8_PTR)Hardware->auxFuncLogical + offset;
+ function->address = Hardware->auxFuncAddress + offset;
+
+ /* Append a dummy draw. */
+ gcmkONERROR(gckHARDWARE_DummyDraw(Hardware, logical, function->address, dummyDrawType, &dummyDrawBytes));
+
+ offset += dummyDrawBytes;
+
+ logical += dummyDrawBytes;
+ address = function->address + dummyDrawBytes;
+
+ if (Hardware->wlFE)
+ {
+ gcmkONERROR(gckWLFE_End(Hardware, logical, address, &endBytes));
+
+ offset += endBytes;
+ }
+
+ function->endAddress = function->address + dummyDrawBytes;
+ function->endLogical = function->logical + dummyDrawBytes;
+
+ function->bytes = dummyDrawBytes + endBytes;
+ }
+ gcmkASSERT(offset < Hardware->auxFuncBytes);
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Hardware->kernel,
+ Hardware->auxFuncVideoMem,
+ 0,
+ Hardware->auxFuncLogical,
+ Hardware->auxFuncBytes
+ ));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_ExecuteFunctions(
+ IN gckHARDWARE Hardware,
+ IN gceHARDWARE_FUNCTION Function
+ )
+{
+ gceSTATUS status;
+ gctUINT32 idle;
+ gctUINT32 timer = 0, delay = 1;
+ gcsHARDWARE_FUNCTION * function = &Hardware->functions[Function];
+ gctUINT32 address;
+
+ address = function->address;
+
+ /* Execute prepared command sequence. */
+ if (Hardware->mcFE)
+ {
+ gcmkONERROR(gckMCFE_Execute(Hardware, gcvFALSE, 0, address, function->bytes));
+ }
+ else
+ {
+ gcmkONERROR(gckWLFE_Execute(Hardware, address, function->bytes));
+ }
+
+#if gcdLINK_QUEUE_SIZE
+ {
+ gcuQUEUEDATA data;
+
+ gcmkVERIFY_OK(gckOS_GetProcessID(&data.linkData.pid));
+
+ data.linkData.start = address;
+ data.linkData.end = address + function->bytes;
+ data.linkData.linkLow = 0;
+ data.linkData.linkHigh = 0;
+
+ gckQUEUE_Enqueue(&Hardware->linkQueue, &data);
+ }
+#endif
+
+ {
+ static char *func[] =
+ {
+ "set mmu",
+ "flush",
+ "dummy draw",
+ ""
+ };
+
+ (void)func;
+ gcmkDUMP(Hardware->os, "#[function: %s]", func[Function]);
+ }
+
+ gcmkDUMP_BUFFER(
+ Hardware->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ function->logical,
+ address,
+ function->bytes
+ );
+
+ /* Wait until GPU idle. */
+ do
+ {
+ gckOS_Delay(Hardware->os, delay);
+
+ gcmkONERROR(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x00004,
+ &idle));
+
+ timer += delay;
+ delay *= 2;
+
+#if gcdGPU_TIMEOUT
+ if (timer >= Hardware->kernel->timeOut)
+ {
+ gckHARDWARE_DumpGPUState(Hardware);
+
+ if (Hardware->kernel->command)
+ {
+ gckCOMMAND_DumpExecutingBuffer(Hardware->kernel->command);
+ }
+
+ /* Even if hardware is not reset correctly, let software
+ ** continue to avoid software stuck. Software will timeout again
+ ** and try to recover GPU in next timeout.
+ */
+ gcmkONERROR(gcvSTATUS_DEVICE);
+ }
+#endif
+ }
+ while (!_IsGPUIdle(idle));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_QueryStateTimer(
+ IN gckHARDWARE Hardware,
+ OUT gctUINT64_PTR On,
+ OUT gctUINT64_PTR Off,
+ OUT gctUINT64_PTR Idle,
+ OUT gctUINT64_PTR Suspend
+ )
+{
+ gckOS_AcquireMutex(Hardware->os, Hardware->powerMutex, gcvINFINITE);
+
+ gckSTATETIMER_Query(
+ &Hardware->powerStateCounter,
+ Hardware->chipPowerState,
+ On, Off, Idle, Suspend);
+
+ gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex);
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckHARDWARE_WaitFence(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT64 FenceData,
+ IN gctUINT32 FenceAddress,
+ OUT gctUINT32 *Bytes
+ )
+{
+ gctUINT32_PTR logical = (gctUINT32_PTR)Logical;
+
+ gctUINT32 dataLow = (gctUINT32)FenceData;
+ gctUINT32 dataHigh = (gctUINT32)(FenceData >> 32);
+
+ if (logical)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x01FD) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++
+ = dataHigh;
+
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x01FA) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++
+ = dataLow;
+
+ *logical++
+ = ((((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) (0x0F & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (Hardware->waitCount) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 17:16) - (0 ?
+ 17:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 17:16) - (0 ?
+ 17:16) + 1))))))) << (0 ?
+ 17:16))) | (((gctUINT32) (0x2 & ((gctUINT32) ((((1 ?
+ 17:16) - (0 ?
+ 17:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 17:16) - (0 ? 17:16) + 1))))))) << (0 ? 17:16)));
+
+ *logical++
+ = FenceAddress;
+ }
+ else
+ {
+ *Bytes = 6 * gcmSIZEOF(gctUINT32);
+ }
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckHARDWARE_UpdateContextID(
+ IN gckHARDWARE Hardware
+ )
+{
+ static gcsiDEBUG_REGISTERS fe = { "FE", 0x470, 0, 0x450, 256, 0x1, 0x00, gcvTRUE, gcvFALSE};
+ gckOS os = Hardware->os;
+ gceCORE core = Hardware->core;
+ gctUINT32 contextIDLow, contextIDHigh;
+ gceSTATUS status;
+
+ gcmkONERROR(gckOS_WriteRegisterEx(os, core, fe.index, 0x53 << fe.shift));
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, fe.data, &contextIDLow));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(os, core, fe.index, 0x54 << fe.shift));
+ gcmkONERROR(gckOS_ReadRegisterEx(os, core, fe.data, &contextIDHigh));
+
+ Hardware->contextID = ((gctUINT64)contextIDHigh << 32) + contextIDLow;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_DummyDraw(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN gceDUMMY_DRAW_TYPE DummyDrawType,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT32 dummyDraw_gc400[] = {
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0193) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0x000000,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0194) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0180) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:0) - (0 ?
+ 3:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:0) - (0 ?
+ 3:0) + 1))))))) << (0 ?
+ 3:0))) | (((gctUINT32) (0x8 & ((gctUINT32) ((((1 ?
+ 3:0) - (0 ?
+ 3:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1))))))) << (0 ?
+ 13:12))) | (((gctUINT32) ((gctUINT32) (4) & ((gctUINT32) ((((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 13:12) - (0 ? 13:12) + 1))))))) << (0 ? 13:12)))
+ | ((((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)))
+ | ((((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 * gcmSIZEOF(float)) & ((gctUINT32) ((((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:24) - (0 ? 31:24) + 1))))))) << (0 ? 31:24)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1))))))) << (0 ?
+ 7:7))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E05) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0202) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1))))))) << (0 ?
+ 5:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:0) - (0 ? 5:0) + 1))))))) << (0 ? 5:0))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0208) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1))))))) << (0 ?
+ 5:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:0) - (0 ? 5:0) + 1))))))) << (0 ? 5:0))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0201) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1))))))) << (0 ?
+ 5:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:0) - (0 ? 5:0) + 1))))))) << (0 ? 5:0))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0204) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1))))))) << (0 ?
+ 5:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 5:0) - (0 ?
+ 5:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:0) - (0 ? 5:0) + 1))))))) << (0 ? 5:0))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x1000) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (4) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))),
+ 0x0, 0x0, 0x0, 0x0,
+ 0xDEADDEAD,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0203) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:0) - (0 ?
+ 6:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:0) - (0 ?
+ 6:0) + 1))))))) << (0 ?
+ 6:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 6:0) - (0 ?
+ 6:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:0) - (0 ? 6:0) + 1))))))) << (0 ? 6:0))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x020E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0200) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 1,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x020C) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0x000F003F,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x028C) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 11:8) - (0 ?
+ 11:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 11:8) - (0 ?
+ 11:8) + 1))))))) << (0 ?
+ 11:8))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 11:8) - (0 ?
+ 11:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 11:8) - (0 ? 11:8) + 1))))))) << (0 ? 11: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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0500) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x028D) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1))))))) << (0 ?
+ 13:12))) | (((gctUINT32) (0x2 & ((gctUINT32) ((((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 13:12) - (0 ? 13:12) + 1))))))) << (0 ? 13:12)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:8) - (0 ?
+ 9:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:8) - (0 ?
+ 9:8) + 1))))))) << (0 ?
+ 9:8))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 9:8) - (0 ?
+ 9:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:8) - (0 ? 9:8) + 1))))))) << (0 ? 9:8)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 17:16) - (0 ?
+ 17:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 17:16) - (0 ?
+ 17:16) + 1))))))) << (0 ?
+ 17:16))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 17:16) - (0 ?
+ 17:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 17:16) - (0 ? 17:16) + 1))))))) << (0 ? 17:16))),
+
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0300) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0301) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0302) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0303) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0289) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:0) - (0 ?
+ 3:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:0) - (0 ?
+ 3:0) + 1))))))) << (0 ?
+ 3:0))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 3:0) - (0 ?
+ 3:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))),
+
+ ((((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) (0x05 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:0) - (0 ?
+ 3:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:0) - (0 ?
+ 3:0) + 1))))))) << (0 ?
+ 3:0))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 3:0) - (0 ?
+ 3:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:0) - (0 ? 3:0) + 1))))))) << (0 ? 3:0))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 23:0) - (0 ?
+ 23:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 23:0) - (0 ?
+ 23:0) + 1))))))) << (0 ?
+ 23:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 23:0) - (0 ?
+ 23:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 23:0) - (0 ? 23:0) + 1))))))) << (0 ? 23:0))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 23:0) - (0 ?
+ 23:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 23:0) - (0 ?
+ 23:0) + 1))))))) << (0 ?
+ 23:0))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 23:0) - (0 ?
+ 23:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 23:0) - (0 ? 23:0) + 1))))))) << (0 ? 23:0))),
+ };
+
+ gctUINT32 dummyDraw_v60[] = {
+
+ /* Semaphore from FE to PE. */
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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))),
+
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))),
+
+ /* Stall from FE to PE. */
+ ((((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))),
+
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12: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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x021A) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((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) ((gctUINT32) (0x0) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E06) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) ((gctUINT32) (0x0) & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 14:12) - (0 ?
+ 14:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 14:12) - (0 ?
+ 14:12) + 1))))))) << (0 ?
+ 14:12))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 14:12) - (0 ?
+ 14:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 14:12) - (0 ? 14:12) + 1))))))) << (0 ? 14:12)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 17:16) - (0 ?
+ 17:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 17:16) - (0 ?
+ 17:16) + 1))))))) << (0 ?
+ 17:16))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 17:16) - (0 ?
+ 17:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 17:16) - (0 ? 17:16) + 1))))))) << (0 ? 17:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:4) - (0 ?
+ 7:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:4) - (0 ?
+ 7:4) + 1))))))) << (0 ?
+ 7:4))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 7:4) - (0 ?
+ 7:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:4) - (0 ? 7:4) + 1))))))) << (0 ? 7: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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0401) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (6) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))),
+ 0x0,
+ 0x2,
+ 0x0,
+ 0x0,
+ 0x0,
+ 0x0,
+ (gctUINT32)~0x0,
+
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x020C) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0xffffffff,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E07) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E08) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0420) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((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) ((gctUINT32) (2) & ((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 ?
+ 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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0424) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 1,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0403) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 3,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E21) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((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 ?
+ 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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x040A) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x2000) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (1 << 2) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16))),
+ 0x07801033,0x3fc00900,0x00000040,0x00390008,
+ (gctUINT32)~0,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x021F) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 0x0,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0240) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:4) - (0 ?
+ 6:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:4) - (0 ?
+ 6:4) + 1))))))) << (0 ?
+ 6:4))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 6:4) - (0 ?
+ 6:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:4) - (0 ? 6:4) + 1))))))) << (0 ? 6:4)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1))))))) << (0 ?
+ 8:8))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 8:8) - (0 ? 8:8) + 1))))))) << (0 ? 8:8)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 26:24) - (0 ?
+ 26:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 26:24) - (0 ?
+ 26:24) + 1))))))) << (0 ?
+ 26:24))) | (((gctUINT32) (0x3 & ((gctUINT32) ((((1 ?
+ 26:24) - (0 ?
+ 26:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 26:24) - (0 ? 26:24) + 1))))))) << (0 ? 26:24))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0241) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (31) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:16) - (0 ?
+ 31:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:16) - (0 ?
+ 31:16) + 1))))))) << (0 ?
+ 31:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 31:16) - (0 ?
+ 31:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:16) - (0 ? 31:16) + 1))))))) << (0 ? 31:16))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0244) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:0) - (0 ?
+ 9:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:0) - (0 ?
+ 9:0) + 1))))))) << (0 ?
+ 9:0))) | (((gctUINT32) ((gctUINT32) (31) & ((gctUINT32) ((((1 ?
+ 9:0) - (0 ?
+ 9:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:0) - (0 ? 9:0) + 1))))))) << (0 ? 9:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:16) - (0 ?
+ 31:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:16) - (0 ?
+ 31:16) + 1))))))) << (0 ?
+ 31:16))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 31:16) - (0 ?
+ 31:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:16) - (0 ? 31:16) + 1))))))) << (0 ? 31:16))),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0247) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+
+ (32+(4*(((gcsFEATURE_DATABASE *)Hardware->featureDatabase)->NumShaderCores)-1))/(4*(((gcsFEATURE_DATABASE *)Hardware->featureDatabase)->NumShaderCores)),
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0248) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ 1,
+
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E03) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5))),
+
+ /* Semaphore from FE to PE. */
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 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))),
+
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))),
+
+ /* Stall from FE to PE. */
+ ((((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))),
+
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) (0x01 & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) (0x07 & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8))),
+
+ /* Invalidate I cache.*/
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x022C) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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))),
+ ((((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) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1))))))) << (0 ?
+ 1:1))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 1:1) - (0 ?
+ 1:1) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:1) - (0 ? 1:1) + 1))))))) << (0 ? 1:1)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1))))))) << (0 ?
+ 4:4))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 4:4) - (0 ?
+ 4:4) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:4) - (0 ? 4:4) + 1))))))) << (0 ? 4:4))),
+
+ /* SubmitJob. */
+ ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))),
+ ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))),
+ ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))),
+ ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))),
+ };
+
+ gctUINT32 bytes = 0;
+ gctUINT32_PTR dummyDraw = gcvNULL;
+
+
+ switch(DummyDrawType)
+ {
+ case gcvDUMMY_DRAW_GC400:
+ dummyDraw = dummyDraw_gc400;
+ bytes = gcmSIZEOF(dummyDraw_gc400);
+ *(dummyDraw + 1) = Address;
+ break;
+ case gcvDUMMY_DRAW_V60:
+ dummyDraw = dummyDraw_v60;
+ bytes = gcmSIZEOF(dummyDraw_v60);
+ if (_QueryFeatureDatabase(Hardware, gcvFEATURE_MCFE))
+ {
+ gctUINT32 submitJob;
+
+ submitJob = ((((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) (0x16 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) (0x001 & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
+
+ if (bytes & 8)
+ {
+ /* To keep 16 byte alignment. */
+ bytes -= 8;
+ }
+
+ dummyDraw[(bytes >> 2) - 2] = submitJob;
+ }
+ break;
+ default:
+ /* other chip no need dummy draw.*/
+ gcmkASSERT(0);
+ break;
+ };
+
+ if (Logical != gcvNULL)
+ {
+ gckOS_MemCopy(Logical, dummyDraw, bytes);
+ }
+
+ *Bytes = bytes;
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckHARDWARE_EnterQueryClock(
+ IN gckHARDWARE Hardware,
+ OUT gctUINT64 *McStart,
+ OUT gctUINT64 *ShStart
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT64 mcStart, shStart;
+
+ gcmkONERROR(gckOS_GetTime(&mcStart));
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00438, 0));
+
+ *McStart = mcStart;
+
+ if (Hardware->core <= gcvCORE_3D_MAX)
+ {
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, 0xFFU << 24));
+
+ gcmkONERROR(gckOS_GetTime(&shStart));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00470, 0x4U << 24));
+
+ *ShStart = shStart;
+ }
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gckHARDWARE_ExitQueryClock(
+ IN gckHARDWARE Hardware,
+ IN gctUINT64 McStart,
+ IN gctUINT64 ShStart,
+ OUT gctUINT32 *McClk,
+ OUT gctUINT32 *ShClk
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT64 mcEnd, shEnd;
+ gctUINT32 mcCycle, shCycle;
+ gctUINT64 mcFreq, shFreq = 0;
+
+ gcmkONERROR(gckOS_GetTime(&mcEnd));
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x00438, &mcCycle));
+
+ if (mcCycle == 0)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ /* cycle = (gctUINT64)cycle * 1000000 / (end - start); */
+ mcFreq = ((gctUINT64)mcCycle * ((1000000U << 12) / (gctUINT32)(mcEnd - McStart))) >> 12;
+
+ *McClk = (gctUINT32)mcFreq;
+
+ if (Hardware->core <= gcvCORE_3D_MAX)
+ {
+ gcmkONERROR(gckOS_GetTime(&shEnd));
+ gcmkONERROR(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, 0x0045C, &shCycle));
+
+ if (!shCycle)
+ {
+ /*TODO: [VIV] Query SH cycle not support for old chips */
+ *ShClk = *McClk;
+ return gcvSTATUS_OK;
+ }
+
+ if (!ShStart)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ shFreq = ((gctUINT64)shCycle * ((1000000U << 12) / (gctUINT32)(shEnd - ShStart))) >> 12;
+ }
+
+ *ShClk = (gctUINT32)shFreq;
+
+OnError:
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_QueryFrequency
+**
+** Query current hardware frequency.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+*/
+gceSTATUS
+gckHARDWARE_QueryFrequency(
+ IN gckHARDWARE Hardware
+ )
+{
+ gctUINT64 mcStart, shStart;
+ gctUINT32 mcClk, shClk;
+ gceSTATUS status;
+ gctUINT64 powerManagement = 0;
+ gctBOOL globalAcquired = gcvFALSE;
+ gceCHIPPOWERSTATE statesStored, state;
+
+ gcmkHEADER_ARG("Hardware=0x%p", Hardware);
+
+ gcmkVERIFY_ARGUMENT(Hardware != gcvNULL);
+
+ mcStart = shStart = 0;
+ mcClk = shClk = 0;
+
+ status = gckOS_QueryOption(Hardware->os, "powerManagement", &powerManagement);
+ if (gcmIS_ERROR(status))
+ {
+ powerManagement = 0;
+ }
+
+ if (powerManagement)
+ {
+ gcmkONERROR(gckHARDWARE_EnablePowerManagement(
+ Hardware, gcvFALSE
+ ));
+ }
+
+ gcmkONERROR(gckHARDWARE_QueryPowerState(
+ Hardware, &statesStored
+ ));
+
+ gcmkONERROR(gckHARDWARE_SetPowerState(
+ Hardware, gcvPOWER_ON_AUTO
+ ));
+
+ /* Grab the global semaphore. */
+ gcmkONERROR(gckOS_AcquireSemaphore(
+ Hardware->os, Hardware->globalSemaphore
+ ));
+
+ globalAcquired = gcvTRUE;
+
+ gckHARDWARE_EnterQueryClock(Hardware, &mcStart, &shStart);
+
+ gcmkONERROR(gckOS_Delay(Hardware->os, 50));
+
+ if (mcStart)
+ {
+ gckHARDWARE_ExitQueryClock(Hardware,
+ mcStart, shStart,
+ &mcClk, &shClk);
+
+ Hardware->mcClk = mcClk;
+ Hardware->shClk = shClk;
+ }
+
+ /* Release the global semaphore. */
+ gcmkONERROR(gckOS_ReleaseSemaphore(
+ Hardware->os, Hardware->globalSemaphore
+ ));
+
+ globalAcquired = gcvFALSE;
+
+ switch(statesStored)
+ {
+ case gcvPOWER_OFF:
+ state = gcvPOWER_OFF_BROADCAST;
+ break;
+ case gcvPOWER_IDLE:
+ state = gcvPOWER_IDLE_BROADCAST;
+ break;
+ case gcvPOWER_SUSPEND:
+ state = gcvPOWER_SUSPEND_BROADCAST;
+ break;
+ case gcvPOWER_ON:
+ state = gcvPOWER_ON_AUTO;
+ break;
+ default:
+ state = statesStored;
+ break;
+ }
+
+ if (powerManagement)
+ {
+ gcmkONERROR(gckHARDWARE_EnablePowerManagement(
+ Hardware, gcvTRUE
+ ));
+ }
+
+ gcmkONERROR(gckHARDWARE_SetPowerState(
+ Hardware, state
+ ));
+
+ gcmkFOOTER_NO();
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (globalAcquired)
+ {
+ /* Release the global semaphore. */
+ gcmkVERIFY_OK(gckOS_ReleaseSemaphore(
+ Hardware->os, Hardware->globalSemaphore
+ ));
+ }
+
+ gcmkFOOTER();
+
+ return status;
+}
+
+
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
new file mode 100644
index 000000000000..06354baaeb87
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware.h
@@ -0,0 +1,345 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_hardware_h_
+#define __gc_hal_kernel_hardware_h_
+
+#if gcdENABLE_VG
+#include "gc_hal_kernel_hardware_vg.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define EVENT_ID_INVALIDATE_PIPE 29
+
+typedef enum {
+ gcvHARDWARE_FUNCTION_MMU,
+ gcvHARDWARE_FUNCTION_FLUSH,
+
+ gcvHARDWARE_FUNCTION_DUMMY_DRAW,
+ gcvHARDWARE_FUNCTION_NUM,
+}
+gceHARDWARE_FUNCTION;
+
+typedef struct _gckASYNC_FE * gckASYNC_FE;
+typedef struct _gckWLFE * gckWLFE;
+typedef struct _gckMCFE * gckMCFE;
+
+typedef struct _gcsHARWARE_FUNCTION
+{
+ /* Entry of the function. */
+ gctUINT32 address;
+
+ /* CPU address of the function. */
+ gctUINT8_PTR logical;
+
+ /* Bytes of the function. */
+ gctUINT32 bytes;
+
+ /* Hardware address of END in this function. */
+ gctUINT32 endAddress;
+
+ /* Logical of END in this function. */
+ gctUINT8_PTR endLogical;
+}
+gcsHARDWARE_FUNCTION;
+
+typedef struct _gcsSTATETIMER
+{
+ gctUINT64 start;
+ gctUINT64 recent;
+
+ /* Elapse of each power state. */
+ gctUINT64 elapse[4];
+}
+gcsSTATETIMER;
+
+typedef struct _gcsHARDWARE_SIGNATURE
+{
+ /* Chip model. */
+ gceCHIPMODEL chipModel;
+
+ /* Revision value.*/
+ gctUINT32 chipRevision;
+
+ /* Supported feature fields. */
+ gctUINT32 chipFeatures;
+
+ /* Supported minor feature fields. */
+ gctUINT32 chipMinorFeatures;
+
+ /* Supported minor feature 1 fields. */
+ gctUINT32 chipMinorFeatures1;
+
+ /* Supported minor feature 2 fields. */
+ gctUINT32 chipMinorFeatures2;
+}
+gcsHARDWARE_SIGNATURE;
+
+typedef struct _gcsMMU_TABLE_ARRAY_ENTRY
+{
+ gctUINT32 low;
+ gctUINT32 high;
+}
+gcsMMU_TABLE_ARRAY_ENTRY;
+
+typedef struct _gcsHARDWARE_PAGETABLE_ARRAY
+{
+ /* Number of entries in page table array. */
+ gctUINT num;
+
+ /* Video memory node. */
+ gckVIDMEM_NODE videoMem;
+
+ /* Size in bytes of array. */
+ gctSIZE_T size;
+
+ /* Physical address of array. */
+ gctPHYS_ADDR_T address;
+
+ /* Logical address of array. */
+ gctPOINTER logical;
+}
+gcsHARDWARE_PAGETABLE_ARRAY;
+
+/* gckHARDWARE object. */
+struct _gckHARDWARE
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* Pointer to gctKERNEL object. */
+ gckKERNEL kernel;
+
+ /* Pointer to gctOS object. */
+ gckOS os;
+
+ /* Core */
+ gceCORE core;
+
+ /* Type */
+ gceHARDWARE_TYPE type;
+
+ /* Chip characteristics. */
+ gcsHAL_QUERY_CHIP_IDENTITY identity;
+ gcsHAL_QUERY_CHIP_OPTIONS options;
+ gctUINT32 powerBaseAddress;
+ gctBOOL extraEventStates;
+
+ /* Big endian */
+ gctBOOL bigEndian;
+
+ /* Base address. */
+ gctUINT32 baseAddress;
+
+ /* FE modules. */
+ gckWLFE wlFE;
+ gckASYNC_FE asyncFE;
+ gckMCFE mcFE;
+
+ /* Chip status */
+ gctPOINTER powerMutex;
+ gceCHIPPOWERSTATE chipPowerState;
+ gctBOOL clockState;
+ gctBOOL powerState;
+ gctPOINTER globalSemaphore;
+ gctBOOL isLastPowerGlobal;
+
+ /* Wait Link FE only. */
+ gctUINT32 lastWaitLink;
+ gctUINT32 lastEnd;
+
+ gctUINT32 mmuVersion;
+
+ gceCHIPPOWERSTATE nextPowerState;
+ gctPOINTER powerStateTimer;
+
+#if gcdENABLE_FSCALE_VAL_ADJUST
+ gctUINT32 powerOnFscaleVal;
+#endif
+ gctPOINTER pageTableDirty[gcvENGINE_GPU_ENGINE_COUNT];
+
+#if gcdLINK_QUEUE_SIZE
+ struct _gckQUEUE linkQueue;
+#endif
+ gctBOOL stallFEPrefetch;
+
+ gctUINT32 minFscaleValue;
+ gctUINT waitCount;
+
+ gctUINT32 mcClk;
+ gctUINT32 shClk;
+
+ gctPOINTER pendingEvent;
+
+ /* Function used by gckHARDWARE. */
+ gckVIDMEM_NODE mmuFuncVideoMem;
+ gctPOINTER mmuFuncLogical;
+ gctSIZE_T mmuFuncBytes;
+
+ gckVIDMEM_NODE auxFuncVideoMem;
+ gctPOINTER auxFuncLogical;
+ gctUINT32 auxFuncAddress;
+ gctSIZE_T auxFuncBytes;
+
+ gcsHARDWARE_FUNCTION functions[gcvHARDWARE_FUNCTION_NUM];
+
+ gcsSTATETIMER powerStateCounter;
+ gctUINT32 executeCount;
+ gctUINT32 lastExecuteAddress;
+
+ /* Head for hardware list in gckMMU. */
+ gcsLISTHEAD mmuHead;
+
+ /* Internal SRAMs info. */
+ gckVIDMEM sRAMVidMem[gcvSRAM_INTER_COUNT];
+ gctPHYS_ADDR sRAMPhysical[gcvSRAM_INTER_COUNT];
+
+ gctPOINTER featureDatabase;
+ gctBOOL hasL2Cache;
+
+ /* MCFE channel bindings, temporary. */
+ gceMCFE_CHANNEL_TYPE mcfeChannels[64];
+ gctUINT32 mcfeChannelCount;
+
+ gcsHARDWARE_SIGNATURE signature;
+
+ gctUINT32 maxOutstandingReads;
+
+ gcsHARDWARE_PAGETABLE_ARRAY pagetableArray;
+
+ gctUINT64 contextID;
+};
+
+gceSTATUS
+gckHARDWARE_GetBaseAddress(
+ IN gckHARDWARE Hardware,
+ OUT gctUINT32_PTR BaseAddress
+ );
+
+gceSTATUS
+gckHARDWARE_NeedBaseAddress(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 State,
+ OUT gctBOOL_PTR NeedBase
+ );
+
+gceSTATUS
+gckHARDWARE_GetFrameInfo(
+ IN gckHARDWARE Hardware,
+ OUT gcsHAL_FRAME_INFO * FrameInfo
+ );
+
+gceSTATUS
+gckHARDWARE_DumpGpuProfile(
+ IN gckHARDWARE Hardware
+ );
+
+gceSTATUS
+gckHARDWARE_HandleFault(
+ IN gckHARDWARE Hardware
+ );
+
+gceSTATUS
+gckHARDWARE_ExecuteFunctions(
+ IN gckHARDWARE Hardware,
+ IN gceHARDWARE_FUNCTION Function
+ );
+
+gceSTATUS
+gckHARDWARE_DummyDraw(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN gceDUMMY_DRAW_TYPE DummyDrawType,
+ IN OUT gctUINT32 * Bytes
+ );
+
+gceSTATUS
+gckHARDWARE_EnterQueryClock(
+ IN gckHARDWARE Hardware,
+ OUT gctUINT64 *McStart,
+ OUT gctUINT64 *ShStart
+ );
+
+gceSTATUS
+gckHARDWARE_ExitQueryClock(
+ IN gckHARDWARE Hardware,
+ IN gctUINT64 McStart,
+ IN gctUINT64 ShStart,
+ OUT gctUINT32 *McClk,
+ OUT gctUINT32 *ShClk
+ );
+
+gceSTATUS
+gckHARDWARE_QueryFrequency(
+ IN gckHARDWARE Hardware
+ );
+
+#define gcmkWRITE_MEMORY(logical, data) \
+ do { \
+ gcmkVERIFY_OK(gckOS_WriteMemory(os, logical, data)); \
+ logical++; \
+ }\
+ while (0) ; \
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_kernel_hardware_h_ */
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_async_fe.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_async_fe.c
new file mode 100644
index 000000000000..40672cf14499
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_async_fe.c
@@ -0,0 +1,670 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal.h"
+#include "gc_hal_kernel.h"
+#include "gc_hal_kernel_context.h"
+
+#define _GC_OBJ_ZONE gcvZONE_HARDWARE
+
+struct _gckASYNC_FE
+{
+ /* Number of free descriptors. */
+ gctPOINTER freeDscriptors;
+};
+
+gceSTATUS
+gckASYNC_FE_Construct(
+ IN gckHARDWARE Hardware,
+ OUT gckASYNC_FE * FE
+ )
+{
+ gceSTATUS status;
+ gctUINT32 data;
+ gckASYNC_FE fe;
+
+ gcmkHEADER();
+
+ gcmkONERROR(gckOS_Allocate(Hardware->os,
+ gcmSIZEOF(struct _gckASYNC_FE),
+ (gctPOINTER *)&fe));
+ gckOS_ZeroMemory(fe, gcmSIZEOF(struct _gckASYNC_FE));
+
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x007E4,
+ &data
+ ));
+
+ gcmkONERROR(gckOS_AtomConstruct(Hardware->os, &fe->freeDscriptors));
+
+ data = (((((gctUINT32) (data)) >> (0 ? 6:0)) & ((gctUINT32) ((((1 ? 6:0) - (0 ? 6:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 6:0) - (0 ? 6:0) + 1)))))) );
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, _GC_OBJ_ZONE, "free descriptor=%d", data);
+
+ gcmkONERROR(gckOS_AtomSet(Hardware->os, fe->freeDscriptors, data));
+
+ /* Enable interrupts. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x000D8, ~0U));
+
+ *FE = fe;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (fe)
+ {
+ if (fe->freeDscriptors)
+ {
+ gckOS_AtomDestroy(Hardware->os, fe->freeDscriptors);
+ }
+ gcmkOS_SAFE_FREE(Hardware->os, fe);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+void
+gckASYNC_FE_Destroy(
+ IN gckHARDWARE Hardware,
+ IN gckASYNC_FE FE
+ )
+{
+ if (FE->freeDscriptors)
+ {
+ gcmkOS_SAFE_FREE(Hardware->os, FE->freeDscriptors);
+ }
+
+ gcmkOS_SAFE_FREE(Hardware->os, FE);
+}
+
+gceSTATUS
+gckASYNC_FE_Initialize(
+ IN gckHARDWARE Hardware,
+ IN gckASYNC_FE FE
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckASYNC_FE_Nop(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctSIZE_T * Bytes
+ )
+{
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x *Bytes=%lu",
+ Hardware, Logical, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < 8)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ /* Append NOP. */
+ logical[0] = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%x: NOP", Logical);
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the NOP command. */
+ *Bytes = 8;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckASYNC_FE_Event(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT8 Event,
+ IN gceKERNEL_WHERE FromWhere,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT size;
+ gctUINT32 destination = 0;
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+ gctBOOL blt;
+ gctBOOL extraEventStates;
+ gctBOOL multiCluster;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Event=%u FromWhere=%d *Bytes=%lu",
+ Hardware, Logical, Event, FromWhere, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+ gcmkVERIFY_ARGUMENT(Event < 32);
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_BLT_ENGINE))
+ {
+ /* Send all event from blt. */
+ if (FromWhere == gcvKERNEL_PIXEL)
+ {
+ FromWhere = gcvKERNEL_BLT;
+ }
+ }
+
+ blt = FromWhere == gcvKERNEL_BLT ? gcvTRUE : gcvFALSE;
+
+ multiCluster = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_MULTI_CLUSTER);
+
+ /* Determine the size of the command. */
+
+ extraEventStates = Hardware->extraEventStates && (FromWhere == gcvKERNEL_PIXEL);
+
+ size = extraEventStates
+ ? gcmALIGN(8 + (1 + 5) * 4, 8) /* EVENT + 5 STATES */
+ : 8;
+
+ if (blt)
+ {
+ size += 16;
+ if (multiCluster)
+ size += 8;
+ }
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < size)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ switch (FromWhere)
+ {
+ case gcvKERNEL_COMMAND:
+ /* From command processor. */
+ destination = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)));
+ break;
+
+ case gcvKERNEL_PIXEL:
+ /* From pixel engine. */
+ destination = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)));
+ break;
+
+ case gcvKERNEL_BLT:
+ destination = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1))))))) << (0 ?
+ 7:7))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7)));
+ break;
+
+ default:
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (blt)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+
+ if (multiCluster)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x50CE) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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) (Hardware->identity.clusterAvailMask & Hardware->options.userClusterMask) & ((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0)));
+ }
+ }
+
+ /* Append EVENT(Event, destination). */
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E01) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++
+ = ((((gctUINT32) (destination)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) ((gctUINT32) (Event) & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)));
+
+ if (blt)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+ }
+
+
+ /* Make sure the event ID gets written out before GPU can access it. */
+ gcmkONERROR(
+ gckOS_MemoryBarrier(Hardware->os, logical + 1));
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ {
+ gctPHYS_ADDR_T phys;
+ gckOS_GetPhysicalAddress(Hardware->os, Logical, &phys);
+ gckOS_CPUPhysicalToGPUPhysical(Hardware->os, phys, &phys);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%08x: EVENT %d", phys, Event);
+ }
+#endif
+
+ /* Append the extra states. These are needed for the chips that do not
+ ** support back-to-back events due to the async interface. The extra
+ ** states add the necessary delay to ensure that event IDs do not
+ ** collide. */
+ if (extraEventStates)
+ {
+ *logical++ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0100) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (5) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
+ *logical++ = 0;
+ *logical++ = 0;
+ *logical++ = 0;
+ *logical++ = 0;
+ *logical++ = 0;
+ }
+
+#if gcdINTERRUPT_STATISTIC
+ if (Event < gcmCOUNTOF(Hardware->kernel->eventObj->queues))
+ {
+ gckOS_AtomSetMask(Hardware->pendingEvent, 1 << Event);
+ }
+#endif
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the EVENT command. */
+ *Bytes = size;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+
+void
+gckASYNC_FE_UpdateAvaiable(
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gctUINT32 data;
+ gctINT32 oldValue;
+ gckASYNC_FE fe = Hardware->asyncFE;
+
+ status = gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x007E4,
+ &data
+ );
+
+ if (gcmIS_SUCCESS(status))
+ {
+ data = (((((gctUINT32) (data)) >> (0 ? 6:0)) & ((gctUINT32) ((((1 ? 6:0) - (0 ? 6:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 6:0) - (0 ? 6:0) + 1)))))) );
+
+ while (data--)
+ {
+ gckOS_AtomIncrement(Hardware->os, fe->freeDscriptors, &oldValue);
+ }
+ }
+}
+
+gceSTATUS
+gckASYNC_FE_ReserveSlot(
+ IN gckHARDWARE Hardware,
+ OUT gctBOOL * Available
+ )
+{
+ gctINT32 oldValue;
+ gckASYNC_FE fe = Hardware->asyncFE;
+
+ gckOS_AtomDecrement(Hardware->os, fe->freeDscriptors, &oldValue);
+
+ if (oldValue > 0)
+ {
+ /* Get one slot. */
+ *Available = gcvTRUE;
+ }
+ else
+ {
+ /* No available slot, restore decreased one.*/
+ gckOS_AtomIncrement(Hardware->os, fe->freeDscriptors, &oldValue);
+ *Available = gcvFALSE;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckASYNC_FE_Execute(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ )
+{
+ gceSTATUS status;
+
+ status = gckOS_WriteRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x007DC,
+ Address
+ );
+ if (gcmIS_ERROR(status))
+ {
+ return status;
+ }
+
+ gckOS_MemoryBarrier(
+ Hardware->os,
+ gcvNULL
+ );
+
+ status = gckOS_WriteRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x007E0,
+ Address + Bytes
+ );
+ if (gcmIS_ERROR(status))
+ {
+ return status;
+ }
+
+ return gcvSTATUS_OK;
+}
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_fe.h b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_fe.h
new file mode 100644
index 000000000000..b673e630975c
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_fe.h
@@ -0,0 +1,290 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_hardware_fe_h_
+#define __gc_hal_kernel_hardware_fe_h_
+
+#include "gc_hal.h"
+
+/******************************************************************************/
+/* Wait-Link FE commands. */
+
+/* Construct Wait-Link FE. */
+gceSTATUS
+gckWLFE_Construct(
+ IN gckHARDWARE Hardware,
+ OUT gckWLFE * FE
+ );
+
+void
+gckWLFE_Destroy(
+ IN gckHARDWARE Hardware,
+ IN gckWLFE FE
+ );
+
+/* Initialize Wait-Link FE, when hardware reset. */
+gceSTATUS
+gckWLFE_Initialize(
+ IN gckHARDWARE Hardware,
+ IN gckWLFE FE
+ );
+
+
+/* Add a WAIT/LINK pair in the command queue. */
+gceSTATUS
+gckWLFE_WaitLink(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN gctUINT32 Offset,
+ IN OUT gctUINT32 * Bytes,
+ OUT gctUINT32 * WaitOffset,
+ OUT gctUINT32 * WaitBytes
+ );
+
+/* Add a LINK command in the command queue. */
+gceSTATUS
+gckWLFE_Link(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FetchAddress,
+ IN gctUINT32 FetchSize,
+ IN OUT gctUINT32 * Bytes,
+ OUT gctUINT32 * Low,
+ OUT gctUINT32 * High
+ );
+
+/* Add an END command in the command queue. */
+gceSTATUS
+gckWLFE_End(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Add a NOP command in the command queue. */
+gceSTATUS
+gckWLFE_Nop(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctSIZE_T * Bytes
+ );
+
+/* Add an EVENT command in the command queue. */
+gceSTATUS
+gckWLFE_Event(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT8 Event,
+ IN gceKERNEL_WHERE FromWhere,
+ IN OUT gctUINT32 * Bytes
+ );
+
+gceSTATUS
+gckWLFE_ChipEnable(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gceCORE_3D_MASK ChipEnable,
+ IN OUT gctSIZE_T * Bytes
+ );
+
+/* Kickstart the command processor. */
+gceSTATUS
+gckWLFE_Execute(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ );
+
+/* Atomic version or IRQ routine. */
+gceSTATUS
+gckWLFE_AtomicExecute(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ );
+
+/******************************************************************************/
+/* ASync FE commands. */
+
+gceSTATUS
+gckASYNC_FE_Construct(
+ IN gckHARDWARE Hardware,
+ OUT gckASYNC_FE * FE
+ );
+
+void
+gckASYNC_FE_Destroy(
+ IN gckHARDWARE Hardware,
+ IN gckASYNC_FE FE
+ );
+
+/* Initialize Async FE, when hardware reset. */
+gceSTATUS
+gckASYNC_FE_Initialize(
+ IN gckHARDWARE Hardware,
+ IN gckASYNC_FE FE
+ );
+
+/* Add a NOP command in the command queue. */
+gceSTATUS
+gckASYNC_FE_Nop(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctSIZE_T * Bytes
+ );
+
+/* Add an EVENT command in the command queue. */
+gceSTATUS
+gckASYNC_FE_Event(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT8 Event,
+ IN gceKERNEL_WHERE FromWhere,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Kickstart the command processor. */
+gceSTATUS
+gckASYNC_FE_Execute(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ );
+
+gceSTATUS
+gckASYNC_FE_ReserveSlot(
+ IN gckHARDWARE Hardware,
+ OUT gctBOOL * Available
+ );
+
+void
+gckASYNC_FE_UpdateAvaiable(
+ IN gckHARDWARE Hardware
+ );
+
+/******************************************************************************/
+/* MC FE commands. */
+
+/* One MCFE includes max 64 engine, each engine contains 2 channels. */
+gceSTATUS
+gckMCFE_Construct(
+ IN gckHARDWARE Hardware,
+ OUT gckMCFE * FE
+ );
+
+void
+gckMCFE_Destroy(
+ IN gckHARDWARE Hardware,
+ IN gckMCFE FE
+ );
+
+/* Initialize MC FE, when hardware reset. */
+gceSTATUS
+gckMCFE_Initialize(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL MMUEnabled,
+ IN gckMCFE FE
+ );
+
+/* Add a NOP command in the command queue. */
+gceSTATUS
+gckMCFE_Nop(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctSIZE_T * Bytes
+ );
+
+/* Add an EVENT command in the command queue. */
+gceSTATUS
+gckMCFE_Event(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT8 Event,
+ IN gceKERNEL_WHERE FromWhere,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Add a SendSemaphore command in the command queue. */
+gceSTATUS
+gckMCFE_SendSemaphore(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 SemaId,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Add a WaitSemaphore command in the command queue. */
+gceSTATUS
+gckMCFE_WaitSemaphore(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 SemaId,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Kickstart the command processor. */
+gceSTATUS
+gckMCFE_Execute(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL Priority,
+ IN gctUINT32 ChannelId,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ );
+
+#endif
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_mc_fe.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_mc_fe.c
new file mode 100644
index 000000000000..726e87e6f540
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_mc_fe.c
@@ -0,0 +1,838 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal.h"
+#include "gc_hal_kernel.h"
+#include "gc_hal_kernel_context.h"
+
+#define _GC_OBJ_ZONE gcvZONE_HARDWARE
+
+typedef struct _gcsMCFE_DESCRIPTOR
+{
+ gctUINT32 start;
+ gctUINT32 end;
+}
+gcsMCFE_DESCRIPTOR;
+
+/* 2^DepthExp = Depth. */
+#define MCFE_RINGBUF_DEPTH_EXP 9
+/* Depth. */
+#define MCFE_RINGBUF_DEPTH (1 << MCFE_RINGBUF_DEPTH_EXP)
+/* MCFE descriptor size in bytes, fixed 8. */
+#define MCFE_COMMAND_DESC_SIZE 8
+/* FIFO size in bytes. */
+#define MCFE_RINGBUF_SIZE (MCFE_RINGBUF_DEPTH * MCFE_COMMAND_DESC_SIZE)
+
+typedef struct _gcsMCFE_RING_BUF
+{
+ gckVIDMEM_NODE ringBufVideoMem;
+ gctUINT32 ringBufAddress;
+ gctUINT32 * ringBufLogical;
+ gctSIZE_T ringBufBytes;
+
+ gctUINT32 gpuAddress;
+ gctPHYS_ADDR_T physical;
+
+ /* Read ptr should be often out-of-date. */
+ gctUINT32 readPtr;
+ gctUINT32 writePtr;
+}
+gcsMCFE_RING_BUF;
+
+typedef struct _gcsMCFE_CHANNEL
+{
+ gceMCFE_CHANNEL_TYPE binding;
+ gcsMCFE_RING_BUF stdRingBuf;
+ gcsMCFE_RING_BUF priRingBuf;
+}
+gcsMCFE_CHANNEL;
+
+struct _gckMCFE
+{
+ gctUINT32 channelCount;
+ gctBOOL mmuEnabled;
+
+ /*
+ * Channels must be the last field.
+ * Will allocate struct size according to channel count.
+ */
+ gcsMCFE_CHANNEL channels[1];
+};
+
+static gcmINLINE gctUINT32
+_NextPtr(
+ gctUINT32 Ptr
+ )
+{
+ return (Ptr + 1) & (MCFE_RINGBUF_DEPTH - 1);
+}
+
+static gceSTATUS
+_AllocateDescRingBuf(
+ gckHARDWARE Hardware,
+ gcsMCFE_RING_BUF * Channel
+ )
+{
+ gceSTATUS status;
+ gcePOOL pool = gcvPOOL_DEFAULT;
+ gckKERNEL kernel = Hardware->kernel;
+ gctUINT32 allocFlag = 0;
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ allocFlag |= gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+ Channel->ringBufBytes = MCFE_RINGBUF_SIZE;
+
+ /* Allocate video memory node for mcfe ring buffer. */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ kernel,
+ 64,
+ gcvVIDMEM_TYPE_COMMAND,
+ allocFlag,
+ &Channel->ringBufBytes,
+ &pool,
+ &Channel->ringBufVideoMem
+ ));
+
+ /* Lock for GPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_Lock(
+ kernel,
+ Channel->ringBufVideoMem,
+ &Channel->gpuAddress
+ ));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ kernel,
+ Channel->ringBufVideoMem,
+ gcvFALSE,
+ gcvFALSE,
+ (gctPOINTER *)&Channel->ringBufLogical
+ ));
+
+ /* Get CPU physical address. */
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(
+ kernel,
+ Channel->ringBufVideoMem,
+ 0,
+ &Channel->physical
+ ));
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(
+ Hardware->os, Channel->physical, &Channel->physical));
+
+ if (Channel->physical > 0xffffffffull)
+ {
+ gcmkPRINT("%s(%d): MCFE ring buffer physical over 4G: 0x%llx",
+ __FUNCTION__, __LINE__, (unsigned long long)Channel->physical);
+ }
+
+ /* Default to use physical. */
+ Channel->ringBufAddress = (gctUINT32)Channel->physical;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+static void
+_DestroyDescRingBuf(
+ gckHARDWARE Hardware,
+ gcsMCFE_RING_BUF * Channel
+ )
+{
+ gckKERNEL kernel = Hardware->kernel;
+
+ if (Channel->ringBufVideoMem)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ kernel,
+ Channel->ringBufVideoMem,
+ 0,
+ gcvFALSE,
+ gcvFALSE
+ ));
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(
+ kernel,
+ Channel->ringBufVideoMem
+ ));
+
+ Channel->ringBufVideoMem = gcvNULL;
+ Channel->ringBufLogical = gcvNULL;
+ }
+}
+
+static gcmINLINE void
+_DestroyMCFE(
+ IN gckHARDWARE Hardware,
+ IN gckMCFE FE
+ )
+{
+ if (FE)
+ {
+ gctUINT i;
+
+ for (i = 0; i < FE->channelCount; i++)
+ {
+ if (FE->channels[i].binding)
+ {
+ _DestroyDescRingBuf(Hardware, &FE->channels[i].stdRingBuf);
+ _DestroyDescRingBuf(Hardware, &FE->channels[i].priRingBuf);
+ }
+ }
+
+ gcmkOS_SAFE_FREE(Hardware->os, FE);
+ }
+}
+
+
+static gceSTATUS
+_ConstructChannel(
+ IN gckHARDWARE Hardware,
+ IN gceMCFE_CHANNEL_TYPE ChannelType,
+ IN gcsMCFE_CHANNEL * Channel
+ )
+{
+ Channel->binding = ChannelType;
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckMCFE_Construct(
+ IN gckHARDWARE Hardware,
+ OUT gckMCFE *FE
+ )
+{
+ gceSTATUS status;
+ gckMCFE fe = gcvNULL;
+ gctUINT32 i;
+ gctSIZE_T size = sizeof(struct _gckMCFE);
+
+ if (Hardware->mcfeChannelCount > 1)
+ {
+ size += sizeof(gcsMCFE_CHANNEL) * (Hardware->mcfeChannelCount - 1);
+ }
+
+ gcmkONERROR(gckOS_Allocate(Hardware->os,
+ size,
+ (gctPOINTER *)&fe));
+
+ gckOS_ZeroMemory(fe, size);
+
+ fe->channelCount = Hardware->mcfeChannelCount;
+
+ for (i = 0; i < fe->channelCount; i++)
+ {
+ gcmkONERROR(
+ _ConstructChannel(Hardware,
+ Hardware->mcfeChannels[i],
+ &fe->channels[i]));
+ }
+
+ /* Enable all events. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ 0x00014,
+ 0xFFFFFFFF));
+
+ *FE = fe;
+ return gcvSTATUS_OK;
+
+OnError:
+ _DestroyMCFE(Hardware, fe);
+ return status;
+}
+
+void
+gckMCFE_Destroy(
+ IN gckHARDWARE Hardware,
+ IN gckMCFE FE
+ )
+{
+ _DestroyMCFE(Hardware, FE);
+}
+
+static gceSTATUS
+_ProgramDescRingBuf(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL MMUEnabled,
+ IN gcsMCFE_RING_BUF * Channel,
+ IN gctUINT32 Index,
+ IN gctBOOL Priority
+ )
+{
+ gctUINT32 ringBufStartReg;
+ gctUINT32 depthExpReg;
+ gctUINT32 readPtrReg;
+ gctUINT32 writePtrReg;
+ gctUINT32 data = 0;
+
+ if (Priority)
+ {
+ ringBufStartReg = 0x02800;
+ depthExpReg = 0x02900;
+ readPtrReg = 0x02B00;
+ writePtrReg = 0x02A00;
+ }
+ else
+ {
+ ringBufStartReg = 0x02400;
+ depthExpReg = 0x02500;
+ readPtrReg = 0x02700;
+ writePtrReg = 0x02600;
+ }
+
+ ringBufStartReg += Index << 2;
+ depthExpReg += Index << 2;
+ readPtrReg += Index << 2;
+ writePtrReg += Index << 2;
+
+ Channel->ringBufAddress = MMUEnabled ? Channel->gpuAddress
+ : (gctUINT32)Channel->physical;
+
+ /* Channel ringBuf start address. */
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(
+ Hardware->os, Hardware->core, ringBufStartReg, Channel->ringBufAddress));
+
+ /* Channel ringBuf depth (exponent of 2). */
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(
+ Hardware->os, Hardware->core, depthExpReg, MCFE_RINGBUF_DEPTH_EXP));
+
+ /* The RD ptr could keep unchanged, read and compute WR ptr. */
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(Hardware->os, Hardware->core, readPtrReg, &data));
+
+ /* Priority ring buffer write ptr. */
+ /* gcmkVERIFY_OK(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, writePtrReg, data)); */
+
+ /* No valid descriptor initially. */
+ Channel->readPtr = Channel->writePtr = data;
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_InitializeChannel(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL MMUEnabled,
+ IN gcsMCFE_CHANNEL * Channel,
+ IN gctUINT32 Index
+ )
+{
+ gceSTATUS status;
+
+ /* Allocate ring buffer descriptor memory. */
+ if (!Channel->stdRingBuf.ringBufVideoMem)
+ {
+ gcmkONERROR(_AllocateDescRingBuf(Hardware, &Channel->stdRingBuf));
+ }
+
+ /* No priority channel in system engine. */
+ if (!Channel->priRingBuf.ringBufVideoMem && Index != 0)
+ {
+ gcmkONERROR(_AllocateDescRingBuf(Hardware, &Channel->priRingBuf));
+ }
+
+ gcmkONERROR(_ProgramDescRingBuf(Hardware, MMUEnabled, &Channel->stdRingBuf, Index, gcvFALSE));
+
+ /* No priority channel in system engine. */
+ if (Channel->binding != gcvMCFE_CHANNEL_SYSTEM)
+ {
+ gcmkONERROR(_ProgramDescRingBuf(Hardware, MMUEnabled, &Channel->priRingBuf, Index, gcvTRUE));
+ }
+
+ return gcvSTATUS_OK;
+
+OnError:
+ /* It's OK to leave ringBuf memory not free'd here. */
+ return status;
+}
+
+gceSTATUS
+gckMCFE_Initialize(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL MMUEnabled,
+ IN gckMCFE FE
+ )
+{
+ gctUINT32 i;
+ gceSTATUS status;
+
+ for (i = 0; i < FE->channelCount; i++)
+ {
+ if (FE->channels[i].binding)
+ {
+ gcmkONERROR(_InitializeChannel(Hardware, MMUEnabled, &FE->channels[i], i));
+ }
+ }
+
+ FE->mmuEnabled = MMUEnabled;
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gckMCFE_Nop(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctSIZE_T * Bytes
+ )
+{
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x *Bytes=%lu",
+ Hardware, Logical, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < 8)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ /* Append NOP. */
+ logical[0] = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+ logical[1] = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%x: NOP", Logical);
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the NOP command. */
+ *Bytes = 8;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+
+gceSTATUS
+gckMCFE_Event(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT8 Event,
+ IN gceKERNEL_WHERE FromWhere,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT size;
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Event=%u FromWhere=%d *Bytes=%lu",
+ Hardware, Logical, Event, FromWhere, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+ gcmkVERIFY_ARGUMENT(Event < 32);
+
+ /* Ignored. */
+ (void)FromWhere;
+
+ size = 8;
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < size)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ /* Append EVENT(Event). */
+ logical[0] = ((((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) (0x16 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) (0x006 & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
+ | Event;
+
+ logical[1] = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ {
+ gctPHYS_ADDR_T phys;
+ gckOS_GetPhysicalAddress(Hardware->os, Logical, &phys);
+ gckOS_CPUPhysicalToGPUPhysical(Hardware->os, phys, &phys);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%08x: EVENT %d", phys, Event);
+ }
+#endif
+
+#if gcdINTERRUPT_STATISTIC
+ if (Event < gcmCOUNTOF(Hardware->kernel->eventObj->queues))
+ {
+ gckOS_AtomSetMask(Hardware->pendingEvent, 1 << Event);
+ }
+#endif
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the EVENT command. */
+ *Bytes = size;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckMCFE_SendSemaphore(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 SemaId,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x SemaId=%u *Bytes=%lu",
+ Hardware, Logical, SemaId, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+ gcmkVERIFY_ARGUMENT(SemaId < 0xFFFF);
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < 8)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ /* Append SEND_SEMAPHORE(SemaId). */
+ logical[0] = ((((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) (0x16 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) (0x002 & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
+ | SemaId;
+
+ logical[1] = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ *Bytes = 8;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckMCFE_WaitSemaphore(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 SemaId,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x SemaId=%u *Bytes=%lu",
+ Hardware, Logical, SemaId, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+ gcmkVERIFY_ARGUMENT(SemaId < 0xFFFF);
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < 8)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ /* Append WAIT_SEMAPHORE(SemaId). */
+ logical[0] = ((((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) (0x16 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) (0x003 & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
+ | SemaId;
+
+ logical[1] = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ *Bytes = 8;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckMCFE_Execute(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL Priority,
+ IN gctUINT32 ChannelId,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ )
+{
+ gctUINT32 regBase;
+ gcsMCFE_DESCRIPTOR *desc;
+ gcsMCFE_CHANNEL * channel = &Hardware->mcFE->channels[ChannelId];
+ gcsMCFE_RING_BUF * ringBuf = Priority ? &channel->priRingBuf
+ : &channel->stdRingBuf;
+
+ /* No priority channel in system channel by design. */
+ gcmkASSERT(!(channel->binding == gcvMCFE_CHANNEL_SYSTEM && Priority == 1));
+
+ while (_NextPtr(ringBuf->writePtr) == ringBuf->readPtr)
+ {
+ gctUINT32 data;
+ regBase = Priority ? 0x02B00
+ : 0x02700;
+
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(Hardware->os,
+ Hardware->core,
+ regBase + ChannelId * 4,
+ &data));
+
+ ringBuf->readPtr = data;
+
+ if (_NextPtr(ringBuf->writePtr) == ringBuf->readPtr)
+ {
+ gcmkPRINT("%s: MCFE channel %s-%d ringBuf is full!",
+ __FUNCTION__,
+ Priority ? "Pri" : "Std",
+ ChannelId);
+
+ gckOS_Delay(Hardware->os, 100);
+ }
+ }
+
+ regBase = Priority ? 0x02A00
+ : 0x02600;
+
+ /* ringBufLogical is in uint32, 2 uint32 contributes 1 descriptr. */
+ desc = (gcsMCFE_DESCRIPTOR *)&ringBuf->ringBufLogical[ringBuf->writePtr * 2];
+ desc->start = Address;
+ desc->end = Address + Bytes;
+
+ gcmkDUMP(Hardware->os,
+ "#[descriptor %d: channel %s-%d]",
+ ringBuf->writePtr,
+ Priority ? "Pri" : "Std",
+ ChannelId);
+
+ gcmkDUMP_BUFFER(Hardware->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ desc,
+ ringBuf->ringBufAddress + ringBuf->writePtr * 8,
+ 8);
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_CleanCache(Hardware->kernel,
+ ringBuf->ringBufVideoMem,
+ 0,
+ desc,
+ 8));
+
+ ringBuf->writePtr = _NextPtr(ringBuf->writePtr);
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%08X - 0x%08X: %06d bytes, Channel=%s-%d",
+ desc->start, desc->end, Bytes,
+ Priority ? "Pri" : "Std", ChannelId);
+
+ gcmkVERIFY_OK(gckOS_WriteRegisterEx(Hardware->os,
+ Hardware->core,
+ regBase + ChannelId * 4,
+ ringBuf->writePtr));
+
+ return gcvSTATUS_OK;
+}
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_waitlink_fe.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_waitlink_fe.c
new file mode 100644
index 000000000000..c57374a6691f
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_hardware_waitlink_fe.c
@@ -0,0 +1,1758 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal.h"
+#include "gc_hal_kernel.h"
+#include "gc_hal_kernel_context.h"
+
+#define _GC_OBJ_ZONE gcvZONE_HARDWARE
+
+gceSTATUS
+gckWLFE_Construct(
+ IN gckHARDWARE Hardware,
+ OUT gckWLFE * FE
+ )
+{
+ /* Just a non-null value. */
+ *FE = (gckWLFE)(gctUINTPTR_T)1;
+ return gcvSTATUS_OK;
+}
+
+void
+gckWLFE_Destroy(
+ IN gckHARDWARE Hardware,
+ IN gckWLFE FE
+ )
+{
+ gcmkASSERT(FE);
+}
+
+gceSTATUS
+gckWLFE_Initialize(
+ IN gckHARDWARE Hardware,
+ IN gckWLFE FE
+ )
+{
+ gcmkASSERT(FE);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckWLFE_WaitLink
+**
+** Append a WAIT/LINK command sequence at the specified location in the command
+** queue.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command queue to append
+** WAIT/LINK command sequence at or gcvNULL just to query the size of the
+** WAIT/LINK command sequence.
+**
+** gctUINT32 Address
+** GPU address of current location inside the command queue.
+**
+** gctUINT32 Offset
+** Offset into command buffer required for alignment.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the WAIT/LINK command
+** sequence. If 'Logical' is gcvNULL, this argument will be ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** by the WAIT/LINK command sequence. If 'Bytes' is gcvNULL, nothing will
+** be returned.
+**
+** gctUINT32 * WaitOffset
+** Pointer to a variable that will receive the offset of the WAIT command
+** from the specified logcial pointer.
+** If 'WaitOffset' is gcvNULL nothing will be returned.
+**
+** gctSIZE_T * WaitSize
+** Pointer to a variable that will receive the number of bytes used by
+** the WAIT command. If 'LinkSize' is gcvNULL nothing will be returned.
+*/
+gceSTATUS
+gckWLFE_WaitLink(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN gctUINT32 Offset,
+ IN OUT gctUINT32 * Bytes,
+ OUT gctUINT32 * WaitOffset,
+ OUT gctUINT32 * WaitSize
+ )
+{
+ gceSTATUS status;
+ gctUINT32_PTR logical;
+ gctUINT32 bytes;
+ gctBOOL useL2;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Offset=0x%08x *Bytes=%lu",
+ Hardware, Logical, Offset, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical != gcvNULL) || (Bytes != gcvNULL));
+
+ gcmkASSERT(Hardware->wlFE);
+ useL2 = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_64K_L2_CACHE);
+
+ /* Compute number of bytes required. */
+ if (useL2)
+ {
+ bytes = gcmALIGN(Offset + 24, 8) - Offset;
+ }
+ else
+ {
+ bytes = gcmALIGN(Offset + 16, 8) - Offset;
+ }
+
+ /* Cast the input pointer. */
+ logical = (gctUINT32_PTR) Logical;
+
+ if (logical != gcvNULL)
+ {
+ /* Not enough space? */
+ if (*Bytes < bytes)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ gcmkASSERT(Address != ~0U);
+
+ /* Store the WAIT/LINK address. */
+ Hardware->lastWaitLink = Address;
+
+ /* Append WAIT(count). */
+ *logical++
+ = ((((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) (0x07 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (Hardware->waitCount) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ logical++;
+
+ if (useL2)
+ {
+ /* LoadState(AQFlush, 1), flush. */
+ *logical++ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E03) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)));
+ }
+
+ /* Append LINK(2, address). */
+ *logical++
+ = ((((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) (0x08 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (bytes >> 3) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++ = Address;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%08x: WAIT %u", Address, Hardware->waitCount
+ );
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%08x: LINK 0x%08x, #%lu",
+ Address + 8, Address, bytes
+ );
+
+ if (WaitOffset != gcvNULL)
+ {
+ /* Return the offset pointer to WAIT command. */
+ *WaitOffset = 0;
+ }
+
+ if (WaitSize != gcvNULL)
+ {
+ /* Return number of bytes used by the WAIT command. */
+ if (useL2)
+ {
+ *WaitSize = 16;
+ }
+ else
+ {
+ *WaitSize = 8;
+ }
+ }
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the WAIT/LINK command
+ ** sequence. */
+ *Bytes = bytes;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu *WaitOffset=0x%x *WaitSize=%lu",
+ gcmOPT_VALUE(Bytes), gcmOPT_VALUE(WaitOffset),
+ gcmOPT_VALUE(WaitSize));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckWLFE_InvalidatePipe(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT size;
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+ gctBOOL blt = gcvFALSE;
+ gctBOOL multiCluster = gcvFALSE;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x *Bytes=%lu",
+ Hardware, Logical, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+
+ gcmkASSERT(Hardware->wlFE);
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_BLT_ENGINE))
+ {
+ /* Send all event from blt. */
+ blt = gcvTRUE;
+ multiCluster = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_MULTI_CLUSTER);
+ }
+
+ /* Determine the size of the command. */
+ size = Hardware->extraEventStates
+ ? gcmALIGN(8 + (1 + 5) * 4, 8) /* EVENT + 5 STATES */
+ : 8;
+
+ if (blt)
+ {
+ size += 16;
+ if (multiCluster)
+ size += 8;
+ }
+
+ /* END. */
+ size += 8;
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < size)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ if (blt)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+
+ if (multiCluster)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x50CE) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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) (Hardware->identity.clusterAvailMask & Hardware->options.userClusterMask) & ((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0)));
+ }
+ }
+
+ /* Append EVENT(Event, PE_SRC). */
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E01) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) ((gctUINT32) (EVENT_ID_INVALIDATE_PIPE) & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)));
+
+ if (blt)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+ }
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ {
+ gctPHYS_ADDR_T phys;
+ gckOS_GetPhysicalAddress(Hardware->os, Logical, &phys);
+ gckOS_CPUPhysicalToGPUPhysical(Hardware->os, phys, &phys);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%08x: EVENT %d", phys, EVENT_ID_INVALIDATE_PIPE);
+ }
+#endif
+
+ /* Append the extra states. These are needed for the chips that do not
+ ** support back-to-back events due to the async interface. The extra
+ ** states add the necessary delay to ensure that event IDs do not
+ ** collide. */
+ if (Hardware->extraEventStates)
+ {
+ *logical++ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0100) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (5) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
+ *logical++ = 0;
+ *logical++ = 0;
+ *logical++ = 0;
+ *logical++ = 0;
+ *logical++ = 0;
+ }
+
+#if gcdINTERRUPT_STATISTIC
+ if (EVENT_ID_INVALIDATE_PIPE < gcmCOUNTOF(Hardware->kernel->eventObj->queues))
+ {
+ gckOS_AtomSetMask(Hardware->pendingEvent, 1 << EVENT_ID_INVALIDATE_PIPE);
+ }
+#endif
+
+ /* Append END. */
+ *logical++ =
+ ((((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) (0x02 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ /* Record the count of execution which is finised by this END. */
+ *logical++ =
+ Hardware->executeCount;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%x: END", Logical);
+
+ /* Make sure the CPU writes out the data to memory. */
+ gcmkONERROR(
+ gckOS_MemoryBarrier(Hardware->os, Logical));
+
+ Hardware->lastEnd = Address + size - 8;
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the EVENT command. */
+ *Bytes = size;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+void
+gckWLFE_DoneInvalidatePipe(
+ gckHARDWARE Hardware
+ )
+{
+ gctUINT32 resume;
+ gctUINT32 bytes;
+ gctUINT32 idle;
+ gctUINT32 pageSize = Hardware->kernel->command->pageSize;
+
+ gcmkASSERT(Hardware->wlFE);
+
+ /* Make sure FE is idle. */
+ do
+ {
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x00004,
+ &idle));
+ }
+ while (idle != 0x7FFFFFFF);
+
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x00664,
+ &resume));
+
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(
+ Hardware->os,
+ Hardware->core,
+ 0x00664,
+ &resume));
+
+ gcmkVERIFY_OK(gckWLFE_WaitLink(
+ Hardware,
+ gcvNULL,
+ ~0U,
+ resume & (pageSize - 1),
+ &bytes,
+ gcvNULL,
+ gcvNULL
+ ));
+
+ /* Start Command Parser. */
+ gcmkVERIFY_OK(gckWLFE_Execute(
+ Hardware,
+ resume,
+ bytes
+ ));
+}
+
+/*******************************************************************************
+**
+** gckWLFE_Link
+**
+** Append a LINK command at the specified location in the command queue.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command queue to append
+** the LINK command at or gcvNULL just to query the size of the LINK
+** command.
+**
+** gctUINT32 FetchAddress
+** Hardware address of destination of LINK.
+**
+** gctSIZE_T FetchSize
+** Number of bytes in destination of LINK.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the LINK command. If
+** 'Logical' is gcvNULL, this argument will be ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the LINK command. If 'Bytes' is gcvNULL, nothing will be returned.
+*/
+gceSTATUS
+gckWLFE_Link(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FetchAddress,
+ IN gctUINT32 FetchSize,
+ IN OUT gctUINT32 * Bytes,
+ OUT gctUINT32 * Low,
+ OUT gctUINT32 * High
+ )
+{
+ gceSTATUS status;
+ gctSIZE_T bytes;
+ gctUINT32 link;
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x FetchAddress=0x%x FetchSize=%lu "
+ "*Bytes=%lu",
+ Hardware, Logical, FetchAddress, FetchSize,
+ gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+
+ gcmkASSERT(Hardware->wlFE);
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < 8)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ gcmkONERROR(
+ gckOS_WriteMemory(Hardware->os, logical + 1, FetchAddress));
+
+ if (High)
+ {
+ *High = FetchAddress;
+ }
+
+ /* Make sure the address got written before the LINK command. */
+ gcmkONERROR(
+ gckOS_MemoryBarrier(Hardware->os, logical + 1));
+
+ /* Compute number of 64-byte aligned bytes to fetch. */
+ bytes = gcmALIGN(FetchAddress + FetchSize, 64) - FetchAddress;
+
+ /* Append LINK(bytes / 8), FetchAddress. */
+ link = ((((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) (0x08 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (bytes >> 3) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ gcmkONERROR(
+ gckOS_WriteMemory(Hardware->os, logical, link));
+
+ if (Low)
+ {
+ *Low = link;
+ }
+
+ /* Memory barrier. */
+ gcmkONERROR(
+ gckOS_MemoryBarrier(Hardware->os, logical));
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the LINK command. */
+ *Bytes = 8;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckWLFE_End
+**
+** Append an END command at the specified location in the command queue.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command queue to append
+** END command at or gcvNULL just to query the size of the END command.
+**
+** gctUINT32 Address
+** GPU address of current location inside the command queue.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the END command. If
+** 'Logical' is gcvNULL, this argument will be ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the END command. If 'Bytes' is gcvNULL, nothing will be returned.
+*/
+gceSTATUS
+gckWLFE_End(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gctUINT32 address;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x *Bytes=%lu",
+ Hardware, Logical, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+
+ gcmkASSERT(Hardware->wlFE);
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < 8)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ /* Append END. */
+ logical[0] =
+ ((((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) (0x02 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ /* Record the count of execution which is finised by this END. */
+ logical[1] =
+ Hardware->executeCount;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%x: END", Logical);
+
+ /* Make sure the CPU writes out the data to memory. */
+ gcmkONERROR(
+ gckOS_MemoryBarrier(Hardware->os, Logical));
+
+ gcmkASSERT(Address != ~0U);
+ address = Address;
+
+ Hardware->lastEnd = address;
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the END command. */
+ *Bytes = 8;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckWLFE_Nop
+**
+** Append a NOP command at the specified location in the command queue.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command queue to append
+** NOP command at or gcvNULL just to query the size of the NOP command.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the NOP command. If
+** 'Logical' is gcvNULL, this argument will be ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the NOP command. If 'Bytes' is gcvNULL, nothing will be returned.
+*/
+gceSTATUS
+gckWLFE_Nop(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctSIZE_T * Bytes
+ )
+{
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x *Bytes=%lu",
+ Hardware, Logical, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+
+ gcmkASSERT(Hardware->wlFE);
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < 8)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ /* Append NOP. */
+ logical[0] = ((((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) (0x03 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%x: NOP", Logical);
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the NOP command. */
+ *Bytes = 8;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckWLFE_Event
+**
+** Append an EVENT command at the specified location in the command queue.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to an gckHARDWARE object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command queue to append
+** the EVENT command at or gcvNULL just to query the size of the EVENT
+** command.
+**
+** gctUINT8 Event
+** Event ID to program.
+**
+** gceKERNEL_WHERE FromWhere
+** Location of the pipe to send the event.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the EVENT command. If
+** 'Logical' is gcvNULL, this argument will be ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the EVENT command. If 'Bytes' is gcvNULL, nothing will be
+** returned.
+*/
+gceSTATUS
+gckWLFE_Event(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT8 Event,
+ IN gceKERNEL_WHERE FromWhere,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT size;
+ gctUINT32 destination = 0;
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+ gctBOOL blt;
+ gctBOOL extraEventStates;
+ gctBOOL multiCluster;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x Event=%u FromWhere=%d *Bytes=%lu",
+ Hardware, Logical, Event, FromWhere, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+ gcmkVERIFY_ARGUMENT(Event < 32);
+
+ gcmkASSERT(Hardware->wlFE);
+
+ if (gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_BLT_ENGINE))
+ {
+ /* Send all event from blt. */
+ if (FromWhere == gcvKERNEL_PIXEL)
+ {
+ FromWhere = gcvKERNEL_BLT;
+ }
+ }
+
+ blt = FromWhere == gcvKERNEL_BLT ? gcvTRUE : gcvFALSE;
+
+ multiCluster = gckHARDWARE_IsFeatureAvailable(Hardware, gcvFEATURE_MULTI_CLUSTER);
+
+ /* Determine the size of the command. */
+
+ extraEventStates = Hardware->extraEventStates && (FromWhere == gcvKERNEL_PIXEL);
+
+ size = extraEventStates
+ ? gcmALIGN(8 + (1 + 5) * 4, 8) /* EVENT + 5 STATES */
+ : 8;
+
+ if (blt)
+ {
+ size += 16;
+ if (multiCluster)
+ size += 8;
+ }
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < size)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ switch (FromWhere)
+ {
+ case gcvKERNEL_COMMAND:
+ /* From command processor. */
+ destination = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)));
+ break;
+
+ case gcvKERNEL_PIXEL:
+ /* From pixel engine. */
+ destination = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)));
+ break;
+
+ case gcvKERNEL_BLT:
+ destination = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1))))))) << (0 ?
+ 7:7))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 7:7) - (0 ?
+ 7:7) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:7) - (0 ? 7:7) + 1))))))) << (0 ? 7:7)));
+ break;
+
+ default:
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (blt)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+
+ if (multiCluster)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x50CE) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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) (Hardware->identity.clusterAvailMask & Hardware->options.userClusterMask) & ((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0)));
+ }
+ }
+
+ /* Append EVENT(Event, destination). */
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E01) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *logical++
+ = ((((gctUINT32) (destination)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) ((gctUINT32) (Event) & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)));
+
+ if (blt)
+ {
+ *logical++
+ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x502E) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ *logical++
+ = ((((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)));
+ }
+
+
+ /* Make sure the event ID gets written out before GPU can access it. */
+ gcmkONERROR(
+ gckOS_MemoryBarrier(Hardware->os, logical + 1));
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ {
+ gctPHYS_ADDR_T phys;
+ gckOS_GetPhysicalAddress(Hardware->os, Logical, &phys);
+ gckOS_CPUPhysicalToGPUPhysical(Hardware->os, phys, &phys);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "0x%08x: EVENT %d", phys, Event);
+ }
+#endif
+
+ /* Append the extra states. These are needed for the chips that do not
+ ** support back-to-back events due to the async interface. The extra
+ ** states add the necessary delay to ensure that event IDs do not
+ ** collide. */
+ if (extraEventStates)
+ {
+ *logical++ = ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0100) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (5) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)));
+ *logical++ = 0;
+ *logical++ = 0;
+ *logical++ = 0;
+ *logical++ = 0;
+ *logical++ = 0;
+ }
+
+#if gcdINTERRUPT_STATISTIC
+ if (Event < gcmCOUNTOF(Hardware->kernel->eventObj->queues))
+ {
+ gckOS_AtomSetMask(Hardware->pendingEvent, 1 << Event);
+ }
+#endif
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the EVENT command. */
+ *Bytes = size;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckWLFE_ChipEnable(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gceCORE_3D_MASK ChipEnable,
+ IN OUT gctSIZE_T * Bytes
+ )
+{
+ gckOS os = Hardware->os;
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x ChipEnable=0x%x *Bytes=%lu",
+ Hardware, Logical, ChipEnable, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+
+ gcmkASSERT(Hardware->wlFE);
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < 8)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ /* Append CHIPENABLE. */
+ gcmkWRITE_MEMORY(
+ logical,
+ ((((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) (0x0D & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27))) | ChipEnable
+ );
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%x: CHIPENABLE 0x%x", Logical, ChipEnable);
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the CHIPENABLE command. */
+ *Bytes = 8;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckWLFE_Execute
+**
+** Kickstart the hardware's command processor with an initialized command
+** buffer.
+**
+** INPUT:
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object.
+**
+** gctUINT32 Address
+** Hardware address of command buffer.
+**
+** gctUINT32 Bytes
+** Number of bytes for the prefetch unit (until after the first LINK).
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckWLFE_Execute(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ )
+{
+ gceSTATUS status;
+ gctUINT32 control;
+
+ gcmkHEADER_ARG("Hardware=0x%x Address=0x%x Bytes=%lu",
+ Hardware, Address, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ gcmkASSERT(Hardware->wlFE);
+
+ /* Enable all events. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00014, ~0U));
+
+ /* Write address register. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00654, Address));
+
+ /* Build control register. */
+ control = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) ((Bytes + 7) >> 3) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ /* Set big endian */
+ if (Hardware->bigEndian)
+ {
+ control |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 21:20) - (0 ?
+ 21:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 21:20) - (0 ?
+ 21:20) + 1))))))) << (0 ?
+ 21:20))) | (((gctUINT32) (0x2 & ((gctUINT32) ((((1 ?
+ 21:20) - (0 ?
+ 21:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 21:20) - (0 ? 21:20) + 1))))))) << (0 ? 21:20)));
+ }
+
+ /* Make sure writing to command buffer and previous AHB register is done. */
+ gcmkONERROR(gckOS_MemoryBarrier(Hardware->os, gcvNULL));
+
+ /* Write control register. */
+ switch (Hardware->options.secureMode)
+ {
+ case gcvSECURE_NONE:
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00658, control));
+ break;
+ case gcvSECURE_IN_NORMAL:
+
+#if defined(__KERNEL__)
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00658, control));
+#endif
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x003A4, control));
+ break;
+#if gcdENABLE_TRUST_APPLICATION
+ case gcvSECURE_IN_TA:
+ /* Send message to TA. */
+ gcmkONERROR(gckKERNEL_SecurityStartCommand(Hardware->kernel, Address, (gctUINT32)Bytes));
+ break;
+#endif
+ default:
+ break;
+ }
+
+ /* Increase execute count. */
+ Hardware->executeCount++;
+
+ /* Record last execute address. */
+ Hardware->lastExecuteAddress = Address;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "Started command buffer @ 0x%08x",
+ Address);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckWLFE_AtomicExecute(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ )
+{
+ gctUINT32 control;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ /* Enable all events. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00014, ~0U));
+
+ /* Write address register. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00654, Address));
+
+ /* Build control register. */
+ control = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) ((Bytes + 7) >> 3) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ /* Set big endian */
+ if (Hardware->bigEndian)
+ {
+ control |= ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 21:20) - (0 ?
+ 21:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 21:20) - (0 ?
+ 21:20) + 1))))))) << (0 ?
+ 21:20))) | (((gctUINT32) (0x2 & ((gctUINT32) ((((1 ?
+ 21:20) - (0 ?
+ 21:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 21:20) - (0 ? 21:20) + 1))))))) << (0 ? 21:20)));
+ }
+
+ /* Make sure writing to command buffer and previous AHB register is done. */
+ gcmkONERROR(gckOS_MemoryBarrier(Hardware->os, gcvNULL));
+
+ /* Write control register. */
+ switch (Hardware->options.secureMode)
+ {
+ case gcvSECURE_NONE:
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00658, control));
+ break;
+ case gcvSECURE_IN_NORMAL:
+
+#if defined(__KERNEL__)
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x00658, control));
+#endif
+ gcmkONERROR(gckOS_WriteRegisterEx(Hardware->os, Hardware->core, 0x003A4, control));
+ break;
+#if gcdENABLE_TRUST_APPLICATION
+ case gcvSECURE_IN_TA:
+ /* Send message to TA. */
+ gcmkONERROR(gckKERNEL_SecurityStartCommand(Hardware->kernel, Address, (gctUINT32)Bytes));
+ break;
+#endif
+ default:
+ break;
+ }
+
+ /* Increase execute count. */
+ Hardware->executeCount++;
+
+ /* Record last execute address. */
+ Hardware->lastExecuteAddress = Address;
+
+ /* Success. */
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ return status;
+}
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_recorder.c b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_recorder.c
new file mode 100644
index 000000000000..0cdfe236a8b1
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/arch/gc_hal_kernel_recorder.c
@@ -0,0 +1,721 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal.h"
+#include "gc_hal_kernel.h"
+#include "gc_hal_kernel_context.h"
+
+/*
+ * -----------------------
+ * HARDWARE STATE RECORDER
+ * -----------------------
+ *
+ * State mirror buffer is used to 'mirror' hardware states since hardware
+ * states can't be dumpped. It is a context buffer which stores 'global'
+ * context.
+ *
+ * For each commit, state recorder
+ * 1) Records context buffer (if there is) and command buffers in this commit.
+ * 2) Parse those buffers to estimate the state changed.
+ * 3) Stores result to a mirror buffer.
+ *
+ * == Commit 0 ====================================================================
+ *
+ * Context Buffer 0
+ *
+ * Command Buffer 0
+ *
+ * Mirror Buffer 0 <- Context Buffer 0 + Command Buffer 0
+ *
+ * == Commit 1 ====================================================================
+ *
+ * Command Buffer 1
+ *
+ * Mirror Buffer 1 <- Command buffer 1 + Mirror Buffer 0
+ *
+ * == Commit 2 ====================================================================
+ *
+ * Context Buffer 2 (optional)
+ *
+ * Command Buffer 2
+ *
+ * Mirror Buffer 2 <- Command buffer 2 + Context Buffer 2 + Mirror Buffer 1
+ *
+ * == Commit N ====================================================================
+ *
+ * For Commit N, these buffers are needed to reproduce hardware's behavior in
+ * this commit.
+ *
+ * Mirror Buffer [N - 1] : State Mirror accumlated by past commits,
+ * which is used to restore hardware state.
+ * Context Buffer [N] :
+ * Command Buffer [N] : Command buffer executed by hardware in this commit.
+ *
+ * If sequence of states programming matters, hardware's behavior can't be reproduced,
+ * but the state values stored in mirror buffer are assuring.
+ */
+
+/* Queue size. */
+#define gcdNUM_RECORDS 6
+
+typedef struct _gcsPARSER_HANDLER * gckPARSER_HANDLER;
+
+typedef void
+(*HandlerFunction)(
+ IN gckPARSER_HANDLER Handler,
+ IN gctUINT32 Addr,
+ IN gctUINT32 Data
+ );
+
+typedef struct _gcsPARSER_HANDLER
+{
+ gctUINT32 type;
+ gctUINT32 cmd;
+ gctPOINTER private;
+ HandlerFunction function;
+}
+gcsPARSER_HANDLER;
+
+typedef struct _gcsPARSER * gckPARSER;
+typedef struct _gcsPARSER
+{
+ gctUINT8_PTR currentCmdBufferAddr;
+
+ /* Current command. */
+ gctUINT32 lo;
+ gctUINT32 hi;
+
+ gctUINT8 cmdOpcode;
+ gctUINT16 cmdAddr;
+ gctUINT32 cmdSize;
+ gctUINT32 cmdRectCount;
+ gctUINT8 skip;
+ gctUINT32 skipCount;
+
+ gctBOOL allow;
+ gctBOOL stop;
+
+ /* Callback used by parser to handle a command. */
+ gckPARSER_HANDLER commandHandler;
+}
+gcsPARSER;
+
+typedef struct _gcsMIRROR
+{
+ gctUINT32_PTR logical[gcdNUM_RECORDS];
+ gctUINT32 bytes;
+ gcsSTATE_MAP_PTR map;
+ gctSIZE_T maxState;
+}
+gcsMIRROR;
+
+typedef struct _gcsDELTA
+{
+ gctUINT64 commitStamp;
+ gctUINT32_PTR command;
+ gctUINT32 commandBytes;
+ gctUINT32_PTR context;
+ gctUINT32 contextBytes;
+}
+gcsDELTA;
+
+typedef struct _gcsRECORDER
+{
+ gckOS os;
+ gcsMIRROR mirror;
+ gcsDELTA deltas[gcdNUM_RECORDS];
+
+ /* Index of current record. */
+ gctUINT index;
+
+ /* Number of records. */
+ gctUINT num;
+
+ /* Plugin used by gckPARSER. */
+ gcsPARSER_HANDLER recorderHandler;
+ gckPARSER parser;
+}
+gcsRECORDER;
+
+
+/******************************************************************************\
+***************************** Command Buffer Parser ****************************
+\******************************************************************************/
+
+/*
+** Command buffer parser checks command buffer in FE's view to make sure there
+** is no format error.
+**
+** Parser provide a callback mechnisam, so plug-in can be added to implement
+** other functions.
+*/
+
+static void
+_HandleLoadState(
+ IN OUT gckPARSER Parser
+ )
+{
+ gctUINT i;
+ gctUINT32_PTR data = (gctUINT32_PTR)Parser->currentCmdBufferAddr;
+ gctUINT32 cmdAddr = Parser->cmdAddr;
+
+ if (Parser->commandHandler == gcvNULL
+ || Parser->commandHandler->cmd != 0x01
+ )
+ {
+ /* No handler for this command. */
+ return;
+ }
+
+ for (i = 0; i < Parser->cmdSize; i++)
+ {
+ Parser->commandHandler->function(Parser->commandHandler, cmdAddr, *data);
+
+ /* Advance to next state. */
+ cmdAddr++;
+ data++;
+ }
+}
+
+static void
+_GetCommand(
+ IN OUT gckPARSER Parser
+ )
+{
+ gctUINT32 * buffer = (gctUINT32 *)Parser->currentCmdBufferAddr;
+
+ gctUINT16 cmdRectCount;
+ gctUINT16 cmdDataCount;
+
+ Parser->hi = buffer[0];
+ Parser->lo = buffer[1];
+
+ Parser->cmdOpcode = (((((gctUINT32) (Parser->hi)) >> (0 ? 31:27)) & ((gctUINT32) ((((1 ? 31:27) - (0 ? 31:27) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1)))))) );
+ Parser->cmdRectCount = 1;
+
+ switch (Parser->cmdOpcode)
+ {
+ case 0x01:
+ /* Extract count. */
+ Parser->cmdSize = (((((gctUINT32) (Parser->hi)) >> (0 ? 25:16)) & ((gctUINT32) ((((1 ? 25:16) - (0 ? 25:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1)))))) );
+ if (Parser->cmdSize == 0)
+ {
+ /* 0 means 1024. */
+ Parser->cmdSize = 1024;
+ }
+ Parser->skip = (Parser->cmdSize & 0x1) ? 0 : 1;
+
+ /* Extract address. */
+ Parser->cmdAddr = (((((gctUINT32) (Parser->hi)) >> (0 ? 15:0)) & ((gctUINT32) ((((1 ? 15:0) - (0 ? 15:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1)))))) );
+
+ Parser->currentCmdBufferAddr = Parser->currentCmdBufferAddr + 4;
+ Parser->skipCount = Parser->cmdSize + Parser->skip;
+ break;
+
+ case 0x05:
+ Parser->cmdSize = 4;
+ Parser->skipCount = gcmALIGN(Parser->cmdSize, 2);
+ break;
+
+ case 0x06:
+ Parser->cmdSize = 5;
+ Parser->skipCount = gcmALIGN(Parser->cmdSize, 2);
+ break;
+
+ case 0x0C:
+ Parser->cmdSize = 3;
+ Parser->skipCount = gcmALIGN(Parser->cmdSize, 2);
+ break;
+
+ case 0x09:
+ Parser->cmdSize = 2;
+ Parser->cmdAddr = 0x0F16;
+ Parser->skipCount = gcmALIGN(Parser->cmdSize, 2);
+ break;
+
+ case 0x04:
+ Parser->cmdSize = 1;
+ Parser->cmdAddr = 0x0F06;
+
+ cmdRectCount = (((((gctUINT32) (Parser->hi)) >> (0 ? 15:8)) & ((gctUINT32) ((((1 ? 15:8) - (0 ? 15:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:8) - (0 ? 15:8) + 1)))))) );
+ cmdDataCount = (((((gctUINT32) (Parser->hi)) >> (0 ? 26:16)) & ((gctUINT32) ((((1 ? 26:16) - (0 ? 26:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 26:16) - (0 ? 26:16) + 1)))))) );
+
+ Parser->skipCount = gcmALIGN(Parser->cmdSize, 2)
+ + cmdRectCount * 2
+ + gcmALIGN(cmdDataCount, 2);
+
+ Parser->cmdRectCount = cmdRectCount;
+ break;
+
+ case 0x03:
+ Parser->currentCmdBufferAddr = Parser->currentCmdBufferAddr + 8;
+ Parser->skipCount = 0;
+ break;
+
+ case 0x02:
+ Parser->currentCmdBufferAddr = Parser->currentCmdBufferAddr + 8;
+ Parser->skipCount = 0;
+ break;
+
+ case 0x07:
+ Parser->currentCmdBufferAddr = Parser->currentCmdBufferAddr + 8;
+ Parser->skipCount = 0;
+ break;
+
+ case 0x08:
+ /* Commands after LINK isn't executed, skip them. */
+ Parser->stop = gcvTRUE;
+ break;
+
+ default:
+ /* Unknown command is a risk. */
+ Parser->allow = gcvFALSE;
+ break;
+ }
+}
+
+static void
+_ParseCommand(
+ IN OUT gckPARSER Parser
+ )
+{
+ switch(Parser->cmdOpcode)
+ {
+ case 0x01:
+ _HandleLoadState(Parser);
+ break;
+ case 0x05:
+ case 0x06:
+ case 0x0C:
+ break;
+ case 0x04:
+ break;
+ default:
+ break;
+ }
+
+ /* Advance to next command. */
+ Parser->currentCmdBufferAddr = Parser->currentCmdBufferAddr
+ + (Parser->skipCount << 2);
+}
+
+gceSTATUS
+gckPARSER_Parse(
+ IN gckPARSER Parser,
+ IN gctUINT8_PTR Buffer,
+ IN gctUINT32 Bytes
+ )
+{
+ gckPARSER parser = Parser;
+ gctUINT8_PTR end = (gctUINT8_PTR)Buffer + Bytes;
+
+ /* Initialize parser. */
+ parser->currentCmdBufferAddr = (gctUINT8_PTR)Buffer;
+ parser->skip = 0;
+ parser->allow = gcvTRUE;
+ parser->stop = gcvFALSE;
+
+ /* Go through command buffer until reaching the end
+ ** or meeting an error. */
+ do
+ {
+ _GetCommand(parser);
+
+ _ParseCommand(parser);
+ }
+ while ((parser->currentCmdBufferAddr < end)
+ && (parser->allow == gcvTRUE)
+ && (parser->stop == gcvFALSE)
+ );
+
+ if (parser->allow == gcvFALSE)
+ {
+ /* Error detected. */
+ return gcvSTATUS_NOT_SUPPORTED;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckPARSER_RegisterCommandHandler
+**
+** Register a command handler which will be called when parser get a command.
+**
+*/
+gceSTATUS
+gckPARSER_RegisterCommandHandler(
+ IN gckPARSER Parser,
+ IN gckPARSER_HANDLER Handler
+ )
+{
+ Parser->commandHandler = Handler;
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckPARSER_Construct(
+ IN gckOS Os,
+ IN gckPARSER_HANDLER Handler,
+ OUT gckPARSER * Parser
+ )
+{
+ gceSTATUS status;
+ gckPARSER pointer;
+
+ gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(gcsPARSER), (gctPOINTER *)&pointer));
+
+ /* Put it here temp, should have a more general plug-in mechnisam. */
+ pointer->commandHandler = Handler;
+
+ *Parser = pointer;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+void
+gckPARSER_Destroy(
+ IN gckOS Os,
+ IN gckPARSER Parser
+ )
+{
+ gcmkOS_SAFE_FREE(Os, Parser);
+}
+
+/******************************************************************************\
+**************************** Hardware States Recorder **************************
+\******************************************************************************/
+
+static void
+_RecodeState(
+ IN gckPARSER_HANDLER Handler,
+ IN gctUINT32 Addr,
+ IN gctUINT32 Data
+ )
+{
+ gcmkVERIFY_OK(gckRECORDER_UpdateMirror(Handler->private, Addr, Data));
+}
+
+static gctUINT
+_Previous(
+ IN gctUINT Index
+ )
+{
+ if (Index == 0)
+ {
+ return gcdNUM_RECORDS - 1;
+ }
+
+ return Index - 1;
+}
+
+static gctUINT
+_Next(
+ IN gctUINT Index
+ )
+{
+ return (Index + 1) % gcdNUM_RECORDS;
+}
+
+gceSTATUS
+gckRECORDER_Construct(
+ IN gckOS Os,
+ IN gckHARDWARE Hardware,
+ OUT gckRECORDER * Recorder
+ )
+{
+ gceSTATUS status;
+ gckCONTEXT context = gcvNULL;
+ gckRECORDER recorder = gcvNULL;
+ gctSIZE_T mapSize;
+ gctUINT i;
+
+ gcmkONERROR(gckCONTEXT_Construct(Os, Hardware, 0, &context));
+
+ gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(gcsRECORDER), (gctPOINTER *)&recorder));
+
+ gckOS_ZeroMemory(recorder, gcmSIZEOF(gcsRECORDER));
+
+ /* Copy state map. */
+ recorder->mirror.maxState = context->maxState;
+
+ mapSize = context->maxState * gcmSIZEOF(gcsSTATE_MAP);
+
+ gcmkONERROR(gckOS_Allocate(Os, mapSize, (gctPOINTER *)&recorder->mirror.map));
+
+ gckOS_MemCopy(recorder->mirror.map, context->map, mapSize);
+
+ /* Copy context buffer. */
+ recorder->mirror.bytes = context->totalSize;
+
+ for (i = 0; i < gcdNUM_RECORDS; i++)
+ {
+ gcmkONERROR(gckOS_Allocate(Os, context->totalSize, (gctPOINTER *)&recorder->mirror.logical[i]));
+ gckOS_MemCopy(recorder->mirror.logical[i], context->buffer->logical, context->totalSize);
+ }
+
+ for (i = 0; i < gcdNUM_RECORDS; i++)
+ {
+ gcmkONERROR(gckOS_Allocate(Os, gcdCMD_BUFFER_SIZE, (gctPOINTER *)&recorder->deltas[i].command));
+ gcmkONERROR(gckOS_Allocate(Os, context->totalSize, (gctPOINTER *)&recorder->deltas[i].context));
+ }
+
+ recorder->index = 0;
+ recorder->num = 0;
+
+ /* Initialize Parser plugin. */
+ recorder->recorderHandler.cmd = 0x01;
+ recorder->recorderHandler.private = recorder;
+ recorder->recorderHandler.function = _RecodeState;
+
+ gcmkONERROR(gckPARSER_Construct(Os, &recorder->recorderHandler, &recorder->parser));
+
+ recorder->os = Os;
+
+ *Recorder = recorder;
+
+ gckCONTEXT_Destroy(context);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (context)
+ {
+ gckCONTEXT_Destroy(context);
+ }
+
+ if (recorder)
+ {
+ gckRECORDER_Destory(Os, recorder);
+ }
+
+ return status;
+}
+
+gceSTATUS
+gckRECORDER_Destory(
+ IN gckOS Os,
+ IN gckRECORDER Recorder
+ )
+{
+ gctUINT i;
+
+ if (Recorder->mirror.map)
+ {
+ gcmkOS_SAFE_FREE(Os, Recorder->mirror.map);
+ }
+
+ for (i = 0; i < gcdNUM_RECORDS; i++)
+ {
+ if (Recorder->mirror.logical[i])
+ {
+ gcmkOS_SAFE_FREE(Os, Recorder->mirror.logical[i]);
+ }
+ }
+
+ for (i = 0; i < gcdNUM_RECORDS; i++)
+ {
+ if (Recorder->deltas[i].command)
+ {
+ gcmkOS_SAFE_FREE(Os, Recorder->deltas[i].command);
+ }
+
+ if (Recorder->deltas[i].context)
+ {
+ gcmkOS_SAFE_FREE(Os, Recorder->deltas[i].context);
+ }
+ }
+
+ if (Recorder->parser)
+ {
+ gckPARSER_Destroy(Os, Recorder->parser);
+ }
+
+ gcmkOS_SAFE_FREE(Os, Recorder);
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckRECORDER_UpdateMirror(
+ IN gckRECORDER Recorder,
+ IN gctUINT32 State,
+ IN gctUINT32 Data
+ )
+{
+ gctUINT32 index;
+ gcsSTATE_MAP_PTR map = Recorder->mirror.map;
+ gctUINT32_PTR buffer = Recorder->mirror.logical[Recorder->index];
+
+ if (State >= Recorder->mirror.maxState)
+ {
+ /* Ignore them just like HW does. */
+ return gcvSTATUS_OK;
+ }
+
+ index = map[State].index;
+
+ if (index)
+ {
+ buffer[index] = Data;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+void
+gckRECORDER_AdvanceIndex(
+ IN gckRECORDER Recorder,
+ IN gctUINT64 CommitStamp
+ )
+{
+ /* Get next record. */
+ gctUINT next = (Recorder->index + 1) % gcdNUM_RECORDS;
+
+ /* Record stamp of this commit. */
+ Recorder->deltas[Recorder->index].commitStamp = CommitStamp;
+
+ /* Mirror of next record is mirror of this record and delta in next record. */
+ gckOS_MemCopy(Recorder->mirror.logical[next],
+ Recorder->mirror.logical[Recorder->index], Recorder->mirror.bytes);
+
+ /* Advance to next record. */
+ Recorder->index = next;
+
+ Recorder->num = gcmMIN(Recorder->num + 1, gcdNUM_RECORDS - 1);
+
+
+ /* Reset delta. */
+ Recorder->deltas[Recorder->index].commandBytes = 0;
+ Recorder->deltas[Recorder->index].contextBytes = 0;
+}
+
+void
+gckRECORDER_Record(
+ IN gckRECORDER Recorder,
+ IN gctUINT8_PTR CommandBuffer,
+ IN gctUINT32 CommandBytes,
+ IN gctUINT8_PTR ContextBuffer,
+ IN gctUINT32 ContextBytes
+ )
+{
+ gcsDELTA * delta = &Recorder->deltas[Recorder->index];
+
+ if (CommandBytes != 0xFFFFFFFF)
+ {
+ gckPARSER_Parse(Recorder->parser, CommandBuffer, CommandBytes);
+ gckOS_MemCopy(delta->command, CommandBuffer, CommandBytes);
+ delta->commandBytes = CommandBytes;
+ }
+
+ if (ContextBytes != 0xFFFFFFFF)
+ {
+ gckPARSER_Parse(Recorder->parser, ContextBuffer, ContextBytes);
+ gckOS_MemCopy(delta->context, ContextBuffer, ContextBytes);
+ delta->contextBytes = ContextBytes;
+ }
+}
+
+void
+gckRECORDER_Dump(
+ IN gckRECORDER Recorder
+ )
+{
+ gctUINT last = Recorder->index;
+ gctUINT previous;
+ gctUINT i;
+ gcsMIRROR *mirror = &Recorder->mirror;
+ gcsDELTA *delta;
+ gckOS os = Recorder->os;
+
+ for (i = 0; i < Recorder->num; i++)
+ {
+ last = _Previous(last);
+ }
+
+ for (i = 0; i < Recorder->num; i++)
+ {
+ delta = &Recorder->deltas[last];
+
+ /* Dump record */
+ gcmkPRINT("#[commit %llu]", delta->commitStamp);
+
+ if (delta->commitStamp)
+ {
+ previous = _Previous(last);
+
+ gcmkPRINT("#[mirror]");
+ gckOS_DumpBuffer(os, gcvDUMP_BUFFER_KERNEL_CONTEXT, mirror->logical[previous], ~0U, mirror->bytes);
+ gcmkPRINT("#[kernel.execute]");
+ }
+
+ if (delta->contextBytes)
+ {
+ gckOS_DumpBuffer(os, gcvDUMP_BUFFER_KERNEL_CONTEXT, delta->context, ~0U, delta->contextBytes);
+ gcmkPRINT("#[kernel.execute]");
+ }
+
+ gckOS_DumpBuffer(os, gcvDUMP_BUFFER_KERNEL_COMMAND, delta->command, ~0U, delta->commandBytes);
+ gcmkPRINT("#[kernel.execute]");
+
+ last = _Next(last);
+ }
+}
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_command_vg.c b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_command_vg.c
new file mode 100644
index 000000000000..bb800a686454
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_command_vg.c
@@ -0,0 +1,1411 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal.h"
+#include "gc_hal_kernel.h"
+
+#if gcdENABLE_VG
+
+#include "gc_hal_kernel_hardware_command_vg.h"
+
+#define _GC_OBJ_ZONE gcvZONE_COMMAND
+
+/******************************************************************************\
+****************************** gckVGCOMMAND API code *****************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** gckVGCOMMAND_InitializeInfo
+**
+** Initialize architecture dependent command buffer information.
+**
+** INPUT:
+**
+** gckVGCOMMAND Command
+** Pointer to the Command object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckVGCOMMAND_InitializeInfo(
+ IN gckVGCOMMAND Command
+ )
+{
+ gceSTATUS status;
+ gcmkHEADER_ARG("Command=0x%x", Command);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ do
+ {
+ /* Reset interrupts. */
+ Command->info.feBufferInt = -1;
+ Command->info.tsOverflowInt = -1;
+
+ /* Set command buffer attributes. */
+ Command->info.addressAlignment = 64;
+ Command->info.commandAlignment = 8;
+
+ /* Determine command alignment address mask. */
+ Command->info.addressMask = ((((gctUINT32) (Command->info.addressAlignment - 1)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) ((gctUINT32) (0 ) & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0)));
+
+ /* Query the number of bytes needed by the STATE command. */
+ gcmkERR_BREAK(gckVGCOMMAND_StateCommand(
+ Command, 0x0, gcvNULL, (gctUINT32)~0, 0,
+ &Command->info.stateCommandSize
+ ));
+
+ /* Query the number of bytes needed by the RESTART command. */
+ gcmkERR_BREAK(gckVGCOMMAND_RestartCommand(
+ Command, gcvNULL, (gctUINT32)~0, 0,
+ &Command->info.restartCommandSize
+ ));
+
+ /* Query the number of bytes needed by the FETCH command. */
+ gcmkERR_BREAK(gckVGCOMMAND_FetchCommand(
+ Command, gcvNULL, (gctUINT32)~0, 0,
+ &Command->info.fetchCommandSize
+ ));
+
+ /* Query the number of bytes needed by the CALL command. */
+ gcmkERR_BREAK(gckVGCOMMAND_CallCommand(
+ Command, gcvNULL, (gctUINT32)~0, 0,
+ &Command->info.callCommandSize
+ ));
+
+ /* Query the number of bytes needed by the RETURN command. */
+ gcmkERR_BREAK(gckVGCOMMAND_ReturnCommand(
+ Command, gcvNULL,
+ &Command->info.returnCommandSize
+ ));
+
+ /* Query the number of bytes needed by the EVENT command. */
+ gcmkERR_BREAK(gckVGCOMMAND_EventCommand(
+ Command, gcvNULL, gcvBLOCK_PIXEL, -1,
+ &Command->info.eventCommandSize
+ ));
+
+ /* Query the number of bytes needed by the END command. */
+ gcmkERR_BREAK(gckVGCOMMAND_EndCommand(
+ Command, gcvNULL, -1,
+ &Command->info.endCommandSize
+ ));
+
+ /* Determine the tail reserve size. */
+ Command->info.staticTailSize = gcmMAX(
+ Command->info.fetchCommandSize,
+ gcmMAX(
+ Command->info.returnCommandSize,
+ Command->info.endCommandSize
+ )
+ );
+
+ /* Determine the maximum tail size. */
+ Command->info.dynamicTailSize
+ = Command->info.staticTailSize
+ + Command->info.eventCommandSize * gcvBLOCK_COUNT;
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVGCOMMAND_StateCommand
+**
+** Append a STATE command at the specified location in the command buffer.
+**
+** INPUT:
+**
+** gckVGCOMMAND Command
+** Pointer to an gckVGCOMMAND object.
+**
+** gctUINT32 Pipe
+** Harwdare destination pipe.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command buffer to append
+** STATE command at or gcvNULL to query the size of the command.
+**
+** gctUINT32 Address
+** Starting register address of the state buffer.
+** If 'Logical' is gcvNULL, this argument is ignored.
+**
+** gctUINT32 Count
+** Number of states in state buffer.
+** If 'Logical' is gcvNULL, this argument is ignored.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the STATE command.
+** If 'Logical' is gcvNULL, the value from this argument is ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the STATE command. If 'Bytes' is gcvNULL, nothing is returned.
+*/
+gceSTATUS
+gckVGCOMMAND_StateCommand(
+ IN gckVGCOMMAND Command,
+ IN gctUINT32 Pipe,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN gctUINT32 Count,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gcmkHEADER_ARG("Command=0x%x Pipe=0x%x Logical=0x%x Address=0x%x Count=0x%x Bytes = 0x%x",
+ Command, Pipe, Logical, Address, Count, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ if (Command->fe20)
+ {
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Cast the buffer pointer. */
+ buffer = (gctUINT32_PTR) Logical;
+
+ /* Append STATE. */
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[0],
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1))))))) << (0 ?
+ 31:28))) | (((gctUINT32) (0x3 & ((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 11:0) - (0 ?
+ 11:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 11:0) - (0 ?
+ 11:0) + 1))))))) << (0 ?
+ 11:0))) | (((gctUINT32) ((gctUINT32) (Address) & ((gctUINT32) ((((1 ?
+ 11:0) - (0 ?
+ 11:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 11:0) - (0 ? 11:0) + 1))))))) << (0 ? 11:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 27:16) - (0 ?
+ 27:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 27:16) - (0 ?
+ 27:16) + 1))))))) << (0 ?
+ 27:16))) | (((gctUINT32) ((gctUINT32) (Count) & ((gctUINT32) ((((1 ?
+ 27:16) - (0 ?
+ 27:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 27:16) - (0 ? 27:16) + 1))))))) << (0 ? 27:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1))))))) << (0 ?
+ 13:12))) | (((gctUINT32) ((gctUINT32) (Pipe) & ((gctUINT32) ((((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 13:12) - (0 ? 13:12) + 1))))))) << (0 ? 13:12)))
+ );
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the STATE command. */
+ *Bytes = 4 * (Count + 1);
+ }
+ }
+ else
+ {
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Cast the buffer pointer. */
+ buffer = (gctUINT32_PTR) Logical;
+
+ /* Append LOAD_STATE. */
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[0],
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1))))))) << (0 ?
+ 25:16))) | (((gctUINT32) ((gctUINT32) (Count) & ((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 25:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 25:16) - (0 ? 25:16) + 1))))))) << (0 ? 25:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (Address) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ );
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the STATE command. */
+ *Bytes = 4 * (Count + 1);
+ }
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGCOMMAND_RestartCommand
+**
+** Form a RESTART command at the specified location in the command buffer.
+**
+** INPUT:
+**
+** gckVGCOMMAND Command
+** Pointer to an gckVGCOMMAND object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command buffer to append
+** RESTART command at or gcvNULL to query the size of the command.
+**
+** gctUINT32 FetchAddress
+** The address of another command buffer to be executed by this RESTART
+** command. If 'Logical' is gcvNULL, this argument is ignored.
+**
+** gctUINT FetchCount
+** The number of 64-bit data quantities in another command buffer to
+** be executed by this RESTART command. If 'Logical' is gcvNULL, this
+** argument is ignored.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the RESTART command.
+** If 'Logical' is gcvNULL, the value from this argument is ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the RESTART command. If 'Bytes' is gcvNULL, nothing is returned.
+*/
+gceSTATUS
+gckVGCOMMAND_RestartCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FetchAddress,
+ IN gctUINT FetchCount,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gcmkHEADER_ARG("Command=0x%x Logical=0x%x FetchAddress=0x%x FetchCount=0x%x Bytes = 0x%x",
+ Command, Logical, FetchAddress, FetchCount, Bytes);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ if (Command->fe20)
+ {
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+ gctUINT32 beginEndMark;
+
+ /* Cast the buffer pointer. */
+ buffer = (gctUINT32_PTR) Logical;
+
+ /* Determine Begin/End flag. */
+ beginEndMark = (FetchCount > 0)
+ ?
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 24:24) - (0 ?
+ 24:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 24:24) - (0 ?
+ 24:24) + 1))))))) << (0 ?
+ 24:24))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 24:24) - (0 ?
+ 24:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 24:24) - (0 ? 24:24) + 1))))))) << (0 ? 24:24)))
+ : ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 24:24) - (0 ?
+ 24:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 24:24) - (0 ?
+ 24:24) + 1))))))) << (0 ?
+ 24:24))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 24:24) - (0 ?
+ 24:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 24:24) - (0 ? 24:24) + 1))))))) << (0 ? 24:24)));
+
+ /* Append RESTART. */
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[0],
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1))))))) << (0 ?
+ 31:28))) | (((gctUINT32) (0x9 & ((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 20:0) - (0 ?
+ 20:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 20:0) - (0 ?
+ 20:0) + 1))))))) << (0 ?
+ 20:0))) | (((gctUINT32) ((gctUINT32) (FetchCount) & ((gctUINT32) ((((1 ?
+ 20:0) - (0 ?
+ 20:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 20:0) - (0 ? 20:0) + 1))))))) << (0 ? 20:0)))
+ | beginEndMark
+ );
+
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[1],
+ FetchAddress
+ );
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the RESTART command. */
+ *Bytes = 8;
+ }
+ }
+ else
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_NOT_SUPPORTED;
+ }
+
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGCOMMAND_FetchCommand
+**
+** Form a FETCH command at the specified location in the command buffer.
+**
+** INPUT:
+**
+** gckVGCOMMAND Command
+** Pointer to an gckVGCOMMAND object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command buffer to append
+** FETCH command at or gcvNULL to query the size of the command.
+**
+** gctUINT32 FetchAddress
+** The address of another command buffer to be executed by this FETCH
+** command. If 'Logical' is gcvNULL, this argument is ignored.
+**
+** gctUINT FetchCount
+** The number of 64-bit data quantities in another command buffer to
+** be executed by this FETCH command. If 'Logical' is gcvNULL, this
+** argument is ignored.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the FETCH command.
+** If 'Logical' is gcvNULL, the value from this argument is ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the FETCH command. If 'Bytes' is gcvNULL, nothing is returned.
+*/
+gceSTATUS
+gckVGCOMMAND_FetchCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FetchAddress,
+ IN gctUINT FetchCount,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gcmkHEADER_ARG("Command=0x%x Logical=0x%x FetchAddress=0x%x FetchCount=0x%x Bytes = 0x%x",
+ Command, Logical, FetchAddress, FetchCount, Bytes);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ if (Command->fe20)
+ {
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Cast the buffer pointer. */
+ buffer = (gctUINT32_PTR) Logical;
+
+ /* Append FETCH. */
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[0],
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1))))))) << (0 ?
+ 31:28))) | (((gctUINT32) (0x5 & ((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 20:0) - (0 ?
+ 20:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 20:0) - (0 ?
+ 20:0) + 1))))))) << (0 ?
+ 20:0))) | (((gctUINT32) ((gctUINT32) (FetchCount) & ((gctUINT32) ((((1 ?
+ 20:0) - (0 ?
+ 20:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 20:0) - (0 ? 20:0) + 1))))))) << (0 ? 20:0)))
+ );
+
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[1],
+ gcmkFIXADDRESS(FetchAddress)
+ );
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the FETCH command. */
+ *Bytes = 8;
+ }
+ }
+ else
+ {
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Cast the buffer pointer. */
+ buffer = (gctUINT32_PTR) Logical;
+
+ /* Append LINK. */
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[0],
+ ((((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) (0x08 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (FetchCount) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ );
+
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[1],
+ gcmkFIXADDRESS(FetchAddress)
+ );
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the LINK command. */
+ *Bytes = 8;
+ }
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGCOMMAND_CallCommand
+**
+** Append a CALL command at the specified location in the command buffer.
+**
+** INPUT:
+**
+** gckVGCOMMAND Command
+** Pointer to an gckVGCOMMAND object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command buffer to append
+** CALL command at or gcvNULL to query the size of the command.
+**
+** gctUINT32 FetchAddress
+** The address of another command buffer to be executed by this CALL
+** command. If 'Logical' is gcvNULL, this argument is ignored.
+**
+** gctUINT FetchCount
+** The number of 64-bit data quantities in another command buffer to
+** be executed by this CALL command. If 'Logical' is gcvNULL, this
+** argument is ignored.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the CALL command.
+** If 'Logical' is gcvNULL, the value from this argument is ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the CALL command. If 'Bytes' is gcvNULL, nothing is returned.
+*/
+gceSTATUS
+gckVGCOMMAND_CallCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FetchAddress,
+ IN gctUINT FetchCount,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gcmkHEADER_ARG("Command=0x%x Logical=0x%x FetchAddress=0x%x FetchCount=0x%x Bytes = 0x%x",
+ Command, Logical, FetchAddress, FetchCount, Bytes);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ if (Command->fe20)
+ {
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Cast the buffer pointer. */
+ buffer = (gctUINT32_PTR) Logical;
+
+ /* Append CALL. */
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[0],
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1))))))) << (0 ?
+ 31:28))) | (((gctUINT32) (0x6 & ((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 20:0) - (0 ?
+ 20:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 20:0) - (0 ?
+ 20:0) + 1))))))) << (0 ?
+ 20:0))) | (((gctUINT32) ((gctUINT32) (FetchCount) & ((gctUINT32) ((((1 ?
+ 20:0) - (0 ?
+ 20:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 20:0) - (0 ? 20:0) + 1))))))) << (0 ? 20:0)))
+ );
+
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[1],
+ gcmkFIXADDRESS(FetchAddress)
+ );
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the CALL command. */
+ *Bytes = 8;
+ }
+ }
+ else
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_NOT_SUPPORTED;
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGCOMMAND_ReturnCommand
+**
+** Append a RETURN command at the specified location in the command buffer.
+**
+** INPUT:
+**
+** gckVGCOMMAND Command
+** Pointer to an gckVGCOMMAND object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command buffer to append
+** RETURN command at or gcvNULL to query the size of the command.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the RETURN command.
+** If 'Logical' is gcvNULL, the value from this argument is ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the RETURN command. If 'Bytes' is gcvNULL, nothing is returned.
+*/
+gceSTATUS
+gckVGCOMMAND_ReturnCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gcmkHEADER_ARG("Command=0x%x Logical=0x%x Bytes = 0x%x",
+ Command, Logical, Bytes);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ if (Command->fe20)
+ {
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Cast the buffer pointer. */
+ buffer = (gctUINT32_PTR) Logical;
+
+ /* Append RETURN. */
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[0],
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1))))))) << (0 ?
+ 31:28))) | (((gctUINT32) (0x7 & ((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28)))
+ );
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the RETURN command. */
+ *Bytes = 8;
+ }
+ }
+ else
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_NOT_SUPPORTED;
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGCOMMAND_EventCommand
+**
+** Form an EVENT command at the specified location in the command buffer.
+**
+** INPUT:
+**
+** gckVGCOMMAND Command
+** Pointer to the Command object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command buffer to append
+** EVENT command at or gcvNULL to query the size of the command.
+**
+** gctINT32 InterruptId
+** The ID of the interrupt to generate.
+** If 'Logical' is gcvNULL, this argument is ignored.
+**
+** gceBLOCK Block
+** Block that will generate the interrupt.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the EVENT command.
+** If 'Logical' is gcvNULL, the value from this argument is ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the END command. If 'Bytes' is gcvNULL, nothing is returned.
+*/
+gceSTATUS
+gckVGCOMMAND_EventCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN gceBLOCK Block,
+ IN gctINT32 InterruptId,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gcmkHEADER_ARG("Command=0x%x Logical=0x%x Block=0x%x InterruptId=0x%x Bytes = 0x%x",
+ Command, Logical, Block, InterruptId, Bytes);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ if (Command->fe20)
+ {
+ typedef struct _gcsEVENTSTATES
+ {
+ /* Chips before VG21 use these values. */
+ gctUINT eventFromFE;
+ gctUINT eventFromPE;
+
+ /* VG21 chips and later use SOURCE field. */
+ gctUINT eventSource;
+ }
+ gcsEVENTSTATES;
+
+ static gcsEVENTSTATES states[] =
+ {
+ /* gcvBLOCK_COMMAND */
+ {
+ (gctUINT)~0,
+ (gctUINT)~0,
+ (gctUINT)~0
+ },
+
+ /* gcvBLOCK_TESSELLATOR */
+ {
+ 0x0,
+ 0x1,
+ 0x10
+ },
+
+ /* gcvBLOCK_TESSELLATOR2 */
+ {
+ 0x0,
+ 0x1,
+ 0x12
+ },
+
+ /* gcvBLOCK_TESSELLATOR3 */
+ {
+ 0x0,
+ 0x1,
+ 0x14
+ },
+
+ /* gcvBLOCK_RASTER */
+ {
+ 0x0,
+ 0x1,
+ 0x07,
+ },
+
+ /* gcvBLOCK_VG */
+ {
+ 0x0,
+ 0x1,
+ 0x0F
+ },
+
+ /* gcvBLOCK_VG2 */
+ {
+ 0x0,
+ 0x1,
+ 0x11
+ },
+
+ /* gcvBLOCK_VG3 */
+ {
+ 0x0,
+ 0x1,
+ 0x13
+ },
+
+ /* gcvBLOCK_PIXEL */
+ {
+ 0x0,
+ 0x1,
+ 0x07
+ },
+ };
+
+ /* Verify block ID. */
+ gcmkVERIFY_ARGUMENT(gcmIS_VALID_INDEX(Block, states));
+
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Verify the event ID. */
+ gcmkVERIFY_ARGUMENT(InterruptId >= 0);
+ gcmkVERIFY_ARGUMENT(InterruptId <= ((gctUINT32) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))));
+
+ /* Cast the buffer pointer. */
+ buffer = (gctUINT32_PTR) Logical;
+
+ /* Append EVENT. */
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[0],
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1))))))) << (0 ?
+ 31:28))) | (((gctUINT32) (0x3 & ((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 11:0) - (0 ?
+ 11:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 11:0) - (0 ?
+ 11:0) + 1))))))) << (0 ?
+ 11:0))) | (((gctUINT32) ((gctUINT32) (0x0E01) & ((gctUINT32) ((((1 ?
+ 11:0) - (0 ?
+ 11:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 11:0) - (0 ? 11:0) + 1))))))) << (0 ? 11:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 27:16) - (0 ?
+ 27:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 27:16) - (0 ?
+ 27:16) + 1))))))) << (0 ?
+ 27:16))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 27:16) - (0 ?
+ 27:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 27:16) - (0 ? 27:16) + 1))))))) << (0 ? 27:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1))))))) << (0 ?
+ 13:12))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 13:12) - (0 ?
+ 13:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 13:12) - (0 ? 13:12) + 1))))))) << (0 ? 13:12)))
+ );
+
+ /* Determine chip version. */
+ if (Command->vg21)
+ {
+ /* Get the event source for the block. */
+ gctUINT eventSource = states[Block].eventSource;
+
+ /* Supported? */
+ if (eventSource == ~0)
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_NOT_SUPPORTED;
+ }
+
+ buffer[1]
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1))))))) << (0 ?
+ 12:8))) | (((gctUINT32) ((gctUINT32) (eventSource) & ((gctUINT32) ((((1 ?
+ 12:8) - (0 ?
+ 12:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:8) - (0 ? 12:8) + 1))))))) << (0 ? 12:8)));
+ }
+ else
+ {
+ /* Get the event source for the block. */
+ gctUINT eventFromFE = states[Block].eventFromFE;
+ gctUINT eventFromPE = states[Block].eventFromPE;
+
+ /* Supported? */
+ if (eventFromFE == ~0)
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_NOT_SUPPORTED;
+ }
+
+ buffer[1]
+ = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) ((gctUINT32) (eventFromFE) & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) ((gctUINT32) (eventFromPE) & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)));
+ }
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Make sure the events are directly supported for the block. */
+ if (states[Block].eventSource == ~0)
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_NOT_SUPPORTED;
+ }
+
+ /* Return number of bytes required by the END command. */
+ *Bytes = 8;
+ }
+ }
+ else
+ {
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Verify the event ID. */
+ gcmkVERIFY_ARGUMENT(InterruptId >= 0);
+ gcmkVERIFY_ARGUMENT(InterruptId <= ((gctUINT32) ((((1 ? 4:0) - (0 ? 4:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))));
+
+ /* Cast the buffer pointer. */
+ buffer = (gctUINT32_PTR) Logical;
+
+ /* Append EVENT. */
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[0],
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E01) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ /* Determine event source. */
+ if (Block == gcvBLOCK_COMMAND)
+ {
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[1],
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1))))))) << (0 ?
+ 5:5))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 5:5) - (0 ?
+ 5:5) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 5:5) - (0 ? 5:5) + 1))))))) << (0 ? 5:5)))
+ );
+ }
+ else
+ {
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[1],
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)))
+ );
+ }
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the EVENT and END commands. */
+ *Bytes = 8;
+ }
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGCOMMAND_EndCommand
+**
+** Form an END command at the specified location in the command buffer.
+**
+** INPUT:
+**
+** gckVGCOMMAND Command
+** Pointer to the Command object.
+**
+** gctPOINTER Logical
+** Pointer to the current location inside the command buffer to append
+** END command at or gcvNULL to query the size of the command.
+**
+** gctINT32 InterruptId
+** The ID of the interrupt to generate.
+** If 'Logical' is gcvNULL, this argument will be ignored.
+**
+** gctSIZE_T * Bytes
+** Pointer to the number of bytes available for the END command.
+** If 'Logical' is gcvNULL, the value from this argument is ignored.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that will receive the number of bytes required
+** for the END command. If 'Bytes' is gcvNULL, nothing is returned.
+*/
+gceSTATUS
+gckVGCOMMAND_EndCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN gctINT32 InterruptId,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gcmkHEADER_ARG("Command=0x%x Logical=0x%x InterruptId=0x%x Bytes = 0x%x",
+ Command, Logical, InterruptId, Bytes);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ if (Command->fe20)
+ {
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR buffer;
+
+ /* Verify the event ID. */
+ gcmkVERIFY_ARGUMENT(InterruptId >= 0);
+
+ /* Cast the buffer pointer. */
+ buffer = (gctUINT32_PTR) Logical;
+
+ /* Append END. */
+ gckOS_WriteMemory(
+ Command->os,
+ &buffer[0],
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1))))))) << (0 ?
+ 31:28))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 31:28) - (0 ?
+ 31:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:28) - (0 ? 31:28) + 1))))))) << (0 ? 31:28)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ );
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the END command. */
+ *Bytes = 8;
+ }
+ }
+ else
+ {
+ if (Logical != gcvNULL)
+ {
+ gctUINT32_PTR memory;
+
+ /* Verify the event ID. */
+ gcmkVERIFY_ARGUMENT(InterruptId >= 0);
+
+ /* Cast the buffer pointer. */
+ memory = (gctUINT32_PTR) Logical;
+
+ /* Append EVENT. */
+ gckOS_WriteMemory(
+ Command->os,
+ &memory[0],
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E01) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ gckOS_WriteMemory(
+ Command->os,
+ &memory[1],
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1))))))) << (0 ?
+ 4:0))) | (((gctUINT32) ((gctUINT32) (InterruptId) & ((gctUINT32) ((((1 ?
+ 4:0) - (0 ?
+ 4:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 4:0) - (0 ? 4:0) + 1))))))) << (0 ? 4:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1))))))) << (0 ?
+ 6:6))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 6:6) - (0 ?
+ 6:6) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 6:6) - (0 ? 6:6) + 1))))))) << (0 ? 6:6)))
+ );
+
+ /* Append END. */
+ gckOS_WriteMemory(
+ Command->os,
+ &memory[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) (0x02 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ );
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the EVENT and END commands. */
+ *Bytes = 16;
+ }
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+#endif /* gcdENABLE_VG */
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_command_vg.h b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_command_vg.h
new file mode 100644
index 000000000000..f1ef960bdc1a
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_command_vg.h
@@ -0,0 +1,353 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_hardware_command_vg_h_
+#define __gc_hal_kernel_hardware_command_vg_h_
+
+/******************************************************************************\
+******************* Task and Interrupt Management Structures. ******************
+\******************************************************************************/
+
+/* Task storage header. */
+typedef struct _gcsTASK_STORAGE * gcsTASK_STORAGE_PTR;
+typedef struct _gcsTASK_STORAGE
+{
+ /* Next allocated storage buffer. */
+ gcsTASK_STORAGE_PTR next;
+}
+gcsTASK_STORAGE;
+
+/* Task container header. */
+typedef struct _gcsTASK_CONTAINER * gcsTASK_CONTAINER_PTR;
+typedef struct _gcsTASK_CONTAINER
+{
+ /* The number of tasks left to be processed in the container. */
+ gctINT referenceCount;
+
+ /* Size of the buffer. */
+ gctUINT size;
+
+ /* Link to the previous and the next allocated containers. */
+ gcsTASK_CONTAINER_PTR allocPrev;
+ gcsTASK_CONTAINER_PTR allocNext;
+
+ /* Link to the previous and the next containers in the free list. */
+ gcsTASK_CONTAINER_PTR freePrev;
+ gcsTASK_CONTAINER_PTR freeNext;
+}
+gcsTASK_CONTAINER;
+
+/* Kernel space task master table entry. */
+typedef struct _gcsBLOCK_TASK_ENTRY * gcsBLOCK_TASK_ENTRY_PTR;
+typedef struct _gcsBLOCK_TASK_ENTRY
+{
+ /* Pointer to the current task container for the block. */
+ gcsTASK_CONTAINER_PTR container;
+
+ /* Pointer to the current task data within the container. */
+ gcsTASK_HEADER_PTR task;
+
+ /* Pointer to the last link task within the container. */
+ gcsTASK_LINK_PTR link;
+
+ /* Number of interrupts allocated for this block. */
+ gctUINT interruptCount;
+
+ /* The index of the current interrupt. */
+ gctUINT interruptIndex;
+
+ /* Interrupt semaphore. */
+ gctSEMAPHORE interruptSemaphore;
+
+ /* Interrupt value array. */
+ gctINT32 interruptArray[32];
+}
+gcsBLOCK_TASK_ENTRY;
+
+
+/******************************************************************************\
+********************* Command Queue Management Structures. *********************
+\******************************************************************************/
+
+/* Command queue kernel element pointer. */
+typedef struct _gcsKERNEL_CMDQUEUE * gcsKERNEL_CMDQUEUE_PTR;
+
+/* Command queue object handler function type. */
+typedef gceSTATUS (* gctOBJECT_HANDLER) (
+ gckVGKERNEL Kernel,
+ gcsKERNEL_CMDQUEUE_PTR Entry
+ );
+
+/* Command queue kernel element. */
+typedef struct _gcsKERNEL_CMDQUEUE
+{
+ /* The number of buffers in the queue. */
+ gcsCMDBUFFER_PTR commandBuffer;
+
+ /* Pointer to the object handler function. */
+ gctOBJECT_HANDLER handler;
+}
+gcsKERNEL_CMDQUEUE;
+
+/* Command queue header. */
+typedef struct _gcsKERNEL_QUEUE_HEADER * gcsKERNEL_QUEUE_HEADER_PTR;
+typedef struct _gcsKERNEL_QUEUE_HEADER
+{
+ /* The size of the buffer in bytes. */
+ gctUINT size;
+
+ /* The number of pending entries to be processed. */
+ volatile gctUINT pending;
+
+ /* The current command queue entry. */
+ gcsKERNEL_CMDQUEUE_PTR currentEntry;
+
+ /* Next buffer. */
+ gcsKERNEL_QUEUE_HEADER_PTR next;
+}
+gcsKERNEL_QUEUE_HEADER;
+
+
+/******************************************************************************\
+******************************* gckVGCOMMAND Object *******************************
+\******************************************************************************/
+
+/* gckVGCOMMAND object. */
+struct _gckVGCOMMAND
+{
+ /***************************************************************************
+ ** Object data and pointers.
+ */
+
+ gcsOBJECT object;
+ gckVGKERNEL kernel;
+ gckOS os;
+ gckVGHARDWARE hardware;
+
+ /* Features. */
+ gctBOOL fe20;
+ gctBOOL vg20;
+ gctBOOL vg21;
+
+
+ /***************************************************************************
+ ** Enable command queue dumping.
+ */
+
+ gctBOOL enableDumping;
+
+
+ /***************************************************************************
+ ** Bus Error interrupt.
+ */
+
+ gctINT32 busErrorInt;
+
+
+ /***************************************************************************
+ ** Command buffer information.
+ */
+
+ gcsCOMMAND_BUFFER_INFO info;
+
+
+ /***************************************************************************
+ ** Synchronization objects.
+ */
+
+ gctPOINTER queueMutex;
+ gctPOINTER taskMutex;
+ gctPOINTER commitMutex;
+
+
+ /***************************************************************************
+ ** Task management.
+ */
+
+ /* The head of the storage buffer linked list. */
+ gcsTASK_STORAGE_PTR taskStorage;
+
+ /* Allocation size. */
+ gctUINT taskStorageGranularity;
+ gctUINT taskStorageUsable;
+
+ /* The free container list. */
+ gcsTASK_CONTAINER_PTR taskFreeHead;
+ gcsTASK_CONTAINER_PTR taskFreeTail;
+
+ /* Task table */
+ gcsBLOCK_TASK_ENTRY taskTable[gcvBLOCK_COUNT];
+
+
+ /***************************************************************************
+ ** Command queue.
+ */
+
+ /* Pointer to the allocated queue memory. */
+ gcsKERNEL_QUEUE_HEADER_PTR queue;
+
+ /* Pointer to the current available queue from which new queue entries
+ will be allocated. */
+ gcsKERNEL_QUEUE_HEADER_PTR queueHead;
+
+ /* If different from queueHead, points to the command queue which is
+ currently being executed by the hardware. */
+ gcsKERNEL_QUEUE_HEADER_PTR queueTail;
+
+ /* Points to the queue to merge the tail with when the tail is processed. */
+ gcsKERNEL_QUEUE_HEADER_PTR mergeQueue;
+
+ /* Queue overflow counter. */
+ gctUINT queueOverflow;
+
+
+ /***************************************************************************
+ ** Context.
+ */
+
+ /* Context counter used for unique ID. */
+ gctUINT64 contextCounter;
+
+ /* Current context ID. */
+ gctUINT64 currentContext;
+
+ /* Command queue power semaphore. */
+ gctPOINTER powerSemaphore;
+ gctINT32 powerStallInt;
+ gcsCMDBUFFER_PTR powerStallBuffer;
+ gctSIGNAL powerStallSignal;
+
+};
+
+/******************************************************************************\
+************************ gckVGCOMMAND Object Internal API. ***********************
+\******************************************************************************/
+
+/* Initialize architecture dependent command buffer information. */
+gceSTATUS
+gckVGCOMMAND_InitializeInfo(
+ IN gckVGCOMMAND Command
+ );
+
+/* Form a STATE command at the specified location in the command buffer. */
+gceSTATUS
+gckVGCOMMAND_StateCommand(
+ IN gckVGCOMMAND Command,
+ IN gctUINT32 Pipe,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN gctUINT32 Count,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Form a RESTART command at the specified location in the command buffer. */
+gceSTATUS
+gckVGCOMMAND_RestartCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FetchAddress,
+ IN gctUINT FetchCount,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Form a FETCH command at the specified location in the command buffer. */
+gceSTATUS
+gckVGCOMMAND_FetchCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FetchAddress,
+ IN gctUINT FetchCount,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Form a CALL command at the specified location in the command buffer. */
+gceSTATUS
+gckVGCOMMAND_CallCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FetchAddress,
+ IN gctUINT FetchCount,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Form a RETURN command at the specified location in the command buffer. */
+gceSTATUS
+gckVGCOMMAND_ReturnCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Form an EVENT command at the specified location in the command buffer. */
+gceSTATUS
+gckVGCOMMAND_EventCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN gceBLOCK Block,
+ IN gctINT32 InterruptId,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Form an END command at the specified location in the command buffer. */
+gceSTATUS
+gckVGCOMMAND_EndCommand(
+ IN gckVGCOMMAND Command,
+ IN gctPOINTER Logical,
+ IN gctINT32 InterruptId,
+ IN OUT gctUINT32 * Bytes
+ );
+
+#endif /* __gc_hal_kernel_hardware_command_h_ */
+
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
new file mode 100644
index 000000000000..07569d83fb18
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.c
@@ -0,0 +1,2384 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal.h"
+#include "gc_hal_kernel.h"
+#include "gc_hal_kernel_hardware_command_vg.h"
+
+#include "gc_feature_database.h"
+
+#if gcdENABLE_VG
+
+#define _GC_OBJ_ZONE gcvZONE_HARDWARE
+
+typedef enum
+{
+ gcvPOWER_FLAG_INITIALIZE = 1 << 0,
+ gcvPOWER_FLAG_STALL = 1 << 1,
+ gcvPOWER_FLAG_STOP = 1 << 2,
+ gcvPOWER_FLAG_START = 1 << 3,
+ gcvPOWER_FLAG_RELEASE = 1 << 4,
+ gcvPOWER_FLAG_DELAY = 1 << 5,
+ gcvPOWER_FLAG_SAVE = 1 << 6,
+ gcvPOWER_FLAG_ACQUIRE = 1 << 7,
+ gcvPOWER_FLAG_POWER_OFF = 1 << 8,
+ gcvPOWER_FLAG_CLOCK_OFF = 1 << 9,
+ gcvPOWER_FLAG_CLOCK_ON = 1 << 10,
+ gcvPOWER_FLAG_NOP = 1 << 11,
+}
+gcePOWER_FLAGS;
+
+/******************************************************************************\
+********************************* Support Code *********************************
+\******************************************************************************/
+static gceSTATUS
+_ResetGPU(
+ IN gckOS Os
+ )
+{
+ gctUINT32 control, idle;
+ gceSTATUS status;
+
+ /* Read register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Os,
+ gcvCORE_VG,
+ 0x00000,
+ &control));
+
+ for (;;)
+ {
+ /* Disable clock gating. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ gcvCORE_VG,
+ 0x00104,
+ 0x00000000));
+
+ /* Wait for clock being stable. */
+ gcmkONERROR(gckOS_Delay(Os, 1));
+
+ /* Isolate the GPU. */
+ control = ((((gctUINT32) (control)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1))))))) << (0 ?
+ 19:19))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ gcvCORE_VG,
+ 0x00000,
+ control));
+
+ /* Set soft reset. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ gcvCORE_VG,
+ 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));
+
+ /* Reset soft reset bit. */
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ gcvCORE_VG,
+ 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) (0) & ((gctUINT32) ((((1 ?
+ 12:12) - (0 ?
+ 12:12) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 12:12) - (0 ? 12:12) + 1))))))) << (0 ? 12:12)))));
+
+ /* Reset GPU isolation. */
+ control = ((((gctUINT32) (control)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1))))))) << (0 ?
+ 19:19))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 19:19) - (0 ?
+ 19:19) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 19:19) - (0 ? 19:19) + 1))))))) << (0 ? 19:19)));
+
+ gcmkONERROR(gckOS_WriteRegisterEx(Os,
+ gcvCORE_VG,
+ 0x00000,
+ control));
+
+ /* Read idle register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Os,
+ gcvCORE_VG,
+ 0x00004,
+ &idle));
+
+ if ((((((gctUINT32) (idle)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ) == 0)
+ {
+ continue;
+ }
+
+ /* Read reset register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(Os,
+ gcvCORE_VG,
+ 0x00000,
+ &control));
+
+ if (((((((gctUINT32) (control)) >> (0 ? 16:16)) & ((gctUINT32) ((((1 ? 16:16) - (0 ? 16:16) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1)))))) ) == 0)
+ || ((((((gctUINT32) (control)) >> (0 ? 17:17)) & ((gctUINT32) ((((1 ? 17:17) - (0 ? 17:17) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 17:17) - (0 ? 17:17) + 1)))))) ) == 0)
+ )
+ {
+ continue;
+ }
+
+ /* GPU is idle. */
+ break;
+ }
+
+ /* Success. */
+ return gcvSTATUS_OK;
+
+OnError:
+
+ /* Return the error. */
+ return status;
+}
+
+
+static gceSTATUS
+_IdentifyHardware(
+ IN gckOS Os,
+ IN gckVGHARDWARE Hardware,
+ OUT gceCHIPMODEL * ChipModel,
+ OUT gctUINT32 * ChipRevision,
+ OUT gctUINT32 * ChipFeatures,
+ OUT gctUINT32 * ChipMinorFeatures,
+ OUT gctUINT32 * ChipMinorFeatures2
+ )
+{
+ gceSTATUS status;
+ gctUINT32 chipIdentity;
+
+ do
+ {
+ /* Read chip identity register. */
+ gcmkERR_BREAK(gckOS_ReadRegisterEx(Os, gcvCORE_VG, 0x00018, &chipIdentity));
+
+ /* Special case for older graphic cores. */
+ if (((((gctUINT32) (chipIdentity)) >> (0 ?
+ 31:24) & ((gctUINT32) ((((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1)))))) == (0x01 & ((gctUINT32) ((((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ? 31:24) + 1))))))))
+ {
+ *ChipModel = gcv500;
+ *ChipRevision = (((((gctUINT32) (chipIdentity)) >> (0 ? 15:12)) & ((gctUINT32) ((((1 ? 15:12) - (0 ? 15:12) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:12) - (0 ? 15:12) + 1)))))) );
+ }
+
+ else
+ {
+ /* Read chip identity register. */
+ gcmkERR_BREAK(gckOS_ReadRegisterEx(Os, gcvCORE_VG,
+ 0x00020,
+ (gctUINT32 *) ChipModel));
+
+ /* Read CHIP_REV register. */
+ gcmkERR_BREAK(gckOS_ReadRegisterEx(Os, gcvCORE_VG,
+ 0x00024,
+ ChipRevision));
+ }
+
+ /* Read chip feature register. */
+ gcmkERR_BREAK(gckOS_ReadRegisterEx(
+ Os, gcvCORE_VG, 0x0001C, ChipFeatures
+ ));
+
+ /* Read chip minor feature register. */
+ gcmkERR_BREAK(gckOS_ReadRegisterEx(
+ Os, gcvCORE_VG, 0x00034, ChipMinorFeatures
+ ));
+
+ /* Read chip minor feature register #2. */
+ gcmkERR_BREAK(gckOS_ReadRegisterEx(
+ Os, gcvCORE_VG, 0x00074, ChipMinorFeatures2
+ ));
+
+ gcmkERR_BREAK(gckOS_ReadRegisterEx(
+ Os, gcvCORE_VG, 0x000A8, &Hardware->productID
+ ));
+
+ gcmkERR_BREAK(gckOS_ReadRegisterEx(
+ Os, gcvCORE_VG, 0x000E8, &Hardware->ecoID
+ ));
+
+ gcmkERR_BREAK(gckOS_ReadRegisterEx(
+ Os, gcvCORE_VG, 0x00030, &Hardware->customerID
+ ));
+
+ gcmkTRACE(
+ gcvLEVEL_VERBOSE,
+ "ChipModel=0x%08X\n"
+ "ChipRevision=0x%08X\n"
+ "ChipFeatures=0x%08X\n"
+ "ChipMinorFeatures=0x%08X\n"
+ "ChipMinorFeatures2=0x%08X\n",
+ *ChipModel,
+ *ChipRevision,
+ *ChipFeatures,
+ *ChipMinorFeatures,
+ *ChipMinorFeatures2
+ );
+
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ /* Return the status. */
+ return status;
+}
+
+#if gcdPOWEROFF_TIMEOUT
+void
+_VGPowerTimerFunction(
+ gctPOINTER Data
+ )
+{
+ gckVGHARDWARE hardware = (gckVGHARDWARE)Data;
+ gcmkVERIFY_OK(
+ gckVGHARDWARE_SetPowerState(hardware, gcvPOWER_OFF_TIMEOUT));
+}
+#endif
+
+/******************************************************************************\
+****************************** gckVGHARDWARE API code *****************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_Construct
+**
+** Construct a new gckVGHARDWARE object.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an initialized gckOS object.
+**
+** OUTPUT:
+**
+** gckVGHARDWARE * Hardware
+** Pointer to a variable that will hold the pointer to the gckVGHARDWARE
+** object.
+*/
+gceSTATUS
+gckVGHARDWARE_Construct(
+ IN gckOS Os,
+ OUT gckVGHARDWARE * Hardware
+ )
+{
+ gckVGHARDWARE hardware = gcvNULL;
+ gceSTATUS status;
+ gceCHIPMODEL chipModel;
+ gctUINT32 chipRevision;
+ gctUINT32 chipFeatures;
+ gctUINT32 chipMinorFeatures;
+ gctUINT32 chipMinorFeatures2;
+ gcsFEATURE_DATABASE * database;
+
+ gcmkHEADER_ARG("Os=0x%x Hardware=0x%x ", Os, Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Hardware != gcvNULL);
+
+ do
+ {
+ gcmkERR_BREAK(gckOS_SetGPUPower(Os, gcvCORE_VG, gcvTRUE, gcvTRUE));
+
+ status = _ResetGPU(Os);
+
+ if (status != gcvSTATUS_OK)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "_ResetGPU failed: status=%d\n", status);
+ }
+
+ /* Allocate the gckVGHARDWARE object. */
+ gcmkERR_BREAK(gckOS_Allocate(Os,
+ gcmSIZEOF(struct _gckVGHARDWARE), (gctPOINTER *) &hardware
+ ));
+
+ /* Identify the hardware. */
+ gcmkERR_BREAK(_IdentifyHardware(Os, hardware,
+ &chipModel, &chipRevision,
+ &chipFeatures, &chipMinorFeatures, &chipMinorFeatures2
+ ));
+
+ /* Initialize the gckVGHARDWARE object. */
+ hardware->object.type = gcvOBJ_HARDWARE;
+ hardware->os = Os;
+
+ /* Set chip identity. */
+ hardware->chipModel = chipModel;
+ hardware->chipRevision = chipRevision;
+ hardware->chipFeatures = chipFeatures;
+ hardware->chipMinorFeatures = chipMinorFeatures;
+ hardware->chipMinorFeatures2 = chipMinorFeatures2;
+
+ hardware->powerMutex = gcvNULL;
+ hardware->chipPowerState = gcvPOWER_ON;
+ hardware->chipPowerStateGlobal = gcvPOWER_ON;
+ hardware->clockState = gcvTRUE;
+ hardware->powerState = gcvTRUE;
+
+#if gcdPOWEROFF_TIMEOUT
+ hardware->powerOffTime = 0;
+ hardware->powerOffTimeout = gcdPOWEROFF_TIMEOUT;
+
+ gcmkVERIFY_OK(gckOS_CreateTimer(Os,
+ _VGPowerTimerFunction,
+ (gctPOINTER)hardware,
+ &hardware->powerOffTimer));
+#endif
+
+ database = hardware->featureDatabase = gcQueryFeatureDB(
+ hardware->chipModel,
+ hardware->chipRevision,
+ hardware->productID,
+ hardware->ecoID,
+ hardware->customerID
+ );
+
+ if (database == gcvNULL)
+ {
+ gcmkPRINT("[galcore]: Feature database is not found,"
+ "chipModel=0x%0x, chipRevision=0x%x, productID=0x%x, ecoID=0x%x",
+ hardware->chipModel,
+ hardware->chipRevision,
+ hardware->productID,
+ hardware->ecoID);
+ /* gcmkERR_BREAK(gcvSTATUS_NOT_FOUND); */
+ }
+
+ /* Determine whether FE 2.0 is present. */
+ hardware->fe20 = ((((gctUINT32) (hardware->chipFeatures)) >> (0 ?
+ 28:28) & ((gctUINT32) ((((1 ?
+ 28:28) - (0 ?
+ 28:28) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 28:28) - (0 ?
+ 28:28) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ?
+ 28:28) - (0 ?
+ 28:28) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 28:28) - (0 ? 28:28) + 1)))))));
+
+ /* Determine whether VG 2.0 is present. */
+ hardware->vg20 = ((((gctUINT32) (hardware->chipMinorFeatures)) >> (0 ?
+ 13:13) & ((gctUINT32) ((((1 ?
+ 13:13) - (0 ?
+ 13:13) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 13:13) - (0 ?
+ 13:13) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ?
+ 13:13) - (0 ?
+ 13:13) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 13:13) - (0 ? 13:13) + 1)))))));
+
+ /* Determine whether VG 2.1 is present. */
+ hardware->vg21 = ((((gctUINT32) (hardware->chipMinorFeatures)) >> (0 ?
+ 18:18) & ((gctUINT32) ((((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1)))))) == (0x1 & ((gctUINT32) ((((1 ?
+ 18:18) - (0 ?
+ 18:18) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 18:18) - (0 ? 18:18) + 1)))))));
+
+ /* Determine whether fc is present. */
+ hardware->fc = (((((gctUINT32) (hardware->chipFeatures)) >> (0 ? 0:0 )) & ((gctUINT32) ((((1 ? 0:0 ) - (0 ? 0:0 ) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0 ) - (0 ? 0:0 ) + 1)))))) );
+
+
+ /* Set default event mask. */
+ hardware->eventMask = 0xFFFFFFFF;
+
+ gcmkERR_BREAK(gckOS_AtomConstruct(Os, &hardware->pageTableDirty));
+
+ /* Set fast clear to auto. */
+ gcmkVERIFY_OK(gckVGHARDWARE_SetFastClear(hardware, -1));
+
+ gcmkERR_BREAK(gckOS_CreateMutex(Os, &hardware->powerMutex));
+
+ /* Enable power management by default. */
+ hardware->options.powerManagement = gcvTRUE;
+
+ /* Return pointer to the gckVGHARDWARE object. */
+ *Hardware = hardware;
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+#if gcdPOWEROFF_TIMEOUT
+ if (hardware != gcvNULL && hardware->powerOffTimer != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_StopTimer(Os, hardware->powerOffTimer));
+ gcmkVERIFY_OK(gckOS_DestroyTimer(Os, hardware->powerOffTimer));
+ }
+#endif
+
+ gcmkVERIFY_OK(gckOS_SetGPUPower(Os, gcvCORE_VG, gcvFALSE, gcvFALSE));
+
+ if (hardware != gcvNULL && hardware->pageTableDirty != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Os, hardware->pageTableDirty));
+ }
+
+ if (hardware != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_Free(Os, hardware));
+ }
+
+ gcmkFOOTER();
+ /* Return the status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_Destroy
+**
+** Destroy an gckVGHARDWARE object.
+**
+** INPUT:
+**
+** gckVGHARDWARE Hardware
+** Pointer to the gckVGHARDWARE object that needs to be destroyed.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckVGHARDWARE_Destroy(
+ IN gckVGHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gcmkHEADER_ARG("Hardware=0x%x ", Hardware);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ /* Mark the object as unknown. */
+ Hardware->object.type = gcvOBJ_UNKNOWN;
+
+ if (Hardware->powerMutex != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(
+ Hardware->os, Hardware->powerMutex));
+ }
+
+#if gcdPOWEROFF_TIMEOUT
+ gcmkVERIFY_OK(gckOS_StopTimer(Hardware->os, Hardware->powerOffTimer));
+ gcmkVERIFY_OK(gckOS_DestroyTimer(Hardware->os, Hardware->powerOffTimer));
+#endif
+
+ if (Hardware->pageTableDirty != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Hardware->os, Hardware->pageTableDirty));
+ }
+
+ /* Free the object. */
+ status = gckOS_Free(Hardware->os, Hardware);
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_QueryMemory
+**
+** Query the amount of memory available on the hardware.
+**
+** INPUT:
+**
+** gckVGHARDWARE Hardware
+** Pointer to the gckVGHARDWARE object.
+**
+** OUTPUT:
+**
+** gctSIZE_T * InternalSize
+** Pointer to a variable that will hold the size of the internal video
+** memory in bytes. If 'InternalSize' is gcvNULL, no information of the
+** internal memory will be returned.
+**
+** gctUINT32 * InternalBaseAddress
+** Pointer to a variable that will hold the hardware's base address for
+** the internal video memory. This pointer cannot be gcvNULL if
+** 'InternalSize' is also non-gcvNULL.
+**
+** gctUINT32 * InternalAlignment
+** Pointer to a variable that will hold the hardware's base address for
+** the internal video memory. This pointer cannot be gcvNULL if
+** 'InternalSize' is also non-gcvNULL.
+**
+** gctSIZE_T * ExternalSize
+** Pointer to a variable that will hold the size of the external video
+** memory in bytes. If 'ExternalSize' is gcvNULL, no information of the
+** external memory will be returned.
+**
+** gctUINT32 * ExternalBaseAddress
+** Pointer to a variable that will hold the hardware's base address for
+** the external video memory. This pointer cannot be gcvNULL if
+** 'ExternalSize' is also non-gcvNULL.
+**
+** gctUINT32 * ExternalAlignment
+** Pointer to a variable that will hold the hardware's base address for
+** the external video memory. This pointer cannot be gcvNULL if
+** 'ExternalSize' is also non-gcvNULL.
+**
+** gctUINT32 * HorizontalTileSize
+** Number of horizontal pixels per tile. If 'HorizontalTileSize' is
+** gcvNULL, no horizontal pixel per tile will be returned.
+**
+** gctUINT32 * VerticalTileSize
+** Number of vertical pixels per tile. If 'VerticalTileSize' is
+** gcvNULL, no vertical pixel per tile will be returned.
+*/
+gceSTATUS
+gckVGHARDWARE_QueryMemory(
+ IN gckVGHARDWARE Hardware,
+ OUT gctSIZE_T * InternalSize,
+ OUT gctUINT32 * InternalBaseAddress,
+ OUT gctUINT32 * InternalAlignment,
+ OUT gctSIZE_T * ExternalSize,
+ OUT gctUINT32 * ExternalBaseAddress,
+ OUT gctUINT32 * ExternalAlignment,
+ OUT gctUINT32 * HorizontalTileSize,
+ OUT gctUINT32 * VerticalTileSize
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x InternalSize=0x%x InternalBaseAddress=0x%x InternalAlignment=0x%x"
+ "ExternalSize=0x%x ExternalBaseAddress=0x%x ExternalAlignment=0x%x HorizontalTileSize=0x%x VerticalTileSize=0x%x",
+ Hardware, InternalSize, InternalBaseAddress, InternalAlignment,
+ ExternalSize, ExternalBaseAddress, ExternalAlignment, HorizontalTileSize, VerticalTileSize);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ if (InternalSize != gcvNULL)
+ {
+ /* No internal memory. */
+ *InternalSize = 0;
+ }
+
+ if (ExternalSize != gcvNULL)
+ {
+ /* No external memory. */
+ *ExternalSize = 0;
+ }
+
+ if (HorizontalTileSize != gcvNULL)
+ {
+ /* 4x4 tiles. */
+ *HorizontalTileSize = 4;
+ }
+
+ if (VerticalTileSize != gcvNULL)
+ {
+ /* 4x4 tiles. */
+ *VerticalTileSize = 4;
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_QueryChipIdentity
+**
+** Query the identity of the hardware.
+**
+** INPUT:
+**
+** gckVGHARDWARE Hardware
+** Pointer to the gckVGHARDWARE object.
+**
+** OUTPUT:
+**
+** gceCHIPMODEL * ChipModel
+** If 'ChipModel' is not gcvNULL, the variable it points to will
+** receive the model of the chip.
+**
+** gctUINT32 * ChipRevision
+** If 'ChipRevision' is not gcvNULL, the variable it points to will
+** receive the revision of the chip.
+**
+** gctUINT32 * ChipFeatures
+** If 'ChipFeatures' is not gcvNULL, the variable it points to will
+** receive the feature set of the chip.
+**
+** gctUINT32 * ChipMinorFeatures
+** If 'ChipMinorFeatures' is not gcvNULL, the variable it points to
+** will receive the minor feature set of the chip.
+**
+** gctUINT32 * ChipMinorFeatures2
+** If 'ChipMinorFeatures2' is not gcvNULL, the variable it points to
+** will receive the minor feature set of the chip.
+**
+*/
+gceSTATUS
+gckVGHARDWARE_QueryChipIdentity(
+ IN gckVGHARDWARE Hardware,
+ OUT gceCHIPMODEL * ChipModel,
+ OUT gctUINT32 * ChipRevision,
+ OUT gctUINT32 * ProductID,
+ OUT gctUINT32 * EcoID,
+ OUT gctUINT32* CustomerID,
+ OUT gctUINT32* ChipFeatures,
+ OUT gctUINT32* ChipMinorFeatures,
+ OUT gctUINT32* ChipMinorFeatures2
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x ChipModel=0x%x ChipRevision=0x%x ChipFeatures = 0x%x ChipMinorFeatures = 0x%x ChipMinorFeatures2 = 0x%x",
+ Hardware, ChipModel, ChipRevision, ChipFeatures, ChipMinorFeatures, ChipMinorFeatures2);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ /* Return chip model. */
+ if (ChipModel != gcvNULL)
+ {
+ *ChipModel = Hardware->chipModel;
+ }
+
+ /* Return revision number. */
+ if (ChipRevision != gcvNULL)
+ {
+ *ChipRevision = Hardware->chipRevision;
+ }
+
+ /* Return feature set. */
+ if (ChipFeatures != gcvNULL)
+ {
+ gctUINT32 features = Hardware->chipFeatures;
+
+ if (Hardware->fc)
+ {
+ 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->options.allowFastClear) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0)));
+ }
+
+ /* Mark 2D pipe as available for GC500.0 since it did not have this *\
+ \* bit. */
+ if ((Hardware->chipModel == gcv500)
+ && (Hardware->chipRevision == 0)
+ )
+ {
+ features = ((((gctUINT32) (features)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9)));
+ }
+
+ /* Mark 2D pipe as available for GC300 since it did not have this *\
+ \* bit. */
+ if (Hardware->chipModel == gcv300)
+ {
+ features = ((((gctUINT32) (features)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1))))))) << (0 ?
+ 9:9))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 9:9) - (0 ?
+ 9:9) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1))))))) << (0 ? 9:9)));
+ }
+
+ *ChipFeatures = features;
+ }
+
+ /* Return minor feature set. */
+ if (ChipMinorFeatures != gcvNULL)
+ {
+ *ChipMinorFeatures = Hardware->chipMinorFeatures;
+ }
+
+ /* Return minor feature set #2. */
+ if (ChipMinorFeatures2 != gcvNULL)
+ {
+ *ChipMinorFeatures2 = Hardware->chipMinorFeatures2;
+ }
+
+ if (ProductID != gcvNULL)
+ {
+ *ProductID = Hardware->productID;
+ }
+
+ if (EcoID != gcvNULL)
+ {
+ *EcoID = Hardware->ecoID;
+ }
+
+ if (CustomerID != gcvNULL)
+ {
+ *CustomerID = Hardware->customerID;
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_ConvertFormat
+**
+** Convert an API format to hardware parameters.
+**
+** INPUT:
+**
+** gckVGHARDWARE Hardware
+** Pointer to the gckVGHARDWARE object.
+**
+** gceSURF_FORMAT Format
+** API format to convert.
+**
+** OUTPUT:
+**
+** gctUINT32 * BitsPerPixel
+** Pointer to a variable that will hold the number of bits per pixel.
+**
+** gctUINT32 * BytesPerTile
+** Pointer to a variable that will hold the number of bytes per tile.
+*/
+gceSTATUS
+gckVGHARDWARE_ConvertFormat(
+ IN gckVGHARDWARE Hardware,
+ IN gceSURF_FORMAT Format,
+ OUT gctUINT32 * BitsPerPixel,
+ OUT gctUINT32 * BytesPerTile
+ )
+{
+ gctUINT32 bitsPerPixel;
+ gctUINT32 bytesPerTile;
+
+ gcmkHEADER_ARG("Hardware=0x%x Format=0x%x BitsPerPixel=0x%x BytesPerTile = 0x%x",
+ Hardware, Format, BitsPerPixel, BytesPerTile);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ /* Dispatch on format. */
+ switch (Format)
+ {
+ case gcvSURF_A1:
+ case gcvSURF_L1:
+ /* 1-bpp format. */
+ bitsPerPixel = 1;
+ bytesPerTile = (1 * 4 * 4) / 8;
+ break;
+
+ case gcvSURF_A4:
+ /* 4-bpp format. */
+ bitsPerPixel = 4;
+ bytesPerTile = (4 * 4 * 4) / 8;
+ break;
+
+ case gcvSURF_INDEX8:
+ case gcvSURF_A8:
+ case gcvSURF_L8:
+ /* 8-bpp format. */
+ bitsPerPixel = 8;
+ bytesPerTile = (8 * 4 * 4) / 8;
+ break;
+
+ case gcvSURF_YV12:
+ /* 12-bpp planar YUV formats. */
+ bitsPerPixel = 12;
+ bytesPerTile = (12 * 4 * 4) / 8;
+ break;
+
+ case gcvSURF_NV12:
+ /* 12-bpp planar YUV formats. */
+ bitsPerPixel = 12;
+ bytesPerTile = (12 * 4 * 4) / 8;
+ break;
+
+ /* 4444 variations. */
+ case gcvSURF_X4R4G4B4:
+ case gcvSURF_A4R4G4B4:
+ case gcvSURF_R4G4B4X4:
+ case gcvSURF_R4G4B4A4:
+ case gcvSURF_B4G4R4X4:
+ case gcvSURF_B4G4R4A4:
+ case gcvSURF_X4B4G4R4:
+ case gcvSURF_A4B4G4R4:
+
+ /* 1555 variations. */
+ case gcvSURF_X1R5G5B5:
+ case gcvSURF_A1R5G5B5:
+ case gcvSURF_R5G5B5X1:
+ case gcvSURF_R5G5B5A1:
+ case gcvSURF_X1B5G5R5:
+ case gcvSURF_A1B5G5R5:
+ case gcvSURF_B5G5R5X1:
+ case gcvSURF_B5G5R5A1:
+
+ /* 565 variations. */
+ case gcvSURF_R5G6B5:
+ case gcvSURF_B5G6R5:
+
+ case gcvSURF_A8L8:
+ case gcvSURF_YUY2:
+ case gcvSURF_UYVY:
+#if gcdVG_ONLY
+ case gcvSURF_YV16:
+#endif
+ case gcvSURF_D16:
+ /* 16-bpp format. */
+ bitsPerPixel = 16;
+ bytesPerTile = (16 * 4 * 4) / 8;
+ break;
+
+ case gcvSURF_X8R8G8B8:
+ case gcvSURF_A8R8G8B8:
+ case gcvSURF_X8B8G8R8:
+ case gcvSURF_A8B8G8R8:
+ case gcvSURF_R8G8B8X8:
+ case gcvSURF_R8G8B8A8:
+ case gcvSURF_B8G8R8X8:
+ case gcvSURF_B8G8R8A8:
+ case gcvSURF_D32:
+ /* 32-bpp format. */
+ bitsPerPixel = 32;
+ bytesPerTile = (32 * 4 * 4) / 8;
+ break;
+
+ case gcvSURF_D24S8:
+ /* 24-bpp format. */
+ bitsPerPixel = 32;
+ bytesPerTile = (32 * 4 * 4) / 8;
+ break;
+
+ case gcvSURF_DXT1:
+ case gcvSURF_ETC1:
+ bitsPerPixel = 4;
+ bytesPerTile = (4 * 4 * 4) / 8;
+ break;
+
+ case gcvSURF_DXT2:
+ case gcvSURF_DXT3:
+ case gcvSURF_DXT4:
+ case gcvSURF_DXT5:
+ bitsPerPixel = 8;
+ bytesPerTile = (8 * 4 * 4) / 8;
+ break;
+
+ default:
+ /* Invalid format. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ /* Set the result. */
+ if (BitsPerPixel != gcvNULL)
+ {
+ * BitsPerPixel = bitsPerPixel;
+ }
+
+ if (BytesPerTile != gcvNULL)
+ {
+ * BytesPerTile = bytesPerTile;
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_SplitMemory
+**
+** Split a hardware specific memory address into a pool and offset.
+**
+** INPUT:
+**
+** gckVGHARDWARE Hardware
+** Pointer to the gckVGHARDWARE object.
+**
+** gctUINT32 Address
+** Address in hardware specific format.
+**
+** OUTPUT:
+**
+** gcePOOL * Pool
+** Pointer to a variable that will hold the pool type for the address.
+**
+** gctUINT32 * Offset
+** Pointer to a variable that will hold the offset for the address.
+*/
+gceSTATUS
+gckVGHARDWARE_SplitMemory(
+ IN gckVGHARDWARE Hardware,
+ IN gctUINT32 Address,
+ OUT gcePOOL * Pool,
+ OUT gctUINT32 * Offset
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x Address=0x%x Pool=0x%x Offset = 0x%x",
+ Hardware, Address, Pool, Offset);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Pool != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Offset != gcvNULL);
+
+ /* Dispatch on memory type. */
+ switch ((((((gctUINT32) (Address)) >> (0 ? 1:0)) & ((gctUINT32) ((((1 ? 1:0) - (0 ? 1:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1)))))) ))
+ {
+ case 0x0:
+ /* System memory. */
+ *Pool = gcvPOOL_SYSTEM;
+ break;
+
+ case 0x2:
+ /* Virtual memory. */
+ *Pool = gcvPOOL_VIRTUAL;
+ break;
+
+ default:
+ /* Invalid memory type. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ /* Return offset of address. */
+ *Offset = ((((gctUINT32) (Address)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0)));
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_Execute
+**
+** Kickstart the hardware's command processor with an initialized command
+** buffer.
+**
+** INPUT:
+**
+** gckVGHARDWARE Hardware
+** Pointer to the gckVGHARDWARE object.
+**
+** gctUINT32 Address
+** Address of the command buffer.
+**
+** gctSIZE_T Count
+** Number of command-sized data units to be executed.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckVGHARDWARE_Execute(
+ IN gckVGHARDWARE Hardware,
+ IN gctUINT32 Address,
+ IN gctUINT32 Count
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Address=0x%x Count=0x%x",
+ Hardware, Address, Count);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ do
+ {
+ /* Enable all events. */
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(
+ Hardware->os,
+ gcvCORE_VG,
+ 0x00014,
+ Hardware->eventMask
+ ));
+
+ if (Hardware->fe20)
+ {
+ /* Write address register. */
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(
+ Hardware->os,
+ gcvCORE_VG,
+ 0x00500,
+ gcmkFIXADDRESS(Address)
+ ));
+
+ /* Write control register. */
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(
+ Hardware->os,
+ gcvCORE_VG,
+ 0x00504,
+ Count
+ ));
+ }
+ else
+ {
+ /* Write address register. */
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(
+ Hardware->os,
+ gcvCORE_VG,
+ 0x00654,
+ gcmkFIXADDRESS(Address)
+ ));
+
+ /* Write control register. */
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(
+ Hardware->os,
+ gcvCORE_VG,
+ 0x00658,
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16))) |
+ ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (Count) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ ));
+ }
+
+ /* Success. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+
+ gcmkFOOTER();
+ /* Return the status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_ConvertLogical
+**
+** Convert a logical system address into a hardware specific address.
+**
+** INPUT:
+**
+** gckVGHARDWARE Hardware
+** Pointer to an gckVGHARDWARE object.
+**
+** gctPOINTER Logical
+** Logical address to convert.
+**
+** gctBOOL InUserSpace
+** gcvTRUE if the memory in user space.
+**
+** gctUINT32* Address
+** Return hardware specific address.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckVGHARDWARE_ConvertLogical(
+ IN gckVGHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctBOOL InUserSpace,
+ OUT gctUINT32 * Address
+ )
+{
+ gctPHYS_ADDR_T physical;
+ gctUINT32 address;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x InUserSpace=%d Address=0x%x",
+ Hardware, Logical, InUserSpace, Address);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Address != gcvNULL);
+
+ do
+ {
+ /* Convert logical address into a physical address. */
+ if (InUserSpace)
+ {
+ gcmkERR_BREAK(gckOS_UserLogicalToPhysical(
+ Hardware->os, Logical, &physical
+ ));
+ }
+ else
+ {
+ gcmkERR_BREAK(gckOS_GetPhysicalAddress(
+ Hardware->os, Logical, &physical
+ ));
+ }
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Hardware->os, physical, &physical));
+
+ gcmkSAFECASTPHYSADDRT(address, physical);
+
+ /* Return hardware specific address. */
+ *Address = ((((gctUINT32) (address)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0)));
+
+ /* Success. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return the status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_QuerySystemMemory
+**
+** Query the command buffer alignment and number of reserved bytes.
+**
+** INPUT:
+**
+** gckVGHARDWARE Harwdare
+** Pointer to an gckVGHARDWARE object.
+**
+** OUTPUT:
+**
+** gctSIZE_T * SystemSize
+** Pointer to a variable that receives the maximum size of the system
+** memory.
+**
+** gctUINT32 * SystemBaseAddress
+** Poinetr to a variable that receives the base address for system
+** memory.
+*/
+gceSTATUS gckVGHARDWARE_QuerySystemMemory(
+ IN gckVGHARDWARE Hardware,
+ OUT gctSIZE_T * SystemSize,
+ OUT gctUINT32 * SystemBaseAddress
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x SystemSize=0x%x SystemBaseAddress=0x%x",
+ Hardware, SystemSize, SystemBaseAddress);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ if (SystemSize != gcvNULL)
+ {
+ /* Maximum system memory can be 2GB. */
+ *SystemSize = (gctSIZE_T)(1 << 31);
+ }
+
+ if (SystemBaseAddress != gcvNULL)
+ {
+ /* Set system memory base address. */
+ *SystemBaseAddress = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0)));
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_SetMMU
+**
+** Set the page table base address.
+**
+** INPUT:
+**
+** gckVGHARDWARE Harwdare
+** Pointer to an gckVGHARDWARE object.
+**
+** gctPOINTER Logical
+** Logical address of the page table.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS gckVGHARDWARE_SetMMU(
+ IN gckVGHARDWARE Hardware,
+ IN gctPOINTER Logical
+ )
+{
+ gceSTATUS status;
+ gctUINT32 address = 0;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x",
+ Hardware, Logical);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+
+ do
+ {
+ /* Convert the logical address into an hardware address. */
+ gcmkERR_BREAK(gckVGHARDWARE_ConvertLogical(Hardware, Logical,
+ gcvFALSE, &address));
+
+ /* Write the AQMemoryFePageTable register. */
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(Hardware->os, gcvCORE_VG,
+ 0x00400,
+ gcmkFIXADDRESS(address)));
+
+ /* Write the AQMemoryTxPageTable register. */
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(Hardware->os, gcvCORE_VG,
+ 0x00404,
+ gcmkFIXADDRESS(address)));
+
+ /* Write the AQMemoryPePageTable register. */
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(Hardware->os, gcvCORE_VG,
+ 0x00408,
+ gcmkFIXADDRESS(address)));
+
+ /* Write the AQMemoryPezPageTable register. */
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(Hardware->os, gcvCORE_VG,
+ 0x0040C,
+ gcmkFIXADDRESS(address)));
+
+ /* Write the AQMemoryRaPageTable register. */
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(Hardware->os, gcvCORE_VG,
+ 0x00410,
+ gcmkFIXADDRESS(address)));
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return the status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_FlushMMU
+**
+** Flush the page table.
+**
+** INPUT:
+**
+** gckVGHARDWARE Harwdare
+** Pointer to an gckVGHARDWARE object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS gckVGHARDWARE_FlushMMU(
+ IN gckVGHARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gckVGCOMMAND command;
+
+ gcmkHEADER_ARG("Hardware=0x%x ", Hardware);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ do
+ {
+ gcsCMDBUFFER_PTR commandBuffer;
+ gctUINT32_PTR buffer;
+
+ /* Create a shortcut to the command buffer object. */
+ command = Hardware->kernel->command;
+
+ /* Allocate command buffer space. */
+ gcmkERR_BREAK(gckVGCOMMAND_Allocate(
+ command, 8, &commandBuffer, (gctPOINTER *) &buffer
+ ));
+
+ gckOS_WriteMemory(
+ Hardware->os,
+ &buffer[0],
+ ((((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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x0E04) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)))
+ );
+
+ 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)))
+ | ((((gctUINT32) (0)) & ~(((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)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1))))))) << (0 ?
+ 2:2))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 2:2) - (0 ?
+ 2:2) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 2:2) - (0 ? 2:2) + 1))))))) << (0 ? 2:2)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1))))))) << (0 ?
+ 3:3))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 3:3) - (0 ?
+ 3:3) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 3:3) - (0 ? 3:3) + 1))))))) << (0 ? 3:3)))
+ | ((((gctUINT32) (0)) & ~(((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)))
+ );
+
+ gcmkERR_BREAK(gckVGCOMMAND_Execute(
+ command,
+ commandBuffer
+ ));
+ }
+ while(gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return the status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_BuildVirtualAddress
+**
+** Build a virtual address.
+**
+** INPUT:
+**
+** gckVGHARDWARE Harwdare
+** Pointer to an gckVGHARDWARE object.
+**
+** gctUINT32 Index
+** Index into page table.
+**
+** gctUINT32 Offset
+** Offset into page.
+**
+** OUTPUT:
+**
+** gctUINT32 * Address
+** Pointer to a variable receiving te hardware address.
+*/
+gceSTATUS gckVGHARDWARE_BuildVirtualAddress(
+ IN gckVGHARDWARE Hardware,
+ IN gctUINT32 Index,
+ IN gctUINT32 Offset,
+ OUT gctUINT32 * Address
+ )
+{
+ gctUINT32 address;
+
+ gcmkHEADER_ARG("Hardware=0x%x Index=0x%x Offset=0x%x Address=0x%x",
+ Hardware, Index, Offset, Address);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Address != gcvNULL);
+
+ /* Build virtual address. */
+ address = (Index << 12) | Offset;
+
+ /* Set virtual type. */
+ address = ((((gctUINT32) (address)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1))))))) << (0 ?
+ 1:0))) | (((gctUINT32) (0x2 & ((gctUINT32) ((((1 ?
+ 1:0) - (0 ?
+ 1:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 1:0) - (0 ? 1:0) + 1))))))) << (0 ? 1:0)));
+
+ /* Set the result. */
+ *Address = address;
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVGHARDWARE_GetIdle(
+ IN gckVGHARDWARE Hardware,
+ OUT gctUINT32 * Data
+ )
+{
+ gceSTATUS status;
+ gcmkHEADER_ARG("Hardware=0x%x Data=0x%x", Hardware, Data);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Data != gcvNULL);
+
+ /* Read register and return. */
+ status = gckOS_ReadRegisterEx(Hardware->os, gcvCORE_VG, 0x00004, Data);
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVGHARDWARE_SetFastClear(
+ IN gckVGHARDWARE Hardware,
+ IN gctINT Enable
+ )
+{
+ gctUINT32 debug;
+ gceSTATUS status;
+
+ if (!Hardware->fc)
+ {
+ return gcvSTATUS_OK;
+ }
+
+ do
+ {
+ if (Enable == -1)
+ {
+ Enable = (Hardware->chipModel > gcv500) ||
+ ((Hardware->chipModel == gcv500) && (Hardware->chipRevision >= 3));
+ }
+
+ gcmkERR_BREAK(gckOS_ReadRegisterEx(Hardware->os, gcvCORE_VG,
+ 0x00414,
+ &debug));
+
+ debug = ((((gctUINT32) (debug)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1))))))) << (0 ?
+ 20:20))) | (((gctUINT32) ((gctUINT32) (Enable == 0) & ((gctUINT32) ((((1 ?
+ 20:20) - (0 ?
+ 20:20) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 20:20) - (0 ? 20:20) + 1))))))) << (0 ? 20:20)));
+
+#ifdef AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION
+ debug = ((((gctUINT32) (debug)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION) - (0 ?
+ AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION) - (0 ?
+ AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION) + 1))))))) << (0 ?
+ AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION))) | (((gctUINT32) ((gctUINT32) (Enable == 0) & ((gctUINT32) ((((1 ?
+ AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION) - (0 ?
+ AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION) - (0 ?
+ AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION) + 1))))))) << (0 ?
+ AQ_MEMORY_DEBUG_DISABLE_Z_COMPRESSION)));
+#endif
+
+ gcmkERR_BREAK(gckOS_WriteRegisterEx(Hardware->os, gcvCORE_VG,
+ 0x00414,
+ debug));
+
+ Hardware->options.allowFastClear = Enable;
+
+ status = gcvFALSE;
+ }
+ while (gcvFALSE);
+
+ return status;
+}
+
+gceSTATUS
+gckVGHARDWARE_ReadInterrupt(
+ IN gckVGHARDWARE Hardware,
+ OUT gctUINT32_PTR IDs
+ )
+{
+ gceSTATUS status;
+ gcmkHEADER_ARG("Hardware=0x%x IDs=0x%x", Hardware, IDs);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(IDs != gcvNULL);
+
+ /* Read AQIntrAcknowledge register. */
+ status = gckOS_ReadRegisterEx(Hardware->os, gcvCORE_VG,
+ 0x00010,
+ IDs);
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS _CommandStall(
+ gckVGHARDWARE Hardware)
+{
+ gceSTATUS status;
+ gckVGCOMMAND command;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ do
+ {
+ gctUINT32_PTR buffer;
+ command = Hardware->kernel->command;
+
+ /* Allocate command buffer space. */
+ gcmkERR_BREAK(gckVGCOMMAND_Allocate(
+ command, 8, &command->powerStallBuffer,
+ (gctPOINTER *) &buffer
+ ));
+
+ gcmkERR_BREAK(gckVGCOMMAND_EventCommand(
+ command, buffer, gcvBLOCK_PIXEL,
+ command->powerStallInt, gcvNULL));
+
+ gcmkERR_BREAK(gckVGCOMMAND_Execute(
+ command,
+ command->powerStallBuffer
+ ));
+
+ /* Wait the signal. */
+ gcmkERR_BREAK(gckOS_WaitSignal(
+ command->os,
+ command->powerStallSignal,
+ gcvFALSE,
+ command->kernel->kernel->timeOut));
+
+
+ }
+ while(gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return the status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_SetPowerState
+**
+** Set GPU to a specified power state.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** gceCHIPPOWERSTATE State
+** Power State.
+**
+*/
+gceSTATUS
+gckVGHARDWARE_SetPowerState(
+ IN gckVGHARDWARE Hardware,
+ IN gceCHIPPOWERSTATE State
+ )
+{
+ gceSTATUS status;
+ gckVGCOMMAND command = gcvNULL;
+ gckOS os;
+ gctUINT flag/*, clock*/;
+
+ gctBOOL acquired = gcvFALSE;
+ gctBOOL commitMutex = gcvFALSE;
+ gctBOOL mutexAcquired = gcvFALSE;
+
+#if gcdPOWEROFF_TIMEOUT
+ gctBOOL timeout = gcvFALSE;
+ gctBOOL isAfter = gcvFALSE;
+ gctUINT32 currentTime;
+#endif
+
+ gctBOOL broadcast = gcvFALSE;
+ gctUINT32 process, thread;
+ gctBOOL global = gcvFALSE;
+
+#if gcdENABLE_PROFILING
+ gctUINT64 time, freq, mutexTime, onTime, stallTime, stopTime, delayTime,
+ initTime, offTime, startTime, totalTime;
+#endif
+
+ /* State transition flags. */
+ static const gctUINT flags[4][4] =
+ {
+ /* gcvPOWER_ON */
+ { /* ON */ 0,
+ /* IDLE */ gcvPOWER_FLAG_NOP,
+ /* SUSPEND */ gcvPOWER_FLAG_ACQUIRE |
+ gcvPOWER_FLAG_STALL |
+ gcvPOWER_FLAG_STOP |
+ gcvPOWER_FLAG_CLOCK_OFF,
+ /* OFF */ gcvPOWER_FLAG_ACQUIRE |
+ gcvPOWER_FLAG_STALL |
+ gcvPOWER_FLAG_STOP |
+ gcvPOWER_FLAG_POWER_OFF |
+ gcvPOWER_FLAG_CLOCK_OFF,
+ },
+
+ /* gcvPOWER_IDLE */
+ { /* ON */ gcvPOWER_FLAG_NOP,
+ /* IDLE */ 0,
+ /* SUSPEND */ gcvPOWER_FLAG_ACQUIRE |
+ gcvPOWER_FLAG_STOP |
+ gcvPOWER_FLAG_CLOCK_OFF,
+ /* OFF */ gcvPOWER_FLAG_ACQUIRE |
+ gcvPOWER_FLAG_STOP |
+ gcvPOWER_FLAG_POWER_OFF |
+ gcvPOWER_FLAG_CLOCK_OFF,
+ },
+
+ /* gcvPOWER_SUSPEND */
+ { /* ON */ gcvPOWER_FLAG_START |
+ gcvPOWER_FLAG_RELEASE |
+ gcvPOWER_FLAG_DELAY |
+ gcvPOWER_FLAG_CLOCK_ON,
+ /* IDLE */ gcvPOWER_FLAG_START |
+ gcvPOWER_FLAG_DELAY |
+ gcvPOWER_FLAG_RELEASE |
+ gcvPOWER_FLAG_CLOCK_ON,
+ /* SUSPEND */ 0,
+ /* OFF */ gcvPOWER_FLAG_SAVE |
+ gcvPOWER_FLAG_POWER_OFF |
+ gcvPOWER_FLAG_CLOCK_OFF,
+ },
+
+ /* gcvPOWER_OFF */
+ { /* ON */ gcvPOWER_FLAG_INITIALIZE |
+ gcvPOWER_FLAG_START |
+ gcvPOWER_FLAG_RELEASE |
+ gcvPOWER_FLAG_DELAY,
+ /* IDLE */ gcvPOWER_FLAG_INITIALIZE |
+ gcvPOWER_FLAG_START |
+ gcvPOWER_FLAG_RELEASE |
+ gcvPOWER_FLAG_DELAY,
+ /* SUSPEND */ gcvPOWER_FLAG_INITIALIZE |
+ gcvPOWER_FLAG_CLOCK_OFF,
+ /* OFF */ 0,
+ },
+ };
+
+ gcmkHEADER_ARG("Hardware=0x%x State=%d", Hardware, State);
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "Switching to power state %d",
+ State);
+#endif
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ /* Get the gckOS object pointer. */
+ os = Hardware->os;
+ gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
+
+ /* Get the gckCOMMAND object pointer. */
+ gcmkVERIFY_OBJECT(Hardware->kernel, gcvOBJ_KERNEL);
+ command = Hardware->kernel->command;
+ gcmkVERIFY_OBJECT(command, gcvOBJ_COMMAND);
+
+ if (Hardware->options.powerManagement == gcvFALSE)
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ /* Start profiler. */
+ gcmkPROFILE_INIT(freq, time);
+
+ /* Convert the broadcast power state. */
+ switch (State)
+ {
+ case gcvPOWER_IDLE_BROADCAST:
+ /* Convert to IDLE and note we are inside broadcast. */
+ State = gcvPOWER_IDLE;
+ broadcast = gcvTRUE;
+ break;
+
+ case gcvPOWER_SUSPEND_BROADCAST:
+ /* Convert to SUSPEND and note we are inside broadcast. */
+ State = gcvPOWER_SUSPEND;
+ broadcast = gcvTRUE;
+ break;
+
+ case gcvPOWER_OFF_BROADCAST:
+ /* Convert to OFF and note we are inside broadcast. */
+ State = gcvPOWER_OFF;
+ broadcast = gcvTRUE;
+ break;
+
+ case gcvPOWER_ON_AUTO:
+ /* Convert to ON and note we are inside recovery. */
+ State = gcvPOWER_ON;
+ break;
+
+ case gcvPOWER_ON:
+ case gcvPOWER_IDLE:
+ case gcvPOWER_SUSPEND:
+ case gcvPOWER_OFF:
+ /* Mark as global power management. */
+ global = gcvTRUE;
+ break;
+
+#if gcdPOWEROFF_TIMEOUT
+ case gcvPOWER_OFF_TIMEOUT:
+ /* Convert to OFF and note we are inside broadcast. */
+ State = gcvPOWER_OFF;
+ broadcast = gcvTRUE;
+ /* Check time out */
+ timeout = gcvTRUE;
+ break;
+#endif
+
+ default:
+ break;
+ }
+
+ /* Get current process and thread IDs. */
+ gcmkONERROR(gckOS_GetProcessID(&process));
+ gcmkONERROR(gckOS_GetThreadID(&thread));
+
+ /* Acquire the power mutex. */
+ if (broadcast)
+ {
+ /* Try to acquire the power mutex. */
+ status = gckOS_AcquireMutex(os, Hardware->powerMutex, 0);
+
+ if (status == gcvSTATUS_TIMEOUT)
+ {
+ /* Check if we already own this mutex. */
+ if ((Hardware->powerProcess == process)
+ && (Hardware->powerThread == thread)
+ )
+ {
+ /* Bail out on recursive power management. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ else if (State == gcvPOWER_IDLE)
+ {
+ /* gcvPOWER_IDLE_BROADCAST is from IST,
+ ** so waiting here will cause deadlock,
+ ** if lock holder call gckCOMMAND_Stall() */
+ gcmkONERROR(gcvSTATUS_INVALID_REQUEST);
+ }
+ else
+ {
+ /* Acquire the power mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(os,
+ Hardware->powerMutex,
+ gcvINFINITE));
+ }
+ }
+ }
+ else
+ {
+ /* Acquire the power mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(os, Hardware->powerMutex, gcvINFINITE));
+ }
+
+ /* Get time until mtuex acquired. */
+ gcmkPROFILE_QUERY(time, mutexTime);
+
+ Hardware->powerProcess = process;
+ Hardware->powerThread = thread;
+ mutexAcquired = gcvTRUE;
+
+ /* Grab control flags and clock. */
+ flag = flags[Hardware->chipPowerState][State];
+ /*clock = clocks[State];*/
+
+#if gcdPOWEROFF_TIMEOUT
+ if (timeout)
+ {
+ gcmkONERROR(gckOS_GetTicks(&currentTime));
+
+ gcmkONERROR(
+ gckOS_TicksAfter(Hardware->powerOffTime, currentTime, &isAfter));
+
+ /* powerOffTime is pushed forward, give up.*/
+ if (isAfter
+ /* Expect a transition start from IDLE. */
+ || (Hardware->chipPowerState == gcvPOWER_ON)
+ || (Hardware->chipPowerState == gcvPOWER_OFF)
+ )
+ {
+ /* Release the power mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(os, Hardware->powerMutex));
+
+ /* No need to do anything. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ }
+#endif
+
+ if (flag == 0)
+ {
+ /* Release the power mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(os, Hardware->powerMutex));
+
+ /* No need to do anything. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ /* internal power control */
+ if (!global)
+ {
+ if (Hardware->chipPowerStateGlobal == gcvPOWER_OFF)
+ {
+ /* Release the power mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(os, Hardware->powerMutex));
+
+ /* No need to do anything. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ }
+ else
+ {
+ if (flag & gcvPOWER_FLAG_ACQUIRE)
+ {
+ /* Acquire the power management semaphore. */
+ gcmkONERROR(gckOS_AcquireSemaphore(os, command->powerSemaphore));
+ acquired = gcvTRUE;
+
+ /* avoid acquiring again. */
+ flag &= ~gcvPOWER_FLAG_ACQUIRE;
+ }
+ }
+
+ if (flag & (gcvPOWER_FLAG_INITIALIZE | gcvPOWER_FLAG_CLOCK_ON))
+ {
+ /* Turn on the power. */
+ gcmkONERROR(gckOS_SetGPUPower(os, gcvCORE_VG, gcvTRUE, gcvTRUE));
+
+ /* Mark clock and power as enabled. */
+ Hardware->clockState = gcvTRUE;
+ Hardware->powerState = gcvTRUE;
+ }
+
+ /* Get time until powered on. */
+ gcmkPROFILE_QUERY(time, onTime);
+
+ if (flag & gcvPOWER_FLAG_STALL)
+ {
+ /* Acquire the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(
+ command->os,
+ command->commitMutex,
+ gcvINFINITE
+ ));
+
+ commitMutex = gcvTRUE;
+
+ gcmkONERROR(_CommandStall(Hardware));
+ }
+
+ /* Get time until stalled. */
+ gcmkPROFILE_QUERY(time, stallTime);
+
+ if (flag & gcvPOWER_FLAG_ACQUIRE)
+ {
+ /* Acquire the power management semaphore. */
+ gcmkONERROR(gckOS_AcquireSemaphore(os, command->powerSemaphore));
+
+ acquired = gcvTRUE;
+ }
+
+
+ /* Get time until stopped. */
+ gcmkPROFILE_QUERY(time, stopTime);
+
+
+ if (flag & gcvPOWER_FLAG_DELAY)
+ {
+ /* Wait for the specified amount of time to settle coming back from
+ ** power-off or suspend state. */
+ gcmkONERROR(gckOS_Delay(os, gcdPOWER_CONTROL_DELAY));
+ }
+
+ /* Get time until delayed. */
+ gcmkPROFILE_QUERY(time, delayTime);
+
+ if (flag & gcvPOWER_FLAG_INITIALIZE)
+ {
+
+ /* Initialize GPU here, replaced by InitializeHardware later */
+ gcmkONERROR(gckVGHARDWARE_SetMMU(Hardware, Hardware->kernel->mmu->pageTableLogical));
+ gcmkVERIFY_OK(gckVGHARDWARE_SetFastClear(Hardware, -1));
+
+ /* Force the command queue to reload the next context. */
+ command->currentContext = 0;
+ }
+
+ /* Get time until initialized. */
+ gcmkPROFILE_QUERY(time, initTime);
+
+ if (flag & (gcvPOWER_FLAG_POWER_OFF | gcvPOWER_FLAG_CLOCK_OFF))
+ {
+ /* Turn off the GPU power. */
+ gcmkONERROR(
+ gckOS_SetGPUPower(os,
+ gcvCORE_VG,
+ (flag & gcvPOWER_FLAG_CLOCK_OFF) ? gcvFALSE
+ : gcvTRUE,
+ (flag & gcvPOWER_FLAG_POWER_OFF) ? gcvFALSE
+ : gcvTRUE));
+
+ /* Save current hardware power and clock states. */
+ Hardware->clockState = (flag & gcvPOWER_FLAG_CLOCK_OFF) ? gcvFALSE
+ : gcvTRUE;
+ Hardware->powerState = (flag & gcvPOWER_FLAG_POWER_OFF) ? gcvFALSE
+ : gcvTRUE;
+ }
+
+ /* Get time until off. */
+ gcmkPROFILE_QUERY(time, offTime);
+
+
+ /* Get time until started. */
+ gcmkPROFILE_QUERY(time, startTime);
+
+ if (flag & gcvPOWER_FLAG_RELEASE)
+ {
+ /* Release the power management semaphore. */
+ gcmkONERROR(gckOS_ReleaseSemaphore(os, command->powerSemaphore));
+ acquired = gcvFALSE;
+ }
+
+ /* Save the new power state. */
+ Hardware->chipPowerState = State;
+
+ if (global)
+ {
+ /* Save the new power state. */
+ Hardware->chipPowerStateGlobal = State;
+ }
+
+ if (commitMutex)
+ {
+ /* Acquire the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(
+ command->os,
+ command->commitMutex
+ ));
+ }
+
+#if gcdPOWEROFF_TIMEOUT
+ /* Reset power off time */
+ gcmkONERROR(gckOS_GetTicks(&currentTime));
+
+ Hardware->powerOffTime = currentTime + Hardware->powerOffTimeout;
+
+ if (State == gcvPOWER_IDLE)
+ {
+ /* Start a timer to power off GPU when GPU enters IDLE or SUSPEND. */
+ gcmkVERIFY_OK(gckOS_StartTimer(os,
+ Hardware->powerOffTimer,
+ Hardware->powerOffTimeout));
+ }
+ else
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "Cancel powerOfftimer");
+
+ /* Cancel running timer when GPU enters ON or OFF. */
+ gcmkVERIFY_OK(gckOS_StopTimer(os, Hardware->powerOffTimer));
+ }
+#endif
+
+ /* Release the power mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(os, Hardware->powerMutex));
+
+ /* Get total time. */
+ gcmkPROFILE_QUERY(time, totalTime);
+#if gcdENABLE_PROFILING
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "PROF(%llu): mutex:%llu on:%llu stall:%llu stop:%llu",
+ freq, mutexTime, onTime, stallTime, stopTime);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ " delay:%llu init:%llu off:%llu start:%llu total:%llu",
+ delayTime, initTime, offTime, startTime, totalTime);
+#endif
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+
+ if (acquired)
+ {
+ /* Release semaphore. */
+ gcmkVERIFY_OK(gckOS_ReleaseSemaphore(Hardware->os,
+ command->powerSemaphore));
+ }
+
+ if (mutexAcquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Hardware->os, Hardware->powerMutex));
+ }
+
+ if (commitMutex)
+ {
+ /* Acquire the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(
+ command->os,
+ command->commitMutex
+ ));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHARDWARE_QueryPowerState
+**
+** Get GPU power state.
+**
+** INPUT:
+**
+** gckHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** gceCHIPPOWERSTATE* State
+** Power State.
+**
+*/
+gceSTATUS
+gckVGHARDWARE_QueryPowerManagementState(
+ IN gckVGHARDWARE Hardware,
+ OUT gceCHIPPOWERSTATE* State
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(State != gcvNULL);
+
+ /* Return the statue. */
+ *State = Hardware->chipPowerState;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*State=%d", *State);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGHARDWARE_EnablePowerManagement
+**
+** Configure GPU power management function.
+** Only used in driver initialization stage.
+**
+** INPUT:
+**
+** gckVGHARDWARE Harwdare
+** Pointer to an gckHARDWARE object.
+**
+** gctBOOL Enable
+** Power Mangement Enabling State.
+**
+*/
+gceSTATUS
+gckVGHARDWARE_EnablePowerManagement(
+ IN gckVGHARDWARE Hardware,
+ IN gctBOOL Enable
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ Hardware->options.powerManagement = Enable;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+#if gcdPOWEROFF_TIMEOUT
+gceSTATUS
+gckVGHARDWARE_SetPowerOffTimeout(
+ IN gckVGHARDWARE Hardware,
+ IN gctUINT32 Timeout
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x Timeout=%d", Hardware, Timeout);
+
+ Hardware->powerOffTimeout = Timeout;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+
+gceSTATUS
+gckVGHARDWARE_QueryPowerOffTimeout(
+ IN gckVGHARDWARE Hardware,
+ OUT gctUINT32* Timeout
+ )
+{
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ *Timeout = Hardware->powerOffTimeout;
+
+ gcmkFOOTER_ARG("*Timeout=%d", *Timeout);
+ return gcvSTATUS_OK;
+}
+#endif
+
+gceSTATUS
+gckVGHARDWARE_QueryIdle(
+ IN gckVGHARDWARE Hardware,
+ OUT gctBOOL_PTR IsIdle
+ )
+{
+ gceSTATUS status;
+ gctUINT32 idle;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(IsIdle != gcvNULL);
+
+ /* We are idle when the power is not ON. */
+ if (Hardware->chipPowerState != gcvPOWER_ON)
+ {
+ *IsIdle = gcvTRUE;
+ }
+
+ else
+ {
+ /* Read idle register. */
+ gcmkONERROR(
+ gckOS_ReadRegisterEx(Hardware->os, gcvCORE_VG, 0x00004, &idle));
+
+ /* Pipe must be idle. */
+ if (((((((gctUINT32) (idle)) >> (0 ? 0:0)) & ((gctUINT32) ((((1 ? 0:0) - (0 ? 0:0) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1)))))) ) != 1)
+ || ((((((gctUINT32) (idle)) >> (0 ? 8:8)) & ((gctUINT32) ((((1 ? 8:8) - (0 ? 8:8) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 8:8) - (0 ? 8:8) + 1)))))) ) != 1)
+ || ((((((gctUINT32) (idle)) >> (0 ? 9:9)) & ((gctUINT32) ((((1 ? 9:9) - (0 ? 9:9) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 9:9) - (0 ? 9:9) + 1)))))) ) != 1)
+ || ((((((gctUINT32) (idle)) >> (0 ? 10:10)) & ((gctUINT32) ((((1 ? 10:10) - (0 ? 10:10) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 10:10) - (0 ? 10:10) + 1)))))) ) != 1)
+ || ((((((gctUINT32) (idle)) >> (0 ? 11:11)) & ((gctUINT32) ((((1 ? 11:11) - (0 ? 11:11) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 11:11) - (0 ? 11:11) + 1)))))) ) != 1)
+ )
+ {
+ /* Something is busy. */
+ *IsIdle = gcvFALSE;
+ }
+
+ else
+ {
+ *IsIdle = gcvTRUE;
+ }
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+#endif /* gcdENABLE_VG */
+
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
new file mode 100644
index 000000000000..04d417a8f119
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/archvg/gc_hal_kernel_hardware_vg.h
@@ -0,0 +1,110 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_hardware_vg_h_
+#define __gc_hal_kernel_hardware_vg_h_
+
+/* gckHARDWARE object. */
+struct _gckVGHARDWARE
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* Pointer to gckKERNEL object. */
+ gckVGKERNEL kernel;
+
+ /* Pointer to gckOS object. */
+ gckOS os;
+
+ /* Chip characteristics. */
+ gceCHIPMODEL chipModel;
+ gctUINT32 chipRevision;
+ gctUINT32 productID;
+ gctUINT32 ecoID;
+ gctUINT32 customerID;
+ gctUINT32 chipFeatures;
+ gctUINT32 chipMinorFeatures;
+ gctUINT32 chipMinorFeatures2;
+
+ /* Features. */
+ gctBOOL fe20;
+ gctBOOL vg20;
+ gctBOOL vg21;
+ gctBOOL fc;
+
+ /* Event mask. */
+ gctUINT32 eventMask;
+
+ gctBOOL clockState;
+ gctBOOL powerState;
+ gctPOINTER powerMutex;
+ gctUINT32 powerProcess;
+ gctUINT32 powerThread;
+ gceCHIPPOWERSTATE chipPowerState;
+ gceCHIPPOWERSTATE chipPowerStateGlobal;
+ gctPOINTER pageTableDirty;
+#if gcdPOWEROFF_TIMEOUT
+ gctUINT32 powerOffTime;
+ gctUINT32 powerOffTimeout;
+ gctPOINTER powerOffTimer;
+#endif
+
+ gcsHAL_QUERY_CHIP_OPTIONS options;
+
+ gctPOINTER featureDatabase;
+};
+
+#endif /* __gc_hal_kernel_hardware_h_ */
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
new file mode 100644
index 000000000000..2415734bdd55
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.c
@@ -0,0 +1,5647 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+#if gcdDEC_ENABLE_AHB
+#include "viv_dec300_main.h"
+#endif
+
+#define _GC_OBJ_ZONE gcvZONE_KERNEL
+
+/*******************************************************************************
+***** Version Signature *******************************************************/
+
+#define _gcmTXT2STR(t) #t
+#define gcmTXT2STR(t) _gcmTXT2STR(t)
+const char * _VERSION = "\n\0$VERSION$"
+ gcmTXT2STR(gcvVERSION_MAJOR) "."
+ gcmTXT2STR(gcvVERSION_MINOR) "."
+ gcmTXT2STR(gcvVERSION_PATCH) ":"
+ gcmTXT2STR(gcvVERSION_BUILD) "$\n";
+
+/******************************************************************************\
+******************************* gckKERNEL API Code ******************************
+\******************************************************************************/
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+#define gcmDEFINE2TEXT(d) #d
+gctCONST_STRING _DispatchText[] =
+{
+ gcmDEFINE2TEXT(gcvHAL_CHIP_INFO),
+ gcmDEFINE2TEXT(gcvHAL_VERSION),
+ gcmDEFINE2TEXT(gcvHAL_SET_TIMEOUT),
+ gcmDEFINE2TEXT(gcvHAL_QUERY_VIDEO_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_QUERY_CHIP_IDENTITY),
+ gcmDEFINE2TEXT(gcvHAL_QUERY_CHIP_OPTION),
+ gcmDEFINE2TEXT(gcvHAL_QUERY_CHIP_FREQUENCY),
+ gcmDEFINE2TEXT(gcvHAL_ALLOCATE_NON_PAGED_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_FREE_NON_PAGED_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_WRAP_USER_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_RELEASE_VIDEO_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_LOCK_VIDEO_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_UNLOCK_VIDEO_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_EXPORT_VIDEO_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_NAME_VIDEO_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_IMPORT_VIDEO_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_MAP_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_UNMAP_MEMORY),
+ gcmDEFINE2TEXT(gcvHAL_CACHE),
+ gcmDEFINE2TEXT(gcvHAL_ATTACH),
+ gcmDEFINE2TEXT(gcvHAL_DETACH),
+ gcmDEFINE2TEXT(gcvHAL_EVENT_COMMIT),
+ gcmDEFINE2TEXT(gcvHAL_COMMIT),
+ gcmDEFINE2TEXT(gcvHAL_COMMIT_DONE),
+ gcmDEFINE2TEXT(gcvHAL_USER_SIGNAL),
+ gcmDEFINE2TEXT(gcvHAL_SIGNAL),
+ gcmDEFINE2TEXT(gcvHAL_WRITE_DATA),
+ gcmDEFINE2TEXT(gcvHAL_READ_REGISTER),
+ gcmDEFINE2TEXT(gcvHAL_WRITE_REGISTER),
+ gcmDEFINE2TEXT(gcvHAL_READ_REGISTER_EX),
+ gcmDEFINE2TEXT(gcvHAL_WRITE_REGISTER_EX),
+ gcmDEFINE2TEXT(gcvHAL_GET_PROFILE_SETTING),
+ gcmDEFINE2TEXT(gcvHAL_SET_PROFILE_SETTING),
+ gcmDEFINE2TEXT(gcvHAL_READ_PROFILER_REGISTER_SETTING),
+ gcmDEFINE2TEXT(gcvHAL_READ_ALL_PROFILE_REGISTERS_PART1),
+ gcmDEFINE2TEXT(gcvHAL_READ_ALL_PROFILE_REGISTERS_PART2),
+ gcmDEFINE2TEXT(gcvHAL_PROFILE_REGISTERS_2D),
+ gcmDEFINE2TEXT(gcvHAL_SET_POWER_MANAGEMENT_STATE),
+ gcmDEFINE2TEXT(gcvHAL_QUERY_POWER_MANAGEMENT_STATE),
+ gcmDEFINE2TEXT(gcvHAL_CONFIG_POWER_MANAGEMENT),
+ gcmDEFINE2TEXT(gcvHAL_GET_BASE_ADDRESS),
+ gcmDEFINE2TEXT(gcvHAL_SET_IDLE),
+ gcmDEFINE2TEXT(gcvHAL_RESET),
+ gcmDEFINE2TEXT(gcvHAL_SET_DEBUG_LEVEL_ZONE),
+ gcmDEFINE2TEXT(gcvHAL_DEBUG_DUMP),
+ gcmDEFINE2TEXT(gcvHAL_UPDATE_DEBUG_CALLBACK),
+ gcmDEFINE2TEXT(gcvHAL_CONFIG_CTX_FRAMEWORK),
+ gcmDEFINE2TEXT(gcvHAL_DUMP_GPU_STATE),
+ gcmDEFINE2TEXT(gcvHAL_DUMP_EVENT),
+ gcmDEFINE2TEXT(gcvHAL_DUMP_GPU_PROFILE),
+ gcmDEFINE2TEXT(gcvHAL_TIMESTAMP),
+ gcmDEFINE2TEXT(gcvHAL_DATABASE),
+ gcmDEFINE2TEXT(gcvHAL_GET_FRAME_INFO),
+ gcmDEFINE2TEXT(gcvHAL_QUERY_COMMAND_BUFFER),
+ gcmDEFINE2TEXT(gcvHAL_SET_FSCALE_VALUE),
+ gcmDEFINE2TEXT(gcvHAL_GET_FSCALE_VALUE),
+ gcmDEFINE2TEXT(gcvHAL_QUERY_RESET_TIME_STAMP),
+ gcmDEFINE2TEXT(gcvHAL_CREATE_NATIVE_FENCE),
+ gcmDEFINE2TEXT(gcvHAL_WAIT_NATIVE_FENCE),
+ gcmDEFINE2TEXT(gcvHAL_SHBUF),
+ gcmDEFINE2TEXT(gcvHAL_GET_GRAPHIC_BUFFER_FD),
+ gcmDEFINE2TEXT(gcvHAL_SET_VIDEO_MEMORY_METADATA),
+ gcmDEFINE2TEXT(gcvHAL_GET_VIDEO_MEMORY_FD),
+ gcmDEFINE2TEXT(gcvHAL_DESTROY_MMU),
+ gcmDEFINE2TEXT(gcvHAL_WAIT_FENCE),
+ gcmDEFINE2TEXT(gcvHAL_DEVICE_MUTEX),
+ gcmDEFINE2TEXT(gcvHAL_DEC200_TEST),
+ gcmDEFINE2TEXT(gcvHAL_DEC300_READ),
+ gcmDEFINE2TEXT(gcvHAL_DEC300_WRITE),
+ gcmDEFINE2TEXT(gcvHAL_DEC300_FLUSH),
+ gcmDEFINE2TEXT(gcvHAL_DEC300_FLUSH_WAIT),
+};
+#endif
+
+#if gcdGPU_TIMEOUT && gcdINTERRUPT_STATISTIC
+void
+_MonitorTimerFunction(
+ gctPOINTER Data
+ )
+{
+ gckKERNEL kernel = (gckKERNEL)Data;
+ gctINT32 pendingInterrupt;
+ gctBOOL reset = gcvFALSE;
+ gctINT32 mask;
+ gctUINT32 advance = kernel->timeOut/2;
+
+#if gcdENABLE_VG
+ if (kernel->core == gcvCORE_VG)
+ {
+ return;
+ }
+#endif
+
+ if (kernel->monitorTimerStop)
+ {
+ /* Stop. */
+ return;
+ }
+
+ gckOS_AtomGet(kernel->os, kernel->eventObj->interruptCount, &pendingInterrupt);
+
+ if (pendingInterrupt < 0)
+ {
+ gctINT i = 0 - pendingInterrupt;
+ gctINT pendingMask;
+
+ gcmkVERIFY_OK(gckOS_AtomGet(
+ kernel->os,
+ kernel->hardware->pendingEvent,
+ &pendingMask
+ ));
+
+ gcmkPRINT("[galcore]: Number of pending interrupt is %d mask is %x",
+ pendingInterrupt, pendingMask);
+
+ while (i--)
+ {
+ /* Ignore counting which should not exist. */
+ gckOS_AtomIncrement(kernel->os, kernel->eventObj->interruptCount, &pendingInterrupt);
+ }
+
+ gckOS_AtomGet(kernel->os, kernel->eventObj->interruptCount, &pendingInterrupt);
+ }
+
+ if (kernel->monitoring == gcvFALSE)
+ {
+ if (pendingInterrupt)
+ {
+ /* Begin to mointor GPU state. */
+ kernel->monitoring = gcvTRUE;
+
+ /* Record current state. */
+ kernel->lastCommitStamp = kernel->eventObj->lastCommitStamp;
+ kernel->restoreAddress = kernel->hardware->lastWaitLink;
+ gcmkVERIFY_OK(gckOS_AtomGet(
+ kernel->os,
+ kernel->hardware->pendingEvent,
+ &kernel->restoreMask
+ ));
+
+ /* Clear timeout. */
+ kernel->timer = 0;
+ }
+ }
+ else
+ {
+ if (pendingInterrupt)
+ {
+ gcmkVERIFY_OK(gckOS_AtomGet(
+ kernel->os,
+ kernel->hardware->pendingEvent,
+ &mask
+ ));
+
+ if (kernel->eventObj->lastCommitStamp == kernel->lastCommitStamp
+ && kernel->hardware->lastWaitLink == kernel->restoreAddress
+ && mask == kernel->restoreMask
+ )
+ {
+ /* GPU state is not changed, accumlate timeout. */
+ kernel->timer += advance;
+
+ if (kernel->timer >= kernel->timeOut)
+ {
+ /* GPU stuck, trigger reset. */
+ reset = gcvTRUE;
+ }
+ }
+ else
+ {
+ /* GPU state changed, cancel current timeout.*/
+ kernel->monitoring = gcvFALSE;
+ }
+ }
+ else
+ {
+ /* GPU finish all jobs, cancel current timeout*/
+ kernel->monitoring = gcvFALSE;
+ }
+ }
+
+ if (reset)
+ {
+ gckKERNEL_Recovery(kernel);
+
+ /* Work in this timeout is done. */
+ kernel->monitoring = gcvFALSE;
+ }
+
+ gcmkVERIFY_OK(gckOS_StartTimer(kernel->os, kernel->monitorTimer, advance));
+}
+#endif
+
+void
+_DumpDriverConfigure(
+ IN gckKERNEL Kernel
+ )
+{
+ gcmkPRINT_N(0, "**************************\n");
+ gcmkPRINT_N(0, "*** GPU DRV CONFIG ***\n");
+ gcmkPRINT_N(0, "**************************\n");
+
+ gcmkPRINT("Galcore version %d.%d.%d.%d\n",
+ gcvVERSION_MAJOR, gcvVERSION_MINOR, gcvVERSION_PATCH, gcvVERSION_BUILD);
+
+ gckOS_DumpParam();
+}
+
+void
+_DumpState(
+ IN gckKERNEL Kernel
+ )
+{
+ /* Dump GPU Debug registers. */
+ gcmkVERIFY_OK(gckHARDWARE_DumpGPUState(Kernel->hardware));
+
+ /* Dump Pending event. */
+ gcmkVERIFY_OK(gckEVENT_Dump(Kernel->eventObj));
+
+ /* Dump Process DB. */
+ gcmkVERIFY_OK(gckKERNEL_DumpProcessDB(Kernel));
+
+#if gcdRECORD_COMMAND
+ /* Dump record. */
+ gckRECORDER_Dump(Kernel->command->recorder);
+#endif
+
+ if (Kernel->command)
+ {
+ gcmkVERIFY_OK(gckCOMMAND_DumpExecutingBuffer(Kernel->command));
+ }
+}
+
+gceSTATUS
+gckKERNEL_GetHardwareType(
+ IN gckKERNEL Kernel,
+ OUT gceHARDWARE_TYPE *Type
+ )
+{
+ gceHARDWARE_TYPE type;
+ gcmkHEADER();
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+#if gcdENABLE_VG
+ if (Kernel->vg)
+ {
+ type = gcvHARDWARE_VG;
+ }
+ else
+#endif
+ {
+ type = Kernel->hardware->type;
+ }
+
+ *Type = type;
+
+ gcmkFOOTER_ARG("type=%d", type);
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+_SetRecovery(
+ IN gckKERNEL Kernel,
+ IN gctBOOL Recovery,
+ IN gctUINT32 StuckDump
+ )
+{
+ Kernel->recovery = Recovery;
+
+ if (Recovery == gcvFALSE)
+ {
+ /* Dump stuck information if Recovery is disabled. */
+ Kernel->stuckDump = gcmMAX(StuckDump, gcvSTUCK_DUMP_USER_COMMAND);
+ }
+
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_Construct
+**
+** Construct a new gckKERNEL object.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gceCORE Core
+** Specified core.
+**
+** IN gctPOINTER Context
+** Pointer to a driver defined context.
+**
+** IN gckDB SharedDB,
+** Pointer to a shared DB.
+**
+** OUTPUT:
+**
+** gckKERNEL * Kernel
+** Pointer to a variable that will hold the pointer to the gckKERNEL
+** object.
+*/
+
+gceSTATUS
+gckKERNEL_Construct(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT ChipID,
+ IN gctPOINTER Context,
+ IN gckDEVICE Device,
+ IN gckDB SharedDB,
+ OUT gckKERNEL * Kernel
+ )
+{
+ gckKERNEL kernel = gcvNULL;
+ gceSTATUS status;
+ gctSIZE_T i;
+ gctPOINTER pointer = gcvNULL;
+ gctUINT64 data;
+ gctUINT32 recovery;
+ gctUINT32 stuckDump;
+ gctUINT64 dynamicMap = 1;
+
+ gcmkHEADER_ARG("Os=%p Context=%p", Os, Context);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Kernel != gcvNULL);
+
+ /* Allocate the gckKERNEL object. */
+ gcmkONERROR(gckOS_Allocate(Os,
+ gcmSIZEOF(struct _gckKERNEL),
+ &pointer));
+
+ /* Zero the object. */
+ gckOS_ZeroMemory(pointer, gcmSIZEOF(struct _gckKERNEL));
+
+ kernel = pointer;
+
+ /* Initialize the gckKERNEL object. */
+ kernel->object.type = gcvOBJ_KERNEL;
+ kernel->os = Os;
+ kernel->core = Core;
+ kernel->device = Device;
+ kernel->chipID = ChipID;
+
+#if gcdENABLE_TRUST_APPLICATION
+ /* Connect to security service for this GPU. */
+ gcmkONERROR(gckKERNEL_SecurityOpen(kernel, kernel->core, &kernel->securityChannel));
+#endif
+
+ if (SharedDB == gcvNULL)
+ {
+ gcmkONERROR(gckOS_Allocate(Os,
+ gcmSIZEOF(struct _gckDB),
+ &pointer));
+
+ kernel->db = pointer;
+ kernel->dbCreated = gcvTRUE;
+ kernel->db->freeDatabase = gcvNULL;
+ kernel->db->freeRecord = gcvNULL;
+ kernel->db->dbMutex = gcvNULL;
+ kernel->db->lastDatabase = gcvNULL;
+ kernel->db->idleTime = 0;
+ kernel->db->lastIdle = 0;
+ kernel->db->lastSlowdown = 0;
+
+ for (i = 0; i < gcmCOUNTOF(kernel->db->db); ++i)
+ {
+ kernel->db->db[i] = gcvNULL;
+ }
+
+ /* Construct a database mutex. */
+ gcmkONERROR(gckOS_CreateMutex(Os, &kernel->db->dbMutex));
+
+ /* Construct a video memory name database. */
+ gcmkONERROR(gckKERNEL_CreateIntegerDatabase(
+ kernel,
+ 512,
+ &kernel->db->nameDatabase
+ ));
+
+ /* Construct a video memory name database mutex. */
+ gcmkONERROR(gckOS_CreateMutex(Os, &kernel->db->nameDatabaseMutex));
+
+ /* Construct a pointer name database. */
+ gcmkONERROR(gckKERNEL_CreateIntegerDatabase(
+ kernel,
+ 512,
+ &kernel->db->pointerDatabase
+ ));
+
+ /* Initialize video memory node list. */
+ gcsLIST_Init(&kernel->db->videoMemList);
+
+ gcmkONERROR(gckOS_CreateMutex(Os, &kernel->db->videoMemListMutex));
+ }
+ else
+ {
+ kernel->db = SharedDB;
+ kernel->dbCreated = gcvFALSE;
+ }
+
+ for (i = 0; i < gcmCOUNTOF(kernel->timers); ++i)
+ {
+ kernel->timers[i].startTime = 0;
+ kernel->timers[i].stopTime = 0;
+ }
+
+ gcmkONERROR(gckOS_CreateMutex(Os, &kernel->vidMemBlockMutex));
+
+ /* Save context. */
+ kernel->context = Context;
+
+ /* Construct atom holding number of clients. */
+ kernel->atomClients = gcvNULL;
+ gcmkONERROR(gckOS_AtomConstruct(Os, &kernel->atomClients));
+
+ kernel->recovery = gcvTRUE;
+ kernel->stuckDump = gcvSTUCK_DUMP_NONE;
+
+ /* Override default recovery and stuckDump setting. */
+ status = gckOS_QueryOption(Os, "recovery", &data);
+ recovery = (gctUINT32)data;
+
+ if (gcmIS_SUCCESS(status))
+ {
+ status = gckOS_QueryOption(Os, "stuckDump", &data);
+ stuckDump = (gctUINT32)data;
+
+ gcmkASSERT(status == gcvSTATUS_OK);
+
+ _SetRecovery(kernel, recovery, stuckDump);
+ }
+
+ status = gckOS_QueryOption(Os, "sRAMLoopMode", &data);
+ kernel->sRAMLoopMode = (status == gcvSTATUS_OK) ? data : 0;
+
+ /* Need the kernel reference before gckKERNEL_Construct() completes.
+ gckOS_MapPagesEx() is called to map kernel virtual command buffers. */
+ *Kernel = kernel;
+
+#if gcdENABLE_VG
+ kernel->vg = gcvNULL;
+
+ if (Core == gcvCORE_VG)
+ {
+ gctPHYS_ADDR_T contiguousBase;
+ gctSIZE_T 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", &data);
+ contiguousSize = (gctSIZE_T)data;
+ }
+
+ if (gcmIS_SUCCESS(status) && contiguousSize)
+ {
+ gctUINT64 gpuContiguousBase;
+
+ gcmkONERROR(gckOS_CPUPhysicalToGPUPhysical(Os, contiguousBase, &gpuContiguousBase));
+
+ gcmkSAFECASTPHYSADDRT(kernel->contiguousBaseAddress, gpuContiguousBase);
+ }
+ }
+ else
+#endif
+ {
+ /* Construct the gckHARDWARE object. */
+ gcmkONERROR(
+ gckHARDWARE_Construct(Os, kernel->device, kernel->core, &kernel->hardware));
+
+ /* Set pointer to gckKERNEL object in gckHARDWARE object. */
+ kernel->hardware->kernel = kernel;
+
+ kernel->sRAMIndex = 0;
+ kernel->extSRAMIndex = 0;
+
+ for (i = gcvSRAM_INTERNAL0; i < gcvSRAM_INTER_COUNT; i++)
+ {
+ kernel->sRAMVidMem[i] = kernel->hardware->sRAMVidMem[i];
+ kernel->sRAMPhysical[i] = kernel->hardware->sRAMPhysical[i];
+ kernel->sRAMPhysFaked[i] = gcvFALSE;
+ }
+
+ kernel->timeOut = kernel->hardware->type == gcvHARDWARE_2D
+ ? gcdGPU_2D_TIMEOUT
+ : gcdGPU_TIMEOUT
+ ;
+
+#if gcdSHARED_PAGETABLE
+ /* Construct the gckMMU object. */
+ gcmkONERROR(
+ gckMMU_Construct(kernel, gcdMMU_SIZE, &kernel->mmu));
+#else
+ if (Device == gcvNULL)
+ {
+ /* Construct the gckMMU object. */
+ gcmkONERROR(
+ gckMMU_Construct(kernel, gcdMMU_SIZE, &kernel->mmu));
+ }
+ else
+ {
+ gcmkONERROR(gckDEVICE_GetMMU(Device, kernel->hardware->type, &kernel->mmu));
+
+ if (kernel->mmu == gcvNULL)
+ {
+ gcmkONERROR(
+ gckMMU_Construct(kernel, gcdMMU_SIZE, &kernel->mmu));
+
+ gcmkONERROR(
+ gckDEVICE_SetMMU(Device, kernel->hardware->type, kernel->mmu));
+ }
+ }
+
+ gcmkONERROR(
+ gckMMU_SetupSRAM(kernel->mmu, kernel->hardware, kernel->device));
+
+ status = gckOS_QueryOption(Os, "mmuDynamicMap", &dynamicMap);
+ if (dynamicMap && kernel->hardware->mmuVersion && !kernel->mmu->dynamicAreaSetuped)
+ {
+ gcmkONERROR(
+ gckMMU_SetupDynamicSpace(kernel->mmu));
+
+ kernel->mmu->dynamicAreaSetuped = gcvTRUE;
+ }
+
+ if (kernel->hardware->mmuVersion > 0)
+ {
+ /* Flush MTLB table. */
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ kernel,
+ kernel->mmu->mtlbVideoMem,
+ 0,
+ kernel->mmu->mtlbLogical,
+ kernel->mmu->mtlbSize
+ ));
+ }
+#endif
+
+ kernel->contiguousBaseAddress = kernel->mmu->contiguousBaseAddress;
+ kernel->externalBaseAddress = kernel->mmu->externalBaseAddress;
+
+ /* Construct the gckCOMMAND object, either MCFE or wait-link FE can exist. */
+ if (gckHARDWARE_IsFeatureAvailable(kernel->hardware, gcvFEATURE_MCFE))
+ {
+ /* Construct the gckCOMMAND object for multi-channel FE. */
+ gcmkONERROR(gckCOMMAND_Construct(kernel, gcvHW_FE_MULTI_CHANNEL, &kernel->command));
+
+ /* Construct gckEVENT for multi-channel FE. */
+ gcmkONERROR(gckEVENT_Construct(kernel, kernel->command, &kernel->eventObj));
+ }
+ else
+ {
+ /* Construct the gckCOMMAND object for legacy wait-link FE. */
+ gcmkONERROR(gckCOMMAND_Construct(kernel, gcvHW_FE_WAIT_LINK, &kernel->command));
+
+ /* Construct the gckEVENT object. */
+ gcmkONERROR(gckEVENT_Construct(kernel, kernel->command, &kernel->eventObj));
+ }
+
+ if (gckHARDWARE_IsFeatureAvailable(kernel->hardware, gcvFEATURE_ASYNC_BLIT))
+ {
+ /* Construct the gckCOMMAND object for BLT engine. */
+ gcmkONERROR(gckCOMMAND_Construct(kernel, gcvHW_FE_ASYNC, &kernel->asyncCommand));
+
+ /* Construct gckEVENT for BLT. */
+ gcmkONERROR(gckEVENT_Construct(kernel, kernel->asyncCommand, &kernel->asyncEvent));
+ }
+
+ gcmkVERIFY_OK(gckOS_GetTime(&kernel->resetTimeStamp));
+
+ /* Post construct hardware elements after MMU settle. */
+ gcmkONERROR(gckHARDWARE_PostConstruct(kernel->hardware));
+
+ /* Initialize the GPU. */
+ gcmkONERROR(
+ gckHARDWARE_InitializeHardware(kernel->hardware));
+
+#if gcdDVFS
+ if (gckHARDWARE_IsFeatureAvailable(kernel->hardware,
+ gcvFEATURE_DYNAMIC_FREQUENCY_SCALING))
+ {
+ gcmkONERROR(gckDVFS_Construct(kernel->hardware, &kernel->dvfs));
+ gcmkONERROR(gckDVFS_Start(kernel->dvfs));
+ }
+#endif
+
+#if COMMAND_PROCESSOR_VERSION == 1
+ if (kernel->command)
+ {
+ /* Start the command queue. */
+ gcmkONERROR(gckCOMMAND_Start(kernel->command));
+ }
+
+ if (kernel->asyncCommand)
+ {
+ /* Start the async command queue. */
+ gcmkONERROR(gckCOMMAND_Start(kernel->asyncCommand));
+ }
+#endif
+ }
+
+#if VIVANTE_PROFILER
+ /* Initialize profile setting */
+ kernel->profileEnable = gcvFALSE;
+ kernel->profileCleanRegister = gcvTRUE;
+#endif
+
+#if gcdLINUX_SYNC_FILE
+ gcmkONERROR(gckOS_CreateSyncTimeline(Os, Core, &kernel->timeline));
+#endif
+
+#if gcdSECURITY
+ /* Connect to security service for this GPU. */
+ gcmkONERROR(gckKERNEL_SecurityOpen(kernel, kernel->core, &kernel->securityChannel));
+#endif
+
+#if gcdGPU_TIMEOUT && gcdINTERRUPT_STATISTIC
+ if (kernel->timeOut)
+ {
+ gcmkVERIFY_OK(gckOS_CreateTimer(
+ Os,
+ (gctTIMERFUNCTION)_MonitorTimerFunction,
+ (gctPOINTER)kernel,
+ &kernel->monitorTimer
+ ));
+
+ kernel->monitoring = gcvFALSE;
+
+ kernel->monitorTimerStop = gcvFALSE;
+
+ gcmkVERIFY_OK(gckOS_StartTimer(
+ Os,
+ kernel->monitorTimer,
+ 100
+ ));
+ }
+#endif
+
+ /* Return pointer to the gckKERNEL object. */
+ *Kernel = kernel;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Kernel=%p", *Kernel);
+ return gcvSTATUS_OK;
+
+OnError:
+ *Kernel = gcvNULL;
+
+ if (kernel != gcvNULL)
+ {
+ gckKERNEL_Destroy(kernel);
+ }
+
+ /* Return the error. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_Destroy
+**
+** Destroy an gckKERNEL object.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object to destroy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_Destroy(
+ IN gckKERNEL Kernel
+ )
+{
+ gctSIZE_T i;
+ gcsDATABASE_PTR database, databaseNext;
+ gcsDATABASE_RECORD_PTR record, recordNext;
+
+ gcmkHEADER_ARG("Kernel=%p", Kernel);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+#if QNX_SINGLE_THREADED_DEBUGGING
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->debugMutex));
+#endif
+
+ if (Kernel->monitorTimer)
+ {
+ /* Stop and destroy monitor timer. */
+ gcmkVERIFY_OK(gckOS_StopTimer(Kernel->os, Kernel->monitorTimer));
+ gcmkVERIFY_OK(gckOS_DestroyTimer(Kernel->os, Kernel->monitorTimer));
+ }
+
+#if gcdENABLE_VG
+ if (Kernel->vg)
+ {
+ gcmkVERIFY_OK(gckVGKERNEL_Destroy(Kernel->vg));
+ }
+ else
+#endif
+ {
+ if (Kernel->command)
+ {
+ /* Destroy the gckCOMMNAND object. */
+ gcmkVERIFY_OK(gckCOMMAND_Destroy(Kernel->command));
+ }
+
+ if (Kernel->asyncCommand)
+ {
+ gcmkVERIFY_OK(gckCOMMAND_Destroy(Kernel->asyncCommand));
+ }
+
+ if (Kernel->asyncEvent)
+ {
+ gcmkVERIFY_OK(gckEVENT_Destroy(Kernel->asyncEvent));
+ }
+
+ if (Kernel->eventObj)
+ {
+ /* Destroy the gckEVENT object. */
+ gcmkVERIFY_OK(gckEVENT_Destroy(Kernel->eventObj));
+ }
+
+ if (Kernel->hardware)
+ {
+ /* Destroy hardware resources before destroying MMU. */
+ gcmkVERIFY_OK(gckHARDWARE_PreDestroy(Kernel->hardware));
+ }
+
+ if (Kernel->mmu)
+ {
+#if gcdSHARED_PAGETABLE
+ /* Destroy the gckMMU object. */
+ gcmkVERIFY_OK(gckMMU_Destroy(Kernel->mmu));
+#else
+ if (Kernel->mmu->hardware == Kernel->hardware)
+ {
+ /* Destroy the gckMMU object. */
+ gcmkVERIFY_OK(gckMMU_Destroy(Kernel->mmu));
+ }
+#endif
+ }
+
+ if (Kernel->hardware)
+ {
+ /* Destroy the gckHARDWARE object. */
+ gcmkVERIFY_OK(gckHARDWARE_Destroy(Kernel->hardware));
+ }
+ }
+
+ if (Kernel->atomClients)
+ {
+ /* Detsroy the client atom. */
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Kernel->os, Kernel->atomClients));
+ }
+
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->vidMemBlockMutex));
+
+ /* Destroy the database. */
+ if (Kernel->dbCreated)
+ {
+ for (i = 0; i < gcmCOUNTOF(Kernel->db->db); ++i)
+ {
+ if (Kernel->db->db[i] != gcvNULL)
+ {
+ gcmkVERIFY_OK(
+ gckKERNEL_DestroyProcessDB(Kernel, Kernel->db->db[i]->processID));
+ }
+ }
+
+ /* Free all databases. */
+ for (database = Kernel->db->freeDatabase;
+ database != gcvNULL;
+ database = databaseNext)
+ {
+ databaseNext = database->next;
+
+ if (database->counterMutex)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, database->counterMutex));
+ }
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, database));
+ }
+
+ if (Kernel->db->lastDatabase != gcvNULL)
+ {
+ if (Kernel->db->lastDatabase->counterMutex)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->db->lastDatabase->counterMutex));
+ }
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, Kernel->db->lastDatabase));
+ }
+
+ /* Free all database records. */
+ for (record = Kernel->db->freeRecord; record != gcvNULL; record = recordNext)
+ {
+ recordNext = record->next;
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, record));
+ }
+
+ if (Kernel->db->dbMutex)
+ {
+ /* Destroy the database mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->db->dbMutex));
+ }
+
+ if (Kernel->db->nameDatabase)
+ {
+ /* Destroy video memory name database. */
+ gcmkVERIFY_OK(gckKERNEL_DestroyIntegerDatabase(Kernel, Kernel->db->nameDatabase));
+ }
+
+ if (Kernel->db->nameDatabaseMutex)
+ {
+ /* Destroy video memory name database mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->db->nameDatabaseMutex));
+ }
+
+ if (Kernel->db->pointerDatabase)
+ {
+ /* Destroy id-pointer database. */
+ gcmkVERIFY_OK(gckKERNEL_DestroyIntegerDatabase(Kernel, Kernel->db->pointerDatabase));
+ }
+
+ if (Kernel->db->videoMemListMutex)
+ {
+ /* Destroy video memory list mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Kernel->db->videoMemListMutex));
+ }
+
+ /* Destroy the database. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, Kernel->db));
+
+ /* Notify stuck timer to quit. */
+ Kernel->monitorTimerStop = gcvTRUE;
+ }
+
+#if gcdDVFS
+ if (Kernel->dvfs)
+ {
+ gcmkVERIFY_OK(gckDVFS_Stop(Kernel->dvfs));
+ gcmkVERIFY_OK(gckDVFS_Destroy(Kernel->dvfs));
+ }
+#endif
+
+#if gcdLINUX_SYNC_FILE
+ if (Kernel->timeline)
+ {
+ gcmkVERIFY_OK(gckOS_DestroySyncTimeline(Kernel->os, Kernel->timeline));
+ }
+#endif
+
+#if gcdSECURITY
+ if (Kernel->securityChannel)
+ {
+ gcmkVERIFY_OK(gckKERNEL_SecurityClose(Kernel->securityChannel));
+ }
+#endif
+
+ /* Mark the gckKERNEL object as unknown. */
+ Kernel->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the gckKERNEL object. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, Kernel));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_AllocateVideoMemory
+**
+** Walk requested pools to allocate video memory.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** OUTPUT:
+**
+** gckVIDMEM_NODE * NodeObject
+** Pointer to a variable receiving video memory represetation.
+*/
+gceSTATUS
+gckKERNEL_AllocateVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Alignment,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN OUT gctSIZE_T * Bytes,
+ IN OUT gcePOOL * Pool,
+ OUT gckVIDMEM_NODE * NodeObject
+ )
+{
+ gceSTATUS status;
+ gcePOOL pool;
+ gckVIDMEM videoMemory;
+ gctINT loopCount;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gctBOOL contiguous = gcvFALSE;
+ gctBOOL cacheable = gcvFALSE;
+ gctBOOL secure = gcvFALSE;
+ gctBOOL fastPools = gcvFALSE;
+ gctBOOL virtualPool4K = gcvFALSE;
+ gctBOOL hasFastPools = gcvFALSE;
+ gctSIZE_T bytes = *Bytes;
+
+ gcmkHEADER_ARG("Kernel=%p *Pool=%d *Bytes=%lu Alignment=%lu Type=%d",
+ Kernel, *Pool, *Bytes, Alignment, Type);
+
+ *NodeObject = gcvNULL;
+
+ /* Check flags. */
+ 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 (Flag & gcvALLOC_FLAG_4K_PAGES)
+ {
+ virtualPool4K = gcvTRUE;
+ Flag &= ~gcvALLOC_FLAG_4K_PAGES;
+ }
+
+#if gcdALLOC_ON_FAULT
+ if (Type == gcvVIDMEM_COLOR_BUFFER)
+ {
+ Flag |= gcvALLOC_FLAG_ALLOC_ON_FAULT;
+ }
+#endif
+
+ if (Flag & gcvALLOC_FLAG_ALLOC_ON_FAULT)
+ {
+ *Pool = gcvPOOL_VIRTUAL;
+ }
+
+ if (Flag & gcvALLOC_FLAG_DMABUF_EXPORTABLE)
+ {
+ gctSIZE_T pageSize = 0;
+ gckOS_GetPageSize(Kernel->os, &pageSize);
+
+ /* Usually, the exported dmabuf might be later imported to DRM,
+ ** while DRM requires input size to be page aligned.
+ */
+ bytes = gcmALIGN(bytes, pageSize);
+ }
+
+ if (Type == gcvVIDMEM_TYPE_COMMAND)
+ {
+#if gcdALLOC_CMD_FROM_RESERVE || gcdSECURITY || gcdDISABLE_GPU_VIRTUAL_ADDRESS || !USE_KERNEL_VIRTUAL_BUFFERS
+ Flag |= gcvALLOC_FLAG_CONTIGUOUS;
+#endif
+ }
+
+ if (Type == gcvVIDMEM_TYPE_TILE_STATUS)
+ {
+ gctBOOL tileStatusInVirtual;
+
+#if gcdENABLE_VG
+ if (Kernel->vg)
+ {
+ tileStatusInVirtual = gcvFALSE;
+ }
+ else
+#endif
+ {
+ tileStatusInVirtual =
+ gckHARDWARE_IsFeatureAvailable(Kernel->hardware, gcvFEATURE_MC20);
+ }
+
+ if (!tileStatusInVirtual)
+ {
+ /* Must be contiguous if not support virtual tile status. */
+ Flag |= gcvALLOC_FLAG_CONTIGUOUS;
+ }
+ }
+
+AllocateMemory:
+
+ /* Get initial pool. */
+ switch (pool = *Pool)
+ {
+ case gcvPOOL_DEFAULT:
+ case gcvPOOL_LOCAL:
+ pool = gcvPOOL_LOCAL_INTERNAL;
+ loopCount = (gctINT) gcvPOOL_NUMBER_OF_POOLS;
+ break;
+
+ case gcvPOOL_UNIFIED:
+ pool = gcvPOOL_SYSTEM;
+ loopCount = (gctINT) gcvPOOL_NUMBER_OF_POOLS;
+ break;
+
+ default:
+ loopCount = 1;
+ break;
+ }
+
+ while (loopCount-- > 0)
+ {
+ if (pool == gcvPOOL_VIRTUAL)
+ {
+ /* Try contiguous virtual first. */
+#if gcdCONTIGUOUS_SIZE_LIMIT
+ if (bytes > gcdCONTIGUOUS_SIZE_LIMIT && contiguous == gcvFALSE)
+ {
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ }
+ else
+#endif
+#if gcdENABLE_GPU_1M_PAGE
+ if (!virtualPool4K && Kernel->core != gcvCORE_VG && Kernel->hardware->mmuVersion)
+ {
+ /* Create a gckVIDMEM_NODE from contiguous memory. */
+ status = gckVIDMEM_NODE_AllocateVirtualChunk(
+ Kernel,
+ pool,
+ Type,
+ Flag | gcvALLOC_FLAG_CONTIGUOUS,
+ &bytes,
+ &nodeObject);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ /* Memory allocated. */
+ break;
+ }
+ }
+#endif
+ {
+ /* Create a gckVIDMEM_NODE from contiguous memory. */
+ status = gckVIDMEM_NODE_AllocateVirtual(
+ Kernel,
+ pool,
+ Type,
+ Flag | gcvALLOC_FLAG_CONTIGUOUS,
+ &bytes,
+ &nodeObject);
+ }
+
+ if (gcmIS_SUCCESS(status))
+ {
+ /* Memory allocated. */
+ break;
+ }
+
+ if (contiguous)
+ {
+ break;
+ }
+
+#if gcdENABLE_GPU_1M_PAGE
+ /* Try non-contiguous virtual chunk. */
+ if (!virtualPool4K && Kernel->hardware->mmuVersion && Kernel->core != gcvCORE_VG)
+ {
+ /* Create a gckVIDMEM_NODE from contiguous memory. */
+ status = gckVIDMEM_NODE_AllocateVirtualChunk(
+ Kernel,
+ pool,
+ Type,
+ Flag | gcvALLOC_FLAG_NON_CONTIGUOUS,
+ &bytes,
+ &nodeObject);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ /* Memory allocated. */
+ break;
+ }
+ }
+#endif
+ /* Try non-contiguous virtual. */
+ /* Create a gckVIDMEM_NODE for virtual memory. */
+ gcmkONERROR(
+ gckVIDMEM_NODE_AllocateVirtual(Kernel,
+ pool,
+ Type,
+ Flag | gcvALLOC_FLAG_NON_CONTIGUOUS,
+ &bytes, &nodeObject));
+
+ /* Success. */
+ break;
+ }
+ /* gcvPOOL_SYSTEM/gcvPOOL_SRAM can't be cacheable. */
+ else if (cacheable == gcvFALSE && secure == gcvFALSE)
+ {
+#ifdef EMULATOR
+ /* Cmodel only support 1 SRAM currently. */
+ Kernel->sRAMIndex = 0;
+ Kernel->extSRAMIndex = 0;
+#endif
+
+ /* Get pointer to gckVIDMEM object for pool. */
+ status = gckKERNEL_GetVideoMemoryPool(Kernel, pool, &videoMemory);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ /* Allocate memory. */
+ if ((Flag & videoMemory->capability) != Flag)
+ {
+ status = gcvSTATUS_NOT_SUPPORTED;
+
+ }
+#if defined(gcdLINEAR_SIZE_LIMIT)
+ /* 512 KB */
+ else if (bytes > gcdLINEAR_SIZE_LIMIT)
+ {
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ }
+#endif
+ else
+ {
+ hasFastPools = gcvTRUE;
+ status = gckVIDMEM_NODE_AllocateLinear(Kernel,
+ videoMemory,
+ pool,
+ Type,
+ Flag,
+ Alignment,
+ (pool == gcvPOOL_SYSTEM ||
+ pool == gcvPOOL_INTERNAL_SRAM ||
+ pool == gcvPOOL_EXTERNAL_SRAM),
+ &bytes,
+ &nodeObject);
+ }
+
+ if (gcmIS_SUCCESS(status))
+ {
+ /* Memory allocated. */
+ break;
+ }
+ }
+ }
+
+ if (pool == gcvPOOL_LOCAL_INTERNAL)
+ {
+ /* Advance to external memory. */
+ pool = gcvPOOL_LOCAL_EXTERNAL;
+ }
+
+ else
+ if (pool == gcvPOOL_LOCAL_EXTERNAL)
+ {
+ if (Kernel->sRAMLoopMode)
+ {
+ /* Advance to Internal SRAM memory block. */
+ pool = gcvPOOL_INTERNAL_SRAM;
+ }
+ else
+ {
+ /* Advance to contiguous reserved memory. */
+ pool = gcvPOOL_SYSTEM;
+ }
+ }
+
+ else
+ if (pool == gcvPOOL_INTERNAL_SRAM)
+ {
+ if (Kernel->sRAMIndex < gcvSRAM_INTER_COUNT - 1 && !Kernel->sRAMPhysFaked[Kernel->sRAMIndex])
+ {
+ Kernel->sRAMIndex++;
+ loopCount++;
+ }
+ else
+ {
+ /* Advance to contiguous reserved memory. */
+ pool = gcvPOOL_SYSTEM;
+ }
+ }
+
+ 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 virtual memory. */
+ pool = gcvPOOL_VIRTUAL;
+ }
+
+ else
+ {
+ /* Out of pools. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ }
+
+ if (nodeObject == gcvNULL)
+ {
+ if (contiguous)
+ {
+ /* Broadcast OOM message. */
+ status = gckOS_Broadcast(Kernel->os, Kernel->hardware, gcvBROADCAST_OUT_OF_MEMORY);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ /* Get some memory. */
+ gckOS_Delay(gcvNULL, 1);
+ goto AllocateMemory;
+ }
+ }
+
+ /* Nothing allocated. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Return node and pool used for allocation. */
+ *Pool = pool;
+ *Bytes = bytes;
+ *NodeObject = nodeObject;
+
+ /* Return status. */
+ gcmkFOOTER_ARG("*Pool=%d *NodeObject=%p", *Pool, *NodeObject);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+
+/*******************************************************************************
+**
+** _AllocateLinearMemory
+**
+** Private function to allocate the requested amount of video memory, output
+** video memory handle.
+*/
+gceSTATUS
+_AllocateLinearMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gctUINT32 handle = 0;
+ gceDATABASE_TYPE dbType;
+ gcePOOL pool = (gcePOOL)Interface->u.AllocateLinearVideoMemory.pool;
+ gctSIZE_T bytes = (gctSIZE_T)Interface->u.AllocateLinearVideoMemory.bytes;
+ gctUINT32 alignment = Interface->u.AllocateLinearVideoMemory.alignment;
+ gceVIDMEM_TYPE type = (Interface->u.AllocateLinearVideoMemory.type & 0xFF);
+ gctUINT32 flag = Interface->u.AllocateLinearVideoMemory.flag;
+ gctUINT64 mappingInOne = 1;
+
+ gcmkHEADER_ARG("Kernel=%p pool=%d bytes=%lu alignment=%lu type=%d",
+ Kernel, pool, bytes, alignment, type);
+
+ gcmkVERIFY_ARGUMENT(bytes != 0);
+
+ if (Interface->u.AllocateLinearVideoMemory.sRAMIndex >= 0)
+ {
+ Kernel->sRAMIndex = Interface->u.AllocateLinearVideoMemory.sRAMIndex;
+ }
+
+ if (Interface->u.AllocateLinearVideoMemory.extSRAMIndex >= 0)
+ {
+ Kernel->extSRAMIndex = Interface->u.AllocateLinearVideoMemory.extSRAMIndex;
+ }
+
+ gckOS_QueryOption(Kernel->os, "allMapInOne", &mappingInOne);
+ if (mappingInOne == 0)
+ {
+ /* TODO: it should page align if driver uses dynamic mapping for mapped user memory.
+ * it should be adjusted with different os.
+ */
+ alignment = gcmALIGN(alignment, 4096);
+ }
+
+ /* Allocate video memory node. */
+ gcmkONERROR(
+ gckKERNEL_AllocateVideoMemory(Kernel,
+ alignment,
+ type,
+ flag,
+ &bytes,
+ &pool,
+ &nodeObject));
+
+ /* Allocate handle for this video memory. */
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Allocate(Kernel, nodeObject, &handle));
+
+ /* Return node and pool used for allocation. */
+ Interface->u.AllocateLinearVideoMemory.node = handle;
+ Interface->u.AllocateLinearVideoMemory.pool = pool;
+ Interface->u.AllocateLinearVideoMemory.bytes = bytes;
+
+ /* Encode surface type and pool to database type. */
+ dbType = gcvDB_VIDEO_MEMORY
+ | (type << gcdDB_VIDEO_MEMORY_TYPE_SHIFT)
+ | (pool << gcdDB_VIDEO_MEMORY_POOL_SHIFT);
+
+ /* Record in process db. */
+ gcmkONERROR(
+ gckKERNEL_AddProcessDB(Kernel,
+ ProcessID,
+ dbType,
+ gcmINT2PTR(handle),
+ gcvNULL,
+ bytes));
+
+ /* Return status. */
+ gcmkFOOTER_ARG("pool=%d node=0x%x", pool, handle);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (handle)
+ {
+ /* Destroy handle allocated. */
+ gcmkVERIFY_OK(gckVIDMEM_HANDLE_Dereference(Kernel, ProcessID, handle));
+ }
+
+ if (nodeObject)
+ {
+ /* Free video memory allocated. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(Kernel, nodeObject));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** _ReleaseVideoMemory
+**
+** Release handle of a video memory.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** ProcessID of current process.
+**
+** gctUINT32 Handle
+** Handle of video memory.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+_ReleaseVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 Handle
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject;
+ gceDATABASE_TYPE type;
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d Handle=%d",
+ Kernel, ProcessID, Handle);
+
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Lookup(Kernel, ProcessID, Handle, &nodeObject));
+
+ type = gcvDB_VIDEO_MEMORY
+ | (nodeObject->type << gcdDB_VIDEO_MEMORY_TYPE_SHIFT)
+ | (nodeObject->pool << gcdDB_VIDEO_MEMORY_POOL_SHIFT);
+
+ gcmkONERROR(
+ gckKERNEL_RemoveProcessDB(Kernel,
+ ProcessID,
+ type,
+ gcmINT2PTR(Handle)));
+
+ gckVIDMEM_HANDLE_Dereference(Kernel, ProcessID, Handle);
+
+ gckVIDMEM_NODE_Dereference(Kernel, nodeObject);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** _LockVideoMemory
+**
+** Lock a video memory node. It will generate a cpu virtual address used
+** by software and a GPU address used by GPU.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gceCORE Core
+** GPU to which video memory is locked.
+**
+** gcsHAL_INTERFACE * Interface
+** Pointer to a gcsHAL_INTERFACE structure that defines the command to
+** be dispatched.
+**
+** OUTPUT:
+**
+** gcsHAL_INTERFACE * Interface
+** Pointer to a gcsHAL_INTERFACE structure that receives any data to be
+** returned.
+*/
+static gceSTATUS
+_LockVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gceCORE Core,
+ IN gctUINT32 ProcessID,
+ IN OUT gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gctUINT32 handle;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gctBOOL referenced = gcvFALSE;
+ gctUINT32 address = gcvINVALID_ADDRESS;
+ gctPOINTER logical = gcvNULL;
+ gctPHYS_ADDR_T physical = gcvINVALID_PHYSICAL_ADDRESS;
+ gctUINT32 gid = 0;
+ gctBOOL asynchronous = gcvFALSE;
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d",
+ Kernel, ProcessID);
+
+ handle = Interface->u.LockVideoMemory.node;
+
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Lookup(Kernel, ProcessID, handle, &nodeObject));
+
+ /* Ref node. */
+ gcmkONERROR(gckVIDMEM_NODE_Reference(Kernel, nodeObject));
+ referenced = gcvTRUE;
+
+ /* Lock for userspace CPU userspace. */
+ gcmkONERROR(
+ gckVIDMEM_NODE_LockCPU(Kernel,
+ nodeObject,
+ Interface->u.LockVideoMemory.cacheable,
+ gcvTRUE,
+ &logical));
+
+ /* Lock for GPU address. */
+ gcmkONERROR(gckVIDMEM_NODE_Lock(Kernel, nodeObject, &address));
+
+ /* Get CPU physical address. */
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(Kernel, nodeObject, 0, &physical));
+ gcmkONERROR(gckVIDMEM_NODE_GetGid(Kernel, nodeObject, &gid));
+
+ Interface->u.LockVideoMemory.address = address;
+ Interface->u.LockVideoMemory.memory = gcmPTR_TO_UINT64(logical);
+ Interface->u.LockVideoMemory.physicalAddress = physical;
+ Interface->u.LockVideoMemory.gid = gid;
+
+ gcmkONERROR(
+ gckKERNEL_AddProcessDB(Kernel,
+ ProcessID,
+ gcvDB_VIDEO_MEMORY_LOCKED,
+ gcmINT2PTR(handle),
+ logical,
+ 0));
+
+ /* Ref handle. */
+ gckVIDMEM_HANDLE_Reference(Kernel, ProcessID, handle);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (logical)
+ {
+ gckVIDMEM_NODE_UnlockCPU(Kernel, nodeObject, ProcessID, gcvTRUE, gcvFALSE);
+ }
+
+ if (address != gcvINVALID_ADDRESS)
+ {
+ gckVIDMEM_NODE_Unlock(Kernel, nodeObject, ProcessID, &asynchronous);
+
+ if (asynchronous)
+ {
+ gckVIDMEM_NODE_Unlock(Kernel, nodeObject, ProcessID, gcvNULL);
+ }
+ }
+
+ if (referenced)
+ {
+ gckVIDMEM_NODE_Dereference(Kernel, nodeObject);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** _UnlockVideoMemory
+**
+** Unlock a video memory node.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** ProcessID of current process.
+**
+** gcsHAL_INTERFACE * Interface
+** Pointer to a gcsHAL_INTERFACE structure that defines the command to
+** be dispatched.
+**
+** OUTPUT:
+**
+** gcsHAL_INTERFACE * Interface
+** Pointer to a gcsHAL_INTERFACE structure that receives any data to be
+** returned.
+*/
+static gceSTATUS
+_UnlockVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN OUT gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject;
+ gcuVIDMEM_NODE_PTR node;
+ gckVIDMEM_BLOCK vidMemBlock = gcvNULL;
+ gctSIZE_T bytes;
+ gctUINT64 mappingInOne = 1;
+
+ gcmkHEADER_ARG("Kernel=%p 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
+ ));
+
+ gckOS_QueryOption(Kernel->os, "allMapInOne", &mappingInOne);
+ /* Unlock CPU. */
+ gcmkONERROR(gckVIDMEM_NODE_UnlockCPU(
+ Kernel, nodeObject, ProcessID, gcvTRUE, mappingInOne == 1));
+
+ /* Unlock video memory. */
+ gcmkONERROR(gckVIDMEM_NODE_Unlock(
+ Kernel,
+ nodeObject,
+ ProcessID,
+ &Interface->u.UnlockVideoMemory.asynchroneous
+ ));
+
+ /* Leave deref handle and deref node in later operation. */
+
+ node = nodeObject->node;
+
+ vidMemBlock = node->VirtualChunk.parent;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ bytes = node->VidMem.bytes;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ bytes = node->VirtualChunk.bytes;
+ }
+ else
+ {
+ bytes = node->Virtual.bytes;
+ }
+
+ Interface->u.UnlockVideoMemory.pool = nodeObject->pool;
+ Interface->u.UnlockVideoMemory.bytes = bytes;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /*
+ * Unlikely to fail expect error node or unlocked, there's no error roll
+ * back requried for those two conditions.
+ */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** _BottomHalfUnlockVideoMemory
+**
+** Unlock video memory from gpu.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** Process ID owning this memory.
+**
+** gceVIDMEM_TYPE
+** Video memory allocation type.
+**
+** gctPOINTER Pointer
+** Video memory to be unlock.
+*/
+static gceSTATUS
+_BottomHalfUnlockVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Node
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+
+ /* Remove record from process db. */
+ gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(
+ Kernel,
+ ProcessID,
+ gcvDB_VIDEO_MEMORY_LOCKED,
+ gcmINT2PTR(Node)
+ ));
+
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(
+ Kernel,
+ ProcessID,
+ Node,
+ &nodeObject
+ ));
+
+ /* Deref handle. */
+ gckVIDMEM_HANDLE_Dereference(Kernel, ProcessID, Node);
+
+ /* Unlock video memory, synced. */
+ gcmkONERROR(gckVIDMEM_NODE_Unlock(Kernel, nodeObject, ProcessID, gcvNULL));
+
+ /* Deref node. */
+ gcmkONERROR(gckVIDMEM_NODE_Dereference(Kernel, nodeObject));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_WrapUserMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gceDATABASE_TYPE type;
+ gctUINT32 handle = 0;
+
+ gcmkONERROR(
+ gckVIDMEM_NODE_WrapUserMemory(Kernel,
+ &Interface->u.WrapUserMemory.desc,
+ Interface->u.WrapUserMemory.type,
+ &nodeObject,
+ &Interface->u.WrapUserMemory.bytes));
+
+ /* Create handle representation for userspace. */
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Allocate(Kernel,
+ nodeObject,
+ &handle));
+
+ type = gcvDB_VIDEO_MEMORY
+ | (nodeObject->type << gcdDB_VIDEO_MEMORY_TYPE_SHIFT)
+ | (nodeObject->pool << gcdDB_VIDEO_MEMORY_POOL_SHIFT);
+
+ gcmkONERROR(
+ gckKERNEL_AddProcessDB(Kernel,
+ ProcessID,
+ type,
+ gcmINT2PTR(handle),
+ gcvNULL,
+ (gctSIZE_T)Interface->u.WrapUserMemory.bytes));
+
+ Interface->u.WrapUserMemory.node = handle;
+ return gcvSTATUS_OK;
+
+OnError:
+ if (handle)
+ {
+ gckVIDMEM_HANDLE_Dereference(Kernel, ProcessID, handle);
+ }
+
+ if (nodeObject)
+ {
+ gckVIDMEM_NODE_Dereference(Kernel, nodeObject);
+ }
+
+ return status;
+}
+
+static gceSTATUS
+_ExportVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Lookup(Kernel,
+ ProcessID,
+ Interface->u.ExportVideoMemory.node,
+ &nodeObject));
+
+ gcmkONERROR(
+ gckVIDMEM_NODE_Export(Kernel,
+ nodeObject,
+ Interface->u.ExportVideoMemory.flags,
+ gcvNULL,
+ &Interface->u.ExportVideoMemory.fd));
+
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_NameVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Lookup(Kernel,
+ ProcessID,
+ Interface->u.NameVideoMemory.handle,
+ &nodeObject));
+
+ gcmkONERROR(
+ gckVIDMEM_NODE_Name(Kernel,
+ nodeObject,
+ &Interface->u.NameVideoMemory.name));
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_ImportVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gctUINT32 handle = 0;
+
+ gcmkONERROR(
+ gckVIDMEM_NODE_Import(Kernel,
+ Interface->u.ImportVideoMemory.name,
+ &nodeObject));
+
+ /* Create handle representation for userspace. */
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Allocate(Kernel,
+ nodeObject,
+ &handle));
+
+ gcmkONERROR(
+ gckKERNEL_AddProcessDB(Kernel,
+ ProcessID,
+ gcvDB_VIDEO_MEMORY,
+ gcmINT2PTR(handle),
+ gcvNULL,
+ 0));
+
+ Interface->u.ImportVideoMemory.handle = handle;
+ return gcvSTATUS_OK;
+
+OnError:
+ if (handle)
+ {
+ gckVIDMEM_HANDLE_Dereference(Kernel, ProcessID, handle);
+ }
+
+ if (nodeObject)
+ {
+ gckVIDMEM_NODE_Dereference(Kernel, nodeObject);
+ }
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_SetVidMemMetadata
+**
+** Set/Get metadata to/from gckVIDMEM_NODE object.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** ProcessID of current process.
+**
+** INOUT:
+**
+** gcsHAL_INTERFACE * Interface
+** Pointer to a interface structure
+*/
+#if defined(CONFIG_DMA_SHARED_BUFFER)
+#include <linux/dma-buf.h>
+
+gceSTATUS
+_SetVidMemMetadata(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ INOUT gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status = gcvSTATUS_NOT_SUPPORTED;
+ gckVIDMEM_NODE nodeObj = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d", Kernel, ProcessID);
+
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(Kernel, ProcessID, Interface->u.SetVidMemMetadata.node, &nodeObj));
+
+ if (Interface->u.SetVidMemMetadata.readback)
+ {
+ Interface->u.SetVidMemMetadata.ts_fd = nodeObj->metadata.ts_fd;
+ Interface->u.SetVidMemMetadata.fc_enabled = nodeObj->metadata.fc_enabled;
+ Interface->u.SetVidMemMetadata.fc_value = nodeObj->metadata.fc_value;
+ Interface->u.SetVidMemMetadata.fc_value_upper = nodeObj->metadata.fc_value_upper;
+ Interface->u.SetVidMemMetadata.compressed = nodeObj->metadata.compressed;
+ Interface->u.SetVidMemMetadata.compress_format = nodeObj->metadata.compress_format;
+ }
+ else
+ {
+#ifdef gcdANDROID
+ if (nodeObj->metadata.ts_address == 0 && nodeObj->tsNode != NULL)
+ {
+ gctUINT32 PhysicalAddress = 0;
+
+ /* Lock for GPU address. */
+ gcmkONERROR(gckVIDMEM_NODE_Lock(Kernel, nodeObj->tsNode, &PhysicalAddress));
+
+ nodeObj->metadata.ts_address = (
+ PhysicalAddress + Kernel->hardware->baseAddress);
+
+ gcmkONERROR(gckVIDMEM_NODE_Unlock(Kernel, nodeObj->tsNode, ProcessID, gcvNULL));
+ }
+#else
+ nodeObj->metadata.ts_fd = Interface->u.SetVidMemMetadata.ts_fd;
+
+ if (nodeObj->metadata.ts_fd >= 0)
+ {
+ nodeObj->metadata.ts_dma_buf = dma_buf_get(nodeObj->metadata.ts_fd);
+
+ if (IS_ERR(nodeObj->metadata.ts_dma_buf))
+ {
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+
+ dma_buf_put(nodeObj->metadata.ts_dma_buf);
+ }
+ else
+ {
+ nodeObj->metadata.ts_dma_buf = NULL;
+ }
+#endif
+
+ nodeObj->metadata.fc_enabled = Interface->u.SetVidMemMetadata.fc_enabled;
+ nodeObj->metadata.fc_value = Interface->u.SetVidMemMetadata.fc_value;
+ nodeObj->metadata.fc_value_upper = Interface->u.SetVidMemMetadata.fc_value_upper;
+ nodeObj->metadata.compressed = Interface->u.SetVidMemMetadata.compressed;
+ nodeObj->metadata.compress_format = Interface->u.SetVidMemMetadata.compress_format;
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+#else
+
+gceSTATUS
+_SetVidMemMetadata(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ INOUT gcsHAL_INTERFACE * Interface
+ )
+{
+ gcmkFATAL("The kernel did NOT support CONFIG_DMA_SHARED_BUFFER");
+ return gcvSTATUS_NOT_SUPPORTED;
+}
+#endif
+
+static gceSTATUS
+_GetVideoMemoryFd(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Lookup(Kernel,
+ ProcessID,
+ Interface->u.GetVideoMemoryFd.handle,
+ &nodeObject));
+
+ gcmkONERROR(
+ gckVIDMEM_NODE_GetFd(Kernel,
+ nodeObject,
+ &Interface->u.GetVideoMemoryFd.fd));
+
+ /* No need to add it to processDB because OS will release all fds when
+ ** process quits.
+ */
+OnError:
+ return status;
+}
+
+
+gceSTATUS
+gckKERNEL_QueryDatabase(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN OUT gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gctINT i;
+
+ gceDATABASE_TYPE type[2] = {
+ gcvDB_VIDEO_MEMORY | (gcvPOOL_SYSTEM << gcdDB_VIDEO_MEMORY_POOL_SHIFT),
+ gcvDB_VIDEO_MEMORY | (gcvPOOL_VIRTUAL << gcdDB_VIDEO_MEMORY_POOL_SHIFT),
+ };
+
+ gcmkHEADER();
+
+ /* Query video memory. */
+ gcmkONERROR(
+ gckKERNEL_QueryProcessDB(Kernel,
+ Interface->u.Database.processID,
+ !Interface->u.Database.validProcessID,
+ gcvDB_VIDEO_MEMORY,
+ &Interface->u.Database.vidMem));
+
+ /* Query non-paged memory. */
+ gcmkONERROR(
+ gckKERNEL_QueryProcessDB(Kernel,
+ Interface->u.Database.processID,
+ !Interface->u.Database.validProcessID,
+ gcvDB_NON_PAGED,
+ &Interface->u.Database.nonPaged));
+
+ /* Query GPU idle time. */
+ gcmkONERROR(
+ gckKERNEL_QueryProcessDB(Kernel,
+ Interface->u.Database.processID,
+ !Interface->u.Database.validProcessID,
+ gcvDB_IDLE,
+ &Interface->u.Database.gpuIdle));
+ for (i = 0; i < 2; i++)
+ {
+ /* Query each video memory pool. */
+ gcmkONERROR(
+ gckKERNEL_QueryProcessDB(Kernel,
+ Interface->u.Database.processID,
+ !Interface->u.Database.validProcessID,
+ type[i],
+ &Interface->u.Database.vidMemPool[i]));
+ }
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ gckKERNEL_DumpVidMemUsage(Kernel, Interface->u.Database.processID);
+#endif
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_ConfigPowerManagement(
+ IN gckKERNEL Kernel,
+ IN OUT gcsHAL_INTERFACE * Interface
+)
+{
+ gceSTATUS status;
+ gctBOOL enable = Interface->u.ConfigPowerManagement.enable;
+
+ gcmkHEADER();
+
+ gcmkONERROR(gckHARDWARE_EnablePowerManagement(Kernel->hardware, enable));
+
+ if (enable == gcvFALSE)
+ {
+ gcmkONERROR(
+ gckHARDWARE_SetPowerState(Kernel->hardware, gcvPOWER_ON));
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+
+static gceSTATUS
+gckKERNEL_CacheOperation(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 Node,
+ IN gceCACHEOPERATION Operation,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+ gckVIDMEM_BLOCK vidMemBlock = gcvNULL;
+ gctSIZE_T offset = 0;
+ void *memHandle;
+
+ gcmkHEADER_ARG("Kernel=%p pid=%u Node=%u op=%d Logical=%p Bytes=0x%lx",
+ Kernel, ProcessID, Node, Operation, Logical, Bytes);
+
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(Kernel,
+ ProcessID,
+ Node,
+ &nodeObject));
+
+ node = nodeObject->node;
+
+ vidMemBlock = node->VirtualChunk.parent;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ static gctBOOL printed;
+
+ if (!printed)
+ {
+ printed = gcvTRUE;
+ gcmkPRINT("[galcore]: %s: Flush Video Memory", __FUNCTION__);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ memHandle = vidMemBlock->physical;
+ offset = node->VirtualChunk.offset;
+ }
+ else
+ {
+ memHandle = node->Virtual.physical;
+ }
+
+ switch (Operation)
+ {
+ case gcvCACHE_FLUSH:
+ /* Clean and invalidate the cache. */
+ status = gckOS_CacheFlush(Kernel->os,
+ ProcessID,
+ memHandle,
+ offset,
+ Logical,
+ Bytes);
+ break;
+ case gcvCACHE_CLEAN:
+ /* Clean the cache. */
+ status = gckOS_CacheClean(Kernel->os,
+ ProcessID,
+ memHandle,
+ offset,
+ Logical,
+ Bytes);
+ break;
+ case gcvCACHE_INVALIDATE:
+ /* Invalidate the cache. */
+ status = gckOS_CacheInvalidate(Kernel->os,
+ ProcessID,
+ memHandle,
+ offset,
+ Logical,
+ Bytes);
+ break;
+
+ case gcvCACHE_MEMORY_BARRIER:
+ status = gckOS_MemoryBarrier(Kernel->os, Logical);
+ break;
+
+ default:
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ break;
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_WaitFence(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE node;
+ gckCOMMAND command = Kernel->command;
+ gckCOMMAND asyncCommand = Kernel->asyncCommand;
+ gckFENCE fence = gcvNULL;
+ gctUINT i;
+
+ gcmkASSERT(command != gcvNULL);
+
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Lookup(Kernel,
+ ProcessID,
+ Interface->u.WaitFence.handle,
+ &node));
+
+ gcmkONERROR(gckVIDMEM_NODE_Reference(Kernel, node));
+
+ /* Wait for fence of all engines. */
+ for (i = 0; i < gcvENGINE_GPU_ENGINE_COUNT; i++)
+ {
+ gckFENCE_SYNC sync = &node->sync[i];
+
+ if (i == gcvENGINE_RENDER)
+ {
+ fence = command->fence;
+ }
+ else
+ {
+ fence = asyncCommand->fence;
+ }
+
+ gcmkONERROR(gckVIDMEM_NODE_InvalidateCache(
+ Kernel,
+ fence->videoMem,
+ 0,
+ fence->logical,
+ 8
+ ));
+
+ if (sync->commitStamp <= *(gctUINT64_PTR)fence->logical)
+ {
+ continue;
+ }
+ else
+ {
+ gckOS_Signal(Kernel->os, sync->signal, gcvFALSE);
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, &fence->mutex, gcvINFINITE));
+
+ /* Add to waiting list. */
+ gcsLIST_AddTail(&sync->head, &fence->waitingList);
+
+ gcmkASSERT(sync->inList == gcvFALSE);
+
+ sync->inList = gcvTRUE;
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, &fence->mutex));
+
+ /* Wait. */
+ status = gckOS_WaitSignal(
+ Kernel->os,
+ sync->signal,
+ gcvTRUE,
+ Interface->u.WaitFence.timeOut
+ );
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, &fence->mutex, gcvINFINITE));
+
+ if (sync->inList)
+ {
+ gcsLIST_Del(&sync->head);
+ sync->inList = gcvFALSE;
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, &fence->mutex));
+ }
+ }
+
+ gckVIDMEM_NODE_Dereference(Kernel, node);
+
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_Commit(
+ IN gckDEVICE Device,
+ IN gceHARDWARE_TYPE HwType,
+ IN gceENGINE Engine,
+ IN gctUINT32 ProcessId,
+ IN OUT gcsHAL_COMMIT * Commit
+ )
+{
+ gceSTATUS status;
+ gcsHAL_SUBCOMMIT *subCommit = &Commit->subCommit;
+ gcsHAL_SUBCOMMIT _subCommit;
+ gctPOINTER userPtr = gcvNULL;
+ gctBOOL needCopy = gcvFALSE;
+ gckKERNEL kernel;
+
+ gcmkVERIFY_OK(gckOS_QueryNeedCopy(Device->os, ProcessId, &needCopy));
+
+ do
+ {
+ gckCOMMAND command;
+ gckEVENT eventObj;
+ gctUINT64 next;
+
+ /* Skip the first nested sub-commit struct. */
+ if (userPtr)
+ {
+ /* Copy/map sub-commit from user. */
+ if (needCopy)
+ {
+ subCommit = &_subCommit;
+
+ status = gckOS_CopyFromUserData(
+ Device->os,
+ subCommit,
+ userPtr,
+ gcmSIZEOF(gcsHAL_SUBCOMMIT)
+ );
+ }
+ else
+ {
+ status = gckOS_MapUserPointer(
+ Device->os,
+ userPtr,
+ gcmSIZEOF(gcsHAL_SUBCOMMIT),
+ (gctPOINTER *)&subCommit
+ );
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ userPtr = gcvNULL;
+
+ gcmkONERROR(status);
+ }
+ }
+
+ if (subCommit->coreId >= gcvCORE_COUNT)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ /* Determine the objects. */
+ kernel = Device->map[HwType].kernels[subCommit->coreId];
+ if (Engine == gcvENGINE_BLT)
+ {
+ command = kernel->asyncCommand;
+ eventObj = kernel->asyncEvent;
+ }
+ else
+ {
+ command = kernel->command;
+ eventObj = kernel->eventObj;
+ }
+ gcmkONERROR(gckOS_Broadcast(kernel->os,
+ kernel->hardware,
+ gcvBROADCAST_GPU_COMMIT));
+
+ {
+ /* Commit command buffers. */
+ status = gckCOMMAND_Commit(command,
+ subCommit,
+ ProcessId,
+ Commit->shared,
+ &Commit->commitStamp,
+ &Commit->contextSwitched);
+
+ if (status != gcvSTATUS_INTERRUPTED)
+ {
+ gcmkONERROR(status);
+ }
+
+ /* Commit events. */
+ status = gckEVENT_Commit(
+ eventObj,
+ gcmUINT64_TO_PTR(subCommit->queue),
+ kernel->hardware->options.powerManagement
+ );
+
+ if (status != gcvSTATUS_INTERRUPTED)
+ {
+ gcmkONERROR(status);
+ }
+ }
+
+ next = subCommit->next;
+
+ /* Unmap user pointer if mapped. */
+ if (!needCopy && userPtr)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Device->os,
+ userPtr,
+ gcmSIZEOF(gcsHAL_SUBCOMMIT),
+ subCommit
+ ));
+ }
+
+ /* Advance to next sub-commit from user. */
+ userPtr = gcmUINT64_TO_PTR(next);
+ }
+ while (userPtr);
+
+ subCommit = &Commit->subCommit;
+ userPtr = gcvNULL;
+ kernel = Device->map[HwType].kernels[subCommit->coreId];
+
+ if (!kernel->hardware->options.gpuProfiler || !kernel->profileEnable)
+ {
+ return gcvSTATUS_OK;
+ }
+
+ do
+ {
+ gctUINT64 next;
+
+ /* Skip the first nested sub-commit struct. */
+ if (userPtr)
+ {
+ /* Copy/map sub-commit from user. */
+ if (needCopy)
+ {
+ subCommit = &_subCommit;
+
+ status = gckOS_CopyFromUserData(
+ Device->os,
+ subCommit,
+ userPtr,
+ gcmSIZEOF(gcsHAL_SUBCOMMIT)
+ );
+ }
+ else
+ {
+ status = gckOS_MapUserPointer(
+ Device->os,
+ userPtr,
+ gcmSIZEOF(gcsHAL_SUBCOMMIT),
+ (gctPOINTER *)&subCommit
+ );
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ userPtr = gcvNULL;
+
+ gcmkONERROR(status);
+ }
+ }
+
+ kernel = Device->map[HwType].kernels[subCommit->coreId];
+
+ if ((kernel->hardware->options.gpuProfiler == gcvTRUE) &&
+ (kernel->profileEnable == gcvTRUE))
+ {
+ gcmkONERROR(gckCOMMAND_Stall(kernel->command, gcvTRUE));
+
+ if (kernel->command->currContext)
+ {
+ gcmkONERROR(gckHARDWARE_UpdateContextProfile(
+ kernel->hardware,
+ kernel->command->currContext));
+ }
+ }
+
+ next = subCommit->next;
+
+ /* Unmap user pointer if mapped. */
+ if (!needCopy && userPtr)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Device->os,
+ userPtr,
+ gcmSIZEOF(gcsHAL_SUBCOMMIT),
+ subCommit
+ ));
+ }
+
+ /* Advance to next sub-commit from user. */
+ userPtr = gcmUINT64_TO_PTR(next);
+ }
+ while (userPtr);
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (!needCopy && userPtr)
+ {
+ gckOS_UnmapUserPointer(
+ Device->os,
+ userPtr,
+ gcmSIZEOF(gcsHAL_SUBCOMMIT),
+ subCommit
+ );
+ }
+
+ 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 && Node[i] != 0; i++)
+ {
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Lookup(Kernel, ProcessID, Node[i], &nodeObject));
+
+ gcmkONERROR(gckVIDMEM_NODE_Reference(Kernel, nodeObject));
+
+ parcle->node[i] = nodeObject;
+ }
+
+ 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
+**
+** Dispatch a command received from the user HAL layer.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gcsHAL_INTERFACE * Interface
+** Pointer to a gcsHAL_INTERFACE structure that defines the command to
+** be dispatched.
+**
+** OUTPUT:
+**
+** gcsHAL_INTERFACE * Interface
+** Pointer to a gcsHAL_INTERFACE structure that receives any data to be
+** returned.
+*/
+gceSTATUS
+gckKERNEL_Dispatch(
+ IN gckKERNEL Kernel,
+ IN gckDEVICE Device,
+ IN OUT gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctPHYS_ADDR physical = gcvNULL;
+ gctSIZE_T bytes;
+ gctPOINTER logical = gcvNULL;
+#if (gcdENABLE_3D || gcdENABLE_2D)
+ gckCONTEXT context = gcvNULL;
+#endif
+ gckKERNEL kernel = Kernel;
+ gctUINT32 processID;
+#if !USE_NEW_LINUX_SIGNAL
+ gctSIGNAL signal;
+#endif
+
+ gctBOOL powerMutexAcquired = gcvFALSE;
+ gctBOOL commitMutexAcquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Kernel=%p Interface=%p", Kernel, Interface);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Interface != gcvNULL);
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_KERNEL,
+ "Dispatching command %d (%s)",
+ Interface->command, _DispatchText[Interface->command]);
+
+ gcmSTATIC_ASSERT(gcvHAL_DESTROY_MMU == gcmCOUNTOF(_DispatchText) - 1,
+ "DispatchText array does not match command codes");
+#endif
+#if QNX_SINGLE_THREADED_DEBUGGING
+ gckOS_AcquireMutex(Kernel->os, Kernel->debugMutex, gcvINFINITE);
+#endif
+
+ /* Get the current process ID. */
+ gcmkONERROR(gckOS_GetProcessID(&processID));
+
+ /* Dispatch on command. */
+ switch (Interface->command)
+ {
+ case gcvHAL_GET_BASE_ADDRESS:
+ /* Get base address. */
+ Interface->u.GetBaseAddress.baseAddress = Kernel->hardware->baseAddress;
+ Interface->u.GetBaseAddress.flatMappingRangeCount = Kernel->mmu->gpuPhysicalRangeCount;
+ if (Kernel->mmu->gpuPhysicalRangeCount)
+ {
+ gckOS_MemCopy(Interface->u.GetBaseAddress.flatMappingRanges, Kernel->mmu->gpuPhysicalRanges,
+ gcmSIZEOF(gcsFLAT_MAPPING_RANGE) * Kernel->mmu->gpuPhysicalRangeCount);
+ }
+ break;
+
+ case gcvHAL_QUERY_VIDEO_MEMORY:
+ /* Query video memory size. */
+ gcmkONERROR(gckKERNEL_QueryVideoMemory(Kernel, Interface));
+ break;
+
+ case gcvHAL_QUERY_CHIP_IDENTITY:
+ /* Query chip identity. */
+ gcmkONERROR(
+ gckHARDWARE_QueryChipIdentity(
+ Kernel->hardware,
+ &Interface->u.QueryChipIdentity));
+ break;
+
+ case gcvHAL_QUERY_CHIP_FREQUENCY:
+ /* Query chip clock. */
+ gcmkONERROR(
+ gckHARDWARE_QueryFrequency(Kernel->hardware));
+
+ Interface->u.QueryChipFrequency.mcClk = Kernel->hardware->mcClk;
+ Interface->u.QueryChipFrequency.shClk = Kernel->hardware->shClk;
+ break;
+
+ case gcvHAL_MAP_MEMORY:
+ physical = gcmINT2PTR(Interface->u.MapMemory.physName);
+
+ /* Map memory. */
+ gcmkONERROR(
+ gckKERNEL_MapMemory(Kernel,
+ physical,
+ (gctSIZE_T) Interface->u.MapMemory.bytes,
+ &logical));
+
+ Interface->u.MapMemory.logical = gcmPTR_TO_UINT64(logical);
+
+ gcmkVERIFY_OK(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID, gcvDB_MAP_MEMORY,
+ logical,
+ physical,
+ (gctSIZE_T) Interface->u.MapMemory.bytes));
+ break;
+
+ case gcvHAL_UNMAP_MEMORY:
+ physical = gcmINT2PTR(Interface->u.UnmapMemory.physName);
+
+ gcmkVERIFY_OK(
+ gckKERNEL_RemoveProcessDB(Kernel,
+ processID, gcvDB_MAP_MEMORY,
+ gcmUINT64_TO_PTR(Interface->u.UnmapMemory.logical)));
+
+ /* Unmap memory. */
+ gcmkONERROR(
+ gckKERNEL_UnmapMemory(Kernel,
+ physical,
+ (gctSIZE_T) Interface->u.UnmapMemory.bytes,
+ gcmUINT64_TO_PTR(Interface->u.UnmapMemory.logical),
+ processID));
+ break;
+
+ case gcvHAL_ALLOCATE_NON_PAGED_MEMORY:
+ bytes = (gctSIZE_T) Interface->u.AllocateNonPagedMemory.bytes;
+
+ /* Allocate non-paged memory. */
+ gcmkONERROR(
+ gckOS_AllocateNonPagedMemory(
+ Kernel->os,
+ gcvTRUE,
+ gcvALLOC_FLAG_CONTIGUOUS,
+ &bytes,
+ &physical,
+ &logical));
+
+ Interface->u.AllocateNonPagedMemory.bytes = bytes;
+ Interface->u.AllocateNonPagedMemory.logical = gcmPTR_TO_UINT64(logical);
+ Interface->u.AllocateNonPagedMemory.physName = gcmPTR_TO_NAME(physical);
+
+ gcmkVERIFY_OK(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID, gcvDB_NON_PAGED,
+ logical,
+ gcmINT2PTR(Interface->u.AllocateNonPagedMemory.physName),
+ bytes));
+ break;
+
+ case gcvHAL_FREE_NON_PAGED_MEMORY:
+ physical = gcmNAME_TO_PTR(Interface->u.FreeNonPagedMemory.physName);
+
+ gcmkVERIFY_OK(
+ gckKERNEL_RemoveProcessDB(Kernel,
+ processID, gcvDB_NON_PAGED,
+ gcmUINT64_TO_PTR(Interface->u.FreeNonPagedMemory.logical)));
+
+ /* Free non-paged memory. */
+ gcmkONERROR(
+ gckOS_FreeNonPagedMemory(Kernel->os,
+ physical,
+ gcmUINT64_TO_PTR(Interface->u.FreeNonPagedMemory.logical),
+ (gctSIZE_T) Interface->u.FreeNonPagedMemory.bytes));
+
+ gcmRELEASE_NAME(Interface->u.FreeNonPagedMemory.physName);
+ break;
+
+ case gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY:
+ /* Allocate memory. */
+ gcmkONERROR(_AllocateLinearMemory(Kernel, processID, Interface));
+ break;
+
+ case gcvHAL_RELEASE_VIDEO_MEMORY:
+ /* Release video memory. */
+ gcmkONERROR(_ReleaseVideoMemory(
+ Kernel, processID,
+ (gctUINT32)Interface->u.ReleaseVideoMemory.node
+ ));
+ break;
+
+ case gcvHAL_LOCK_VIDEO_MEMORY:
+ /* Lock video memory. */
+ gcmkONERROR(_LockVideoMemory(Kernel, Kernel->core, processID, Interface));
+ break;
+
+ case gcvHAL_UNLOCK_VIDEO_MEMORY:
+ /* Unlock video memory. */
+ gcmkONERROR(_UnlockVideoMemory(Kernel, processID, Interface));
+ break;
+
+ case gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY:
+ gcmkERR_BREAK(_BottomHalfUnlockVideoMemory(Kernel, processID,
+ Interface->u.BottomHalfUnlockVideoMemory.type,
+ Interface->u.BottomHalfUnlockVideoMemory.node));
+ break;
+
+ case gcvHAL_EVENT_COMMIT:
+ if (!Interface->commitMutex)
+ {
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os,
+ Kernel->device->commitMutex,
+ gcvINFINITE
+ ));
+
+ commitMutexAcquired = gcvTRUE;
+ }
+ /* Commit an event queue. */
+ if (Interface->engine == gcvENGINE_BLT)
+ {
+ if (!gckHARDWARE_IsFeatureAvailable(Kernel->hardware, gcvFEATURE_ASYNC_BLIT))
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ gcmkONERROR(gckEVENT_Commit(
+ Kernel->asyncEvent, gcmUINT64_TO_PTR(Interface->u.Event.queue), gcvFALSE));
+ }
+ else
+ {
+ gcmkONERROR(gckEVENT_Commit(
+ Kernel->eventObj, gcmUINT64_TO_PTR(Interface->u.Event.queue), gcvFALSE));
+ }
+
+ if (!Interface->commitMutex)
+ {
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex));
+ commitMutexAcquired = gcvFALSE;
+ }
+ break;
+
+ case gcvHAL_COMMIT:
+ if (!Interface->commitMutex)
+ {
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os,
+ Device->commitMutex,
+ gcvINFINITE
+ ));
+ commitMutexAcquired = gcvTRUE;
+ }
+
+ gcmkONERROR(_Commit(Device,
+ Kernel->hardware->type,
+ Interface->engine,
+ processID,
+ &Interface->u.Commit));
+
+ if (!Interface->commitMutex)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Device->commitMutex));
+ commitMutexAcquired = gcvFALSE;
+ }
+ break;
+
+#if !USE_NEW_LINUX_SIGNAL
+ case gcvHAL_USER_SIGNAL:
+ /* Dispatch depends on the user signal subcommands. */
+ switch(Interface->u.UserSignal.command)
+ {
+ case gcvUSER_SIGNAL_CREATE:
+ /* Create a signal used in the user space. */
+ gcmkONERROR(
+ gckOS_CreateUserSignal(Kernel->os,
+ Interface->u.UserSignal.manualReset,
+ &Interface->u.UserSignal.id));
+
+ gcmkVERIFY_OK(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID, gcvDB_SIGNAL,
+ gcmINT2PTR(Interface->u.UserSignal.id),
+ gcvNULL,
+ 0));
+ break;
+
+ case gcvUSER_SIGNAL_DESTROY:
+ gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(
+ Kernel,
+ processID, gcvDB_SIGNAL,
+ gcmINT2PTR(Interface->u.UserSignal.id)));
+
+ /* Destroy the signal. */
+ gcmkONERROR(
+ gckOS_DestroyUserSignal(Kernel->os,
+ Interface->u.UserSignal.id));
+ break;
+
+ case gcvUSER_SIGNAL_SIGNAL:
+ /* Signal the signal. */
+ gcmkONERROR(
+ gckOS_SignalUserSignal(Kernel->os,
+ Interface->u.UserSignal.id,
+ Interface->u.UserSignal.state));
+ break;
+
+ case gcvUSER_SIGNAL_WAIT:
+ /* Wait on the signal. */
+ status = gckOS_WaitUserSignal(Kernel->os,
+ Interface->u.UserSignal.id,
+ Interface->u.UserSignal.wait);
+ break;
+
+ case gcvUSER_SIGNAL_MAP:
+ gcmkONERROR(
+ gckOS_MapSignal(Kernel->os,
+ (gctSIGNAL)(gctUINTPTR_T)Interface->u.UserSignal.id,
+ (gctHANDLE)(gctUINTPTR_T)processID,
+ &signal));
+
+ gcmkVERIFY_OK(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID, gcvDB_SIGNAL,
+ gcmINT2PTR(Interface->u.UserSignal.id),
+ gcvNULL,
+ 0));
+ break;
+
+ case gcvUSER_SIGNAL_UNMAP:
+ gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(
+ Kernel,
+ processID, gcvDB_SIGNAL,
+ gcmINT2PTR(Interface->u.UserSignal.id)));
+
+ /* Destroy the signal. */
+ gcmkONERROR(
+ gckOS_DestroyUserSignal(Kernel->os,
+ Interface->u.UserSignal.id));
+ break;
+
+ default:
+ /* Invalid user signal command. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+ break;
+#endif
+
+ case gcvHAL_SET_POWER_MANAGEMENT_STATE:
+ /* Set the power management state. */
+ gcmkONERROR(
+ gckHARDWARE_SetPowerState(Kernel->hardware,
+ Interface->u.SetPowerManagement.state));
+ break;
+
+ case gcvHAL_QUERY_POWER_MANAGEMENT_STATE:
+ /* Chip is not idle. */
+ Interface->u.QueryPowerManagement.isIdle = gcvFALSE;
+
+ /* Query the power management state. */
+ gcmkONERROR(gckHARDWARE_QueryPowerState(
+ Kernel->hardware,
+ &Interface->u.QueryPowerManagement.state));
+
+ /* Query the idle state. */
+ gcmkONERROR(
+ gckHARDWARE_QueryIdle(Kernel->hardware,
+ &Interface->u.QueryPowerManagement.isIdle));
+ break;
+
+ case gcvHAL_READ_REGISTER:
+#if gcdREGISTER_READ_FROM_USER
+ {
+ gceCHIPPOWERSTATE power;
+
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->hardware->powerMutex, gcvINFINITE));
+ powerMutexAcquired = gcvTRUE;
+ gcmkONERROR(gckHARDWARE_QueryPowerState(Kernel->hardware,
+ &power));
+ if (power == gcvPOWER_ON)
+ {
+ /* Read a register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(
+ Kernel->os,
+ Kernel->core,
+ Interface->u.ReadRegisterData.address,
+ &Interface->u.ReadRegisterData.data));
+ }
+ else
+ {
+ /* Chip is in power-state. */
+ Interface->u.ReadRegisterData.data = 0;
+ status = gcvSTATUS_CHIP_NOT_READY;
+ }
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->hardware->powerMutex));
+ powerMutexAcquired = gcvFALSE;
+ }
+#else
+ /* No access from user land to read registers. */
+ Interface->u.ReadRegisterData.data = 0;
+ status = gcvSTATUS_NOT_SUPPORTED;
+#endif
+ break;
+
+ case gcvHAL_WRITE_REGISTER:
+#if gcdREGISTER_WRITE_FROM_USER
+ {
+ gceCHIPPOWERSTATE power;
+
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->hardware->powerMutex, gcvINFINITE));
+ powerMutexAcquired = gcvTRUE;
+ gcmkONERROR(gckHARDWARE_QueryPowerState(Kernel->hardware,
+ &power));
+ if (power == gcvPOWER_ON)
+ {
+ /* Write a register. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Kernel->os,
+ Kernel->core,
+ Interface->u.WriteRegisterData.address,
+ Interface->u.WriteRegisterData.data));
+ }
+ else
+ {
+ /* Chip is in power-state. */
+ Interface->u.WriteRegisterData.data = 0;
+ status = gcvSTATUS_CHIP_NOT_READY;
+ }
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->hardware->powerMutex));
+ powerMutexAcquired = gcvFALSE;
+ }
+#else
+ /* No access from user land to write registers. */
+ status = gcvSTATUS_NOT_SUPPORTED;
+#endif
+ break;
+
+ case gcvHAL_READ_ALL_PROFILE_REGISTERS_PART1:
+ /* Read profile data according to the context. */
+ gcmkONERROR(
+ gckHARDWARE_QueryContextProfile(
+ Kernel->hardware,
+ Kernel->profileCleanRegister,
+ gcmNAME_TO_PTR(Interface->u.RegisterProfileData_part1.context),
+ &Interface->u.RegisterProfileData_part1.Counters,
+ gcvNULL));
+ break;
+ 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;
+#endif
+
+ status = gcvSTATUS_OK;
+ break;
+
+ case gcvHAL_SET_PROFILE_SETTING:
+#if VIVANTE_PROFILER
+ /* Set profile setting */
+ if(Kernel->hardware->options.gpuProfiler)
+ {
+ Kernel->profileEnable = Interface->u.SetProfileSetting.enable;
+
+ if (Kernel->profileEnable)
+ {
+ gcmkONERROR(gckHARDWARE_InitProfiler(Kernel->hardware));
+ }
+
+ }
+ else
+ {
+ status = gcvSTATUS_NOT_SUPPORTED;
+ break;
+ }
+#endif
+
+ status = gcvSTATUS_OK;
+ break;
+
+ case gcvHAL_READ_PROFILER_REGISTER_SETTING:
+ Kernel->profileCleanRegister = Interface->u.SetProfilerRegisterClear.bclear;
+ status = gcvSTATUS_OK;
+ break;
+
+ case gcvHAL_RESET:
+ /* Reset the hardware. */
+ gcmkONERROR(
+ gckHARDWARE_Reset(Kernel->hardware));
+ break;
+
+ case gcvHAL_SET_DEBUG_LEVEL_ZONE:
+ /* Set debug level and zones. */
+ gckOS_SetDebugLevel(Interface->u.DebugLevelZone.level);
+ gckOS_SetDebugZones(Interface->u.DebugLevelZone.zones,
+ Interface->u.DebugLevelZone.enable);
+ break;
+
+ case gcvHAL_DEBUG_DUMP:
+ gckOS_DumpBuffer(Kernel->os,
+ Interface->u.DebugDump.type,
+ gcmUINT64_TO_PTR(Interface->u.DebugDump.ptr),
+ Interface->u.DebugDump.address,
+ Interface->u.DebugDump.size);
+ status = gcvSTATUS_OK;
+ break;
+
+ case gcvHAL_DUMP_GPU_STATE:
+ {
+ gceCHIPPOWERSTATE power;
+
+ _DumpDriverConfigure(Kernel);
+
+ gcmkONERROR(gckHARDWARE_QueryPowerState(
+ Kernel->hardware,
+ &power
+ ));
+
+ if (power == gcvPOWER_ON)
+ {
+ Interface->u.ReadRegisterData.data = 1;
+
+ _DumpState(Kernel);
+ }
+ else
+ {
+ Interface->u.ReadRegisterData.data = 0;
+ status = gcvSTATUS_CHIP_NOT_READY;
+
+ gcmkPRINT("[galcore]: Can't dump state if GPU isn't POWER ON.");
+ }
+ }
+ break;
+
+ case gcvHAL_DUMP_EVENT:
+ break;
+
+ case gcvHAL_CACHE:
+ logical = gcmUINT64_TO_PTR(Interface->u.Cache.logical);
+ bytes = (gctSIZE_T) Interface->u.Cache.bytes;
+
+ gcmkONERROR(gckKERNEL_CacheOperation(Kernel,
+ processID,
+ Interface->u.Cache.node,
+ Interface->u.Cache.operation,
+ logical,
+ bytes));
+ break;
+
+ case gcvHAL_TIMESTAMP:
+ /* Check for invalid timer. */
+ if ((Interface->u.TimeStamp.timer >= gcmCOUNTOF(Kernel->timers))
+ || (Interface->u.TimeStamp.request != 2))
+ {
+ Interface->u.TimeStamp.timeDelta = 0;
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ /* Return timer results and reset timer. */
+ {
+ gcsTIMER_PTR timer = &(Kernel->timers[Interface->u.TimeStamp.timer]);
+ gctUINT64 timeDelta = 0;
+
+ if (timer->stopTime < timer->startTime )
+ {
+ Interface->u.TimeStamp.timeDelta = 0;
+ gcmkONERROR(gcvSTATUS_TIMER_OVERFLOW);
+ }
+
+ timeDelta = timer->stopTime - timer->startTime;
+
+ /* Check truncation overflow. */
+ Interface->u.TimeStamp.timeDelta = (gctINT32) timeDelta;
+ /*bit0~bit30 is available*/
+ if (timeDelta>>31)
+ {
+ Interface->u.TimeStamp.timeDelta = 0;
+ gcmkONERROR(gcvSTATUS_TIMER_OVERFLOW);
+ }
+
+ status = gcvSTATUS_OK;
+ }
+ break;
+
+ case gcvHAL_DATABASE:
+ gcmkONERROR(gckKERNEL_QueryDatabase(Kernel, processID, Interface));
+ break;
+
+ case gcvHAL_VERSION:
+ Interface->u.Version.major = gcvVERSION_MAJOR;
+ Interface->u.Version.minor = gcvVERSION_MINOR;
+ Interface->u.Version.patch = gcvVERSION_PATCH;
+ Interface->u.Version.build = gcvVERSION_BUILD;
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_KERNEL,
+ "KERNEL version %d.%d.%d build %u",
+ gcvVERSION_MAJOR, gcvVERSION_MINOR,
+ gcvVERSION_PATCH, gcvVERSION_BUILD);
+#endif
+ break;
+
+ case gcvHAL_CHIP_INFO:
+ /* Only if not support multi-core */
+ Interface->u.ChipInfo.count = 1;
+ Interface->u.ChipInfo.types[0] = Kernel->hardware->type;
+ break;
+
+#if (gcdENABLE_3D || gcdENABLE_2D)
+ case gcvHAL_ATTACH:
+ if (Kernel->command)
+ {
+ /* Attach user process. */
+ gcmkONERROR(
+ gckCOMMAND_Attach(Kernel->command,
+ &context,
+ &bytes,
+ &Interface->u.Attach.numStates,
+ processID));
+
+ Interface->u.Attach.maxState = bytes;
+ Interface->u.Attach.context = gcmPTR_TO_NAME(context);
+
+ if (Interface->u.Attach.map)
+ {
+ if (context != gcvNULL)
+ {
+ gcmkVERIFY_OK(
+ gckCONTEXT_MapBuffer(context,
+ Interface->u.Attach.logicals,
+ &Interface->u.Attach.bytes));
+ }
+ else
+ {
+ gctUINT i;
+
+ for (i = 0; i < gcmCOUNTOF(Interface->u.Attach.logicals); i++)
+ {
+ Interface->u.Attach.logicals[i] = 0;
+ }
+
+ Interface->u.Attach.bytes = 0;
+ }
+ }
+
+ gcmkVERIFY_OK(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID, gcvDB_CONTEXT,
+ gcmINT2PTR(Interface->u.Attach.context),
+ gcvNULL,
+ 0));
+ }
+ break;
+#endif
+
+ case gcvHAL_DETACH:
+ if (Kernel->command)
+ {
+ gcmkVERIFY_OK(
+ gckKERNEL_RemoveProcessDB(Kernel,
+ processID, gcvDB_CONTEXT,
+ gcmINT2PTR(Interface->u.Detach.context)));
+
+ /* Detach user process. */
+ gcmkONERROR(
+ gckCOMMAND_Detach(Kernel->command,
+ gcmNAME_TO_PTR(Interface->u.Detach.context)));
+
+ gcmRELEASE_NAME(Interface->u.Detach.context);
+ }
+ break;
+
+ case gcvHAL_GET_FRAME_INFO:
+ gcmkONERROR(gckHARDWARE_GetFrameInfo(
+ Kernel->hardware,
+ gcmUINT64_TO_PTR(Interface->u.GetFrameInfo.frameInfo)));
+ break;
+
+ case gcvHAL_DUMP_GPU_PROFILE:
+ gcmkONERROR(gckHARDWARE_DumpGpuProfile(Kernel->hardware));
+ break;
+
+ case gcvHAL_SET_FSCALE_VALUE:
+#if gcdENABLE_FSCALE_VAL_ADJUST
+ status = gckHARDWARE_SetFscaleValue(Kernel->hardware,
+ Interface->u.SetFscaleValue.value,
+ Interface->u.SetFscaleValue.shValue);
+#else
+ status = gcvSTATUS_NOT_SUPPORTED;
+#endif
+ break;
+ case gcvHAL_GET_FSCALE_VALUE:
+#if gcdENABLE_FSCALE_VAL_ADJUST
+ status = gckHARDWARE_GetFscaleValue(Kernel->hardware,
+ &Interface->u.GetFscaleValue.value,
+ &Interface->u.GetFscaleValue.minValue,
+ &Interface->u.GetFscaleValue.maxValue);
+#else
+ status = gcvSTATUS_NOT_SUPPORTED;
+#endif
+ break;
+
+ case gcvHAL_EXPORT_VIDEO_MEMORY:
+ /* Unlock video memory. */
+ gcmkONERROR(_ExportVideoMemory(Kernel, processID, Interface));
+ break;
+
+ case gcvHAL_NAME_VIDEO_MEMORY:
+ gcmkONERROR(_NameVideoMemory(Kernel, processID, Interface));
+ break;
+
+ case gcvHAL_IMPORT_VIDEO_MEMORY:
+ gcmkONERROR(_ImportVideoMemory(Kernel, processID, Interface));
+ break;
+
+ case gcvHAL_SET_VIDEO_MEMORY_METADATA:
+ gcmkONERROR(_SetVidMemMetadata(Kernel, processID, Interface));
+ break;
+
+ case gcvHAL_GET_VIDEO_MEMORY_FD:
+ gcmkONERROR(_GetVideoMemoryFd(Kernel, processID, Interface));
+ break;
+
+ case gcvHAL_QUERY_RESET_TIME_STAMP:
+ Interface->u.QueryResetTimeStamp.timeStamp = Kernel->resetTimeStamp;
+ Interface->u.QueryResetTimeStamp.contextID = Kernel->hardware->contextID;
+ break;
+
+#if gcdLINUX_SYNC_FILE
+ case gcvHAL_CREATE_NATIVE_FENCE:
+ {
+ gctINT fenceFD;
+ gctSIGNAL signal =
+ gcmUINT64_TO_PTR(Interface->u.CreateNativeFence.signal);
+
+ gcmkONERROR(
+ gckOS_CreateNativeFence(Kernel->os,
+ Kernel->timeline,
+ signal,
+ &fenceFD));
+
+ Interface->u.CreateNativeFence.fenceFD = fenceFD;
+ }
+ break;
+
+ case gcvHAL_WAIT_NATIVE_FENCE:
+ {
+ gctINT fenceFD;
+ gctUINT32 timeout;
+
+ fenceFD = Interface->u.WaitNativeFence.fenceFD;
+ timeout = Interface->u.WaitNativeFence.timeout;
+
+ gcmkONERROR(
+ gckOS_WaitNativeFence(Kernel->os,
+ Kernel->timeline,
+ fenceFD,
+ timeout));
+ }
+ break;
+#endif
+
+ case gcvHAL_SHBUF:
+ {
+ gctSHBUF shBuf;
+ gctPOINTER uData;
+ gctUINT32 bytes;
+
+ switch (Interface->u.ShBuf.command)
+ {
+ case gcvSHBUF_CREATE:
+ bytes = Interface->u.ShBuf.bytes;
+
+ /* Create. */
+ gcmkONERROR(gckKERNEL_CreateShBuffer(Kernel, bytes, &shBuf));
+
+ Interface->u.ShBuf.id = gcmPTR_TO_UINT64(shBuf);
+
+ gcmkVERIFY_OK(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID,
+ gcvDB_SHBUF,
+ shBuf,
+ gcvNULL,
+ 0));
+ break;
+
+ case gcvSHBUF_DESTROY:
+ shBuf = gcmUINT64_TO_PTR(Interface->u.ShBuf.id);
+
+ /* Check db first to avoid illegal destroy in the process. */
+ gcmkONERROR(
+ gckKERNEL_RemoveProcessDB(Kernel,
+ processID,
+ gcvDB_SHBUF,
+ shBuf));
+
+ gcmkONERROR(gckKERNEL_DestroyShBuffer(Kernel, shBuf));
+ break;
+
+ case gcvSHBUF_MAP:
+ shBuf = gcmUINT64_TO_PTR(Interface->u.ShBuf.id);
+
+ /* Map for current process access. */
+ gcmkONERROR(gckKERNEL_MapShBuffer(Kernel, shBuf));
+
+ gcmkVERIFY_OK(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID,
+ gcvDB_SHBUF,
+ shBuf,
+ gcvNULL,
+ 0));
+ break;
+
+ case gcvSHBUF_WRITE:
+ shBuf = gcmUINT64_TO_PTR(Interface->u.ShBuf.id);
+ uData = gcmUINT64_TO_PTR(Interface->u.ShBuf.data);
+ bytes = Interface->u.ShBuf.bytes;
+
+ /* Write. */
+ gcmkONERROR(
+ gckKERNEL_WriteShBuffer(Kernel, shBuf, uData, bytes));
+ break;
+
+ case gcvSHBUF_READ:
+ shBuf = gcmUINT64_TO_PTR(Interface->u.ShBuf.id);
+ uData = gcmUINT64_TO_PTR(Interface->u.ShBuf.data);
+ bytes = Interface->u.ShBuf.bytes;
+
+ /* Read. */
+ gcmkONERROR(
+ gckKERNEL_ReadShBuffer(Kernel,
+ shBuf,
+ uData,
+ bytes,
+ &bytes));
+
+ /* Return copied size. */
+ Interface->u.ShBuf.bytes = bytes;
+ break;
+
+ default:
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ break;
+ }
+ }
+ 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(_WrapUserMemory(Kernel, processID, Interface));
+ break;
+
+ case gcvHAL_WAIT_FENCE:
+ gcmkONERROR(_WaitFence(Kernel, processID, Interface));
+ break;
+
+ case gcvHAL_DEVICE_MUTEX:
+ if (Interface->u.DeviceMutex.isMutexLocked)
+ {
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os,
+ Kernel->device->commitMutex,
+ gcvINFINITE
+ ));
+ }
+ else
+ {
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex));
+ }
+ break;
+
+#if gcdDEC_ENABLE_AHB
+ case gcvHAL_DEC300_READ:
+ gcmkONERROR(viv_dec300_read(
+ Interface->u.DEC300Read.enable,
+ Interface->u.DEC300Read.readId,
+ Interface->u.DEC300Read.format,
+ Interface->u.DEC300Read.strides,
+ Interface->u.DEC300Read.is3D,
+ Interface->u.DEC300Read.isMSAA,
+ Interface->u.DEC300Read.clearValue,
+ Interface->u.DEC300Read.isTPC,
+ Interface->u.DEC300Read.isTPCCompressed,
+ Interface->u.DEC300Read.surfAddrs,
+ Interface->u.DEC300Read.tileAddrs
+ ));
+ break;
+
+ case gcvHAL_DEC300_WRITE:
+ gcmkONERROR(viv_dec300_write(
+ Interface->u.DEC300Write.enable,
+ Interface->u.DEC300Write.readId,
+ Interface->u.DEC300Write.writeId,
+ Interface->u.DEC300Write.format,
+ Interface->u.DEC300Write.surfAddr,
+ Interface->u.DEC300Write.tileAddr
+ ));
+ break;
+
+ case gcvHAL_DEC300_FLUSH:
+ gcmkONERROR(viv_dec300_flush(0));
+ break;
+
+ case gcvHAL_DEC300_FLUSH_WAIT:
+ gcmkONERROR(viv_dec300_flush_done(&Interface->u.DEC300FlushWait.done));
+ break;
+#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);
+ }
+
+OnError:
+ /* Save status. */
+ Interface->status = status;
+
+#if QNX_SINGLE_THREADED_DEBUGGING
+ gckOS_ReleaseMutex(Kernel->os, Kernel->debugMutex);
+#endif
+
+ if (powerMutexAcquired == gcvTRUE)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->hardware->powerMutex));
+ }
+
+ if (commitMutexAcquired == gcvTRUE)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->device->commitMutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** gckKERNEL_AttachProcess
+**
+** Attach or detach a process.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctBOOL Attach
+** gcvTRUE if a new process gets attached or gcFALSE when a process
+** gets detatched.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_AttachProcess(
+ IN gckKERNEL Kernel,
+ IN gctBOOL Attach
+ )
+{
+ gceSTATUS status;
+ gctUINT32 processID;
+
+ gcmkHEADER_ARG("Kernel=%p Attach=%d", Kernel, Attach);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ /* Get current process ID. */
+ gcmkONERROR(gckOS_GetProcessID(&processID));
+
+ gcmkONERROR(gckKERNEL_AttachProcessEx(Kernel, Attach, processID));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** gckKERNEL_AttachProcessEx
+**
+** Attach or detach a process with the given PID. Can be paired with gckKERNEL_AttachProcess
+** provided the programmer is aware of the consequences.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctBOOL Attach
+** gcvTRUE if a new process gets attached or gcFALSE when a process
+** gets detatched.
+**
+** gctUINT32 PID
+** PID of the process to attach or detach.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_AttachProcessEx(
+ IN gckKERNEL Kernel,
+ IN gctBOOL Attach,
+ IN gctUINT32 PID
+ )
+{
+ gceSTATUS status;
+ gctINT32 old;
+
+ gcmkHEADER_ARG("Kernel=%p Attach=%d PID=%d", Kernel, Attach, PID);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ if (Attach)
+ {
+ /* Increment the number of clients attached. */
+ gcmkONERROR(
+ gckOS_AtomIncrement(Kernel->os, Kernel->atomClients, &old));
+
+ if (old == 0)
+ {
+#if gcdENABLE_VG
+ if (Kernel->vg == gcvNULL)
+#endif
+ {
+ gcmkONERROR(gckOS_Broadcast(Kernel->os,
+ Kernel->hardware,
+ gcvBROADCAST_FIRST_PROCESS));
+ }
+ }
+
+ if (Kernel->dbCreated)
+ {
+ /* Create the process database. */
+ gcmkONERROR(gckKERNEL_CreateProcessDB(Kernel, PID));
+ }
+ }
+ else
+ {
+ if (Kernel->dbCreated)
+ {
+ /* Clean up the process database. */
+ gcmkONERROR(gckKERNEL_DestroyProcessDB(Kernel, PID));
+
+ /* Save the last know process ID. */
+ Kernel->db->lastProcessID = PID;
+ }
+
+#if gcdENABLE_VG
+ if (Kernel->vg == gcvNULL)
+#endif
+ {
+ status = gckEVENT_Submit(Kernel->eventObj, gcvTRUE, gcvFALSE);
+
+ if (status == gcvSTATUS_INTERRUPTED && Kernel->eventObj->submitTimer)
+ {
+ gcmkONERROR(gckOS_StartTimer(Kernel->os,
+ Kernel->eventObj->submitTimer,
+ 1));
+ }
+ else
+ {
+ gcmkONERROR(status);
+ }
+ }
+
+ /* Decrement the number of clients attached. */
+ gcmkONERROR(
+ gckOS_AtomDecrement(Kernel->os, Kernel->atomClients, &old));
+
+ if (old == 1)
+ {
+#if gcdENABLE_VG
+ if (Kernel->vg == gcvNULL)
+#endif
+ {
+ /* Last client detached, switch to SUSPEND power state. */
+ gcmkONERROR(gckOS_Broadcast(Kernel->os,
+ Kernel->hardware,
+ gcvBROADCAST_LAST_PROCESS));
+ }
+ }
+
+ if (Kernel->timeoutPID == PID)
+ {
+ Kernel->timeOut = Kernel->hardware->type == gcvHARDWARE_2D
+ ? gcdGPU_2D_TIMEOUT
+ : gcdGPU_TIMEOUT;
+
+ gcmkVERIFY_OK(gckOS_StopTimer(Kernel->os, Kernel->monitorTimer));
+
+ gcmkVERIFY_OK(gckOS_StartTimer(Kernel->os, Kernel->monitorTimer, 100));
+ }
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_Recovery
+**
+** Try to recover the GPU from a fatal error.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_Recovery(
+ IN gckKERNEL Kernel
+ )
+{
+ gceSTATUS status;
+ gckEVENT eventObj;
+ gckHARDWARE hardware;
+ gctUINT32 mask = 0;
+ gctUINT32 i = 0, count = 0;
+#if gcdINTERRUPT_STATISTIC
+ gctINT32 oldValue;
+#endif
+
+ gcmkHEADER_ARG("Kernel=%p", Kernel);
+
+ /* Validate the arguemnts. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ /* Grab gckEVENT object. */
+ eventObj = Kernel->eventObj;
+ gcmkVERIFY_OBJECT(eventObj, gcvOBJ_EVENT);
+
+ /* Grab gckHARDWARE object. */
+ hardware = Kernel->hardware;
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ if (Kernel->stuckDump == gcvSTUCK_DUMP_NONE)
+ {
+ gcmkPRINT("[galcore]: GPU[%d] hang, automatic recovery.", Kernel->core);
+ }
+ else
+ {
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, Kernel->device->stuckDumpMutex, gcvINFINITE));
+
+ _DumpDriverConfigure(Kernel);
+ _DumpState(Kernel);
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->device->stuckDumpMutex));
+ }
+
+ if (Kernel->recovery == gcvFALSE)
+ {
+ gcmkPRINT("[galcore]: Stop driver to keep scene.");
+
+ /* Stop monitor timer. */
+ Kernel->monitorTimerStop = gcvTRUE;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ /* Issuing a soft reset for the GPU. */
+ gcmkONERROR(gckHARDWARE_Reset(hardware));
+
+ mask = Kernel->restoreMask;
+
+ for (i = 0; i < 32; i++)
+ {
+ if (mask & (1 << i))
+ {
+ count++;
+ }
+ }
+
+ /* Handle all outstanding events now. */
+ gcmkONERROR(gckOS_AtomSet(Kernel->os, eventObj->pending, mask));
+
+#if gcdINTERRUPT_STATISTIC
+ while (count--)
+ {
+ gcmkONERROR(gckOS_AtomDecrement(
+ Kernel->os,
+ eventObj->interruptCount,
+ &oldValue
+ ));
+ }
+
+ gckOS_AtomClearMask(Kernel->hardware->pendingEvent, mask);
+#endif
+
+ gcmkONERROR(gckEVENT_Notify(eventObj, 1));
+
+ gcmkVERIFY_OK(gckOS_GetTime(&Kernel->resetTimeStamp));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_OpenUserData
+**
+** Get access to the user data.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctBOOL NeedCopy
+** The flag indicating whether or not the data should be copied.
+**
+** gctPOINTER StaticStorage
+** Pointer to the kernel storage where the data is to be copied if
+** NeedCopy is gcvTRUE.
+**
+** gctPOINTER UserPointer
+** User pointer to the data.
+**
+** gctSIZE_T Size
+** Size of the data.
+**
+** OUTPUT:
+**
+** gctPOINTER * KernelPointer
+** Pointer to the kernel pointer that will be pointing to the data.
+*/
+gceSTATUS
+gckKERNEL_OpenUserData(
+ IN gckKERNEL Kernel,
+ IN gctBOOL NeedCopy,
+ IN gctPOINTER StaticStorage,
+ IN gctPOINTER UserPointer,
+ IN gctSIZE_T Size,
+ OUT gctPOINTER * KernelPointer
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG(
+ "Kernel=%p NeedCopy=%d StaticStorage=%p "
+ "UserPointer=%p Size=%lu KernelPointer=%p",
+ Kernel, NeedCopy, StaticStorage, UserPointer, Size, KernelPointer
+ );
+
+ /* Validate the arguemnts. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(!NeedCopy || (StaticStorage != gcvNULL));
+ gcmkVERIFY_ARGUMENT(UserPointer != gcvNULL);
+ gcmkVERIFY_ARGUMENT(KernelPointer != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Size > 0);
+
+ if (NeedCopy)
+ {
+ /* Copy the user data to the static storage. */
+ gcmkONERROR(gckOS_CopyFromUserData(
+ Kernel->os, StaticStorage, UserPointer, Size
+ ));
+
+ /* Set the kernel pointer. */
+ * KernelPointer = StaticStorage;
+ }
+ else
+ {
+ gctPOINTER pointer = gcvNULL;
+
+ /* Map the user pointer. */
+ gcmkONERROR(gckOS_MapUserPointer(
+ Kernel->os, UserPointer, Size, &pointer
+ ));
+
+ /* Set the kernel pointer. */
+ * KernelPointer = pointer;
+ }
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_CloseUserData
+**
+** Release resources associated with the user data connection opened by
+** gckKERNEL_OpenUserData.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctBOOL NeedCopy
+** The flag indicating whether or not the data should be copied.
+**
+** gctBOOL FlushData
+** If gcvTRUE, the data is written back to the user.
+**
+** gctPOINTER UserPointer
+** User pointer to the data.
+**
+** gctSIZE_T Size
+** Size of the data.
+**
+** OUTPUT:
+**
+** gctPOINTER * KernelPointer
+** Kernel pointer to the data.
+*/
+gceSTATUS
+gckKERNEL_CloseUserData(
+ IN gckKERNEL Kernel,
+ IN gctBOOL NeedCopy,
+ IN gctBOOL FlushData,
+ IN gctPOINTER UserPointer,
+ IN gctSIZE_T Size,
+ OUT gctPOINTER * KernelPointer
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctPOINTER pointer;
+
+ gcmkHEADER_ARG(
+ "Kernel=%p NeedCopy=%d FlushData=%d "
+ "UserPointer=%p Size=%lu KernelPointer=%p",
+ Kernel, NeedCopy, FlushData, UserPointer, Size, KernelPointer
+ );
+
+ /* Validate the arguemnts. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(UserPointer != gcvNULL);
+ gcmkVERIFY_ARGUMENT(KernelPointer != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Size > 0);
+
+ /* Get a shortcut to the kernel pointer. */
+ pointer = * KernelPointer;
+
+ if (pointer != gcvNULL)
+ {
+ if (NeedCopy)
+ {
+ if (FlushData)
+ {
+ gcmkONERROR(gckOS_CopyToUserData(
+ Kernel->os, * KernelPointer, UserPointer, Size
+ ));
+ }
+ }
+ else
+ {
+ /* Unmap record from kernel memory. */
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Kernel->os,
+ UserPointer,
+ Size,
+ * KernelPointer
+ ));
+ }
+
+ /* Reset the kernel pointer. */
+ * KernelPointer = gcvNULL;
+ }
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static void
+gckQUEUE_Dequeue(
+ IN gckQUEUE LinkQueue
+ )
+{
+ gcmkASSERT(LinkQueue->count == LinkQueue->size);
+
+ LinkQueue->count--;
+ LinkQueue->front = (LinkQueue->front + 1) % gcdLINK_QUEUE_SIZE;
+}
+
+void
+gckQUEUE_Enqueue(
+ IN gckQUEUE LinkQueue,
+ IN gcuQUEUEDATA *Data
+ )
+{
+ gcuQUEUEDATA * datas = LinkQueue->datas;
+
+ if (LinkQueue->count == LinkQueue->size)
+ {
+ gckQUEUE_Dequeue(LinkQueue);
+ }
+
+ gcmkASSERT(LinkQueue->count < LinkQueue->size);
+
+ LinkQueue->count++;
+
+ datas[LinkQueue->rear] = *Data;
+
+ LinkQueue->rear = (LinkQueue->rear + 1) % LinkQueue->size;
+}
+
+void
+gckQUEUE_GetData(
+ IN gckQUEUE LinkQueue,
+ IN gctUINT32 Index,
+ OUT gcuQUEUEDATA ** Data
+ )
+{
+ gcuQUEUEDATA * datas = LinkQueue->datas;
+
+ gcmkASSERT(Index < LinkQueue->size);
+
+ *Data = &datas[(Index + LinkQueue->front) % LinkQueue->size];
+}
+
+gceSTATUS
+gckQUEUE_Allocate(
+ IN gckOS Os,
+ IN gckQUEUE Queue,
+ IN gctUINT32 Size
+ )
+{
+ gceSTATUS status;
+
+ gcmkONERROR(gckOS_Allocate(
+ Os,
+ gcmSIZEOF(struct _gckLINKDATA) * Size,
+ (gctPOINTER *)&Queue->datas
+ ));
+
+ Queue->size = Size;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gckQUEUE_Free(
+ IN gckOS Os,
+ IN gckQUEUE Queue
+ )
+{
+ if (Queue->datas)
+ {
+ gcmkVERIFY_OK(gckOS_Free(Os, (gctPOINTER)Queue->datas));
+ }
+
+ return gcvSTATUS_OK;
+}
+
+/******************************************************************************\
+*************************** Pointer - ID translation ***************************
+\******************************************************************************/
+
+/* The capacity is 32 initially, double when expand, but no more than 512. */
+#define gcdID_TABLE_MAX_EXPAND 512
+
+typedef struct _gcsINTEGERDB * gckINTEGERDB;
+typedef struct _gcsINTEGERDB
+{
+ gckOS os;
+ gctPOINTER * table;
+ gctUINT32 * bitmap;
+ gctPOINTER mutex;
+ gctUINT32 capacity;
+ gctUINT32 nextId;
+ gctUINT32 freeCount;
+}
+gcsINTEGERDB;
+
+gceSTATUS
+gckKERNEL_CreateIntegerDatabase(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Capacity,
+ OUT gctPOINTER * Database
+ )
+{
+ gceSTATUS status;
+ gckINTEGERDB database = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=%p Capacity=%u Datbase=%p", Kernel, Capacity, Database);
+
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Database != gcvNULL);
+
+ /* round up to 32 alignment. */
+ Capacity = (Capacity + 31) & ~31;
+
+ /* Allocate a database. */
+ gcmkONERROR(gckOS_Allocate(
+ Kernel->os, gcmSIZEOF(gcsINTEGERDB), (gctPOINTER *)&database));
+
+ gcmkONERROR(gckOS_ZeroMemory(database, gcmSIZEOF(gcsINTEGERDB)));
+
+ /* Allocate a pointer table. */
+ gcmkONERROR(gckOS_Allocate(
+ Kernel->os,
+ gcmSIZEOF(gctPOINTER) * Capacity,
+ (gctPOINTER *)&database->table
+ ));
+
+ /* Allocate bitmap. */
+ gcmkONERROR(gckOS_Allocate(
+ Kernel->os, Capacity / 8, (gctPOINTER *)&database->bitmap));
+
+ gcmkONERROR(gckOS_ZeroMemory(database->bitmap, Capacity / 8));
+
+ /* Allocate a database mutex. */
+ gcmkONERROR(gckOS_CreateMutex(Kernel->os, &database->mutex));
+
+ /* Initialize. */
+ database->os = Kernel->os;
+
+ database->nextId = 0;
+ database->freeCount = Capacity;
+ database->capacity = Capacity;
+
+ *Database = database;
+
+ gcmkFOOTER_ARG("*Database=0x%08X", *Database);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Rollback. */
+ if (database)
+ {
+ if (database->table)
+ {
+ gckOS_Free(Kernel->os, database->table);
+ }
+
+ if (database->bitmap)
+ {
+ gckOS_Free(Kernel->os, database->bitmap);
+ }
+
+ gckOS_Free(Kernel->os, database);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_DestroyIntegerDatabase(
+ IN gckKERNEL Kernel,
+ IN gctPOINTER Database
+ )
+{
+ gckINTEGERDB database = Database;
+
+ gcmkHEADER_ARG("Kernel=%p Datbase=%p", Kernel, Database);
+
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Database != gcvNULL);
+
+ /* Destroy pointer table. */
+ gcmkOS_SAFE_FREE(Kernel->os, database->table);
+ gcmkOS_SAFE_FREE(Kernel->os, database->bitmap);
+
+ /* Destroy database mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, database->mutex));
+
+ /* Destroy database. */
+ gckOS_Free(Kernel->os, database);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckKERNEL_AllocateIntegerId(
+ IN gctPOINTER Database,
+ IN gctPOINTER Pointer,
+ OUT gctUINT32 * Id
+ )
+{
+ gceSTATUS status;
+ gckINTEGERDB database = Database;
+ gctUINT32 pos;
+ gctUINT32 n, i;
+ gckOS os = database->os;
+ gctPOINTER * table = gcvNULL;
+
+ gcmkHEADER_ARG("Database=%p Pointer=%p", Database, Pointer);
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(os, database->mutex, gcvINFINITE));
+
+ if (database->freeCount < 1)
+ {
+ gctUINT32 * bitmap = gcvNULL;
+ gctUINT32 expand;
+ gctUINT32 capacity;
+
+ expand = database->capacity < gcdID_TABLE_MAX_EXPAND
+ ? database->capacity : gcdID_TABLE_MAX_EXPAND;
+
+ capacity = database->capacity + expand;
+
+ /* Extend table. */
+ gcmkONERROR(
+ gckOS_Allocate(os,
+ gcmSIZEOF(gctPOINTER) * capacity,
+ (gctPOINTER *)&table));
+
+ gcmkONERROR(
+ gckOS_Allocate(os, capacity / 32 * sizeof(gctUINT32), (gctPOINTER *)&bitmap));
+
+ gckOS_ZeroMemory(bitmap + database->capacity / 32, expand / 8);
+
+ /* Copy data from old table. */
+ gckOS_MemCopy(table,
+ database->table,
+ database->capacity * gcmSIZEOF(gctPOINTER));
+
+ gckOS_MemCopy(bitmap,
+ database->bitmap,
+ database->capacity / 32 * sizeof(gctUINT32));
+
+ gckOS_Free(os, database->table);
+ gckOS_Free(os, database->bitmap);
+
+ /* Update databse with new allocated table. */
+ database->table = table;
+ database->bitmap = bitmap;
+ database->nextId = database->capacity;
+ database->capacity = capacity;
+ database->freeCount += expand;
+ }
+
+ pos = database->nextId;
+ n = pos >> 5;
+ i = pos & 31;
+
+ while (database->bitmap[n] & (1u << i))
+ {
+ pos++;
+
+ if (pos == database->capacity)
+ {
+ /* Wrap to the begin. */
+ pos = 0;
+ }
+
+ n = pos >> 5;
+ i = pos & 31;
+ }
+
+ /* Connect id with pointer. */
+ database->table[pos] = Pointer;
+ database->bitmap[n] |= (1u << i);
+
+ *Id = pos + 1;
+
+ database->nextId = (pos + 1) % database->capacity;
+ database->freeCount--;
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
+
+ gcmkFOOTER_ARG("*Id=%u", *Id);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (table)
+ {
+ gckOS_Free(os, table);
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_FreeIntegerId(
+ IN gctPOINTER Database,
+ IN gctUINT32 Id
+ )
+{
+ gceSTATUS status;
+ gckINTEGERDB database = Database;
+ gckOS os = database->os;
+ gctUINT32 pos = Id - 1;
+ gctUINT32 n, i;
+
+ gcmkHEADER_ARG("Database=%p Id=%d", Database, Id);
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(os, database->mutex, gcvINFINITE));
+
+ n = pos >> 5;
+ i = pos & 31;
+
+ if (pos >= database->capacity || (database->bitmap[n] & (1u << i)) == 0)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+
+ /* Clear id. */
+ database->bitmap[n] &= ~(1u << i);
+ database->table[pos] = gcvNULL;
+
+ ++database->freeCount;
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_QueryIntegerId(
+ IN gctPOINTER Database,
+ IN gctUINT32 Id,
+ OUT gctPOINTER * Pointer
+ )
+{
+ gceSTATUS status;
+ gckINTEGERDB database = Database;
+ gckOS os = database->os;
+ gctUINT32 pos = Id - 1;
+ gctUINT32 n, i;
+
+ gcmkHEADER_ARG("Database=%p Id=%d", Database, Id);
+ gcmkVERIFY_ARGUMENT(Pointer != gcvNULL);
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(os, database->mutex, gcvINFINITE));
+
+ n = pos >> 5;
+ i = pos & 31;
+
+ if (pos >= database->capacity || (database->bitmap[n] & (1u << i)) == 0)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+
+ *Pointer = database->table[pos];
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, database->mutex));
+
+ gcmkFOOTER_ARG("*Pointer=0x%08X", *Pointer);
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+
+gctUINT32
+gckKERNEL_AllocateNameFromPointer(
+ IN gckKERNEL Kernel,
+ IN gctPOINTER Pointer
+ )
+{
+ gceSTATUS status;
+ gctUINT32 name;
+ gctPOINTER database = Kernel->db->pointerDatabase;
+
+ gcmkHEADER_ARG("Kernel=%p Pointer=%p", Kernel, Pointer);
+
+ gcmkONERROR(gckKERNEL_AllocateIntegerId(database, Pointer, &name));
+
+ gcmkFOOTER_ARG("name=%d", name);
+ return name;
+
+OnError:
+ gcmkFOOTER();
+ return 0;
+}
+
+gctPOINTER
+gckKERNEL_QueryPointerFromName(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Name
+ )
+{
+ gceSTATUS status;
+ gctPOINTER pointer = gcvNULL;
+ gctPOINTER database = Kernel->db->pointerDatabase;
+
+ gcmkHEADER_ARG("Kernel=%p Name=%d", Kernel, Name);
+
+ /* Lookup in database to get pointer. */
+ gcmkONERROR(gckKERNEL_QueryIntegerId(database, Name, &pointer));
+
+ gcmkFOOTER_ARG("pointer=0x%X", pointer);
+ return pointer;
+
+OnError:
+ gcmkFOOTER();
+ return gcvNULL;
+}
+
+gceSTATUS
+gckKERNEL_DeleteName(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Name
+ )
+{
+ gctPOINTER database = Kernel->db->pointerDatabase;
+
+ gcmkHEADER_ARG("Kernel=%p Name=%p", Kernel, Name);
+
+ /* Free name if exists. */
+ gcmkVERIFY_OK(gckKERNEL_FreeIntegerId(database, Name));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+***** Shared Buffer ************************************************************
+*******************************************************************************/
+
+/*******************************************************************************
+**
+** gckKERNEL_CreateShBuffer
+**
+** Create shared buffer.
+** The shared buffer can be used across processes. Other process needs call
+** gckKERNEL_MapShBuffer before use it.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctUINT32 Size
+** Specify the shared buffer size.
+**
+** OUTPUT:
+**
+** gctSHBUF * ShBuf
+** Pointer to hold return shared buffer handle.
+*/
+gceSTATUS
+gckKERNEL_CreateShBuffer(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Size,
+ OUT gctSHBUF * ShBuf
+ )
+{
+ gceSTATUS status;
+ gcsSHBUF_PTR shBuf = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=%p, Size=%u", Kernel, Size);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ if (Size == 0)
+ {
+ /* Invalid size. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+ else if (Size > 1024)
+ {
+ /* Limite shared buffer size. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ /* Create a shared buffer structure. */
+ gcmkONERROR(
+ gckOS_Allocate(Kernel->os,
+ sizeof (gcsSHBUF),
+ (gctPOINTER *)&shBuf));
+
+ /* Initialize shared buffer. */
+ shBuf->id = 0;
+ shBuf->reference = gcvNULL;
+ shBuf->size = Size;
+ shBuf->data = gcvNULL;
+
+ /* Allocate integer id for this shared buffer. */
+ gcmkONERROR(
+ gckKERNEL_AllocateIntegerId(Kernel->db->pointerDatabase,
+ shBuf,
+ &shBuf->id));
+
+ /* Allocate atom. */
+ gcmkONERROR(gckOS_AtomConstruct(Kernel->os, &shBuf->reference));
+
+ /* Set default reference count to 1. */
+ gcmkVERIFY_OK(gckOS_AtomSet(Kernel->os, shBuf->reference, 1));
+
+ /* Return integer id. */
+ *ShBuf = (gctSHBUF)(gctUINTPTR_T)shBuf->id;
+
+ gcmkFOOTER_ARG("*ShBuf=%u", shBuf->id);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Error roll back. */
+ if (shBuf != gcvNULL)
+ {
+ if (shBuf->id != 0)
+ {
+ gcmkVERIFY_OK(
+ gckKERNEL_FreeIntegerId(Kernel->db->pointerDatabase,
+ shBuf->id));
+ }
+
+ gcmkOS_SAFE_FREE(Kernel->os, shBuf);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_DestroyShBuffer
+**
+** Destroy shared buffer.
+** This will decrease reference of specified shared buffer and do actual
+** destroy when no reference on it.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctSHBUF ShBuf
+** Specify the shared buffer to be destroyed.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_DestroyShBuffer(
+ IN gckKERNEL Kernel,
+ IN gctSHBUF ShBuf
+ )
+{
+ gceSTATUS status;
+ gcsSHBUF_PTR shBuf;
+ gctINT32 oldValue = 0;
+
+ gcmkHEADER_ARG("Kernel=%p ShBuf=%u",
+ Kernel, (gctUINT32)(gctUINTPTR_T) ShBuf);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(ShBuf != gcvNULL);
+
+ /* Find shared buffer structure. */
+ gcmkONERROR(
+ gckKERNEL_QueryIntegerId(Kernel->db->pointerDatabase,
+ (gctUINT32)(gctUINTPTR_T)ShBuf,
+ (gctPOINTER)&shBuf));
+
+ gcmkASSERT(shBuf->id == (gctUINT32)(gctUINTPTR_T)ShBuf);
+
+ /* Decrease the reference count. */
+ gckOS_AtomDecrement(Kernel->os, shBuf->reference, &oldValue);
+
+ if (oldValue == 1)
+ {
+ /* Free integer id. */
+ gcmkVERIFY_OK(
+ gckKERNEL_FreeIntegerId(Kernel->db->pointerDatabase,
+ shBuf->id));
+
+ /* Free atom. */
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Kernel->os, shBuf->reference));
+
+ if (shBuf->data)
+ {
+ gcmkOS_SAFE_FREE(Kernel->os, shBuf->data);
+ shBuf->data = gcvNULL;
+ }
+
+ /* Free the shared buffer. */
+ gcmkOS_SAFE_FREE(Kernel->os, shBuf);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_MapShBuffer
+**
+** Map shared buffer into this process so that it can be used in this process.
+** This will increase reference count on the specified shared buffer.
+** Call gckKERNEL_DestroyShBuffer to dereference.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctSHBUF ShBuf
+** Specify the shared buffer to be mapped.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_MapShBuffer(
+ IN gckKERNEL Kernel,
+ IN gctSHBUF ShBuf
+ )
+{
+ gceSTATUS status;
+ gcsSHBUF_PTR shBuf;
+ gctINT32 oldValue = 0;
+
+ gcmkHEADER_ARG("Kernel=%p ShBuf=%u",
+ Kernel, (gctUINT32)(gctUINTPTR_T) ShBuf);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(ShBuf != gcvNULL);
+
+ /* Find shared buffer structure. */
+ gcmkONERROR(
+ gckKERNEL_QueryIntegerId(Kernel->db->pointerDatabase,
+ (gctUINT32)(gctUINTPTR_T)ShBuf,
+ (gctPOINTER)&shBuf));
+
+ gcmkASSERT(shBuf->id == (gctUINT32)(gctUINTPTR_T)ShBuf);
+
+ /* Increase the reference count. */
+ gckOS_AtomIncrement(Kernel->os, shBuf->reference, &oldValue);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_WriteShBuffer
+**
+** Write user data into shared buffer.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctSHBUF ShBuf
+** Specify the shared buffer to be written to.
+**
+** gctPOINTER UserData
+** User mode pointer to hold the source data.
+**
+** gctUINT32 ByteCount
+** Specify number of bytes to write. If this is larger than
+** shared buffer size, gcvSTATUS_INVALID_ARGUMENT is returned.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_WriteShBuffer(
+ IN gckKERNEL Kernel,
+ IN gctSHBUF ShBuf,
+ IN gctPOINTER UserData,
+ IN gctUINT32 ByteCount
+ )
+{
+ gceSTATUS status;
+ gcsSHBUF_PTR shBuf = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=%p ShBuf=%u UserData=%p ByteCount=%u",
+ Kernel, (gctUINT32)(gctUINTPTR_T) ShBuf, UserData, ByteCount);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(ShBuf != gcvNULL);
+
+ /* Find shared buffer structure. */
+ gcmkONERROR(
+ gckKERNEL_QueryIntegerId(Kernel->db->pointerDatabase,
+ (gctUINT32)(gctUINTPTR_T)ShBuf,
+ (gctPOINTER)&shBuf));
+
+ gcmkASSERT(shBuf->id == (gctUINT32)(gctUINTPTR_T)ShBuf);
+
+ if ((ByteCount > shBuf->size) ||
+ (ByteCount == 0) ||
+ (UserData == gcvNULL))
+ {
+ /* Exceeds buffer max size or invalid. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (shBuf->data == gcvNULL)
+ {
+ /* Allocate buffer data when first time write. */
+ gcmkONERROR(gckOS_Allocate(Kernel->os, ByteCount, &shBuf->data));
+ }
+
+ /* Copy data from user. */
+ gcmkONERROR(
+ gckOS_CopyFromUserData(Kernel->os,
+ shBuf->data,
+ UserData,
+ ByteCount));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (shBuf && shBuf->data)
+ {
+ gcmkOS_SAFE_FREE(Kernel->os, shBuf->data);
+ shBuf->data = gcvNULL;
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_ReadShBuffer
+**
+** Read data from shared buffer and copy to user pointer.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctSHBUF ShBuf
+** Specify the shared buffer to be read from.
+**
+** gctPOINTER UserData
+** User mode pointer to save output data.
+**
+** gctUINT32 ByteCount
+** Specify number of bytes to read.
+** If this is larger than shared buffer size, only avaiable bytes are
+** copied. If smaller, copy requested size.
+**
+** OUTPUT:
+**
+** gctUINT32 * BytesRead
+** Pointer to hold how many bytes actually read from shared buffer.
+*/
+gceSTATUS
+gckKERNEL_ReadShBuffer(
+ IN gckKERNEL Kernel,
+ IN gctSHBUF ShBuf,
+ IN gctPOINTER UserData,
+ IN gctUINT32 ByteCount,
+ OUT gctUINT32 * BytesRead
+ )
+{
+ gceSTATUS status;
+ gcsSHBUF_PTR shBuf;
+ gctUINT32 bytes;
+
+ gcmkHEADER_ARG("Kernel=%p ShBuf=%u UserData=%p ByteCount=%u",
+ Kernel, (gctUINT32)(gctUINTPTR_T) ShBuf, UserData, ByteCount);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(ShBuf != gcvNULL);
+
+ /* Find shared buffer structure. */
+ gcmkONERROR(
+ gckKERNEL_QueryIntegerId(Kernel->db->pointerDatabase,
+ (gctUINT32)(gctUINTPTR_T)ShBuf,
+ (gctPOINTER)&shBuf));
+
+ gcmkASSERT(shBuf->id == (gctUINT32)(gctUINTPTR_T)ShBuf);
+
+ if (shBuf->data == gcvNULL)
+ {
+ *BytesRead = 0;
+
+ /* No data in shared buffer, skip copy. */
+ status = gcvSTATUS_SKIP;
+ goto OnError;
+ }
+ else if (ByteCount == 0)
+ {
+ /* Invalid size to read. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ /* Determine bytes to copy. */
+ bytes = (ByteCount < shBuf->size) ? ByteCount : shBuf->size;
+
+ /* Copy data to user. */
+ gcmkONERROR(
+ gckOS_CopyToUserData(Kernel->os,
+ shBuf->data,
+ UserData,
+ bytes));
+
+ /* Return copied size. */
+ *BytesRead = bytes;
+
+ gcmkFOOTER_ARG("*BytesRead=%u", bytes);
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************\
+*************************** List Helper *****************************************
+\*******************************************************************************/
+
+static void
+_ListAdd(
+ gcsLISTHEAD_PTR New,
+ gcsLISTHEAD_PTR Prev,
+ gcsLISTHEAD_PTR Next
+ )
+{
+ Next->prev = New;
+ New->next = Next;
+ New->prev = Prev;
+ Prev->next = New;
+}
+
+void
+_ListDel(
+ gcsLISTHEAD_PTR Prev,
+ gcsLISTHEAD_PTR Next
+ )
+{
+ Next->prev = Prev;
+ Prev->next = Next;
+}
+
+void
+gcsLIST_Init(
+ gcsLISTHEAD_PTR Node
+ )
+{
+ Node->prev = Node;
+ Node->next = Node;
+}
+
+void
+gcsLIST_Add(
+ gcsLISTHEAD_PTR New,
+ gcsLISTHEAD_PTR Head
+ )
+{
+ _ListAdd(New, Head, Head->next);
+}
+
+void
+gcsLIST_AddTail(
+ gcsLISTHEAD_PTR New,
+ gcsLISTHEAD_PTR Head
+ )
+{
+ _ListAdd(New, Head->prev, Head);
+}
+
+void
+gcsLIST_Del(
+ gcsLISTHEAD_PTR Node
+ )
+{
+ _ListDel(Node->prev, Node->next);
+}
+
+gctBOOL
+gcsLIST_Empty(
+ gcsLISTHEAD_PTR Head
+ )
+{
+ return Head->next == Head;
+}
+
+/*******************************************************************************\
+********************************* Fence *****************************************
+\*******************************************************************************/
+
+gceSTATUS
+gckFENCE_Create(
+ IN gckOS Os,
+ IN gckKERNEL Kernel,
+ OUT gckFENCE * Fence
+ )
+{
+ gceSTATUS status;
+ gcePOOL pool = gcvPOOL_DEFAULT;
+ gckFENCE fence = gcvNULL;
+ gctSIZE_T size = 8;
+ gctUINT32 allocFlag = gcvALLOC_FLAG_CONTIGUOUS;
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ allocFlag |= gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+
+ gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(gcsFENCE), (gctPOINTER *)&fence));
+ gcmkONERROR(gckOS_ZeroMemory(fence, gcmSIZEOF(gcsFENCE)));
+ gcmkONERROR(gckOS_CreateMutex(Os, (gctPOINTER *)&fence->mutex));
+
+ fence->kernel = Kernel;
+
+ /* Allocate video memory node for fence. */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ Kernel,
+ 64,
+ gcvVIDMEM_TYPE_FENCE,
+ allocFlag,
+ &size,
+ &pool,
+ &fence->videoMem
+ ));
+
+ /* Lock for GPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_Lock(
+ Kernel,
+ fence->videoMem,
+ &fence->address
+ ));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ Kernel,
+ fence->videoMem,
+ gcvFALSE,
+ gcvFALSE,
+ &fence->logical
+ ));
+
+ gcsLIST_Init(&fence->waitingList);
+
+ *Fence = fence;
+
+ return gcvSTATUS_OK;
+OnError:
+ if (fence)
+ {
+ gckFENCE_Destory(Os, fence);
+ }
+
+ return status;
+}
+
+gceSTATUS
+gckFENCE_Destory(
+ IN gckOS Os,
+ OUT gckFENCE Fence
+ )
+{
+ if (Fence->mutex)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Os, Fence->mutex));
+ }
+
+ if (Fence->logical)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ Fence->kernel,
+ Fence->videoMem,
+ 0,
+ gcvFALSE,
+ gcvFALSE
+ ));
+
+ /* Synchronueous unlock. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Unlock(
+ Fence->kernel,
+ Fence->videoMem,
+ 0,
+ gcvNULL
+ ));
+
+ /* Free video memory. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(
+ Fence->kernel,
+ Fence->videoMem
+ ));
+ }
+
+ gcmkOS_SAFE_FREE(Os, Fence);
+
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckFENCE_Signal
+**
+** Signal all completed nodes.
+**
+**
+*/
+gceSTATUS
+gckFENCE_Signal(
+ IN gckOS Os,
+ IN gckFENCE Fence
+ )
+{
+ gcsLISTHEAD_PTR list = &Fence->waitingList;
+ gcsLISTHEAD_PTR nodeHead, nodeTemp;
+ gckFENCE_SYNC sync;
+ gckOS os = Os;
+ gctUINT64 stamp = *(gctUINT64 *)Fence->logical;
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(os, Fence->mutex, gcvINFINITE));
+
+ gcmkLIST_FOR_EACH_SAFE(nodeHead, nodeTemp, list)
+ {
+ sync = gcmCONTAINEROF(nodeHead, struct _gcsFENCE_SYNC, head);
+
+ /* Signal all nodes which are complete. */
+ if (sync->commitStamp <= stamp && sync->inList)
+ {
+ /* Signal. */
+ gckOS_Signal(os, sync->signal, gcvTRUE);
+
+ /* Remove from wait list. */
+ gcsLIST_Del(nodeHead);
+
+ /* Mark node not in waiting list. */
+ sync->inList = gcvFALSE;
+ }
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, Fence->mutex));
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckDEVICE_Construct(
+ IN gckOS Os,
+ OUT gckDEVICE * Device
+ )
+{
+ gceSTATUS status;
+ gckDEVICE device;
+ gctUINT i, j;
+
+ gcmkHEADER();
+
+ gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(gcsDEVICE), (gctPOINTER *)&device));
+
+ gckOS_ZeroMemory(device, gcmSIZEOF(gcsDEVICE));
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ device->coreInfoArray[i].type = gcvHARDWARE_INVALID;
+
+ /* Initialize internal SRAM. */
+ for (j = 0; j < gcvSRAM_INTER_COUNT; j++)
+ {
+ device->sRAMBases[i][j] = gcvINVALID_PHYSICAL_ADDRESS;
+ device->sRAMSizes[i][j] = 0;
+ device->sRAMPhysFaked[i][j] = gcvFALSE;
+ }
+ }
+
+ /* Initialize external SRAM. */
+ for (i = 0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ device->extSRAMBases[i] = gcvINVALID_PHYSICAL_ADDRESS;
+ device->extSRAMSizes[i] = 0;
+ }
+
+ device->defaultHwType = gcvHARDWARE_INVALID;
+
+ gcmkONERROR(gckOS_CreateMutex(Os, &device->stuckDumpMutex));
+ gcmkONERROR(gckOS_CreateMutex(Os, &device->commitMutex));
+
+ device->os = Os;
+ device->showSRAMMapInfo = 0;
+
+ *Device = device;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+
+ if (device != gcvNULL)
+ {
+ gckDEVICE_Destroy(Os, device);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckDEVICE_AddCore(
+ IN gckDEVICE Device,
+ IN gceCORE Core,
+ IN gctUINT ChipID,
+ IN gctPOINTER Context,
+ IN gckKERNEL * Kernel
+ )
+{
+ gceSTATUS status;
+ gcsCORE_INFO * info = Device->coreInfoArray;
+ gceHARDWARE_TYPE type = (gceHARDWARE_TYPE)((gctUINT)gcvHARDWARE_INVALID);
+ gctUINT32 index = Device->coreNum;
+ gctUINT32 i;
+ gcsCORE_LIST *coreList;
+ gceHARDWARE_TYPE kernelType;
+ gceHARDWARE_TYPE defaultHwType;
+ gckKERNEL kernel;
+
+ gcmkHEADER_ARG("Device=%p Core=%d ChipID=%d Context=%p Kernel=%p",
+ Device, Core, ChipID, Context, Kernel);
+
+ gcmkASSERT(Device->coreNum < gcvCORE_COUNT);
+
+ if (Core >= gcvCORE_MAJOR && Core <= gcvCORE_3D_MAX)
+ {
+ /* Chip ID is only used for 3D cores. */
+ if (ChipID == gcvCHIP_ID_DEFAULT)
+ {
+ /* Apply default chipID if it is not set. */
+ ChipID = Core;
+ }
+ }
+
+ /* Construct gckKERNEL for this core. */
+ gcmkONERROR(gckKERNEL_Construct(
+ Device->os, Core, ChipID, Context, Device, Device->database, Kernel));
+
+ kernel = *Kernel;
+
+ if (Device->database == gcvNULL)
+ {
+ Device->database = kernel->db;
+ }
+
+ gcmkVERIFY_OK(
+ gckKERNEL_GetHardwareType(kernel,
+ &kernelType));
+
+ if (kernelType >= gcvHARDWARE_NUM_TYPES)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ info[index].type = kernelType;
+ info[index].core = Core;
+ info[index].kernel = kernel;
+ info[index].chipID = ChipID;
+
+ if (index == 0)
+ {
+ /* First core, map all type/core to it. */
+ for (; type != gcvHARDWARE_NUM_TYPES; type = (gceHARDWARE_TYPE)((gctUINT)type + 1))
+ {
+ Device->map[type].num = 0;
+
+ for (i = 0 ; i < 4; i++)
+ {
+ Device->map[type].kernels[i] = kernel;
+ }
+ }
+ }
+
+ /* Get core list of this type. */
+ coreList = &Device->map[kernelType];
+
+ /* 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;
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckDEVICE_ChipInfo(
+ IN gckDEVICE Device,
+ IN gcsHAL_INTERFACE_PTR Interface
+ )
+{
+ {
+ gctUINT i;
+ gcsCORE_INFO * info = Device->coreInfoArray;
+
+ for (i = 0; i < Device->coreNum; i++)
+ {
+ Interface->u.ChipInfo.types[i] = info[i].type;
+ Interface->u.ChipInfo.ids[i] = info[i].chipID;
+ }
+
+ Interface->u.ChipInfo.count = Device->coreNum;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckDEVICE_Version(
+ IN gckDEVICE Device,
+ IN gcsHAL_INTERFACE_PTR Interface
+ )
+{
+ Interface->u.Version.major = gcvVERSION_MAJOR;
+ Interface->u.Version.minor = gcvVERSION_MINOR;
+ Interface->u.Version.patch = gcvVERSION_PATCH;
+ Interface->u.Version.build = gcvVERSION_BUILD;
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_KERNEL,
+ "KERNEL version %d.%d.%d build %u",
+ gcvVERSION_MAJOR, gcvVERSION_MINOR,
+ gcvVERSION_PATCH, gcvVERSION_BUILD);
+#endif
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckDEVICE_Destroy(
+ IN gckOS Os,
+ IN gckDEVICE Device
+ )
+{
+ gctINT i;
+ gcsCORE_INFO * info = Device->coreInfoArray;
+
+ for (i = Device->coreNum - 1; i >= 0 ; i--)
+ {
+ if (info[i].kernel != gcvNULL)
+ {
+ gckKERNEL_Destroy(info[i].kernel);
+ }
+ }
+
+ if (Device->commitMutex)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Os, Device->commitMutex));
+ }
+ if (Device->stuckDumpMutex)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Os, Device->stuckDumpMutex));
+ }
+
+ gcmkOS_SAFE_FREE(Os, Device);
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+gckDEVICE_SetTimeOut(
+ IN gckDEVICE Device,
+ IN gcsHAL_INTERFACE_PTR Interface
+ )
+{
+#if gcdGPU_TIMEOUT
+ gckKERNEL kernel;
+ gctUINT i;
+ gceHARDWARE_TYPE type = Interface->hardwareType;
+ gcsCORE_LIST *coreList;
+ gctUINT32 processID = 0;
+
+ /* Get the current process ID. */
+ gckOS_GetProcessID(&processID);
+
+ coreList = &Device->map[type];
+
+ for (i = 0; i < coreList->num; i++)
+ {
+ kernel = coreList->kernels[i];
+
+ kernel->timeOut = Interface->u.SetTimeOut.timeOut;
+
+ kernel->timeoutPID = processID;
+ }
+#endif
+
+ return gcvSTATUS_OK;
+}
+
+
+gceSTATUS
+gckDEVICE_Dispatch(
+ IN gckDEVICE Device,
+ IN gcsHAL_INTERFACE_PTR Interface
+ )
+{
+ gceSTATUS status = gcvSTATUS_NOT_SUPPORTED;
+ gckKERNEL kernel;
+ gceHARDWARE_TYPE type = Interface->hardwareType;
+ gctUINT32 coreIndex = Interface->coreIndex;
+
+ switch (Interface->command)
+ {
+ case gcvHAL_CHIP_INFO:
+ status = gckDEVICE_ChipInfo(Device, Interface);
+ break;
+
+ case gcvHAL_VERSION:
+ status = gckDEVICE_Version(Device, Interface);
+ break;
+
+ case gcvHAL_SET_TIMEOUT:
+ status = gckDEVICE_SetTimeOut(Device, Interface);
+ break;
+
+ default:
+ status = gcvSTATUS_NOT_SUPPORTED;
+ break;
+ }
+
+ if (gcmIS_SUCCESS(status))
+ {
+ /* Dispatch handled in this layer. */
+ Interface->status = status;
+ }
+ else
+ {
+ /* Need go through gckKERNEL dispatch. */
+ kernel = Device->map[type].kernels[coreIndex];
+
+
+#if gcdENABLE_VG
+ if (kernel->vg)
+ {
+ status = gckVGKERNEL_Dispatch(kernel, Interface);
+ }
+ else
+#endif
+ {
+ status = gckKERNEL_Dispatch(kernel, Device, Interface);
+ }
+
+ /* Interface->status is handled in gckKERNEL_Dispatch(). */
+ }
+
+ return status;
+}
+
+gceSTATUS
+gckDEVICE_GetMMU(
+ IN gckDEVICE Device,
+ IN gceHARDWARE_TYPE Type,
+ IN gckMMU *Mmu
+ )
+{
+ gcmkHEADER();
+ gcmkVERIFY_ARGUMENT(Type < gcvHARDWARE_NUM_TYPES);
+
+ *Mmu = Device->mmus[Type];
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckDEVICE_SetMMU(
+ IN gckDEVICE Device,
+ IN gceHARDWARE_TYPE Type,
+ IN gckMMU Mmu
+ )
+{
+ gcmkHEADER();
+ gcmkVERIFY_ARGUMENT(Type < gcvHARDWARE_NUM_TYPES);
+
+ Device->mmus[Type] = Mmu;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+#if gcdENABLE_TRUST_APPLICATION
+gceSTATUS
+gckKERNEL_MapInTrustApplicaiton(
+ IN gckKERNEL Kernel,
+ IN gctPOINTER Logical,
+ IN gctPHYS_ADDR Physical,
+ IN gctUINT32 GPUAddress,
+ IN gctSIZE_T PageCount
+ )
+{
+ gceSTATUS status;
+ gctUINT32 * physicalArrayLogical = gcvNULL;
+ gctSIZE_T bytes;
+ gctPOINTER logical = Logical;
+ gctUINT32 i;
+ gctSIZE_T pageSize;
+ gctUINT32 pageMask;
+
+ gcmkHEADER();
+
+ gcmkVERIFY_OK(gckOS_GetPageSize(Kernel->os, &pageSize));
+
+ pageMask = (gctUINT32)pageSize - 1;
+
+ bytes = PageCount * gcmSIZEOF(gctUINT32);
+
+ gcmkONERROR(gckOS_Allocate(
+ Kernel->os,
+ bytes,
+ (gctPOINTER *)&physicalArrayLogical
+ ));
+
+ /* Fill in physical array. */
+ for (i = 0; i < PageCount; i++)
+ {
+ gctPHYS_ADDR_T phys;
+ status = gckOS_GetPhysicalFromHandle(
+ Kernel->os,
+ Physical,
+ i * 4096,
+ &phys
+ );
+
+ if (status == gcvSTATUS_NOT_SUPPORTED)
+ {
+ gcmkONERROR(gckOS_GetPhysicalAddress(
+ Kernel->os,
+ logical,
+ &phys
+ ));
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, phys, &phys));
+ }
+
+ phys &= ~pageMask;
+
+ gcmkSAFECASTPHYSADDRT(physicalArrayLogical[i], phys);
+
+ logical = (gctUINT8_PTR)logical + 4096;
+ }
+
+ gcmkONERROR(gckKERNEL_SecurityMapMemory(
+ Kernel,
+ physicalArrayLogical,
+ 0,
+ (gctUINT32)PageCount,
+ &GPUAddress
+ ));
+
+ gcmkVERIFY_OK(gckOS_Free(
+ Kernel->os,
+ physicalArrayLogical
+ ));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (physicalArrayLogical != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_Free(
+ Kernel->os,
+ (gctPOINTER)physicalArrayLogical
+ ));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+#endif
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
new file mode 100644
index 000000000000..f9d87d75b137
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel.h
@@ -0,0 +1,2413 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_h_
+#define __gc_hal_kernel_h_
+
+#include "gc_hal.h"
+#include "gc_hal_kernel_hardware.h"
+#include "gc_hal_kernel_hardware_fe.h"
+#include "gc_hal_driver.h"
+#include "gc_hal_kernel_mutex.h"
+#include "gc_hal_metadata.h"
+
+#if gcdENABLE_VG
+#include "gc_hal_kernel_vg.h"
+#endif
+
+#if gcdSECURITY || gcdENABLE_TRUST_APPLICATION
+#include "gc_hal_security_interface.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+***** New MMU Defination *******************************************************/
+
+#if gcdENABLE_MMU_1KMODE
+/* 1k mode */
+#define gcdMMU_MTLB_SHIFT 24
+#define gcdMMU_STLB_4K_SHIFT 12
+#define gcdMMU_STLB_64K_SHIFT 16
+#define gcdMMU_STLB_1M_SHIFT 20
+#define gcdMMU_STLB_16M_SHIFT 24
+
+#define gcdMMU_MTLB_BITS (32 - gcdMMU_MTLB_SHIFT)
+#define gcdMMU_PAGE_4K_BITS gcdMMU_STLB_4K_SHIFT
+#define gcdMMU_STLB_4K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_PAGE_4K_BITS)
+#define gcdMMU_PAGE_64K_BITS gcdMMU_STLB_64K_SHIFT
+#define gcdMMU_STLB_64K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_PAGE_64K_BITS)
+#define gcdMMU_PAGE_1M_BITS gcdMMU_STLB_1M_SHIFT
+#define gcdMMU_STLB_1M_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_PAGE_1M_BITS)
+#define gcdMMU_PAGE_16M_BITS gcdMMU_STLB_16M_SHIFT
+#define gcdMMU_STLB_16M_BITS 4
+
+
+#define gcdMMU_MTLB_ENTRY_NUM (1 << gcdMMU_MTLB_BITS)
+#define gcdMMU_MTLB_SIZE (gcdMMU_MTLB_ENTRY_NUM << 2)
+#define gcdMMU_STLB_4K_ENTRY_NUM (1 << gcdMMU_STLB_4K_BITS)
+#define gcdMMU_STLB_4K_SIZE (gcdMMU_STLB_4K_ENTRY_NUM << 2)
+#define gcdMMU_PAGE_4K_SIZE (1 << gcdMMU_STLB_4K_SHIFT)
+#define gcdMMU_STLB_64K_ENTRY_NUM (1 << gcdMMU_STLB_64K_BITS)
+#define gcdMMU_STLB_64K_SIZE (gcdMMU_STLB_64K_ENTRY_NUM << 2)
+#define gcdMMU_PAGE_64K_SIZE (1 << gcdMMU_STLB_64K_SHIFT)
+#define gcdMMU_STLB_1M_ENTRY_NUM (1 << gcdMMU_STLB_1M_BITS)
+#define gcdMMU_STLB_1M_SIZE (gcdMMU_STLB_1M_ENTRY_NUM << 2)
+#define gcdMMU_PAGE_1M_SIZE (1 << gcdMMU_STLB_1M_SHIFT)
+#define gcdMMU_STLB_16M_ENTRY_NUM (1 << gcdMMU_STLB_16M_BITS)
+#define gcdMMU_STLB_16M_SIZE (gcdMMU_STLB_16M_ENTRY_NUM << 2)
+#define gcdMMU_PAGE_16M_SIZE (1 << gcdMMU_STLB_16M_SHIFT)
+
+
+#define gcdMMU_MTLB_MASK (~((1U << gcdMMU_MTLB_SHIFT)-1))
+#define gcdMMU_STLB_4K_MASK ((~0U << gcdMMU_STLB_4K_SHIFT) ^ gcdMMU_MTLB_MASK)
+#define gcdMMU_PAGE_4K_MASK (gcdMMU_PAGE_4K_SIZE - 1)
+#define gcdMMU_STLB_64K_MASK ((~((1U << gcdMMU_STLB_64K_SHIFT)-1)) ^ gcdMMU_MTLB_MASK)
+#define gcdMMU_PAGE_64K_MASK (gcdMMU_PAGE_64K_SIZE - 1)
+#define gcdMMU_STLB_1M_MASK ((~((1U << gcdMMU_STLB_1M_SHIFT)-1)) ^ gcdMMU_MTLB_MASK)
+#define gcdMMU_PAGE_1M_MASK (gcdMMU_PAGE_1M_SIZE - 1)
+#define gcdMMU_STLB_16M_MASK 0x0F000000
+#define gcdMMU_PAGE_16M_MASK (gcdMMU_PAGE_16M_SIZE - 1)
+
+
+/* Page offset definitions. */
+#define gcdMMU_OFFSET_4K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_STLB_4K_BITS)
+#define gcdMMU_OFFSET_4K_MASK ((1U << gcdMMU_OFFSET_4K_BITS) - 1)
+#define gcdMMU_OFFSET_64K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_STLB_64K_BITS)
+#define gcdMMU_OFFSET_64K_MASK ((1U << gcdMMU_OFFSET_64K_BITS) - 1)
+#define gcdMMU_OFFSET_1M_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_STLB_1M_BITS)
+#define gcdMMU_OFFSET_1M_MASK ((1U << gcdMMU_OFFSET_1M_BITS) - 1)
+#define gcdMMU_OFFSET_16M_BITS (32 - gcdMMU_MTLB_BITS)
+#define gcdMMU_OFFSET_16M_MASK ((1U << gcdMMU_OFFSET_16M_BITS) - 1)
+
+
+#define gcdMMU_MTLB_ENTRY_HINTS_BITS 6
+#define gcdMMU_MTLB_ENTRY_STLB_MASK (~((1U << gcdMMU_MTLB_ENTRY_HINTS_BITS) - 1))
+
+#define gcdMMU_MTLB_PRESENT 0x00000001
+#define gcdMMU_MTLB_EXCEPTION 0x00000002
+#define gcdMMU_MTLB_4K_PAGE (0 << 2)
+#define gcdMMU_MTLB_64K_PAGE (1 << 2)
+#define gcdMMU_MTLB_1M_PAGE (2 << 2)
+#define gcdMMU_MTBL_16M_PAGE (3 << 2)
+
+#define gcdMMU_STLB_PRESENT 0x00000001
+#define gcdMMU_STLB_EXCEPTION 0x00000002
+#define gcdMMU_STBL_WRITEABLE 0x00000004
+
+#else /* 4K mode */
+
+#define gcdMMU_MTLB_SHIFT 22
+#define gcdMMU_STLB_4K_SHIFT 12
+#define gcdMMU_STLB_64K_SHIFT 16
+
+#define gcdMMU_MTLB_BITS (32 - gcdMMU_MTLB_SHIFT)
+#define gcdMMU_PAGE_4K_BITS gcdMMU_STLB_4K_SHIFT
+#define gcdMMU_STLB_4K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_PAGE_4K_BITS)
+#define gcdMMU_PAGE_64K_BITS gcdMMU_STLB_64K_SHIFT
+#define gcdMMU_STLB_64K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_PAGE_64K_BITS)
+
+#define gcdMMU_MTLB_ENTRY_NUM (1 << gcdMMU_MTLB_BITS)
+#define gcdMMU_MTLB_SIZE (gcdMMU_MTLB_ENTRY_NUM << 2)
+#define gcdMMU_STLB_4K_ENTRY_NUM (1 << gcdMMU_STLB_4K_BITS)
+#define gcdMMU_STLB_4K_SIZE (gcdMMU_STLB_4K_ENTRY_NUM << 2)
+#define gcdMMU_PAGE_4K_SIZE (1 << gcdMMU_STLB_4K_SHIFT)
+#define gcdMMU_STLB_64K_ENTRY_NUM (1 << gcdMMU_STLB_64K_BITS)
+#define gcdMMU_STLB_64K_SIZE (gcdMMU_STLB_64K_ENTRY_NUM << 2)
+#define gcdMMU_PAGE_64K_SIZE (1 << gcdMMU_STLB_64K_SHIFT)
+
+#define gcdMMU_MTLB_MASK (~((1U << gcdMMU_MTLB_SHIFT)-1))
+#define gcdMMU_STLB_4K_MASK ((~0U << gcdMMU_STLB_4K_SHIFT) ^ gcdMMU_MTLB_MASK)
+#define gcdMMU_PAGE_4K_MASK (gcdMMU_PAGE_4K_SIZE - 1)
+#define gcdMMU_STLB_64K_MASK ((~((1U << gcdMMU_STLB_64K_SHIFT)-1)) ^ gcdMMU_MTLB_MASK)
+#define gcdMMU_PAGE_64K_MASK (gcdMMU_PAGE_64K_SIZE - 1)
+
+/* Page offset definitions. */
+#define gcdMMU_OFFSET_4K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_STLB_4K_BITS)
+#define gcdMMU_OFFSET_4K_MASK ((1U << gcdMMU_OFFSET_4K_BITS) - 1)
+#define gcdMMU_OFFSET_64K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_STLB_64K_BITS)
+#define gcdMMU_OFFSET_64K_MASK ((1U << gcdMMU_OFFSET_64K_BITS) - 1)
+
+#define gcdMMU_MTLB_ENTRY_HINTS_BITS 6
+#define gcdMMU_MTLB_ENTRY_STLB_MASK (~((1U << gcdMMU_MTLB_ENTRY_HINTS_BITS) - 1))
+
+#define gcdMMU_MTLB_PRESENT 0x00000001
+#define gcdMMU_MTLB_EXCEPTION 0x00000002
+#define gcdMMU_MTLB_4K_PAGE (0 << 2)
+#define gcdMMU_MTLB_64K_PAGE (1 << 2)
+
+
+#define gcdMMU_STLB_PRESENT 0x00000001
+#define gcdMMU_STLB_EXCEPTION 0x00000002
+#define gcdMMU_STLB_WRITEABLE 0x00000004
+
+#endif
+
+#define gcd1M_PAGE_SIZE (1 << 20)
+#define gcd1M_PAGE_SHIFT 20
+
+/*******************************************************************************
+***** Stuck Dump Level ********************************************************/
+
+/* Dump nonthing when stuck happens. */
+#define gcvSTUCK_DUMP_NONE 0
+
+/* Dump GPU state and memory near stuck point. */
+#define gcvSTUCK_DUMP_NEARBY_MEMORY 1
+
+/* Beside gcvSTUCK_DUMP_NEARBY_MEMORY, dump context buffer and user command buffer. */
+#define gcvSTUCK_DUMP_USER_COMMAND 2
+
+/* Beside gcvSTUCK_DUMP_USER_COMMAND, commit will be stall
+** to make sure command causing stuck isn't missed. */
+#define gcvSTUCK_DUMP_STALL_COMMAND 3
+
+/* Beside gcvSTUCK_DUMP_USER_COMMAND, dump kernel command buffer. */
+#define gcvSTUCK_DUMP_ALL_COMMAND 4
+
+/*******************************************************************************
+***** Page table **************************************************************/
+
+#define gcvPAGE_TABLE_DIRTY_BIT_OTHER (1 << 0)
+#define gcvPAGE_TABLE_DIRTY_BIT_FE (1 << 1)
+
+/*******************************************************************************
+***** Process Database Management *********************************************/
+
+typedef enum _gceDATABASE_TYPE
+{
+ gcvDB_VIDEO_MEMORY = 1, /* Video memory created. */
+ gcvDB_NON_PAGED, /* Non paged memory. */
+ gcvDB_SIGNAL, /* Signal. */
+ gcvDB_VIDEO_MEMORY_LOCKED, /* Video memory locked. */
+ gcvDB_CONTEXT, /* Context */
+ gcvDB_IDLE, /* GPU idle. */
+ gcvDB_MAP_MEMORY, /* Map memory */
+ gcvDB_SHBUF, /* Shared buffer. */
+
+ gcvDB_NUM_TYPES,
+}
+gceDATABASE_TYPE;
+
+#define gcdDATABASE_TYPE_MASK 0x000000FF
+#define gcdDB_VIDEO_MEMORY_TYPE_MASK 0x0000FF00
+#define gcdDB_VIDEO_MEMORY_TYPE_SHIFT 8
+
+#define gcdDB_VIDEO_MEMORY_POOL_MASK 0x00FF0000
+#define gcdDB_VIDEO_MEMORY_POOL_SHIFT 16
+
+typedef struct _gcsDATABASE_RECORD * gcsDATABASE_RECORD_PTR;
+typedef struct _gcsDATABASE_RECORD
+{
+ /* Pointer to kernel. */
+ gckKERNEL kernel;
+
+ /* Pointer to next database record. */
+ gcsDATABASE_RECORD_PTR next;
+
+ /* Type of record. */
+ gceDATABASE_TYPE type;
+
+ /* Data for record. */
+ gctPOINTER data;
+ gctPHYS_ADDR physical;
+ gctSIZE_T bytes;
+}
+gcsDATABASE_RECORD;
+
+typedef struct _gcsDATABASE * gcsDATABASE_PTR;
+typedef struct _gcsDATABASE
+{
+ /* Pointer to next entry is hash list. */
+ gcsDATABASE_PTR next;
+ gctSIZE_T slot;
+
+ /* 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;
+ gcsDATABASE_COUNTERS mapMemory;
+
+ gcsDATABASE_COUNTERS vidMemType[gcvVIDMEM_TYPE_COUNT];
+ /* Counter for each video memory pool. */
+ gcsDATABASE_COUNTERS vidMemPool[gcvPOOL_NUMBER_OF_POOLS];
+ gctPOINTER counterMutex;
+
+ /* Idle time management. */
+ gctUINT64 lastIdle;
+ gctUINT64 idle;
+
+ /* Pointer to database. */
+ gcsDATABASE_RECORD_PTR list[48];
+
+ gctPOINTER handleDatabase;
+ gctPOINTER handleDatabaseMutex;
+}
+gcsDATABASE;
+
+typedef struct _gcsFDPRIVATE * gcsFDPRIVATE_PTR;
+typedef struct _gcsFDPRIVATE
+{
+ gctINT (* release) (gcsFDPRIVATE_PTR Private);
+}
+gcsFDPRIVATE;
+
+typedef struct _gcsRECORDER * gckRECORDER;
+
+
+/* Create a process database that will contain all its allocations. */
+gceSTATUS
+gckKERNEL_CreateProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID
+ );
+
+/* Add a record to the process database. */
+gceSTATUS
+gckKERNEL_AddProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gceDATABASE_TYPE Type,
+ IN gctPOINTER Pointer,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Size
+ );
+
+/* Remove a record to the process database. */
+gceSTATUS
+gckKERNEL_RemoveProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gceDATABASE_TYPE Type,
+ IN gctPOINTER Pointer
+ );
+
+/* Destroy the process database. */
+gceSTATUS
+gckKERNEL_DestroyProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID
+ );
+
+/* Find a record to the process database. */
+gceSTATUS
+gckKERNEL_FindProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 ThreadID,
+ IN gceDATABASE_TYPE Type,
+ IN gctPOINTER Pointer,
+ OUT gcsDATABASE_RECORD_PTR Record
+ );
+
+/* Query the process database. */
+gceSTATUS
+gckKERNEL_QueryProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctBOOL LastProcessID,
+ IN gceDATABASE_TYPE Type,
+ OUT gcuDATABASE_INFO * Info
+ );
+
+/* Dump the process database. */
+gceSTATUS
+gckKERNEL_DumpProcessDB(
+ IN gckKERNEL Kernel
+ );
+
+/* Dump the video memory usage for process specified. */
+gceSTATUS
+gckKERNEL_DumpVidMemUsage(
+ IN gckKERNEL Kernel,
+ IN gctINT32 ProcessID
+ );
+
+gceSTATUS
+gckKERNEL_FindDatabase(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctBOOL LastProcessID,
+ OUT gcsDATABASE_PTR * Database
+ );
+
+gceSTATUS
+gckKERNEL_FindHandleDatbase(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ OUT gctPOINTER * HandleDatabase,
+ OUT gctPOINTER * HandleDatabaseMutex
+ );
+
+gceSTATUS
+gckMMU_GetPageEntry(
+ IN gckMMU Mmu,
+ IN gcePAGE_TYPE PageType,
+ IN gctUINT32 Address,
+ IN gctUINT32_PTR *PageTable
+ );
+
+gceSTATUS
+gckMMU_SetupSRAM(
+ IN gckMMU Mmu,
+ IN gckHARDWARE Hardware,
+ IN gckDEVICE Device
+ );
+
+gceSTATUS
+gckMMU_SetupDynamicSpace(
+ IN gckMMU Mmu
+ );
+
+void
+gckMMU_DumpRecentFreedAddress(
+ IN gckMMU Mmu
+ );
+
+gceSTATUS
+gckKERNEL_CreateIntegerDatabase(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Capacity,
+ OUT gctPOINTER * Database
+ );
+
+gceSTATUS
+gckKERNEL_DestroyIntegerDatabase(
+ IN gckKERNEL Kernel,
+ IN gctPOINTER Database
+ );
+
+gceSTATUS
+gckKERNEL_AllocateIntegerId(
+ IN gctPOINTER Database,
+ IN gctPOINTER Pointer,
+ OUT gctUINT32 * Id
+ );
+
+gceSTATUS
+gckKERNEL_FreeIntegerId(
+ IN gctPOINTER Database,
+ IN gctUINT32 Id
+ );
+
+gceSTATUS
+gckKERNEL_QueryIntegerId(
+ IN gctPOINTER Database,
+ IN gctUINT32 Id,
+ OUT gctPOINTER * Pointer
+ );
+
+/* Pointer rename */
+gctUINT32
+gckKERNEL_AllocateNameFromPointer(
+ IN gckKERNEL Kernel,
+ IN gctPOINTER Pointer
+ );
+
+gctPOINTER
+gckKERNEL_QueryPointerFromName(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Name
+ );
+
+gceSTATUS
+gckKERNEL_DeleteName(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Name
+ );
+
+/*******************************************************************************
+********* Timer Management ****************************************************/
+typedef struct _gcsTIMER * gcsTIMER_PTR;
+typedef struct _gcsTIMER
+{
+ /* Start and Stop time holders. */
+ gctUINT64 startTime;
+ gctUINT64 stopTime;
+}
+gcsTIMER;
+
+/******************************************************************************\
+********************************** Structures **********************************
+\******************************************************************************/
+
+/* gckDB object. */
+struct _gckDB
+{
+ /* Database management. */
+ gcsDATABASE_PTR db[16];
+ gctPOINTER dbMutex;
+ gcsDATABASE_PTR freeDatabase;
+ gcsDATABASE_RECORD_PTR freeRecord;
+ gcsDATABASE_PTR lastDatabase;
+ gctUINT32 lastProcessID;
+ gctUINT64 lastIdle;
+ gctUINT64 idleTime;
+ gctUINT64 lastSlowdown;
+ gctUINT64 lastSlowdownIdle;
+
+ gctPOINTER nameDatabase;
+ gctPOINTER nameDatabaseMutex;
+
+ gctPOINTER pointerDatabase;
+
+ gcsLISTHEAD videoMemList;
+ gctPOINTER videoMemListMutex;
+};
+
+typedef struct _gckCOMMAND * gckCOMMAND;
+
+typedef struct _gckEVENT * gckEVENT;
+
+/* gckKERNEL object. */
+struct _gckKERNEL
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* Pointer to gckOS object. */
+ gckOS os;
+
+ /* Pointer to gckDEVICE object. */
+ gckDEVICE device;
+
+ /* Pointer to gckHARDWARE object. */
+ gckHARDWARE hardware;
+
+ /* Core */
+ gceCORE core;
+ gctUINT chipID;
+
+ /* Main command module, event and context. */
+ gckCOMMAND command;
+ gckEVENT eventObj;
+ gctPOINTER context;
+
+ /* Async FE command and event modules. */
+ gckCOMMAND asyncCommand;
+ gckEVENT asyncEvent;
+
+ /* Pointer to gckMMU object. */
+ gckMMU mmu;
+
+ /* Arom holding number of clients. */
+ gctPOINTER atomClients;
+
+#if VIVANTE_PROFILER
+ /* Enable profiling */
+ gctBOOL profileEnable;
+ /* Clear profile register or not*/
+ gctBOOL profileCleanRegister;
+#endif
+
+#ifdef QNX_SINGLE_THREADED_DEBUGGING
+ gctPOINTER debugMutex;
+#endif
+
+ /* Database management. */
+ gckDB db;
+ gctBOOL dbCreated;
+
+ gctUINT64 resetTimeStamp;
+
+ /* Pointer to gckEVENT object. */
+ gcsTIMER timers[8];
+ gctUINT32 timeOut;
+
+#if gcdENABLE_VG
+ gckVGKERNEL vg;
+#endif
+
+#if gcdDVFS
+ gckDVFS dvfs;
+#endif
+
+#if gcdLINUX_SYNC_FILE
+ gctHANDLE timeline;
+#endif
+
+ /* Enable recovery. */
+ gctBOOL recovery;
+
+ /* Level of dump information after stuck. */
+ gctUINT stuckDump;
+
+#if gcdSECURITY || gcdENABLE_TRUST_APPLICATION
+ gctUINT32 securityChannel;
+#endif
+
+ /* Timer to monitor GPU stuck. */
+ gctPOINTER monitorTimer;
+
+ /* Flag to quit monitor timer. */
+ gctBOOL monitorTimerStop;
+
+ /* Monitor states. */
+ gctBOOL monitoring;
+ gctUINT32 lastCommitStamp;
+ gctUINT32 timer;
+ gctUINT32 restoreAddress;
+ gctINT32 restoreMask;
+
+ gckVIDMEM_BLOCK vidMemBlock;
+ gctPOINTER vidMemBlockMutex;
+
+ gctUINT32 contiguousBaseAddress;
+ gctUINT32 externalBaseAddress;
+ gctUINT32 internalBaseAddress;
+
+ /* External shared SRAM. */
+ gctUINT32 extSRAMBaseAddresses[gcvSRAM_EXT_COUNT];
+ gctUINT32 extSRAMIndex;
+
+ /* Per core SRAM description. */
+ gctUINT32 sRAMIndex;
+ gckVIDMEM sRAMVidMem[gcvSRAM_INTER_COUNT];
+ gctPHYS_ADDR sRAMPhysical[gcvSRAM_INTER_COUNT];
+ gctUINT32 sRAMBaseAddresses[gcvSRAM_INTER_COUNT];
+ gctUINT32 sRAMSizes[gcvSRAM_INTER_COUNT];
+ gctBOOL sRAMPhysFaked[gcvSRAM_INTER_COUNT];
+ gctUINT64 sRAMLoopMode;
+
+ gctUINT32 timeoutPID;
+};
+
+struct _FrequencyHistory
+{
+ gctUINT32 frequency;
+ gctUINT32 count;
+};
+
+/* gckDVFS object. */
+struct _gckDVFS
+{
+ gckOS os;
+ gckHARDWARE hardware;
+ gctPOINTER timer;
+ gctUINT32 pollingTime;
+ gctBOOL stop;
+ gctUINT32 totalConfig;
+ gctUINT32 loads[8];
+ gctUINT8 currentScale;
+ struct _FrequencyHistory frequencyHistory[16];
+};
+
+typedef struct _gcsFENCE * gckFENCE;
+typedef struct _gcsFENCE
+{
+ /* Pointer to required object. */
+ gckKERNEL kernel;
+
+ /* Fence location. */
+ gckVIDMEM_NODE videoMem;
+ gctPOINTER logical;
+ gctUINT32 address;
+
+ gcsLISTHEAD waitingList;
+ gctPOINTER mutex;
+}
+gcsFENCE;
+
+/* A sync point attached to fence. */
+typedef struct _gcsFENCE_SYNC * gckFENCE_SYNC;
+typedef struct _gcsFENCE_SYNC
+{
+ /* Stamp of commit access this node. */
+ gctUINT64 commitStamp;
+
+ /* Attach to waiting list. */
+ gcsLISTHEAD head;
+
+ gctPOINTER signal;
+
+ gctBOOL inList;
+}
+gcsFENCE_SYNC;
+
+typedef struct _gcsCOMMAND_QUEUE
+{
+ gctSIGNAL signal;
+ gckVIDMEM_NODE videoMem;
+ gctPOINTER logical;
+ gctUINT32 address;
+}
+gcsCOMMAND_QUEUE;
+
+/* gckCOMMAND object. */
+struct _gckCOMMAND
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* Pointer to required object. */
+ gckKERNEL kernel;
+ gckOS os;
+
+ gceHW_FE_TYPE feType;
+
+ /* Number of bytes per page. */
+ gctUINT32 pageSize;
+
+ /* Current pipe select. */
+ gcePIPE_SELECT pipeSelect;
+
+ /* Command queue running flag. */
+ gctBOOL running;
+
+ /* Idle flag and commit stamp. */
+ gctBOOL idle;
+ gctUINT64 commitStamp;
+
+ /* Command queue mutex. */
+ gctPOINTER mutexQueue;
+
+ /* Context switching mutex. */
+ gctPOINTER mutexContext;
+
+ /* Context sequence mutex. */
+ gctPOINTER mutexContextSeq;
+
+ /* Command queue power semaphore. */
+ gctPOINTER powerSemaphore;
+
+ /* Command queues. */
+ gcsCOMMAND_QUEUE queues[gcdCOMMAND_QUEUES];
+
+ /* Current queue. */
+ gckVIDMEM_NODE videoMem;
+ gctPOINTER logical;
+ gctUINT32 address;
+
+ gctUINT32 offset;
+ gctINT index;
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ gctUINT wrapCount;
+#endif
+
+ /* The command queue is new. */
+ gctBOOL newQueue;
+
+ /* Context management. */
+ gckCONTEXT currContext;
+ gctPOINTER stateMap;
+
+ /* Pointer to last WAIT command. */
+ /* Wait-Link FE only. */
+ struct
+ {
+ gckVIDMEM_NODE videoMem;
+ gctUINT32 offset;
+ gctPOINTER logical;
+ gctUINT32 address;
+ gctUINT32 size;
+ }
+ waitPos;
+
+ /* MCFE. */
+ gctUINT32 totalSemaId;
+
+ /*
+ * freeSemaId ------> [pendingSema]
+ * ^ freePos -->+ +
+ * | ^ | |
+ * | | | |
+ * | nextPos ---+ |
+ * | |
+ * | |
+ * | v
+ * nextSemaId <----------------------+
+ *
+ * Terminology:
+ * 'freeSemaId': the top (final) free sema id can be used, signaled already.
+ * 'nextSemaId': the next sema id to be used.
+ * 'pendingSema': the used semaphores which are tracked in the ring.
+ *
+ * 3 Id sections:
+ * Id(s) between 'nextSemaId' and 'freeSemaId':
+ * Available for immediate use.
+ *
+ * Id(s) between 'freeSemaId' (exclusive) and 'pendingSema':
+ * To be signed, will be available to use later.
+ *
+ * Id(s) between 'pendingSema' and 'nextSemaId':
+ * The semaphores just used, not tracking in pendingSema ring.
+ *
+ * Conditions:
+ * 'nextSemaId' = 'freeSemaId':
+ * Using the final free semaphore, means the ring is full of used ones.
+ *
+ * 'freeSemaId' + 1 = 'nextSemaId':
+ * Can use 'freeSema' + 1 to 'freeSema'(loop back), means empty ring,
+ * ie, no used one.
+ */
+
+ /* MCFE semaphore id tracking ring. */
+ gctUINT32 nextSemaId;
+ gctUINT32 freeSemaId;
+
+ gctUINT32 semaMinThreshhold;
+
+ /* pending semaphore id tracking ring. */
+ struct
+ {
+ gctUINT32 semaId;
+ gctSIGNAL signal;
+ }
+ pendingSema[8];
+
+ gctUINT32 nextPendingPos;
+ gctUINT32 freePendingPos;
+
+ /* semaphore id (array index) to handle value map. */
+ gctUINT32 * semaHandleMap;
+
+ /*
+ * Dirty channels, ie channels ever submitted commands.
+ * Need sync to (send semaphore to) system channel.
+ */
+ gctUINT64 dirtyChannel[2];
+
+ /*
+ * Sync channels, need sync from (wait semaphore from) the system
+ * channel before its own jobs.
+ */
+ gctUINT64 syncChannel[2];
+
+ /* Command buffer alignment. */
+ gctUINT32 alignment;
+
+ /* Commit counter. */
+ gctPOINTER atomCommit;
+
+ /* Kernel process ID. */
+ gctUINT32 kernelProcessID;
+
+#if gcdRECORD_COMMAND
+ gckRECORDER recorder;
+#endif
+
+ gckFENCE fence;
+
+ gctBOOL dummyDraw;
+};
+
+typedef struct _gcsEVENT * gcsEVENT_PTR;
+
+/* Structure holding one event to be processed. */
+typedef struct _gcsEVENT
+{
+ /* Pointer to next event in queue. */
+ gcsEVENT_PTR next;
+
+ /* Event information. */
+ gcsHAL_INTERFACE info;
+
+ /* Process ID owning the event. */
+ gctUINT32 processID;
+
+#ifdef __QNXNTO__
+ /* Kernel. */
+ gckKERNEL kernel;
+#endif
+
+ gctBOOL fromKernel;
+}
+gcsEVENT;
+
+/* Structure holding a list of events to be processed by an interrupt. */
+typedef struct _gcsEVENT_QUEUE * gcsEVENT_QUEUE_PTR;
+typedef struct _gcsEVENT_QUEUE
+{
+ /* Time stamp. */
+ gctUINT64 stamp;
+
+ /* Source of the event. */
+ gceKERNEL_WHERE source;
+
+ /* Pointer to head of event queue. */
+ gcsEVENT_PTR head;
+
+ /* Pointer to tail of event queue. */
+ gcsEVENT_PTR tail;
+
+ /* Next list of events. */
+ gcsEVENT_QUEUE_PTR next;
+
+ /* Current commit stamp. */
+ gctUINT64 commitStamp;
+}
+gcsEVENT_QUEUE;
+
+/*
+ gcdREPO_LIST_COUNT defines the maximum number of event queues with different
+ hardware module sources that may coexist at the same time. Only two sources
+ are supported - gcvKERNEL_COMMAND and gcvKERNEL_PIXEL. gcvKERNEL_COMMAND
+ source is used only for managing the kernel command queue and is only issued
+ when the current command queue gets full. Since we commit event queues every
+ time we commit command buffers, in the worst case we can have up to three
+ pending event queues:
+ - gcvKERNEL_PIXEL
+ - gcvKERNEL_COMMAND (queue overflow)
+ - gcvKERNEL_PIXEL
+*/
+#define gcdREPO_LIST_COUNT 3
+
+
+/* gckEVENT object. */
+struct _gckEVENT
+{
+ /* The object. */
+ gcsOBJECT object;
+
+ /* Pointer to required objects. */
+ gckOS os;
+ gckKERNEL kernel;
+
+ /* Pointer to COMMAND object, either one of the 3. */
+ gckCOMMAND command;
+
+ /* Submit function pointer, different for different command module. */
+ gceSTATUS (* submitEvent)(gckEVENT, gctBOOL, gctBOOL);
+
+ /* Time stamp. */
+ gctUINT64 stamp;
+ gctUINT32 lastCommitStamp;
+
+ /* Queue mutex. */
+ gctPOINTER eventQueueMutex;
+
+ /* Array of event queues. */
+ gcsEVENT_QUEUE queues[29];
+ gctINT32 freeQueueCount;
+ gctUINT8 lastID;
+
+ /* Pending events. */
+ gctPOINTER pending;
+
+ /* List of free event structures and its mutex. */
+ gcsEVENT_PTR freeEventList;
+ gctSIZE_T freeEventCount;
+ gctPOINTER freeEventMutex;
+
+ /* Event queues. */
+ gcsEVENT_QUEUE_PTR queueHead;
+ gcsEVENT_QUEUE_PTR queueTail;
+ gcsEVENT_QUEUE_PTR freeList;
+ gcsEVENT_QUEUE repoList[gcdREPO_LIST_COUNT];
+ gctPOINTER eventListMutex;
+
+ gctPOINTER submitTimer;
+
+#if gcdINTERRUPT_STATISTIC
+ gctPOINTER interruptCount;
+#endif
+
+ gctINT notifyState;
+};
+
+/* Construct a new gckEVENT object. */
+gceSTATUS
+gckEVENT_Construct(
+ IN gckKERNEL Kernel,
+ IN gckCOMMAND Command,
+ OUT gckEVENT * Event
+ );
+
+/* Destroy an gckEVENT object. */
+gceSTATUS
+gckEVENT_Destroy(
+ IN gckEVENT Event
+ );
+
+/* Reserve the next available hardware event. */
+gceSTATUS
+gckEVENT_GetEvent(
+ IN gckEVENT Event,
+ IN gctBOOL Wait,
+ OUT gctUINT8 * EventID,
+ IN gceKERNEL_WHERE Source
+ );
+
+/* Add a new event to the list of events. */
+gceSTATUS
+gckEVENT_AddList(
+ IN gckEVENT Event,
+ IN gcsHAL_INTERFACE_PTR Interface,
+ IN gceKERNEL_WHERE FromWhere,
+ IN gctBOOL AllocateAllowed,
+ IN gctBOOL FromKernel
+ );
+
+/* Schedule a FreeVideoMemory event. */
+gceSTATUS
+gckEVENT_FreeVideoMemory(
+ IN gckEVENT Event,
+ IN gcuVIDMEM_NODE_PTR VideoMemory,
+ IN gceKERNEL_WHERE FromWhere
+ );
+
+/* Schedule a signal event. */
+gceSTATUS
+gckEVENT_Signal(
+ IN gckEVENT Event,
+ IN gctSIGNAL Signal,
+ IN gceKERNEL_WHERE FromWhere
+ );
+
+/* Schedule an Unlock event. */
+gceSTATUS
+gckEVENT_Unlock(
+ IN gckEVENT Event,
+ IN gceKERNEL_WHERE FromWhere,
+ IN gctPOINTER Node
+ );
+
+gceSTATUS
+gckEVENT_CommitDone(
+ IN gckEVENT Event,
+ IN gceKERNEL_WHERE FromWhere,
+ IN gckCONTEXT Context
+ );
+
+gceSTATUS
+gckEVENT_Submit(
+ IN gckEVENT Event,
+ IN gctBOOL Wait,
+ IN gctBOOL FromPower
+ );
+
+gceSTATUS
+gckEVENT_Commit(
+ IN gckEVENT Event,
+ IN gcsQUEUE_PTR Queue,
+ IN gctBOOL Forced
+ );
+
+/* Event callback routine. */
+gceSTATUS
+gckEVENT_Notify(
+ IN gckEVENT Event,
+ IN gctUINT32 IDs
+ );
+
+/* Event callback routine. */
+gceSTATUS
+gckEVENT_Interrupt(
+ IN gckEVENT Event,
+ IN gctUINT32 IDs
+ );
+
+gceSTATUS
+gckEVENT_Dump(
+ IN gckEVENT Event
+ );
+
+/* Free all events belonging to a process. */
+gceSTATUS
+gckEVENT_FreeProcess(
+ IN gckEVENT Event,
+ IN gctUINT32 ProcessID
+ );
+
+/* gcuVIDMEM_NODE structure. */
+typedef union _gcuVIDMEM_NODE
+{
+ /* Allocated from gckVIDMEM. */
+ struct _gcsVIDMEM_NODE_VIDMEM
+ {
+ /* Owner of this node. */
+ gckVIDMEM parent;
+
+ /* Dual-linked list of nodes. */
+ gcuVIDMEM_NODE_PTR next;
+ gcuVIDMEM_NODE_PTR prev;
+
+ /* Dual linked list of free nodes. */
+ gcuVIDMEM_NODE_PTR nextFree;
+ gcuVIDMEM_NODE_PTR prevFree;
+
+ /* Information for this node. */
+ gctSIZE_T offset;
+
+ gctUINT32 address;
+ gctSIZE_T bytes;
+ gctUINT32 alignment;
+
+ /* Client virtual address. */
+ gctPOINTER logical;
+
+ /* Process ID owning this memory. */
+ gctUINT32 processID;
+
+ /* Locked counter. */
+ gctINT32 locked;
+
+ /* Memory pool. */
+ gcePOOL pool;
+
+ /* Kernel virtual address. */
+ gctPOINTER kvaddr;
+
+ /* mdl record pointer. */
+ gctPHYS_ADDR physical;
+
+#if gcdENABLE_VG
+ gctPOINTER kernelVirtual;
+#endif
+ }
+ VidMem;
+
+ /* Allocated from gckOS. */
+ struct _gcsVIDMEM_NODE_VIRTUAL
+ {
+ /* Pointer to gckKERNEL object. */
+ gckKERNEL kernel;
+
+ /* Information for this node. */
+ /* Contiguously allocated? */
+ gctBOOL contiguous;
+ /* mdl record pointer... a kmalloc address. Process agnostic. */
+ gctPHYS_ADDR physical;
+ gctSIZE_T bytes;
+
+ /* do_mmap_pgoff address... mapped per-process. */
+ gctPOINTER logical;
+
+ /* Kernel virtual address. */
+ gctPOINTER kvaddr;
+
+#if gcdENABLE_VG
+ /* Physical address of this node, only meaningful when it is contiguous. */
+ gctUINT64 physicalAddress;
+
+ /* Kernel logical of this node. */
+ gctPOINTER kernelVirtual;
+#endif
+
+ /* Customer private handle */
+ gctUINT32 gid;
+
+ /* Page table information. */
+ /* Used only when node is not contiguous */
+ gctSIZE_T pageCount;
+
+ /* Used only when node is not contiguous */
+ gctPOINTER pageTables[gcvHARDWARE_NUM_TYPES];
+ /* Actual physical address */
+ gctUINT32 addresses[gcvHARDWARE_NUM_TYPES];
+
+ /* Locked counter. */
+ gctINT32 lockeds[gcvHARDWARE_NUM_TYPES];
+
+ /* MMU page size type */
+ gcePAGE_TYPE pageType;
+
+ gceVIDMEM_TYPE type;
+
+ /* Secure GPU virtual address. */
+ gctBOOL secure;
+
+ gctBOOL onFault;
+ }
+ Virtual;
+
+ struct _gcsVIDMEM_NODE_VIRTUAL_CHUNK
+ {
+ /* Owner of this chunk */
+ gckVIDMEM_BLOCK parent;
+
+ /* Pointer to gckKERNEL object. */
+ gckKERNEL kernel;
+
+ /* Dual-linked list of chunk. */
+ gcuVIDMEM_NODE_PTR next;
+ gcuVIDMEM_NODE_PTR prev;
+
+ /* Dual linked list of free chunk. */
+ gcuVIDMEM_NODE_PTR nextFree;
+ gcuVIDMEM_NODE_PTR prevFree;
+
+ /* Information for this chunk. */
+ gctSIZE_T offset;
+ gctUINT32 addresses[gcvHARDWARE_NUM_TYPES];
+ gctINT32 lockeds[gcvHARDWARE_NUM_TYPES];
+ gctSIZE_T bytes;
+
+ /* Mapped user logical */
+ gctPOINTER logical;
+
+ /* Kernel virtual address. */
+ gctPOINTER kvaddr;
+
+ /* Locked counter. */
+ }
+ VirtualChunk;
+
+}
+gcuVIDMEM_NODE;
+
+/* gckVIDMEM object. */
+struct _gckVIDMEM
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* Pointer to gckOS object. */
+ gckOS os;
+
+ /* mdl record pointer... a kmalloc address. Process agnostic. */
+ gctPHYS_ADDR physical;
+
+ /* Information for this video memory heap. */
+ gctPHYS_ADDR_T physicalBase;
+ gctSIZE_T bytes;
+ gctSIZE_T freeBytes;
+ gctSIZE_T minFreeBytes;
+
+ /* caps inherit from its allocator, ~0u if allocator was not applicable. */
+ gctUINT32 capability;
+
+ /* Mapping for each type of surface. */
+ gctINT mapping[gcvVIDMEM_TYPE_COUNT];
+
+ /* Sentinel nodes for up to 8 banks. */
+ gcuVIDMEM_NODE sentinel[8];
+
+ /* Allocation threshold. */
+ gctSIZE_T threshold;
+
+ /* The heap mutex. */
+ gctPOINTER mutex;
+};
+
+/* gckVIDMEM_BLOCK object. */
+typedef struct _gcsVIDMEM_BLOCK
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* Pointer to gckOS object. */
+ gckOS os;
+
+ /* linked list of nodes. */
+ gckVIDMEM_BLOCK next;
+
+ /* Contiguously allocated? */
+ gctBOOL contiguous;
+
+ /* Customer private handle */
+ gctUINT32 gid;
+
+ /* mdl record pointer... a kmalloc address. Process agnostic. */
+ gctPHYS_ADDR physical;
+
+ /* Information for this video memory virtual block. */
+ gctSIZE_T bytes;
+ gctSIZE_T freeBytes;
+
+ /* 1M page count. */
+ gctUINT32 pageCount;
+
+ /* Gpu virtual base of this video memory heap. */
+ gctUINT32 addresses[gcvHARDWARE_NUM_TYPES];
+ gctPOINTER pageTables[gcvHARDWARE_NUM_TYPES];
+
+ /* TODO: */
+ gceVIDMEM_TYPE type;
+
+ /* Virtual chunk. */
+ gcuVIDMEM_NODE node;
+
+ gctPOINTER mutex;
+
+ gctBOOL secure;
+ gctBOOL onFault;
+}
+gcsVIDMEM_BLOCK;
+
+typedef struct _gcsVIDMEM_NODE
+{
+ _VIV_VIDMEM_METADATA metadata;
+
+ /* Pointer to gcuVIDMEM_NODE. */
+ gcuVIDMEM_NODE_PTR node;
+
+ /* Pointer to gckKERNEL object. */
+ gckKERNEL kernel;
+
+ /* Mutex to protect node. */
+ gctPOINTER mutex;
+
+ /* Reference count. */
+ gctPOINTER reference;
+
+ /* Name for client to import. */
+ gctUINT32 name;
+
+ /* Link in _gckDB::videoMemList. */
+ gcsLISTHEAD link;
+
+ /* dma_buf */
+ gctPOINTER dmabuf;
+
+ /* Video memory allocation type. */
+ gceVIDMEM_TYPE type;
+
+ /* Pool from which node is allocated. */
+ gcePOOL pool;
+
+ gcsFENCE_SYNC sync[gcvENGINE_GPU_ENGINE_COUNT];
+
+ /* For DRM usage */
+ gctUINT64 timeStamp;
+ gckVIDMEM_NODE tsNode;
+ gctUINT32 tilingMode;
+ gctUINT32 tsMode;
+ gctUINT64 clearValue;
+}
+gcsVIDMEM_NODE;
+
+typedef struct _gcsVIDMEM_HANDLE * gckVIDMEM_HANDLE;
+typedef struct _gcsVIDMEM_HANDLE
+{
+ /* Pointer to gckVIDMEM_NODE. */
+ gckVIDMEM_NODE node;
+
+ /* Handle for current process. */
+ gctUINT32 handle;
+
+ /* Reference count for this handle. */
+ gctPOINTER reference;
+}
+gcsVIDMEM_HANDLE;
+
+typedef struct _gcsSHBUF * gcsSHBUF_PTR;
+typedef struct _gcsSHBUF
+{
+ /* ID. */
+ gctUINT32 id;
+
+ /* Reference count. */
+ gctPOINTER reference;
+
+ /* Data size. */
+ gctUINT32 size;
+
+ /* Data. */
+ gctPOINTER data;
+}
+gcsSHBUF;
+
+typedef struct _gcsCORE_INFO
+{
+ gceHARDWARE_TYPE type;
+ gceCORE core;
+ gckKERNEL kernel;
+ gctUINT chipID;
+}
+gcsCORE_INFO;
+
+typedef struct _gcsCORE_LIST
+{
+ gckKERNEL kernels[gcvCORE_COUNT];
+ gctUINT32 num;
+}
+gcsCORE_LIST;
+
+/* A gckDEVICE is a group of cores (gckKERNEL in software). */
+typedef struct _gcsDEVICE
+{
+ gcsCORE_INFO coreInfoArray[gcvCORE_COUNT];
+ gctUINT32 coreNum;
+ gcsCORE_LIST map[gcvHARDWARE_NUM_TYPES];
+ gceHARDWARE_TYPE defaultHwType;
+
+ gckOS os;
+
+ /* Process resource database. */
+ gckDB database;
+
+ /* Same hardware type shares one MMU. */
+ gckMMU mmus[gcvHARDWARE_NUM_TYPES];
+
+ /* Physical address of internal SRAMs. */
+ gctUINT64 sRAMBases[gcvCORE_COUNT][gcvSRAM_INTER_COUNT];
+ /* Internal SRAMs' size. */
+ gctUINT32 sRAMSizes[gcvCORE_COUNT][gcvSRAM_INTER_COUNT];
+ /* GPU/VIP virtual address of internal SRAMs. */
+ gctUINT32 sRAMBaseAddresses[gcvCORE_COUNT][gcvSRAM_INTER_COUNT];
+ gctBOOL sRAMPhysFaked[gcvCORE_COUNT][gcvSRAM_INTER_COUNT];
+
+ /* Physical address of external SRAMs. */
+ gctUINT64 extSRAMBases[gcvSRAM_EXT_COUNT];
+ /* External SRAMs' size. */
+ gctUINT32 extSRAMSizes[gcvSRAM_EXT_COUNT];
+ /* GPU/VIP virtual address of external SRAMs. */
+ gctUINT32 extSRAMBaseAddresses[gcvSRAM_EXT_COUNT];
+ /* MDL. */
+ gctPHYS_ADDR extSRAMPhysical[gcvSRAM_EXT_COUNT];
+
+ /* Show SRAM mapping info or not. */
+ gctUINT showSRAMMapInfo;
+
+ /* Mutex to make sure stuck dump for multiple cores doesn't interleave. */
+ gctPOINTER stuckDumpMutex;
+
+ /* Mutex for multi-core combine mode command submission */
+ gctPOINTER commitMutex;
+}
+gcsDEVICE;
+
+/* video memory pool functions. */
+/* Construct a new gckVIDMEM object. */
+gceSTATUS
+gckVIDMEM_Construct(
+ IN gckOS Os,
+ IN gctPHYS_ADDR_T PhysicalBase,
+ IN gctSIZE_T Bytes,
+ IN gctSIZE_T Threshold,
+ IN gctSIZE_T Banking,
+ OUT gckVIDMEM * Memory
+ );
+
+/* Destroy an gckVDIMEM object. */
+gceSTATUS
+gckVIDMEM_Destroy(
+ IN gckVIDMEM Memory
+ );
+
+
+gceSTATUS
+gckVIDMEM_HANDLE_Allocate(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE Node,
+ OUT gctUINT32 * Handle
+ );
+
+gceSTATUS
+gckVIDMEM_HANDLE_Reference(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 Handle
+ );
+
+gceSTATUS
+gckVIDMEM_HANDLE_Dereference(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 Handle
+ );
+
+gceSTATUS
+gckVIDMEM_HANDLE_Lookup(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 Handle,
+ OUT gckVIDMEM_NODE * Node
+ );
+
+gceSTATUS
+gckVIDMEM_HANDLE_Lookup2(
+ IN gckKERNEL Kernel,
+ IN gcsDATABASE_PTR Database,
+ IN gctUINT32 Handle,
+ OUT gckVIDMEM_NODE * Node
+ );
+
+/* video memory node functions. */
+gceSTATUS
+gckVIDMEM_NODE_AllocateLinear(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM VideoMemory,
+ IN gcePOOL Pool,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN gctUINT32 Alignment,
+ IN gctBOOL Specified,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gckVIDMEM_NODE * NodeObject
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_AllocateVirtual(
+ IN gckKERNEL Kernel,
+ IN gcePOOL Pool,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gckVIDMEM_NODE * NodeObject
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_AllocateVirtualChunk(
+ IN gckKERNEL Kernel,
+ IN gcePOOL Pool,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gckVIDMEM_NODE * NodeObject
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_Reference(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE Node
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_Dereference(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE Node
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_GetReference(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctINT32 * ReferenceCount
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_Lock(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctUINT32 *Address
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_Unlock(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctUINT32 ProcessID,
+ IN OUT gctBOOL * Asynchroneous
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_CleanCache(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_InvalidateCache(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_GetLockCount(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctINT32 * LockCount
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_LockCPU(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctBOOL Cacheable,
+ IN gctBOOL FromUser,
+ OUT gctPOINTER * Logical
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_UnlockCPU(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctUINT32 ProcessID,
+ IN gctBOOL FromUser,
+ IN gctBOOL Defer
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_GetPhysical(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * PhysicalAddress
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_GetGid(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctUINT32 * Gid
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_GetSize(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctSIZE_T * Size
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_GetType(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gceVIDMEM_TYPE * Type,
+ OUT gcePOOL * Pool
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_Export(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctINT32 Flags,
+ OUT gctPOINTER *DmaBuf,
+ OUT gctINT32 *FD
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_Name(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctUINT32 * Name
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_Import(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Name,
+ OUT gckVIDMEM_NODE * NodeObject
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_GetFd(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctINT * Fd
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_WrapUserMemory(
+ IN gckKERNEL Kernel,
+ IN gcsUSER_MEMORY_DESC_PTR Desc,
+ IN gceVIDMEM_TYPE Type,
+ OUT gckVIDMEM_NODE * NodeObject,
+ OUT gctUINT64 * Bytes
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_SetCommitStamp(
+ IN gckKERNEL Kernel,
+ IN gceENGINE Engine,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctUINT64 CommitStamp
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_GetCommitStamp(
+ IN gckKERNEL Kernel,
+ IN gceENGINE Engine,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctUINT64_PTR CommitStamp
+ );
+
+gceSTATUS
+gckVIDMEM_NODE_Find(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Address,
+ OUT gckVIDMEM_NODE * NodeObject,
+ OUT gctUINT32 * Offset
+ );
+
+typedef struct _gcsADDRESS_AREA * gcsADDRESS_AREA_PTR;
+typedef struct _gcsADDRESS_AREA
+{
+ /* Page table / STLB table information. */
+ gctSIZE_T stlbSize;
+ gckVIDMEM_NODE stlbVideoMem;
+ gctUINT32_PTR stlbLogical;
+ gctUINT32 stlbEntries;
+ /* stlb physical address. */
+ gctPHYS_ADDR_T stlbPhysical;
+
+ /* Free entries. */
+ gctUINT32 heapList;
+ gctBOOL freeNodes;
+
+ gceAREA_TYPE areaType;
+
+ gctUINT32 mappingStart;
+ gctUINT32 mappingEnd;
+
+ gctUINT32_PTR mapLogical;
+}
+gcsADDRESS_AREA;
+
+/* gckMMU object. */
+struct _gckMMU
+{
+ /* The object. */
+ gcsOBJECT object;
+
+ /* Pointer to gckOS object. */
+ gckOS os;
+
+ /* Pointer to gckHARDWARE object. */
+ gckHARDWARE hardware;
+
+ /* The page table mutex. */
+ gctPOINTER pageTableMutex;
+
+ /* Master TLB information. */
+ gctSIZE_T mtlbSize;
+ gckVIDMEM_NODE mtlbVideoMem;
+ gctUINT32_PTR mtlbLogical;
+ gctUINT32 mtlbEntries;
+ /* mtlb physical address. */
+ gctPHYS_ADDR_T mtlbPhysical;
+
+ /* memory pool used for page table */
+ gcePOOL pool;
+
+ gctPOINTER staticSTLB;
+ gctBOOL enabled;
+
+ gctSIZE_T safePageSize;
+ gckVIDMEM_NODE safePageVideoMem;
+ gctPOINTER safePageLogical;
+ gctUINT32 safeAddress;
+ /* Safe page physical address. */
+ gctPHYS_ADDR_T safePagePhysical;
+
+ /* GPU physical address flat mapping area. */
+ gctUINT32 gpuPhysicalRangeCount;
+ gcsFLAT_MAPPING_RANGE gpuPhysicalRanges[gcdMAX_FLAT_MAPPING_COUNT];
+
+ /* GPU virtual address flat mapping area*/
+ gctUINT32 gpuAddressRangeCount;
+ gcsFLAT_MAPPING_RANGE gpuAddressRanges[gcdMAX_FLAT_MAPPING_COUNT];
+
+ /* List of hardware which uses this MMU. */
+ gcsLISTHEAD hardwareList;
+
+ struct _gckQUEUE recentFreedAddresses;
+
+ gcsADDRESS_AREA dynamicArea1M;
+ gcsADDRESS_AREA dynamicArea4K;
+ gcsADDRESS_AREA secureArea;
+
+ gctBOOL dynamicAreaSetuped;
+
+ gctBOOL sRAMMapped;
+
+ gctUINT32 contiguousBaseAddress;
+ gctUINT32 externalBaseAddress;
+ gctUINT32 internalBaseAddress;
+};
+
+
+gceSTATUS
+gckOS_CreateKernelMapping(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Logical
+ );
+
+gceSTATUS
+gckOS_DestroyKernelMapping(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctPOINTER Logical
+ );
+
+gceSTATUS
+gckOS_GetFd(
+ IN gctSTRING Name,
+ IN gcsFDPRIVATE_PTR Private,
+ OUT gctINT *Fd
+ );
+
+/*******************************************************************************
+**
+** gckOS_ReadMappedPointer
+**
+** Read pointer mapped from user pointer which returned by gckOS_MapUserPointer.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Address
+** Pointer returned by gckOS_MapUserPointer.
+**
+** gctUINT32_PTR Data
+** Pointer to hold 32 bits data.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_ReadMappedPointer(
+ IN gckOS Os,
+ IN gctPOINTER Address,
+ IN gctUINT32_PTR Data
+ );
+
+gceSTATUS
+gckKERNEL_AttachProcess(
+ IN gckKERNEL Kernel,
+ IN gctBOOL Attach
+ );
+
+gceSTATUS
+gckKERNEL_AttachProcessEx(
+ IN gckKERNEL Kernel,
+ IN gctBOOL Attach,
+ IN gctUINT32 PID
+ );
+
+gceSTATUS
+gckKERNEL_AllocateVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Alignment,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN OUT gctSIZE_T * Bytes,
+ IN OUT gcePOOL * Pool,
+ OUT gckVIDMEM_NODE * NodeObject
+ );
+
+gceSTATUS
+gckHARDWARE_QueryIdle(
+ IN gckHARDWARE Hardware,
+ OUT gctBOOL_PTR IsIdle
+ );
+
+gceSTATUS
+gckHARDWARE_WaitFence(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT64 FenceData,
+ IN gctUINT32 FenceAddress,
+ OUT gctUINT32 *Bytes
+ );
+
+gceSTATUS
+gckHARDWARE_UpdateContextID(
+ IN gckHARDWARE Hardware
+ );
+
+gceSTATUS
+gckHARDWARE_QueryMcfe(
+ IN gckHARDWARE Hardware,
+ OUT const gceMCFE_CHANNEL_TYPE * Channels[],
+ OUT gctUINT32 * Count
+ );
+
+#if gcdSECURITY
+gceSTATUS
+gckKERNEL_SecurityOpen(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 GPU,
+ OUT gctUINT32 *Channel
+ );
+
+/*
+** Close a security service channel
+*/
+gceSTATUS
+gckKERNEL_SecurityClose(
+ IN gctUINT32 Channel
+ );
+
+/*
+** Security service interface.
+*/
+gceSTATUS
+gckKERNEL_SecurityCallService(
+ IN gctUINT32 Channel,
+ IN OUT gcsTA_INTERFACE * Interface
+ );
+
+gceSTATUS
+gckKERNEL_SecurityStartCommand(
+ IN gckKERNEL Kernel
+ );
+
+gceSTATUS
+gckKERNEL_SecurityAllocateSecurityMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Bytes,
+ OUT gctUINT32 * Handle
+ );
+
+gceSTATUS
+gckKERNEL_SecurityExecute(
+ IN gckKERNEL Kernel,
+ IN gctPOINTER Buffer,
+ IN gctUINT32 Bytes
+ );
+
+gceSTATUS
+gckKERNEL_SecurityMapMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 *PhysicalArray,
+ IN gctUINT32 PageCount,
+ OUT gctUINT32 * GPUAddress
+ );
+
+gceSTATUS
+gckKERNEL_SecurityUnmapMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 GPUAddress,
+ IN gctUINT32 PageCount
+ );
+
+#endif
+
+#if gcdENABLE_TRUST_APPLICATION
+gceSTATUS
+gckKERNEL_SecurityOpen(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 GPU,
+ OUT gctUINT32 *Channel
+ );
+
+/*
+** Close a security service channel
+*/
+gceSTATUS
+gckKERNEL_SecurityClose(
+ IN gctUINT32 Channel
+ );
+
+/*
+** Security service interface.
+*/
+gceSTATUS
+gckKERNEL_SecurityCallService(
+ IN gctUINT32 Channel,
+ IN OUT gcsTA_INTERFACE * Interface
+ );
+
+gceSTATUS
+gckKERNEL_SecurityStartCommand(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ );
+
+gceSTATUS
+gckKERNEL_SecurityMapMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 *PhysicalArray,
+ IN gctPHYS_ADDR_T Physical,
+ IN gctUINT32 PageCount,
+ OUT gctUINT32 * GPUAddress
+ );
+
+gceSTATUS
+gckKERNEL_SecurityUnmapMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 GPUAddress,
+ IN gctUINT32 PageCount
+ );
+
+gceSTATUS
+gckKERNEL_SecurityDumpMMUException(
+ IN gckKERNEL Kernel
+ );
+
+gceSTATUS
+gckKERNEL_ReadMMUException(
+ IN gckKERNEL Kernel,
+ IN gctUINT32_PTR MMUStatus,
+ IN gctUINT32_PTR MMUException
+ );
+
+gceSTATUS
+gckKERNEL_HandleMMUException(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 MMUStatus,
+ IN gctPHYS_ADDR_T Physical,
+ IN gctUINT32 GPUAddres
+ );
+#endif
+
+gceSTATUS
+gckKERNEL_CreateShBuffer(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Size,
+ OUT gctSHBUF * ShBuf
+ );
+
+gceSTATUS
+gckKERNEL_DestroyShBuffer(
+ IN gckKERNEL Kernel,
+ IN gctSHBUF ShBuf
+ );
+
+gceSTATUS
+gckKERNEL_MapShBuffer(
+ IN gckKERNEL Kernel,
+ IN gctSHBUF ShBuf
+ );
+
+gceSTATUS
+gckKERNEL_WriteShBuffer(
+ IN gckKERNEL Kernel,
+ IN gctSHBUF ShBuf,
+ IN gctPOINTER UserData,
+ IN gctUINT32 ByteCount
+ );
+
+gceSTATUS
+gckKERNEL_ReadShBuffer(
+ IN gckKERNEL Kernel,
+ IN gctSHBUF ShBuf,
+ IN gctPOINTER UserData,
+ IN gctUINT32 ByteCount,
+ OUT gctUINT32 * BytesRead
+ );
+
+gceSTATUS
+gckKERNEL_GetHardwareType(
+ IN gckKERNEL Kernel,
+ OUT gceHARDWARE_TYPE *Type
+ );
+
+/******************************************************************************\
+******************************* gckCONTEXT Object *******************************
+\******************************************************************************/
+
+gceSTATUS
+gckCONTEXT_Construct(
+ IN gckOS Os,
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 ProcessID,
+ OUT gckCONTEXT * Context
+ );
+
+gceSTATUS
+gckCONTEXT_Destroy(
+ IN gckCONTEXT Context
+ );
+
+gceSTATUS
+gckCONTEXT_Update(
+ IN gckCONTEXT Context,
+ IN gctUINT32 ProcessID,
+ IN gcsSTATE_DELTA_PTR StateDelta
+ );
+
+gceSTATUS
+gckCONTEXT_MapBuffer(
+ IN gckCONTEXT Context,
+ OUT gctUINT64 *Logicals,
+ OUT gctUINT32 *Bytes
+ );
+
+void
+gckQUEUE_Enqueue(
+ IN gckQUEUE LinkQueue,
+ IN gcuQUEUEDATA *Data
+ );
+
+void
+gckQUEUE_GetData(
+ IN gckQUEUE LinkQueue,
+ IN gctUINT32 Index,
+ OUT gcuQUEUEDATA ** Data
+ );
+
+gceSTATUS
+gckQUEUE_Allocate(
+ IN gckOS Os,
+ IN gckQUEUE Queue,
+ IN gctUINT32 Size
+ );
+
+gceSTATUS
+gckQUEUE_Free(
+ IN gckOS Os,
+ IN gckQUEUE Queue
+ );
+
+/******************************************************************************\
+****************************** gckRECORDER Object ******************************
+\******************************************************************************/
+gceSTATUS
+gckRECORDER_Construct(
+ IN gckOS Os,
+ IN gckHARDWARE Hardware,
+ OUT gckRECORDER * Recorder
+ );
+
+gceSTATUS
+gckRECORDER_Destory(
+ IN gckOS Os,
+ IN gckRECORDER Recorder
+ );
+
+void
+gckRECORDER_AdvanceIndex(
+ gckRECORDER Recorder,
+ gctUINT64 CommitStamp
+ );
+
+void
+gckRECORDER_Record(
+ gckRECORDER Recorder,
+ gctUINT8_PTR CommandBuffer,
+ gctUINT32 CommandBytes,
+ gctUINT8_PTR ContextBuffer,
+ gctUINT32 ContextBytes
+ );
+
+void
+gckRECORDER_Dump(
+ gckRECORDER Recorder
+ );
+
+gceSTATUS
+gckRECORDER_UpdateMirror(
+ gckRECORDER Recorder,
+ gctUINT32 State,
+ gctUINT32 Data
+ );
+
+/******************************************************************************\
+****************************** gckCOMMAND Object *******************************
+\******************************************************************************/
+
+/* Construct a new gckCOMMAND object. */
+gceSTATUS
+gckCOMMAND_Construct(
+ IN gckKERNEL Kernel,
+ IN gceHW_FE_TYPE FeType,
+ OUT gckCOMMAND * Command
+ );
+
+/* Destroy an gckCOMMAND object. */
+gceSTATUS
+gckCOMMAND_Destroy(
+ IN gckCOMMAND Command
+ );
+
+/* Acquire command queue synchronization objects. */
+gceSTATUS
+gckCOMMAND_EnterCommit(
+ IN gckCOMMAND Command,
+ IN gctBOOL FromPower
+ );
+
+/* Release command queue synchronization objects. */
+gceSTATUS
+gckCOMMAND_ExitCommit(
+ IN gckCOMMAND Command,
+ IN gctBOOL FromPower
+ );
+
+/* Start the command queue. */
+gceSTATUS
+gckCOMMAND_Start(
+ IN gckCOMMAND Command
+ );
+
+/* Stop the command queue. */
+gceSTATUS
+gckCOMMAND_Stop(
+ IN gckCOMMAND Command
+ );
+
+/* Commit command buffers. */
+gceSTATUS
+gckCOMMAND_Commit(
+ IN gckCOMMAND Command,
+ IN gcsHAL_SUBCOMMIT * SubCommit,
+ IN gctUINT32 ProcessId,
+ IN gctBOOL Shared,
+ OUT gctUINT64_PTR CommitStamp,
+ INOUT gctBOOL *contextSwitched
+ );
+
+/* Reserve space in the command buffer. */
+gceSTATUS
+gckCOMMAND_Reserve(
+ IN gckCOMMAND Command,
+ IN gctUINT32 RequestedBytes,
+ OUT gctPOINTER * Buffer,
+ OUT gctUINT32 * BufferSize
+ );
+
+/*
+ * Execute reserved space in the command buffer.
+ * Wait link FE version.
+ */
+gceSTATUS
+gckCOMMAND_Execute(
+ IN gckCOMMAND Command,
+ IN gctUINT32 RequstedBytes
+ );
+
+/*
+ * Execute reserved space in the command buffer.
+ * Async FE version.
+ */
+gceSTATUS
+gckCOMMAND_ExecuteAsync(
+ IN gckCOMMAND Command,
+ IN gctUINT32 RequestedBytes
+ );
+
+/*
+ * Execute reserved space in the command buffer.
+ * MC-FE version.
+ */
+gceSTATUS
+gckCOMMAND_ExecuteMultiChannel(
+ IN gckCOMMAND Command,
+ IN gctBOOL Priority,
+ IN gctUINT32 ChannelId,
+ IN gctUINT32 RequstedBytes
+ );
+
+/* Stall the command queue. */
+gceSTATUS
+gckCOMMAND_Stall(
+ IN gckCOMMAND Command,
+ IN gctBOOL FromPower
+ );
+
+/* Attach user process. */
+gceSTATUS
+gckCOMMAND_Attach(
+ IN gckCOMMAND Command,
+ OUT gckCONTEXT * Context,
+ OUT gctSIZE_T * MaxState,
+ OUT gctUINT32 * NumStates,
+ IN gctUINT32 ProcessID
+ );
+
+/* Dump command buffer being executed by GPU. */
+gceSTATUS
+gckCOMMAND_DumpExecutingBuffer(
+ IN gckCOMMAND Command
+ );
+
+/* Detach user process. */
+gceSTATUS
+gckCOMMAND_Detach(
+ IN gckCOMMAND Command,
+ IN gckCONTEXT Context
+ );
+
+void
+gcsLIST_Init(
+ gcsLISTHEAD_PTR Node
+ );
+
+void
+gcsLIST_Add(
+ gcsLISTHEAD_PTR New,
+ gcsLISTHEAD_PTR Head
+ );
+
+void
+gcsLIST_AddTail(
+ gcsLISTHEAD_PTR New,
+ gcsLISTHEAD_PTR Head
+ );
+
+void
+gcsLIST_Del(
+ gcsLISTHEAD_PTR Node
+ );
+
+gctBOOL
+gcsLIST_Empty(
+ gcsLISTHEAD_PTR Head
+ );
+
+#define gcmkLIST_FOR_EACH(pos, head) \
+ for (pos = (head)->next; pos != (head); pos = pos->next)
+
+#define gcmkLIST_FOR_EACH_SAFE(pos, n, head) \
+ for (pos = (head)->next, n = pos->next; pos != (head); \
+ pos = n, n = pos->next)
+
+gceSTATUS
+gckFENCE_Create(
+ IN gckOS Os,
+ IN gckKERNEL Kernel,
+ OUT gckFENCE * Fence
+ );
+
+gceSTATUS
+gckFENCE_Destory(
+ IN gckOS Os,
+ OUT gckFENCE Fence
+ );
+
+gceSTATUS
+gckFENCE_Signal(
+ IN gckOS Os,
+ IN gckFENCE Fence
+ );
+
+gceSTATUS
+gckDEVICE_Construct(
+ IN gckOS Os,
+ OUT gckDEVICE * Device
+ );
+
+gceSTATUS
+gckDEVICE_AddCore(
+ IN gckDEVICE Device,
+ IN gceCORE Core,
+ IN gctUINT chipID,
+ IN gctPOINTER Context,
+ IN gckKERNEL * Kernel
+ );
+
+gceSTATUS
+gckDEVICE_Destroy(
+ IN gckOS Os,
+ IN gckDEVICE Device
+ );
+
+gceSTATUS
+gckDEVICE_Dispatch(
+ IN gckDEVICE Device,
+ IN gcsHAL_INTERFACE_PTR Interface
+ );
+
+gceSTATUS
+gckDEVICE_GetMMU(
+ IN gckDEVICE Device,
+ IN gceHARDWARE_TYPE Type,
+ IN gckMMU *Mmu
+ );
+
+gceSTATUS
+gckDEVICE_SetMMU(
+ IN gckDEVICE Device,
+ IN gceHARDWARE_TYPE Type,
+ IN gckMMU Mmu
+ );
+
+#if gcdENABLE_TRUST_APPLICATION
+gceSTATUS
+gckKERNEL_MapInTrustApplicaiton(
+ IN gckKERNEL Kernel,
+ IN gctPOINTER Logical,
+ IN gctPHYS_ADDR Physical,
+ IN gctUINT32 GPUAddress,
+ IN gctSIZE_T PageCount
+ );
+#endif
+
+#if gcdSECURITY || gcdENABLE_TRUST_APPLICATION
+gceSTATUS
+gckOS_OpenSecurityChannel(
+ IN gckOS Os,
+ IN gceCORE Core,
+ OUT gctUINT32 *Channel
+ );
+
+gceSTATUS
+gckOS_CloseSecurityChannel(
+ IN gctUINT32 Channel
+ );
+
+gceSTATUS
+gckOS_CallSecurityService(
+ IN gctUINT32 Channel,
+ IN gcsTA_INTERFACE * Interface
+ );
+
+gceSTATUS
+gckOS_InitSecurityChannel(
+ OUT gctUINT32 Channel
+ );
+
+gceSTATUS
+gckOS_AllocatePageArray(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T PageCount,
+ OUT gctPOINTER * PageArrayLogical,
+ OUT gctPHYS_ADDR * PageArrayPhysical
+ );
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_kernel_h_ */
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
new file mode 100644
index 000000000000..42ad69759f8a
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command.c
@@ -0,0 +1,4485 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+#include "gc_hal_kernel_context.h"
+
+#define _GC_OBJ_ZONE gcvZONE_COMMAND
+
+/******************************************************************************\
+********************************* Support Code *********************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** _NewQueue
+**
+** Allocate a new command queue.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to an gckCOMMAND object.
+**
+** gctBOOL Stalled
+** Indicate if hardware is stalled already.
+**
+** OUTPUT:
+**
+** gckCOMMAND Command
+** gckCOMMAND object has been updated with a new command queue.
+*/
+static gceSTATUS
+_NewQueue(
+ IN OUT gckCOMMAND Command,
+ IN gctBOOL Stalled
+ )
+{
+ gceSTATUS status;
+ gctINT currentIndex, newIndex;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ /* Switch to the next command buffer. */
+ currentIndex = Command->index;
+ newIndex = (currentIndex + 1) % gcdCOMMAND_QUEUES;
+
+ /* Wait for availability. */
+ gcmkDUMP(Command->os, "#[kernel.waitsignal]");
+
+ gcmkONERROR(gckOS_WaitSignal(
+ Command->os,
+ Command->queues[newIndex].signal,
+ gcvFALSE,
+ gcvINFINITE
+ ));
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ if (newIndex < currentIndex)
+ {
+ Command->wrapCount += 1;
+
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_INFO, gcvZONE_COMMAND,
+ 2 * 4,
+ "%s(%d): queue array wrapped around.\n",
+ __FUNCTION__, __LINE__
+ );
+ }
+
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_INFO, gcvZONE_COMMAND,
+ 3 * 4,
+ "%s(%d): total queue wrap arounds %d.\n",
+ __FUNCTION__, __LINE__, Command->wrapCount
+ );
+
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_INFO, gcvZONE_COMMAND,
+ 3 * 4,
+ "%s(%d): switched to queue %d.\n",
+ __FUNCTION__, __LINE__, newIndex
+ );
+#endif
+
+ /* Update gckCOMMAND object with new command queue. */
+ Command->index = newIndex;
+ Command->newQueue = gcvTRUE;
+ Command->videoMem = Command->queues[newIndex].videoMem;
+ Command->logical = Command->queues[newIndex].logical;
+ Command->address = Command->queues[newIndex].address;
+ Command->offset = 0;
+
+ if (currentIndex != -1)
+ {
+ if (Stalled)
+ {
+ gckOS_Signal(
+ Command->os,
+ Command->queues[currentIndex].signal,
+ gcvTRUE
+ );
+ }
+ else
+ {
+ /* Mark the command queue as available. */
+ gcmkONERROR(gckEVENT_Signal(
+ Command->kernel->eventObj,
+ Command->queues[currentIndex].signal,
+ gcvKERNEL_COMMAND
+ ));
+ }
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("Command->index=%d", Command->index);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_IncrementCommitAtom(
+ IN gckCOMMAND Command,
+ IN gctBOOL Increment
+ )
+{
+ gceSTATUS status;
+ gckHARDWARE hardware;
+ gctINT32 atomValue;
+ gctBOOL powerAcquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ /* Extract the gckHARDWARE and gckEVENT objects. */
+ hardware = Command->kernel->hardware;
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ /* Grab the power mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(
+ Command->os, hardware->powerMutex, gcvINFINITE
+ ));
+ powerAcquired = gcvTRUE;
+
+ /* Increment the commit atom. */
+ if (Increment)
+ {
+ gcmkONERROR(gckOS_AtomIncrement(
+ Command->os, Command->atomCommit, &atomValue
+ ));
+ }
+ else
+ {
+ gcmkONERROR(gckOS_AtomDecrement(
+ Command->os, Command->atomCommit, &atomValue
+ ));
+ }
+
+ /* Release the power mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(
+ Command->os, hardware->powerMutex
+ ));
+ powerAcquired = gcvFALSE;
+
+ /* Success. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (powerAcquired)
+ {
+ /* Release the power mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(
+ Command->os, hardware->powerMutex
+ ));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_CheckFlushMMU(
+ IN gckCOMMAND Command,
+ IN gckHARDWARE Hardware
+ )
+{
+#if gcdSECURITY
+ return gcvSTATUS_OK;
+#else
+ gceSTATUS status;
+ gctUINT32 oldValue;
+ gctBOOL pause = gcvFALSE;
+
+ gctUINT8_PTR pointer;
+ gctUINT32 address;
+ gctUINT32 eventBytes;
+ gctUINT32 endBytes;
+ gctUINT32 bufferSize;
+ gctUINT32 executeBytes;
+
+ gckOS_AtomicExchange(Command->os,
+ Hardware->pageTableDirty[gcvENGINE_RENDER],
+ 0,
+ &oldValue);
+
+ if (oldValue)
+ {
+ /* Page Table is upated, flush mmu before commit. */
+ gctUINT32 flushBytes;
+
+ gcmkONERROR(gckHARDWARE_FlushMMU(
+ Hardware,
+ gcvNULL,
+ gcvINVALID_ADDRESS,
+ 0,
+ &flushBytes
+ ));
+
+ gcmkONERROR(gckCOMMAND_Reserve(
+ Command,
+ flushBytes,
+ (gctPOINTER *)&pointer,
+ &bufferSize
+ ));
+
+ /* Pointer to reserved address. */
+ address = Command->address + Command->offset;
+
+ /*
+ * subsequent 8 bytes are wait-link commands.
+ * Set more existed bytes for now.
+ */
+ gcmkONERROR(gckHARDWARE_FlushMMU(
+ Hardware,
+ pointer,
+ address,
+ (bufferSize - flushBytes),
+ &flushBytes
+ ));
+
+ gcmkONERROR(gckCOMMAND_Execute(Command, flushBytes));
+
+ if ((oldValue & gcvPAGE_TABLE_DIRTY_BIT_FE)
+ && (!Hardware->stallFEPrefetch)
+ )
+ {
+ pause = gcvTRUE;
+ }
+ }
+
+ if (pause)
+ {
+ /* Query size. */
+ gcmkONERROR(gckWLFE_Event(Hardware, gcvNULL, 0, gcvKERNEL_PIXEL, &eventBytes));
+ gcmkONERROR(gckWLFE_End(Hardware, gcvNULL, ~0U, &endBytes));
+
+ executeBytes = eventBytes + endBytes;
+
+ /* Reserve space. */
+ gcmkONERROR(gckCOMMAND_Reserve(
+ Command,
+ executeBytes,
+ (gctPOINTER *)&pointer,
+ &bufferSize
+ ));
+
+ /* Pointer to reserved address. */
+ address = Command->address + Command->offset;
+
+ /* Append EVENT(29). */
+ gcmkONERROR(gckWLFE_Event(
+ Hardware,
+ pointer,
+ 29,
+ gcvKERNEL_PIXEL,
+ &eventBytes
+ ));
+
+ /* Append END. */
+ pointer += eventBytes;
+ address += eventBytes;
+
+ gcmkONERROR(gckWLFE_End(Hardware, pointer, address, &endBytes));
+
+ gcmkONERROR(gckCOMMAND_Execute(Command, executeBytes));
+ }
+
+ return gcvSTATUS_OK;
+OnError:
+ return status;
+#endif
+}
+
+/* WaitLink FE only. */
+static gceSTATUS
+_DummyDraw(
+ IN gckCOMMAND Command
+ )
+{
+#if gcdSECURITY
+ return gcvSTATUS_OK;
+#else
+ gceSTATUS status;
+ gckHARDWARE hardware = Command->kernel->hardware;
+
+ gctUINT8_PTR pointer;
+ gctUINT32 bufferSize;
+
+ gctUINT32 dummyDrawBytes;
+ gceDUMMY_DRAW_TYPE dummyDrawType = gcvDUMMY_DRAW_INVALID;
+
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_FE_NEED_DUMMYDRAW))
+ {
+ dummyDrawType = gcvDUMMY_DRAW_GC400;
+ }
+
+ if (!gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_USC_DEFER_FILL_FIX) &&
+ gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_USC))
+ {
+ dummyDrawType = gcvDUMMY_DRAW_V60;
+ }
+
+ if (dummyDrawType != gcvDUMMY_DRAW_INVALID)
+ {
+ gckHARDWARE_DummyDraw(hardware, gcvNULL, Command->queues[0].address, dummyDrawType, &dummyDrawBytes);
+
+ /* Reserve space. */
+ gcmkONERROR(gckCOMMAND_Reserve(
+ Command,
+ dummyDrawBytes,
+ (gctPOINTER *)&pointer,
+ &bufferSize
+ ));
+
+ gckHARDWARE_DummyDraw(hardware, pointer, Command->queues[0].address, dummyDrawType, &dummyDrawBytes);
+
+ gcmkONERROR(gckCOMMAND_Execute(Command, dummyDrawBytes));
+ }
+
+ return gcvSTATUS_OK;
+OnError:
+ return status;
+#endif
+}
+
+/*
+ * Wait pending semaphores.
+ *
+ * next == free: full, no more semaphores.
+ * (free + 1) = next: empty
+ */
+static gcmINLINE gceSTATUS
+_WaitPendingMcfeSema(
+ gckCOMMAND Command
+ )
+{
+ gceSTATUS status;
+ const gctUINT count = gcmCOUNTOF(Command->pendingSema);
+ gctUINT32 nextFreePos;
+ gctUINT32 timeout = gcvINFINITE;
+
+ gcmkHEADER_ARG("freePendingPos=%u nextPendingPos=%u",
+ Command->freePendingPos, Command->nextPendingPos);
+
+ nextFreePos = (Command->freePendingPos + 1) % count;
+
+ if (nextFreePos == Command->nextPendingPos)
+ {
+ /* No pendings. */
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+
+ while (nextFreePos != Command->nextPendingPos)
+ {
+ /* Timeout is infinite in the first to at least free one slot. */
+ status = gckOS_WaitSignal(Command->os,
+ Command->pendingSema[nextFreePos].signal,
+ gcvFALSE,
+ timeout);
+
+ if (status == gcvSTATUS_TIMEOUT)
+ {
+ /* Timeout out is OK for later pendings. */
+ break;
+ }
+
+ gcmkONERROR(status);
+
+ /* Do not wait for the later slots. */
+ timeout = 0;
+
+ /* More free semaphores can be used. */
+ Command->freeSemaId = Command->pendingSema[nextFreePos].semaId;
+
+ /* Advance free pos. */
+ Command->freePendingPos = nextFreePos;
+ nextFreePos = (nextFreePos + 1) % count;
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static gctUINT32
+_GetFreeMcfeSemaNum(
+ gckCOMMAND Command
+ )
+{
+ gctUINT32 num = 0;
+
+ if (Command->nextSemaId <= Command->freeSemaId)
+ {
+ num = Command->freeSemaId - Command->nextSemaId;
+ }
+ else
+ {
+ num = Command->totalSemaId - Command->nextSemaId + Command->freeSemaId;
+ }
+
+ return num;
+}
+
+/*
+ * Get next semaphore id in semaphore ring.
+ *
+ * There are semaMinThreshhold semaphores are reserved for system operations,
+ * such as _SyncToSystemChannel etc.
+ * The rest semaphores are regular ones.
+ */
+static gcmINLINE gceSTATUS
+_GetNextMcfeSemaId(
+ gckCOMMAND Command,
+ gctBOOL regularSema,
+ gctUINT32 * SemaId
+ )
+{
+ gctUINT32 freeSemaNum = 0;
+
+ gceSTATUS status = gcvSTATUS_OK;
+
+ /*
+ * See the comments in struct definition.
+ * wait when run out of semaphores.
+ */
+ freeSemaNum = _GetFreeMcfeSemaNum(Command);
+
+ if ((regularSema && (freeSemaNum <= Command->semaMinThreshhold)) ||
+ (!regularSema && (freeSemaNum == 0)))
+ {
+ gcmkONERROR(_WaitPendingMcfeSema(Command));
+ }
+
+ gcmkASSERT(Command->nextSemaId != Command->freeSemaId);
+
+ /* Output the semaphore ID. */
+ *SemaId = Command->nextSemaId;
+
+ /* Advance to next. */
+ if (++Command->nextSemaId == Command->totalSemaId)
+ {
+ Command->nextSemaId = 0;
+ }
+
+OnError:
+ return status;
+}
+
+/*
+ * Get next pending pos in pending semaphore tracking ring.
+ */
+static gcmINLINE gceSTATUS
+_GetNextPendingPos(
+ gckCOMMAND Command,
+ gctUINT32 * Pos
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ /* Wait when out of pending ring. */
+ if (Command->nextPendingPos == Command->freePendingPos)
+ {
+ /* Run out of pending semaphore tracking ring. */
+ gcmkONERROR(_WaitPendingMcfeSema(Command));
+ }
+
+ gcmkASSERT(Command->nextPendingPos != Command->freePendingPos);
+
+ *Pos = Command->nextPendingPos;
+
+ /* Advance to next. */
+ if (++Command->nextPendingPos == gcmCOUNTOF(Command->pendingSema))
+ {
+ Command->nextPendingPos = 0;
+ }
+
+OnError:
+ return status;
+}
+
+/*
+ * Sync specific channels to system channel.
+ * Record semaphores to pendingSema structure.
+ * 'SyncChannel' is cleared upon function return.
+ */
+static gceSTATUS
+_SyncToSystemChannel(
+ gckCOMMAND Command,
+ gctUINT64 SyncChannel[2]
+ )
+{
+ gceSTATUS status;
+ gckKERNEL kernel = Command->kernel;
+ gckHARDWARE hardware = kernel->hardware;
+ gctUINT8 semaId[128];
+ gctUINT32 semaCount = 0;
+ gctUINT32 reqBytes = 0;
+ gctUINT32 bytes = 0;
+ gctUINT8_PTR buffer;
+ gctUINT32 i;
+ gctUINT32 pri;
+
+ /* Ignore system channel. */
+ SyncChannel[0] &= ~((gctUINT64)1ull);
+ SyncChannel[1] &= ~((gctUINT64)1ull);
+
+ if (!SyncChannel[0] && !SyncChannel[1])
+ {
+ return gcvSTATUS_OK;
+ }
+
+ /* Query SendSemaphore command size. */
+ gckMCFE_SendSemaphore(hardware, gcvNULL, 0, &reqBytes);
+
+ for (pri = 0; pri < 2; pri++)
+ {
+ for (i = 1; i < 64 && SyncChannel[pri]; i++)
+ {
+ gctUINT32 id;
+
+ if (!(SyncChannel[pri] & (1ull << i)))
+ {
+ continue;
+ }
+
+ /* Get a free semaphore id. */
+ gcmkONERROR(_GetNextMcfeSemaId(Command, gcvFALSE, &id));
+ semaId[semaCount++] = (gctUINT8)id;
+
+ gcmkONERROR(gckCOMMAND_Reserve(Command, reqBytes, (gctPOINTER *)&buffer, &bytes));
+
+ /* Send semaphore executed in specified channel. */
+ gckMCFE_SendSemaphore(hardware, buffer, id, &bytes);
+
+ gcmkONERROR(gckCOMMAND_ExecuteMultiChannel(Command, pri, i, reqBytes));
+
+ /* Remove the sync'ed channel. */
+ SyncChannel[pri] &= ~(1ull << i);
+ }
+ }
+
+ if (semaCount > 0)
+ {
+ gctUINT32 pos = 0;
+ gckEVENT eventObj = kernel->eventObj;
+ gctUINT32 bufferLen = 0;
+
+ /* Query WaitSemaphore command size. */
+ gckMCFE_WaitSemaphore(hardware, gcvNULL, 0, &reqBytes);
+ reqBytes *= semaCount;
+
+ gcmkONERROR(gckCOMMAND_Reserve(Command, reqBytes, (gctPOINTER *)&buffer, &bufferLen));
+
+ for (i = 0; i < semaCount; i++)
+ {
+ bytes = bufferLen;
+
+ /* Wait semaphores executed in fixed system channel. */
+ gckMCFE_WaitSemaphore(hardware, buffer, semaId[i], &bytes);
+
+ buffer += bytes;
+ bufferLen -= bytes;
+ }
+
+ gcmkONERROR(gckCOMMAND_ExecuteMultiChannel(Command, 0, 0, reqBytes));
+
+ /* Now upload the pending semaphore tracking ring. */
+ gcmkONERROR(_GetNextPendingPos(Command, &pos));
+
+ /* Update latest pending semaphore id. */
+ Command->pendingSema[pos].semaId = (gctUINT32)semaId[semaCount - 1];
+
+ /* Send the signal by event. */
+ gcmkONERROR(gckEVENT_Signal(
+ eventObj,
+ Command->pendingSema[pos].signal,
+ gcvKERNEL_PIXEL
+ ));
+
+ gcmkONERROR(gckEVENT_Submit(
+ eventObj,
+ gcvTRUE,
+ gcvFALSE
+ ));
+ }
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+static gcmINLINE gceSTATUS
+_SyncFromSystemChannel(
+ gckCOMMAND Command,
+ gctBOOL Priority,
+ gctUINT32 ChannelId
+ )
+{
+ gceSTATUS status;
+ gckHARDWARE hardware = Command->kernel->hardware;
+ gctUINT32 reqBytes = 0;
+ gctUINT32 bytes = 0;
+ gctUINT8_PTR buffer;
+ gctUINT32 id;
+
+ if (!(Command->syncChannel[Priority ? 1 : 0] & (1ull << ChannelId)))
+ {
+ /* No need to sync. */
+ return gcvSTATUS_OK;
+ }
+
+ /* Get a semaphore. */
+ gcmkONERROR(_GetNextMcfeSemaId(Command, gcvFALSE, &id));
+
+ /* Send the semaphore in system channel. */
+ gckMCFE_SendSemaphore(hardware, gcvNULL, 0, &reqBytes);
+
+ gcmkONERROR(gckCOMMAND_Reserve(
+ Command,
+ reqBytes,
+ (gctPOINTER *)&buffer,
+ &bytes
+ ));
+
+ gckMCFE_SendSemaphore(hardware, buffer, id, &bytes);
+
+ gcmkONERROR(gckCOMMAND_ExecuteMultiChannel(Command, gcvFALSE, 0, reqBytes));
+
+ /* Wait the semaphore in specific channel. */
+ gckMCFE_WaitSemaphore(hardware, gcvNULL, 0, &reqBytes);
+
+ gcmkONERROR(gckCOMMAND_Reserve(
+ Command,
+ reqBytes,
+ (gctPOINTER *)&buffer,
+ &bytes
+ ));
+
+ gckMCFE_WaitSemaphore(hardware, buffer, id, &bytes);
+
+ gcmkONERROR(gckCOMMAND_ExecuteMultiChannel(
+ Command,
+ Priority,
+ ChannelId,
+ reqBytes
+ ));
+
+ /* Clear the sync flag. */
+ Command->syncChannel[Priority ? 1 : 0] &= ~(1ull << ChannelId);
+
+ /* Can not track the semaphore here. */
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_CheckFlushMcfeMMU(
+ IN gckCOMMAND Command,
+ IN gckHARDWARE Hardware
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT32 oldValue;
+ gctUINT32 reqBytes;
+ gctUINT32 bytes;
+ gctUINT8_PTR buffer;
+ gctUINT32 id = 0;
+
+ gckOS_AtomicExchange(Command->os,
+ Hardware->pageTableDirty[gcvENGINE_RENDER],
+ 0,
+ &oldValue);
+
+ if (!oldValue)
+ {
+ return gcvSTATUS_OK;
+ }
+
+ /*
+ * We had sync'ed to system channel in every commit, see comments in Commit.
+ * It should not run into sync again here, unless there's some other place
+ * causes channels dirty. Let's check it here.
+ */
+ gcmkONERROR(_SyncToSystemChannel(Command, Command->dirtyChannel));
+
+ /* Query flush Mcfe MMU cache command bytes. */
+ gcmkONERROR(gckHARDWARE_FlushMcfeMMU(Hardware, gcvNULL, &reqBytes));
+
+ /* Query semaphore command bytes. */
+ gcmkONERROR(
+ gckMCFE_SendSemaphore(Hardware, gcvNULL, 0, &bytes));
+ reqBytes += bytes;
+
+ gcmkONERROR(
+ gckMCFE_WaitSemaphore(Hardware, gcvNULL, 0, &bytes));
+ reqBytes += bytes;
+
+ /* Get a semaphore. */
+ gcmkONERROR(_GetNextMcfeSemaId(Command, gcvFALSE, &id));
+
+ /* Request command buffer for system channel. */
+ gcmkONERROR(gckCOMMAND_Reserve(
+ Command,
+ reqBytes,
+ (gctPOINTER *)&buffer,
+ &bytes
+ ));
+
+ /* Do flush mmu. */
+ gckHARDWARE_FlushMcfeMMU(Hardware, buffer, &bytes);
+ buffer += bytes;
+
+ /* Send and wait semaphore in the system channel itself. */
+ gcmkONERROR(gckMCFE_SendSemaphore(Hardware, buffer, id, &bytes));
+ buffer += bytes;
+
+ gcmkONERROR(gckMCFE_WaitSemaphore(Hardware, buffer, id, &bytes));
+
+ /* Execute flush mmu and send semaphores. */
+ gcmkONERROR(gckCOMMAND_ExecuteMultiChannel(Command, 0, 0, reqBytes));
+
+ /* Need sync from system channel. */
+ Command->syncChannel[0] = ~1ull;
+ Command->syncChannel[1] = ~1ull;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+/*
+ * Find sema id from the map.
+ * Returns semaphore Id, ie the array index of semaHandleMap.
+ * -1 if not found.
+ */
+static gcmINLINE gctINT32
+_FindSemaIdFromMap(
+ IN gckCOMMAND Command,
+ IN gctUINT32 SemaHandle
+ )
+{
+ gctUINT32 semaId = Command->nextSemaId;
+
+ do
+ {
+ /*
+ * Only need to check semaId between signaledId (inclusive) and
+ * nextSemaId (exclusive).
+ */
+ semaId = (semaId == 0) ? (Command->totalSemaId - 1) : (semaId - 1);
+
+ if (Command->semaHandleMap[semaId] == SemaHandle)
+ {
+ return (gctINT32)semaId;
+ }
+ }
+ while (semaId != Command->freeSemaId);
+
+ return -1;
+}
+
+/* Put together patch list handling variables. */
+typedef struct _gcsPATCH_LIST_VARIABLE
+{
+ /* gcvHAL_PATCH_VIDMEM_TIMESTAMP. */
+ gctUINT64 maxAsyncTimestamp;
+
+ /* gcvHAL_PATCH_MCFE_SEMAPHORE. */
+ gctBOOL semaUsed;
+}
+gcsPATCH_LIST_VARIABLE;
+
+/* Patch item handler typedef. */
+typedef gceSTATUS
+(* PATCH_ITEM_HANDLER)(
+ IN gckCOMMAND Command,
+ IN gcsHAL_COMMAND_LOCATION * CommandBuffer,
+ IN gctPOINTER Patch,
+ IN gcsPATCH_LIST_VARIABLE * PatchListVar
+ );
+
+static const gctUINT32 _PatchItemSize[] =
+{
+ 0,
+ (gctUINT32)sizeof(gcsHAL_PATCH_VIDMEM_ADDRESS),
+ (gctUINT32)sizeof(gcsHAL_PATCH_MCFE_SEMAPHORE),
+ (gctUINT32)sizeof(gcsHAL_PATCH_VIDMEM_TIMESTAMP),
+};
+
+static gceSTATUS
+_HandleVidmemAddressPatch(
+ IN gckCOMMAND Command,
+ IN gcsHAL_COMMAND_LOCATION * CommandBuffer,
+ IN gctPOINTER Patch,
+ IN gcsPATCH_LIST_VARIABLE * PatchListVar
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsHAL_PATCH_VIDMEM_ADDRESS * patch = Patch;
+
+ gcmkHEADER_ARG("Command=%p location=0x%x node=0x%x offset=%x",
+ Command, patch->location, patch->node, patch->offset);
+
+ (void)status;
+ (void)patch;
+
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_HandleMCFESemaphorePatch(
+ IN gckCOMMAND Command,
+ IN gcsHAL_COMMAND_LOCATION * CommandBuffer,
+ IN gctPOINTER Patch,
+ IN gcsPATCH_LIST_VARIABLE * PatchListVar
+ )
+{
+ gckHARDWARE hardware = Command->kernel->hardware;
+ gctINT32 index;
+ gctUINT32 semaId;
+ gceSTATUS status;
+ gctUINT32 bytes = 8;
+ gctUINT32 buffer[2];
+ gctUINT8_PTR location;
+ gcsHAL_PATCH_MCFE_SEMAPHORE * patch = (gcsHAL_PATCH_MCFE_SEMAPHORE *)Patch;
+
+ gcmkHEADER_ARG("Command=%p location=0x%x semaHandle=%d",
+ Command, patch->location, patch->semaHandle);
+
+ index = _FindSemaIdFromMap(Command, patch->semaHandle);
+
+ if (index < 0)
+ {
+ status = _GetNextMcfeSemaId(Command, gcvTRUE, &semaId);
+
+ if (gcmIS_ERROR(status))
+ {
+ gcmkONERROR(_SyncToSystemChannel(Command, Command->dirtyChannel));
+ gcmkONERROR(_GetNextMcfeSemaId(Command, gcvTRUE, &semaId));
+ }
+
+ Command->semaHandleMap[semaId] = patch->semaHandle;
+ }
+ else
+ {
+ semaId = (gctUINT32)index;
+
+ /* One send must match one wait, will assign new id next time. */
+ Command->semaHandleMap[semaId] = 0;
+ }
+
+ if (patch->sendSema)
+ {
+ gcmkONERROR(gckMCFE_SendSemaphore(hardware, buffer, semaId, &bytes));
+ }
+ else
+ {
+ gcmkONERROR(gckMCFE_WaitSemaphore(hardware, buffer, semaId, &bytes));
+ }
+
+ gcmkASSERT(bytes == 8);
+
+ location = gcmUINT64_TO_PTR(CommandBuffer->logical + patch->location);
+
+ /* Patch the command buffer. */
+ gckOS_WriteMemory(Command->os, location, buffer[0]);
+ gckOS_WriteMemory(Command->os, location + 4, buffer[1]);
+
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_HandleTimestampPatch(
+ IN gckCOMMAND Command,
+ IN gcsHAL_COMMAND_LOCATION * CommandBuffer,
+ IN gctPOINTER Patch,
+ IN gcsPATCH_LIST_VARIABLE * PatchListVar
+ )
+{
+ gceSTATUS status;
+ gctUINT32 processID;
+ gckVIDMEM_NODE videoMem = gcvNULL;
+ gcsHAL_PATCH_VIDMEM_TIMESTAMP * patch = Patch;
+ gceENGINE engine = Command->feType == gcvHW_FE_ASYNC ? gcvENGINE_BLT
+ : gcvENGINE_RENDER;
+
+ gcmkHEADER_ARG("Command=%p node=0x%x", Command, patch->handle);
+
+ /* Get the current process ID. */
+ gcmkONERROR(gckOS_GetProcessID(&processID));
+
+ gcmkONERROR(
+ gckVIDMEM_HANDLE_Lookup(Command->kernel,
+ processID,
+ patch->handle,
+ &videoMem));
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Reference(Command->kernel, videoMem));
+
+ /* Touch video memory node. */
+ gcmkVERIFY_OK(
+ gckVIDMEM_NODE_SetCommitStamp(Command->kernel,
+ engine,
+ videoMem,
+ Command->commitStamp));
+
+ if ((engine == gcvENGINE_RENDER) && Command->kernel->asyncCommand)
+ {
+ /* Find the latest timestamp of the nodes used in async FE. */
+ gctUINT64 stamp = 0;
+
+ /* Get stamp touched async command buffer. */
+ gcmkVERIFY_OK(
+ gckVIDMEM_NODE_GetCommitStamp(Command->kernel,
+ gcvENGINE_BLT,
+ videoMem,
+ &stamp));
+
+ /* Find latest one. */
+ if (PatchListVar->maxAsyncTimestamp < stamp)
+ {
+ PatchListVar->maxAsyncTimestamp = stamp;
+ }
+ }
+
+OnError:
+ if (videoMem)
+ {
+ gckVIDMEM_NODE_Dereference(Command->kernel, videoMem);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_HandlePatchListSingle(
+ IN gckCOMMAND Command,
+ IN gcsHAL_COMMAND_LOCATION * CommandBuffer,
+ IN gcsHAL_PATCH_LIST * PatchList,
+ IN gctBOOL NeedCopy,
+ IN gcsPATCH_LIST_VARIABLE * PatchListVar
+ )
+{
+ gceSTATUS status;
+ /* 256 bytes for storage. */
+ gctUINT64 storage[32];
+ gctPOINTER kArray = gcvNULL;
+ gctPOINTER userPtr = gcvNULL;
+ gctUINT32 index = 0;
+ gctUINT32 count = 0;
+ gctUINT32 itemSize = 0;
+ gctUINT32 batchCount = 0;
+
+ static const PATCH_ITEM_HANDLER patchHandler[] =
+ {
+ gcvNULL,
+ _HandleVidmemAddressPatch,
+ _HandleMCFESemaphorePatch,
+ _HandleTimestampPatch,
+ };
+ PATCH_ITEM_HANDLER handler;
+
+ gcmkHEADER_ARG("Command=%p CommandBuffer=%p PatchList=%p type=%d",
+ Command, CommandBuffer, PatchList, PatchList->type);
+
+ if (PatchList->type >= gcmCOUNTOF(_PatchItemSize) || PatchList->type >= gcmCOUNTOF(patchHandler))
+ {
+ /* Exceeds buffer max size. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ itemSize = _PatchItemSize[PatchList->type];
+
+ batchCount = (gctUINT32)(sizeof(storage) / itemSize);
+
+ handler = patchHandler[PatchList->type];
+
+ while (index < PatchList->count)
+ {
+ gctUINT i;
+ gctUINT8_PTR ptr;
+
+ /* Determine batch count, don't handle too many in one batch. */
+ count = PatchList->count - index;
+
+ if (count > batchCount)
+ {
+ count = batchCount;
+ }
+
+ userPtr = gcmUINT64_TO_PTR(PatchList->patchArray + itemSize * index);
+
+ /* Copy/map a patch array batch from user. */
+ if (NeedCopy)
+ {
+ kArray = storage;
+
+ status = gckOS_CopyFromUserData(
+ Command->os,
+ kArray,
+ userPtr,
+ itemSize * count
+ );
+ }
+ else
+ {
+ status = gckOS_MapUserPointer(
+ Command->os,
+ userPtr,
+ itemSize * count,
+ (gctPOINTER *)&kArray
+ );
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ userPtr = gcvNULL;
+ gcmkONERROR(status);
+ }
+
+ /* Advance to next batch. */
+ index += count;
+
+ ptr = (gctUINT8_PTR)kArray;
+
+ for (i = 0; i < count; i++)
+ {
+ /* Call handler. */
+ gcmkONERROR(
+ handler(Command, CommandBuffer, ptr, PatchListVar));
+
+ /* Advance to next patch. */
+ ptr += itemSize;
+ }
+
+ /* Unmap user pointer if mapped. */
+ if (!NeedCopy)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Command->os,
+ userPtr,
+ itemSize * count,
+ kArray
+ ));
+ }
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (!NeedCopy && userPtr)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Command->os,
+ userPtr,
+ itemSize * count,
+ kArray
+ ));
+
+ userPtr = gcvNULL;
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_HandlePatchList(
+ IN gckCOMMAND Command,
+ IN gcsHAL_COMMAND_LOCATION * CommandBuffer,
+ OUT gcsPATCH_LIST_VARIABLE * PatchListVar
+ )
+{
+ gceSTATUS status;
+ gctBOOL needCopy = gcvFALSE;
+ gcsHAL_PATCH_LIST storage;
+ gcsHAL_PATCH_LIST * kPatchList = gcvNULL;
+ gctPOINTER userPtr = gcmUINT64_TO_PTR(CommandBuffer->patchHead);
+
+ gcmkHEADER_ARG("Command=%p CommandBuffer=%p", Command, CommandBuffer);
+
+ /* Check wehther we need to copy the structures or not. */
+ gcmkONERROR(gckOS_QueryNeedCopy(Command->os, 0, &needCopy));
+
+ while (userPtr)
+ {
+ gctUINT64 next;
+
+ /* Copy/map a patch from user. */
+ if (needCopy)
+ {
+ kPatchList = &storage;
+
+ status = gckOS_CopyFromUserData(
+ Command->os,
+ kPatchList,
+ userPtr,
+ sizeof(gcsHAL_PATCH_LIST)
+ );
+ }
+ else
+ {
+ status = gckOS_MapUserPointer(
+ Command->os,
+ userPtr,
+ sizeof(gcsHAL_PATCH_LIST),
+ (gctPOINTER *)&kPatchList
+ );
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ userPtr = gcvNULL;
+ gcmkONERROR(status);
+ }
+
+ /* Do handle patch. */
+ gcmkASSERT(kPatchList->type < gcvHAL_PATCH_TYPE_COUNT);
+
+ gcmkONERROR(
+ _HandlePatchListSingle(Command,
+ CommandBuffer,
+ kPatchList,
+ needCopy,
+ PatchListVar));
+
+ next = kPatchList->next;
+
+ /* Unmap user pointer if mapped. */
+ if (!needCopy)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Command->os,
+ userPtr,
+ sizeof(gcsHAL_PATCH_LIST),
+ kPatchList
+ ));
+ }
+
+ /* Advance to next patch from user. */
+ userPtr = gcmUINT64_TO_PTR(next);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (!needCopy && userPtr)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Command->os,
+ userPtr,
+ sizeof(gcsHAL_PATCH_LIST),
+ kPatchList
+ ));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_WaitForAsyncCommandStamp(
+ IN gckCOMMAND Command,
+ IN gctUINT64 Stamp
+ )
+{
+ gctUINT32 bytes;
+ gceSTATUS status;
+ gctUINT32 fenceAddress;
+ gctUINT32 bufferSize;
+ gctPOINTER pointer;
+ gckCOMMAND asyncCommand = Command->kernel->asyncCommand;
+
+ gcmkHEADER_ARG("Stamp = 0x%llx", Stamp);
+
+ if (*(gctUINT64 *)asyncCommand->fence->logical >= Stamp)
+ {
+ /* Already satisfied, skip. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ fenceAddress = asyncCommand->fence->address;
+
+ gcmkONERROR(gckHARDWARE_WaitFence(
+ Command->kernel->hardware,
+ gcvNULL,
+ Stamp,
+ fenceAddress,
+ &bytes
+ ));
+
+ gcmkONERROR(gckCOMMAND_Reserve(
+ Command,
+ bytes,
+ &pointer,
+ &bufferSize
+ ));
+
+ gcmkONERROR(gckHARDWARE_WaitFence(
+ Command->kernel->hardware,
+ pointer,
+ Stamp,
+ fenceAddress,
+ &bytes
+ ));
+
+ gcmkONERROR(gckCOMMAND_Execute(Command, bytes));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/******************************************************************************\
+****************************** gckCOMMAND API Code ******************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** gckCOMMAND_Construct
+**
+** Construct a new gckCOMMAND object.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** OUTPUT:
+**
+** gckCOMMAND * Command
+** Pointer to a variable that will hold the pointer to the gckCOMMAND
+** object.
+*/
+gceSTATUS
+gckCOMMAND_Construct(
+ IN gckKERNEL Kernel,
+ IN gceHW_FE_TYPE FeType,
+ OUT gckCOMMAND * Command
+ )
+{
+ gckOS os;
+ gckCOMMAND command = gcvNULL;
+ gceSTATUS status;
+ gctINT i;
+ gctPOINTER pointer = gcvNULL;
+ gctSIZE_T pageSize;
+
+ gcmkHEADER_ARG("Kernel=%p", Kernel);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Command != gcvNULL);
+
+ /* Extract the gckOS object. */
+ os = Kernel->os;
+
+ /* Allocate the gckCOMMAND structure. */
+ gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(struct _gckCOMMAND), &pointer));
+ command = pointer;
+
+ /* Reset the entire object. */
+ gcmkONERROR(gckOS_ZeroMemory(command, gcmSIZEOF(struct _gckCOMMAND)));
+
+ /* Initialize the gckCOMMAND object.*/
+ command->object.type = gcvOBJ_COMMAND;
+ command->kernel = Kernel;
+ command->os = os;
+
+ command->feType = FeType;
+
+ /* Get the command buffer requirements. */
+ gcmkONERROR(gckHARDWARE_QueryCommandBuffer(
+ Kernel->hardware,
+ gcvENGINE_RENDER,
+ &command->alignment,
+ gcvNULL,
+ gcvNULL
+ ));
+
+ /* Create the command queue mutex. */
+ gcmkONERROR(gckOS_CreateMutex(os, &command->mutexQueue));
+
+ /* Create the context switching mutex. */
+ gcmkONERROR(gckOS_CreateMutex(os, &command->mutexContext));
+
+ /* Create the context switching mutex. */
+ gcmkONERROR(gckOS_CreateMutex(os, &command->mutexContextSeq));
+
+ /* Create the power management semaphore. */
+ gcmkONERROR(gckOS_CreateSemaphore(os, &command->powerSemaphore));
+
+ /* Create the commit atom. */
+ gcmkONERROR(gckOS_AtomConstruct(os, &command->atomCommit));
+
+ /* Get the page size from teh OS. */
+ gcmkONERROR(gckOS_GetPageSize(os, &pageSize));
+
+ gcmkSAFECASTSIZET(command->pageSize, pageSize);
+
+ /* Get process ID. */
+ gcmkONERROR(gckOS_GetProcessID(&command->kernelProcessID));
+
+ /* Set hardware to pipe 0. */
+ command->pipeSelect = gcvPIPE_INVALID;
+
+ /* Pre-allocate the command queues. */
+ for (i = 0; i < gcdCOMMAND_QUEUES; ++i)
+ {
+ gcePOOL pool = gcvPOOL_DEFAULT;
+ gctSIZE_T size = pageSize;
+ gckVIDMEM_NODE videoMem = gcvNULL;
+ gctUINT32 allocFlag = 0;
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ allocFlag = gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+ /* Allocate video memory node for command buffers. */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ Kernel,
+ 64,
+ gcvVIDMEM_TYPE_COMMAND,
+ allocFlag,
+ &size,
+ &pool,
+ &videoMem
+ ));
+
+ command->queues[i].videoMem = videoMem;
+
+ /* Lock for GPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_Lock(
+ Kernel,
+ videoMem,
+ &command->queues[i].address
+ ));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ Kernel,
+ videoMem,
+ gcvFALSE,
+ gcvFALSE,
+ &command->queues[i].logical
+ ));
+
+ gcmkONERROR(gckOS_CreateSignal(
+ os, gcvFALSE, &command->queues[i].signal
+ ));
+
+ gcmkONERROR(gckOS_Signal(
+ os, command->queues[i].signal, gcvTRUE
+ ));
+ }
+
+#if gcdRECORD_COMMAND
+ gcmkONERROR(gckRECORDER_Construct(os, Kernel->hardware, &command->recorder));
+#endif
+
+ gcmkONERROR(gckFENCE_Create(
+ os, Kernel, &command->fence
+ ));
+
+ /* No command queue in use yet. */
+ command->index = -1;
+ command->logical = gcvNULL;
+ command->newQueue = gcvFALSE;
+
+ /* Query mcfe semaphore count. */
+ if (FeType == gcvHW_FE_MULTI_CHANNEL)
+ {
+ command->totalSemaId = 128;
+
+ /* Empty sema id ring. */
+ command->nextSemaId = 0;
+ command->freeSemaId = command->totalSemaId - 1;
+
+ command->semaMinThreshhold = 16;
+
+ /* Create signals. */
+ for (i = 0; i < (gctINT)gcmCOUNTOF(command->pendingSema); i++)
+ {
+ gcmkONERROR(gckOS_CreateSignal(
+ os,
+ gcvFALSE,
+ &command->pendingSema[i].signal
+ ));
+ }
+
+ /* Empty pending sema tracking ring. */
+ command->nextPendingPos = 0;
+ command->freePendingPos = gcmCOUNTOF(command->pendingSema) - 1;
+
+ /* Allocate sema handle mapping. */
+ gcmkONERROR(gckOS_Allocate(
+ os,
+ command->totalSemaId * sizeof(gctUINT32),
+ &pointer
+ ));
+
+ command->semaHandleMap = (gctUINT32 *)pointer;
+
+ gcmkVERIFY_OK(gckOS_ZeroMemory(
+ command->semaHandleMap,
+ command->totalSemaId * sizeof(gctUINT32)
+ ));
+ }
+
+ /* Command is not yet running. */
+ command->running = gcvFALSE;
+
+ /* Command queue is idle. */
+ command->idle = gcvTRUE;
+
+ /* Commit stamp start from 1. */
+ command->commitStamp = 1;
+
+ command->dummyDraw = gcvTRUE;
+
+ /* Return pointer to the gckCOMMAND object. */
+ *Command = command;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Command=0x%x", *Command);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (command != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckCOMMAND_Destroy(command));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckCOMMAND_Destroy
+**
+** Destroy an gckCOMMAND object.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to an gckCOMMAND object to destroy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCOMMAND_Destroy(
+ IN gckCOMMAND Command
+ )
+{
+ gctINT i;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ /* Stop the command queue. */
+ gcmkVERIFY_OK(gckCOMMAND_Stop(Command));
+
+ for (i = 0; i < gcdCOMMAND_QUEUES; ++i)
+ {
+ if (Command->queues[i].signal)
+ {
+ gcmkVERIFY_OK(gckOS_DestroySignal(
+ Command->os, Command->queues[i].signal
+ ));
+ }
+
+ if (Command->queues[i].logical)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ Command->kernel,
+ Command->queues[i].videoMem,
+ 0,
+ gcvFALSE,
+ gcvFALSE
+ ));
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Unlock(
+ Command->kernel,
+ Command->queues[i].videoMem,
+ 0,
+ gcvNULL
+ ));
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(
+ Command->kernel,
+ Command->queues[i].videoMem
+ ));
+
+ Command->queues[i].videoMem = gcvNULL;
+ Command->queues[i].logical = gcvNULL;
+ }
+ }
+
+ if (Command->mutexContext)
+ {
+ /* Delete the context switching mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Command->os, Command->mutexContext));
+ }
+
+ if (Command->mutexContextSeq != gcvNULL)
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Command->os, Command->mutexContextSeq));
+
+ if (Command->mutexQueue)
+ {
+ /* Delete the command queue mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Command->os, Command->mutexQueue));
+ }
+
+ if (Command->powerSemaphore)
+ {
+ /* Destroy the power management semaphore. */
+ gcmkVERIFY_OK(gckOS_DestroySemaphore(Command->os, Command->powerSemaphore));
+ }
+
+ if (Command->atomCommit)
+ {
+ /* Destroy the commit atom. */
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Command->os, Command->atomCommit));
+ }
+
+#if gcdRECORD_COMMAND
+ gckRECORDER_Destory(Command->os, Command->recorder);
+#endif
+
+ if (Command->stateMap)
+ {
+ gcmkOS_SAFE_FREE(Command->os, Command->stateMap);
+ }
+
+ if (Command->semaHandleMap)
+ {
+ gcmkOS_SAFE_FREE(Command->os, Command->semaHandleMap);
+ }
+
+ if (Command->fence)
+ {
+ gcmkVERIFY_OK(gckFENCE_Destory(Command->os, Command->fence));
+ }
+
+ /* Mark object as unknown. */
+ Command->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the gckCOMMAND object. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Command->os, Command));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckCOMMAND_EnterCommit
+**
+** Acquire command queue synchronization objects.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to an gckCOMMAND object to destroy.
+**
+** gctBOOL FromPower
+** Determines whether the call originates from inside the power
+** management or not.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCOMMAND_EnterCommit(
+ IN gckCOMMAND Command,
+ IN gctBOOL FromPower
+ )
+{
+ gceSTATUS status;
+ gckHARDWARE hardware;
+ gctBOOL atomIncremented = gcvFALSE;
+ gctBOOL semaAcquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ /* Extract the gckHARDWARE and gckEVENT objects. */
+ hardware = Command->kernel->hardware;
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ if (!FromPower)
+ {
+ /* Increment COMMIT atom to let power management know that a commit is
+ ** in progress. */
+ gcmkONERROR(_IncrementCommitAtom(Command, gcvTRUE));
+ atomIncremented = gcvTRUE;
+
+ /* Notify the system the GPU has a commit. */
+ gcmkONERROR(gckOS_Broadcast(Command->os,
+ hardware,
+ gcvBROADCAST_GPU_COMMIT));
+
+ /* Acquire the power management semaphore. */
+ gcmkONERROR(gckOS_AcquireSemaphore(Command->os,
+ Command->powerSemaphore));
+ semaAcquired = gcvTRUE;
+ }
+
+ /* Grab the conmmand queue mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Command->os,
+ Command->mutexQueue,
+ gcvINFINITE));
+
+ /* Success. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (semaAcquired)
+ {
+ /* Release the power management semaphore. */
+ gcmkVERIFY_OK(gckOS_ReleaseSemaphore(
+ Command->os, Command->powerSemaphore
+ ));
+ }
+
+ if (atomIncremented)
+ {
+ /* Decrement the commit atom. */
+ gcmkVERIFY_OK(_IncrementCommitAtom(
+ Command, gcvFALSE
+ ));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckCOMMAND_ExitCommit
+**
+** Release command queue synchronization objects.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to an gckCOMMAND object to destroy.
+**
+** gctBOOL FromPower
+** Determines whether the call originates from inside the power
+** management or not.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCOMMAND_ExitCommit(
+ IN gckCOMMAND Command,
+ IN gctBOOL FromPower
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ /* Release the power mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Command->os, Command->mutexQueue));
+
+ if (!FromPower)
+ {
+ /* Release the power management semaphore. */
+ gcmkONERROR(gckOS_ReleaseSemaphore(Command->os,
+ Command->powerSemaphore));
+
+ /* Decrement the commit atom. */
+ gcmkONERROR(_IncrementCommitAtom(Command, gcvFALSE));
+ }
+
+ /* Success. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_StartWaitLinkFE(
+ IN gckCOMMAND Command
+ )
+{
+ gceSTATUS status;
+ gckHARDWARE hardware;
+ gctUINT32 waitOffset = 0;
+ gctUINT32 waitLinkBytes;
+ gctPOINTER logical;
+ gctUINT32 address;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ if (Command->running)
+ {
+ /* Command queue already running. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ /* Extract the gckHARDWARE object. */
+ hardware = Command->kernel->hardware;
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ /* Query the size of WAIT/LINK command sequence. */
+ gcmkONERROR(gckWLFE_WaitLink(
+ hardware,
+ gcvNULL,
+ ~0U,
+ Command->offset,
+ &waitLinkBytes,
+ gcvNULL,
+ gcvNULL
+ ));
+
+ if ((Command->pageSize - Command->offset < waitLinkBytes)
+ || (Command->logical == gcvNULL)
+ )
+ {
+ /* Start at beginning of a new queue. */
+ gcmkONERROR(_NewQueue(Command, gcvTRUE));
+ }
+
+ logical = (gctUINT8_PTR) Command->logical + Command->offset;
+ address = Command->address + Command->offset;
+
+ /* Append WAIT/LINK. */
+ gcmkONERROR(gckWLFE_WaitLink(
+ hardware,
+ logical,
+ address,
+ 0,
+ &waitLinkBytes,
+ &waitOffset,
+ &Command->waitPos.size
+ ));
+
+ /* Update wait command position. */
+ Command->waitPos.videoMem = Command->videoMem;
+ Command->waitPos.offset = Command->offset + waitOffset;
+ Command->waitPos.logical = (gctUINT8_PTR) logical + waitOffset;
+ Command->waitPos.address = address + waitOffset;
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->videoMem,
+ Command->offset,
+ logical,
+ waitLinkBytes
+ ));
+
+ /* Adjust offset. */
+ Command->offset += waitLinkBytes;
+ Command->newQueue = gcvFALSE;
+
+ gcmkDUMP(Command->os, "#[wait-link: fe start]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ logical,
+ address,
+ waitLinkBytes
+ );
+
+#if gcdSECURITY
+ /* Start FE by calling security service. */
+ gckKERNEL_SecurityStartCommand(
+ Command->kernel
+ );
+#else
+ /* Enable command processor. */
+ gcmkONERROR(gckWLFE_Execute(
+ hardware,
+ address,
+ waitLinkBytes
+ ));
+#endif
+
+ /* Command queue is running. */
+ Command->running = gcvTRUE;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_StartAsyncFE(
+ IN gckCOMMAND Command
+ )
+{
+ if ((Command->pageSize <= Command->offset) ||
+ (Command->logical == gcvNULL))
+ {
+ /* Start at beginning of a new queue. */
+ gcmkVERIFY_OK(_NewQueue(Command, gcvTRUE));
+ }
+
+ /* Command queue is running. */
+ Command->running = gcvTRUE;
+
+ /* Nothing to do. */
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_StartMCFE(
+ IN gckCOMMAND Command
+ )
+{
+ if ((Command->pageSize <= Command->offset) ||
+ (Command->logical == gcvNULL))
+ {
+ /* Start at beginning of a new queue. */
+ gcmkVERIFY_OK(_NewQueue(Command, gcvTRUE));
+ }
+
+ /* Command queue is running. */
+ Command->running = gcvTRUE;
+
+ /* Nothing to do. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckCOMMAND_Start
+**
+** Start up the command queue.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to an gckCOMMAND object to start.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCOMMAND_Start(
+ IN gckCOMMAND Command
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ if (Command->feType == gcvHW_FE_WAIT_LINK)
+ {
+ gcmkONERROR(_StartWaitLinkFE(Command));
+ }
+ else if (Command->feType == gcvHW_FE_MULTI_CHANNEL)
+ {
+ gcmkONERROR(_StartMCFE(Command));
+ }
+ else
+ {
+ gcmkONERROR(_StartAsyncFE(Command));
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+
+}
+
+static gceSTATUS
+_StopWaitLinkFE(
+ IN gckCOMMAND Command
+ )
+{
+ gckHARDWARE hardware;
+ gceSTATUS status;
+ gctUINT32 idle;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ /* Extract the gckHARDWARE object. */
+ hardware = Command->kernel->hardware;
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ /* Replace last WAIT with END. */
+ gcmkONERROR(gckWLFE_End(
+ hardware,
+ Command->waitPos.logical,
+ Command->waitPos.address,
+ &Command->waitPos.size
+ ));
+
+ gcmkDUMP(Command->os, "#[end: fe stop]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ Command->waitPos.logical,
+ Command->waitPos.address,
+ Command->waitPos.size
+ );
+
+#if gcdSECURITY
+ gcmkONERROR(gckKERNEL_SecurityExecute(
+ Command->kernel, Command->waitPos.logical, 8
+ ));
+#endif
+
+ /* Update queue tail pointer. */
+ gcmkONERROR(gckHARDWARE_UpdateQueueTail(Command->kernel->hardware,
+ Command->logical,
+ Command->offset));
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->waitPos.videoMem,
+ Command->waitPos.offset,
+ Command->waitPos.logical,
+ Command->waitPos.size
+ ));
+
+ /* Wait for idle. */
+ gcmkONERROR(gckHARDWARE_GetIdle(hardware, gcvTRUE, &idle));
+
+ /* Command queue is no longer running. */
+ Command->running = gcvFALSE;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_StopAsyncFE(
+ IN gckCOMMAND Command
+ )
+{
+ gckHARDWARE hardware;
+ gceSTATUS status;
+ gctUINT32 idle;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ hardware = Command->kernel->hardware;
+
+ /* Update queue tail pointer. */
+ gcmkONERROR(gckHARDWARE_UpdateQueueTail(hardware,
+ Command->logical,
+ Command->offset));
+
+ /* Wait for idle. */
+ gcmkONERROR(gckHARDWARE_GetIdle(hardware, gcvTRUE, &idle));
+
+ /* Command queue is no longer running. */
+ Command->running = gcvFALSE;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_StopMCFE(
+ IN gckCOMMAND Command
+ )
+{
+ gceSTATUS status;
+ gckHARDWARE hardware;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ hardware = Command->kernel->hardware;
+
+ /* Update queue tail pointer. */
+ gcmkONERROR(gckHARDWARE_UpdateQueueTail(hardware,
+ Command->logical,
+ Command->offset));
+
+ /* Command queue is no longer running. */
+ Command->running = gcvFALSE;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckCOMMAND_Stop
+**
+** Stop the command queue.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to an gckCOMMAND object to stop.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCOMMAND_Stop(
+ IN gckCOMMAND Command
+ )
+{
+ if (!Command->running)
+ {
+ /* Command queue is not running. */
+ return gcvSTATUS_OK;
+ }
+
+ if (Command->feType == gcvHW_FE_WAIT_LINK)
+ {
+ return _StopWaitLinkFE(Command);
+ }
+ else if (Command->feType == gcvHW_FE_MULTI_CHANNEL)
+ {
+ return _StopMCFE(Command);
+ }
+ else
+ {
+ return _StopAsyncFE(Command);
+ }
+}
+
+static gceSTATUS
+_CommitWaitLinkOnce(
+ IN gckCOMMAND Command,
+ IN gckCONTEXT Context,
+ IN gcsHAL_COMMAND_LOCATION * CommandBuffer,
+ IN gcsSTATE_DELTA_PTR StateDelta,
+ IN gctUINT32 ProcessID,
+ IN gctBOOL Shared,
+ INOUT gctBOOL *contextSwitched
+ )
+{
+ gceSTATUS status;
+ gctBOOL commitEntered = gcvFALSE;
+ gctBOOL contextAcquired = gcvFALSE;
+ gckHARDWARE hardware;
+ gcsPATCH_LIST_VARIABLE patchListVar = {0, 0};
+
+ gcsCONTEXT_PTR contextBuffer;
+ gctUINT8_PTR commandBufferLogical = gcvNULL;
+ gctUINT32 commandBufferAddress = 0;
+ gckVIDMEM_NODE commandBufferVideoMem = gcvNULL;
+ gctUINT8_PTR commandBufferTail = gcvNULL;
+ gctUINT commandBufferSize;
+ gctUINT32 linkBytes;
+ gctSIZE_T bytes;
+ gctUINT32 offset;
+ gctPOINTER entryLogical;
+ gctUINT32 entryAddress;
+ gctUINT32 entryBytes;
+ gctUINT32 exitAddress;
+ gctUINT32 exitBytes;
+ gctPOINTER waitLinkLogical;
+ gctUINT32 waitLinkAddress;
+ gctUINT32 waitLinkBytes;
+ gctUINT32 waitOffset;
+ gctUINT32 waitSize;
+
+#ifdef __QNXNTO__
+ gctPOINTER userCommandBufferLogical = gcvNULL;
+ gctBOOL userCommandBufferLogicalMapped = gcvFALSE;
+#endif
+
+#if gcdDUMP_IN_KERNEL
+ gctPOINTER contextDumpLogical = gcvNULL;
+# endif
+ gctUINT32 exitLinkLow = 0, exitLinkHigh = 0;
+ gctUINT32 entryLinkLow = 0, entryLinkHigh = 0;
+ gctUINT32 commandLinkLow = 0, commandLinkHigh = 0;
+
+ gcmkHEADER_ARG("Command=%p CommandBuffer=%p ProcessID=%d",
+ Command, CommandBuffer, ProcessID
+ );
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ gcmkASSERT(Command->feType == gcvHW_FE_WAIT_LINK);
+
+ /* Acquire the command queue. */
+ gcmkONERROR(gckCOMMAND_EnterCommit(Command, gcvFALSE));
+ commitEntered = gcvTRUE;
+
+ /* Acquire the context switching mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(
+ Command->os, Command->mutexContext, gcvINFINITE
+ ));
+ contextAcquired = gcvTRUE;
+
+ /* Extract the gckHARDWARE and gckEVENT objects. */
+ hardware = Command->kernel->hardware;
+
+
+ gcmkONERROR(
+ _HandlePatchList(Command, CommandBuffer, &patchListVar));
+
+ /* Query the size of LINK command. */
+ gcmkONERROR(gckWLFE_Link(
+ hardware, gcvNULL, 0, 0, &linkBytes, gcvNULL, gcvNULL
+ ));
+
+ /* Compute the command buffer entry and the size. */
+ commandBufferLogical
+ = (gctUINT8_PTR) gcmUINT64_TO_PTR(CommandBuffer->logical)
+ + CommandBuffer->startOffset;
+
+ commandBufferAddress = CommandBuffer->address
+ + CommandBuffer->startOffset;
+
+#ifdef __QNXNTO__
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(
+ Command->kernel,
+ ProcessID,
+ CommandBuffer->videoMemNode,
+ &commandBufferVideoMem
+ ));
+
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ Command->kernel,
+ commandBufferVideoMem,
+ gcvFALSE,
+ gcvFALSE,
+ &userCommandBufferLogical
+ ));
+
+ commandBufferLogical = (gctUINT8_PTR)userCommandBufferLogical + CommandBuffer->startOffset;
+ userCommandBufferLogicalMapped =gcvTRUE;
+#endif
+
+ commandBufferSize = CommandBuffer->size;
+
+ gcmkONERROR(_CheckFlushMMU(Command, hardware));
+
+ if (Command->dummyDraw == gcvTRUE &&
+ Context != gcvNULL)
+ {
+ Command->dummyDraw = gcvFALSE;
+ gcmkONERROR(_DummyDraw(Command));
+ }
+
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_FENCE_64BIT) &&
+ Command->kernel->asyncCommand &&
+ patchListVar.maxAsyncTimestamp != 0)
+ {
+ gcmkONERROR(_WaitForAsyncCommandStamp(
+ Command,
+ patchListVar.maxAsyncTimestamp
+ ));
+ }
+
+ /* Get the current offset. */
+ offset = Command->offset;
+
+ /* Compute number of bytes left in current kernel command queue. */
+ bytes = Command->pageSize - offset;
+
+ /* Query the size of WAIT/LINK command sequence. */
+ gcmkONERROR(gckWLFE_WaitLink(
+ hardware,
+ gcvNULL,
+ ~0U,
+ offset,
+ &waitLinkBytes,
+ gcvNULL,
+ gcvNULL
+ ));
+
+ /* Is there enough space in the current command queue? */
+ if (bytes < waitLinkBytes)
+ {
+ /* No, create a new one. */
+ gcmkONERROR(_NewQueue(Command, gcvFALSE));
+
+ /* Get the new current offset. */
+ offset = Command->offset;
+
+ /* Recompute the number of bytes in the new kernel command queue. */
+ bytes = Command->pageSize - offset;
+ gcmkASSERT(bytes >= waitLinkBytes);
+ }
+
+ /* Compute the location if WAIT/LINK command sequence. */
+ waitLinkLogical = (gctUINT8_PTR) Command->logical + offset;
+ waitLinkAddress = Command->address + offset;
+
+ /* Context switch required? */
+ if (Context == gcvNULL)
+ {
+ /* See if we have to switch pipes for the command buffer. */
+ if (CommandBuffer->entryPipe == (gctUINT32)(Command->pipeSelect))
+ {
+ /* Skip reserved head bytes. */
+ offset = CommandBuffer->reservedHead;
+ }
+ else
+ {
+ gctUINT32 pipeBytes = CommandBuffer->reservedHead;
+
+ /* The current hardware and the entry command buffer pipes
+ ** are different, switch to the correct pipe. */
+ gcmkONERROR(gckHARDWARE_PipeSelect(
+ Command->kernel->hardware,
+ commandBufferLogical,
+ CommandBuffer->entryPipe,
+ &pipeBytes
+ ));
+
+ /* Do not skip pipe switching sequence. */
+ offset = 0;
+
+ /* Reserved bytes in userspace must be exact for a pipeSelect. */
+ gcmkASSERT(pipeBytes == CommandBuffer->reservedHead);
+ }
+
+ /* Compute the entry. */
+ entryLogical = commandBufferLogical + offset;
+ entryAddress = commandBufferAddress + offset;
+ entryBytes = commandBufferSize - offset;
+
+ Command->currContext = gcvNULL;
+ }
+#if gcdDEBUG_OPTION && gcdDEBUG_FORCE_CONTEXT_UPDATE
+ else if (1)
+#else
+ else if (Command->currContext != Context)
+#endif
+ {
+ /* Get the current context buffer. */
+ contextBuffer = Context->buffer;
+
+ /* Yes, merge in the deltas. */
+ gcmkONERROR(gckCONTEXT_Update(Context, ProcessID, StateDelta));
+
+ /***************************************************************
+ ** SWITCHING CONTEXT.
+ */
+
+ /* Determine context buffer entry offset. */
+ offset = (Command->pipeSelect == gcvPIPE_3D)
+
+ /* Skip pipe switching sequence. */
+ ? Context->entryOffset3D + Context->pipeSelectBytes
+
+ /* Do not skip pipe switching sequence. */
+ : Context->entryOffset3D;
+
+ /* Compute the entry. */
+ entryLogical = (gctUINT8_PTR) contextBuffer->logical + offset;
+ entryAddress = contextBuffer->address + offset;
+ entryBytes = Context->bufferSize - offset;
+
+ /* See if we have to switch pipes between the context
+ and command buffers. */
+ if (CommandBuffer->entryPipe == gcvPIPE_3D)
+ {
+ /* Skip reserved head bytes. */
+ offset = CommandBuffer->reservedHead;
+ }
+ else
+ {
+ gctUINT32 pipeBytes = CommandBuffer->reservedHead;
+
+ /* The current hardware and the initial context pipes are
+ different, switch to the correct pipe. */
+ gcmkONERROR(gckHARDWARE_PipeSelect(
+ Command->kernel->hardware,
+ commandBufferLogical,
+ CommandBuffer->entryPipe,
+ &pipeBytes
+ ));
+
+ /* Do not skip pipe switching sequence. */
+ offset = 0;
+
+ /* Reserved bytes in userspace must be exact for a pipeSelect. */
+ gcmkASSERT(pipeBytes == CommandBuffer->reservedHead);
+ }
+
+ /* Generate a LINK from the context buffer to
+ the command buffer. */
+ gcmkONERROR(gckWLFE_Link(
+ hardware,
+ contextBuffer->link3D,
+ commandBufferAddress + offset,
+ commandBufferSize - offset,
+ &linkBytes,
+ &commandLinkLow,
+ &commandLinkHigh
+ ));
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ contextBuffer->videoMem,
+ entryAddress - contextBuffer->address,
+ entryLogical,
+ entryBytes
+ ));
+
+ /* Update the current context. */
+ Command->currContext = Context;
+
+ if (contextSwitched)
+ {
+ *contextSwitched = gcvTRUE;
+ }
+
+#if gcdDUMP_IN_KERNEL
+ contextDumpLogical = entryLogical;
+#endif
+
+#if gcdSECURITY
+ /* Commit context buffer to trust zone. */
+ gckKERNEL_SecurityExecute(
+ Command->kernel,
+ entryLogical,
+ entryBytes - 8
+ );
+#endif
+
+#if gcdRECORD_COMMAND
+ gckRECORDER_Record(
+ Command->recorder,
+ gcvNULL,
+ 0xFFFFFFFF,
+ entryLogical,
+ entryBytes
+ );
+#endif
+ }
+
+ /* Same context. */
+ else
+ {
+ /* See if we have to switch pipes for the command buffer. */
+ if (CommandBuffer->entryPipe == (gctUINT32)(Command->pipeSelect))
+ {
+ /* Skip reserved head bytes. */
+ offset = CommandBuffer->reservedHead;
+ }
+ else
+ {
+ gctUINT32 pipeBytes = CommandBuffer->reservedHead;
+
+ /* The current hardware and the entry command buffer pipes
+ ** are different, switch to the correct pipe. */
+ gcmkONERROR(gckHARDWARE_PipeSelect(
+ Command->kernel->hardware,
+ commandBufferLogical,
+ CommandBuffer->entryPipe,
+ &pipeBytes
+ ));
+
+ /* Do not skip pipe switching sequence. */
+ offset = 0;
+
+ /* Reserved bytes in userspace must be exact for a pipeSelect. */
+ gcmkASSERT(pipeBytes == CommandBuffer->reservedHead);
+ }
+
+ /* Compute the entry. */
+ entryLogical = commandBufferLogical + offset;
+ entryAddress = commandBufferAddress + offset;
+ entryBytes = commandBufferSize - offset;
+ }
+
+ (void)entryLogical;
+
+ /* Determine the location to jump to for the command buffer being
+ ** scheduled. */
+ if (Command->newQueue)
+ {
+ /* New command queue, jump to the beginning of it. */
+ /* Some extra commands (at beginning) are required for new queue. */
+ exitAddress = Command->address;
+ exitBytes = Command->offset + waitLinkBytes;
+ }
+ else
+ {
+ /* Still within the preexisting command queue, jump to the new
+ WAIT/LINK command sequence. */
+ exitAddress = waitLinkAddress;
+ exitBytes = waitLinkBytes;
+ }
+
+ /* Add a new WAIT/LINK command sequence. When the command buffer which is
+ currently being scheduled is fully executed by the GPU, the FE will
+ jump to this WAIT/LINK sequence. */
+ gcmkONERROR(gckWLFE_WaitLink(
+ hardware,
+ waitLinkLogical,
+ waitLinkAddress,
+ offset,
+ &waitLinkBytes,
+ &waitOffset,
+ &waitSize
+ ));
+
+ if (Command->newQueue)
+ {
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->videoMem,
+ 0,
+ Command->logical,
+ exitBytes
+ ));
+ }
+ else
+ {
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->videoMem,
+ Command->offset,
+ waitLinkLogical,
+ exitBytes
+ ));
+ }
+
+ /* Determine the location of the TAIL in the command buffer. */
+ commandBufferTail
+ = commandBufferLogical
+ + commandBufferSize
+ - CommandBuffer->reservedTail;
+
+ /* Generate command which writes out commit stamp. */
+ if (gckHARDWARE_IsFeatureAvailable(hardware, gcvFEATURE_FENCE_64BIT))
+ {
+ gctUINT32 bytes;
+
+ gcmkONERROR(gckHARDWARE_Fence(
+ hardware,
+ gcvENGINE_RENDER,
+ commandBufferTail,
+ Command->fence->address,
+ Command->commitStamp,
+ &bytes
+ ));
+
+ commandBufferTail += bytes;
+ }
+
+ /* Generate a LINK from the end of the command buffer being scheduled
+ back to the kernel command queue. */
+#if !gcdSECURITY
+ if (Shared == gcvFALSE)
+ {
+ gcmkONERROR(gckWLFE_Link(
+ hardware,
+ commandBufferTail,
+ exitAddress,
+ exitBytes,
+ &linkBytes,
+ &exitLinkLow,
+ &exitLinkHigh
+ ));
+ }
+ else
+ {
+ gctUINT8_PTR link = commandBufferTail + CommandBuffer->exitIndex * 16;
+ gctSIZE_T bytes = 8;
+
+ gcmkONERROR(gckWLFE_ChipEnable(
+ hardware,
+ link,
+ (gceCORE_3D_MASK)(1 << hardware->kernel->chipID),
+ &bytes
+ ));
+
+ link += bytes;
+
+ gcmkONERROR(gckWLFE_Link(
+ hardware,
+ link,
+ exitAddress,
+ exitBytes,
+ &linkBytes,
+ &exitLinkLow,
+ &exitLinkHigh
+ ));
+
+ link += linkBytes;
+ }
+#endif
+
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(
+ Command->kernel,
+ ProcessID,
+ CommandBuffer->videoMemNode,
+ &commandBufferVideoMem
+ ));
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ commandBufferVideoMem,
+ CommandBuffer->startOffset,
+ commandBufferLogical,
+ commandBufferSize
+ ));
+
+#if gcdRECORD_COMMAND
+ gckRECORDER_Record(
+ Command->recorder,
+ commandBufferLogical + offset,
+ commandBufferSize - offset,
+ gcvNULL,
+ 0xFFFFFFFF
+ );
+
+ gckRECORDER_AdvanceIndex(Command->recorder, Command->commitStamp);
+#endif
+
+#if gcdSECURITY
+ /* Submit command buffer to trust zone. */
+ gckKERNEL_SecurityExecute(
+ Command->kernel,
+ commandBufferLogical + offset,
+ commandBufferSize - offset - 8
+ );
+#else
+#if gcdNULL_DRIVER
+ /*
+ * Skip link to entryAddress.
+ * Instead, we directly link to final wait link position.
+ */
+ gcmkONERROR(gckWLFE_Link(
+ hardware,
+ Command->waitPos.logical,
+ waitLinkAddress,
+ waitLinkBytes,
+ &Command->waitPos.size,
+ &entryLinkLow,
+ &entryLinkHigh
+ ));
+# else
+ /* Generate a LINK from the previous WAIT/LINK command sequence to the
+ entry determined above (either the context or the command buffer).
+ This LINK replaces the WAIT instruction from the previous WAIT/LINK
+ pair, therefore we use WAIT metrics for generation of this LINK.
+ This action will execute the entire sequence. */
+ gcmkONERROR(gckWLFE_Link(
+ hardware,
+ Command->waitPos.logical,
+ entryAddress,
+ entryBytes,
+ &Command->waitPos.size,
+ &entryLinkLow,
+ &entryLinkHigh
+ ));
+# endif
+#endif
+
+#if gcdLINK_QUEUE_SIZE
+ /* TODO: What's it? */
+ if (Command->kernel->stuckDump >= gcvSTUCK_DUMP_USER_COMMAND)
+ {
+ gcuQUEUEDATA data;
+
+ gcmkVERIFY_OK(gckOS_GetProcessID(&data.linkData.pid));
+
+ data.linkData.start = entryAddress;
+ data.linkData.end = entryAddress + entryBytes;
+ data.linkData.linkLow = entryLinkLow;
+ data.linkData.linkHigh = entryLinkHigh;
+
+ gckQUEUE_Enqueue(&hardware->linkQueue, &data);
+
+ if (commandBufferAddress + offset != entryAddress)
+ {
+ data.linkData.start = commandBufferAddress + offset;
+ data.linkData.end = commandBufferAddress + commandBufferSize;
+ data.linkData.linkLow = commandLinkLow;
+ data.linkData.linkHigh = commandLinkHigh;
+
+ gckQUEUE_Enqueue(&hardware->linkQueue, &data);
+ }
+
+ if (Command->kernel->stuckDump >= gcvSTUCK_DUMP_ALL_COMMAND)
+ {
+ data.linkData.start = exitAddress;
+ data.linkData.end = exitAddress + exitBytes;
+ data.linkData.linkLow = exitLinkLow;
+ data.linkData.linkHigh = exitLinkHigh;
+
+ /* Dump kernel command.*/
+ gckQUEUE_Enqueue(&hardware->linkQueue, &data);
+ }
+ }
+#endif
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->waitPos.videoMem,
+ Command->waitPos.offset,
+ Command->waitPos.logical,
+ Command->waitPos.size
+ ));
+
+ if (entryAddress != commandBufferAddress + offset)
+ {
+ gcmkDUMP(Command->os, "#[context]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_KERNEL_CONTEXT,
+ contextDumpLogical,
+ entryAddress,
+ entryBytes
+ );
+
+ /* execute context. */
+ gcmkDUMP(Command->os,
+ "@[execute 0 0 0x%08X 0x%08X]",
+ entryAddress + offset,
+ entryBytes - offset - 8
+ );
+ }
+
+ gcmkDUMP(Command->os, "#[command: user]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_COMMAND,
+ commandBufferLogical + offset,
+ commandBufferAddress + offset,
+ commandBufferSize - offset
+ );
+
+ /* execute user commands. */
+ gcmkDUMP(
+ Command->os,
+ "@[execute 0 0 0x%08X 0x%08X]",
+ commandBufferAddress
+ + CommandBuffer->reservedHead,
+ commandBufferSize
+ - CommandBuffer->reservedHead
+ - CommandBuffer->reservedTail
+ );
+
+ gcmkDUMP(Command->os, "#[wait-link]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ waitLinkLogical,
+ waitLinkAddress,
+ waitLinkBytes
+ );
+
+#if gcdNULL_DRIVER
+ gcmkDUMP(
+ Command->os,
+ "#[null driver: below command skipped link to 0x%08X 0x%08X]",
+ entryAddress,
+ entryBytes
+ );
+#endif
+
+ gcmkDUMP(Command->os, "#[link: break prev wait-link]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ Command->waitPos.logical,
+ Command->waitPos.address,
+ Command->waitPos.size
+ );
+
+ /* Update the current pipe. */
+ Command->pipeSelect = CommandBuffer->exitPipe;
+
+ /* Update command queue offset. */
+ Command->offset += waitLinkBytes;
+ Command->newQueue = gcvFALSE;
+
+ /* Update address of last WAIT. */
+ Command->waitPos.videoMem = Command->videoMem;
+ Command->waitPos.offset = Command->offset - waitLinkBytes + waitOffset;
+ Command->waitPos.logical = (gctUINT8_PTR)waitLinkLogical + waitOffset;
+ Command->waitPos.address = waitLinkAddress + waitOffset;
+ Command->waitPos.size = waitSize;
+
+ /* Update queue tail pointer. */
+ gcmkONERROR(gckHARDWARE_UpdateQueueTail(
+ hardware, Command->logical, Command->offset
+ ));
+
+ /* Release the context switching mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Command->os, Command->mutexContext));
+ contextAcquired = gcvFALSE;
+
+ /* Release the command queue. */
+ gcmkONERROR(gckCOMMAND_ExitCommit(Command, gcvFALSE));
+ commitEntered = gcvFALSE;
+
+ if (status == gcvSTATUS_INTERRUPTED)
+ {
+ gcmkTRACE(
+ gcvLEVEL_INFO,
+ "%s(%d): Intterupted in gckEVENT_Submit",
+ __FUNCTION__, __LINE__
+ );
+ status = gcvSTATUS_OK;
+ }
+ else
+ {
+ gcmkONERROR(status);
+ }
+
+#ifdef __QNXNTO__
+ if(userCommandBufferLogicalMapped)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ Command->kernel,
+ commandBufferVideoMem,
+ ProcessID,
+ gcvFALSE,
+ gcvFALSE
+ ));
+
+ userCommandBufferLogicalMapped =gcvFALSE;
+ }
+#endif
+
+ /* Return status. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (contextAcquired)
+ {
+ /* Release the context switching mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Command->os, Command->mutexContext));
+ }
+
+ if (commitEntered)
+ {
+ /* Release the command queue mutex. */
+ gcmkVERIFY_OK(gckCOMMAND_ExitCommit(Command, gcvFALSE));
+ }
+
+#ifdef __QNXNTO__
+ if (userCommandBufferLogicalMapped)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Command->os,
+ userCommandBufferLogical,
+ 0,
+ commandBufferLogical));
+ }
+#endif
+
+ /* Return status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_CommitAsyncOnce(
+ IN gckCOMMAND Command,
+ IN gcsHAL_COMMAND_LOCATION * CommandBuffer
+ )
+{
+ gceSTATUS status;
+ gckHARDWARE hardware = Command->kernel->hardware;
+ gctBOOL available = gcvFALSE;
+ gctBOOL acquired = gcvFALSE;
+ gctUINT8_PTR commandBufferLogical;
+ gctUINT8_PTR commandBufferTail;
+ gctUINT commandBufferSize;
+ gctUINT32 commandBufferAddress;
+ gctUINT32 fenceBytes;
+ gctUINT32 oldValue;
+ gctUINT32 flushBytes;
+ gcsPATCH_LIST_VARIABLE patchListVar = {0, 0};
+
+ gcmkHEADER();
+
+ gcmkVERIFY_OK(
+ _HandlePatchList(Command, CommandBuffer, &patchListVar));
+
+ gckOS_AtomicExchange(Command->os,
+ hardware->pageTableDirty[gcvENGINE_BLT],
+ 0,
+ &oldValue);
+
+ if (oldValue)
+ {
+ gckHARDWARE_FlushAsyncMMU(hardware, gcvNULL, &flushBytes);
+
+ gcmkASSERT(flushBytes <= CommandBuffer->reservedHead);
+
+ /* Compute the command buffer entry to insert the flushMMU commands. */
+ commandBufferLogical = (gctUINT8_PTR)gcmUINT64_TO_PTR(CommandBuffer->logical)
+ + CommandBuffer->startOffset
+ + CommandBuffer->reservedHead
+ - flushBytes;
+
+ commandBufferAddress = CommandBuffer->address
+ + CommandBuffer->startOffset
+ + CommandBuffer->reservedHead
+ - flushBytes;
+
+ gckHARDWARE_FlushAsyncMMU(hardware, commandBufferLogical, &flushBytes);
+ }
+ else
+ {
+ /* Compute the command buffer entry. */
+ commandBufferLogical = (gctUINT8_PTR)gcmUINT64_TO_PTR(CommandBuffer->logical)
+ + CommandBuffer->startOffset
+ + CommandBuffer->reservedHead;
+
+ commandBufferAddress = CommandBuffer->address
+ + CommandBuffer->startOffset
+ + CommandBuffer->reservedHead;
+
+ flushBytes = 0;
+ }
+
+ commandBufferTail = (gctUINT8_PTR)gcmUINT64_TO_PTR(CommandBuffer->logical)
+ + CommandBuffer->startOffset
+ + CommandBuffer->size
+ - CommandBuffer->reservedTail;
+
+ gcmkONERROR(gckHARDWARE_Fence(
+ hardware,
+ gcvENGINE_BLT,
+ commandBufferTail,
+ Command->fence->address,
+ Command->commitStamp,
+ &fenceBytes
+ ));
+
+ gcmkASSERT(fenceBytes <= CommandBuffer->reservedTail);
+
+ commandBufferSize = CommandBuffer->size
+ - CommandBuffer->reservedHead
+ - CommandBuffer->reservedTail
+ + flushBytes
+ + fenceBytes;
+
+ gckOS_AcquireMutex(Command->os, Command->mutexContext, gcvINFINITE);
+ acquired = gcvTRUE;
+
+ /* Acquire a slot. */
+ for (;;)
+ {
+ gcmkONERROR(gckASYNC_FE_ReserveSlot(hardware, &available));
+
+ if (available)
+ {
+ break;
+ }
+ else
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, _GC_OBJ_ZONE, "No available slot, have to wait");
+
+ gckOS_Delay(Command->os, 1);
+ }
+ }
+
+#if gcdNULL_DRIVER
+ /* Skip submit to hardware for NULL driver. */
+ gcmkDUMP(Command->os, "#[null driver: below command is skipped]");
+#endif
+
+ gcmkDUMP(Command->os, "#[async-command: user]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_ASYNC_COMMAND,
+ commandBufferLogical,
+ commandBufferAddress,
+ commandBufferSize
+ );
+
+ gcmkDUMP(
+ Command->os,
+ "@[execute 1 0 0x%08X 0x%08X]",
+ commandBufferAddress
+ + CommandBuffer->reservedHead,
+ CommandBuffer->size
+ - CommandBuffer->reservedHead
+ - CommandBuffer->reservedTail
+ );
+
+#if !gcdNULL_DRIVER
+ /* Execute command buffer. */
+ gckASYNC_FE_Execute(hardware, commandBufferAddress, commandBufferSize);
+#endif
+
+ gckOS_ReleaseMutex(Command->os, Command->mutexContext);
+ acquired = gcvFALSE;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ gckOS_ReleaseMutex(Command->os, Command->mutexContext);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_CommitMultiChannelOnce(
+ IN gckCOMMAND Command,
+ IN gckCONTEXT Context,
+ IN gcsHAL_COMMAND_LOCATION * CommandBuffer
+ )
+{
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+ gctUINT8_PTR commandBufferLogical;
+ gctUINT commandBufferSize;
+ gctUINT32 commandBufferAddress;
+ gckHARDWARE hardware;
+ gctUINT64 bit;
+ gcsPATCH_LIST_VARIABLE patchListVar = {0, 0};
+
+ gcmkHEADER_ARG("priority=%d channelId=%d videoMemNode=%u size=0x%x patchHead=%p",
+ CommandBuffer->priority, CommandBuffer->channelId,
+ CommandBuffer->videoMemNode, CommandBuffer->size,
+ gcmUINT64_TO_PTR(CommandBuffer->patchHead));
+
+ gcmkASSERT(Command->feType == gcvHW_FE_MULTI_CHANNEL);
+
+ hardware = Command->kernel->hardware;
+
+ gcmkVERIFY_OK(
+ _HandlePatchList(Command, CommandBuffer, &patchListVar));
+
+ /* Check flush mcfe MMU cache. */
+ gcmkONERROR(_CheckFlushMcfeMMU(Command, hardware));
+
+ /* Compute the command buffer entry and the size. */
+ commandBufferLogical
+ = (gctUINT8_PTR) gcmUINT64_TO_PTR(CommandBuffer->logical)
+ + CommandBuffer->startOffset
+ + CommandBuffer->reservedHead;
+
+ commandBufferAddress = CommandBuffer->address
+ + CommandBuffer->startOffset
+ + CommandBuffer->reservedHead;
+
+ /* reservedTail bytes are not used, because fence not enable. */
+ commandBufferSize
+ = CommandBuffer->size
+ - CommandBuffer->reservedHead
+ - CommandBuffer->reservedTail;
+
+ if (commandBufferSize & 8)
+ {
+ /*
+ * Need 16 byte alignment for MCFE command size.
+ * command is already 8 byte aligned, if not 16 byte aligned,
+ * we need append 8 bytes.
+ */
+ gctUINT32 nop[2];
+ gctSIZE_T bytes = 8;
+ gctUINT8_PTR tail = commandBufferLogical + commandBufferSize;
+
+ gckMCFE_Nop(hardware, nop, &bytes);
+ gcmkASSERT(bytes == 8);
+
+ gckOS_WriteMemory(Command->os, tail, nop[0]);
+ gckOS_WriteMemory(Command->os, tail + 4, nop[1]);
+
+ commandBufferSize += 8;
+ }
+
+ /* Large command buffer size does not make sense. */
+ gcmkASSERT(commandBufferSize < 0x800000);
+
+
+ if (CommandBuffer->channelId != 0)
+ {
+ /* Sync from the system channel. */
+ gcmkONERROR(_SyncFromSystemChannel(
+ Command,
+ (gctBOOL)CommandBuffer->priority,
+ (gctUINT32)CommandBuffer->channelId
+ ));
+ }
+
+ Command->currContext = Context;
+
+ gckOS_AcquireMutex(Command->os, Command->mutexQueue, gcvINFINITE);
+ acquired = gcvTRUE;
+
+#if gcdNULL_DRIVER
+ /* Skip submit to hardware for NULL driver. */
+ gcmkDUMP(Command->os, "#[null driver: below command is skipped]");
+#endif
+
+ gcmkDUMP(Command->os, "#[mcfe-command: user]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_COMMAND,
+ commandBufferLogical,
+ commandBufferAddress,
+ commandBufferSize
+ );
+
+ gcmkDUMP(Command->os,
+ "@[execute %d %d 0x%08X 0x%08X]",
+ CommandBuffer->channelId,
+ CommandBuffer->priority,
+ commandBufferAddress,
+ commandBufferSize);
+
+#if !gcdNULL_DRIVER
+ /* Execute command buffer. */
+ gcmkONERROR(gckMCFE_Execute(
+ hardware,
+ (gctBOOL)CommandBuffer->priority,
+ (gctUINT32)CommandBuffer->channelId,
+ commandBufferAddress,
+ commandBufferSize
+ ));
+#endif
+
+ bit = 1ull << CommandBuffer->channelId;
+
+ /* This channel is dirty. */
+ Command->dirtyChannel[CommandBuffer->priority ? 1 : 0] |= bit;
+
+ gckOS_ReleaseMutex(Command->os, Command->mutexQueue);
+ acquired = gcvFALSE;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ gckOS_ReleaseMutex(Command->os, Command->mutexQueue);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+
+/*******************************************************************************
+**
+** gckCOMMAND_Commit
+**
+** Commit command buffers to the command queue.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to a gckCOMMAND object.
+**
+** gcsHAL_SUBCOMMIT * SubCommit
+** Commit information, includes context, delta, and command buffer
+* locations.
+**
+** gctUINT32 ProcessID
+** Current process ID.
+**
+** OUTPUT:
+** gctBOOL *contextSwitched
+** pass context Switch flag to upper
+*/
+gceSTATUS
+gckCOMMAND_Commit(
+ IN gckCOMMAND Command,
+ IN gcsHAL_SUBCOMMIT * SubCommit,
+ IN gctUINT32 ProcessId,
+ IN gctBOOL Shared,
+ OUT gctUINT64_PTR CommitStamp,
+ INOUT gctBOOL *contextSwitched
+ )
+{
+ gceSTATUS status;
+ gcsSTATE_DELTA_PTR delta = gcmUINT64_TO_PTR(SubCommit->delta);
+ gckCONTEXT context = gcvNULL;
+ gcsHAL_COMMAND_LOCATION *cmdLoc = &SubCommit->commandBuffer;
+ gcsHAL_COMMAND_LOCATION _cmdLoc;
+ gctPOINTER userPtr = gcvNULL;
+ gctBOOL needCopy = gcvFALSE;
+
+ gcmkHEADER_ARG("Command=%p SubCommit=%p delta=%p context=%u pid=%u",
+ Command, SubCommit, delta, SubCommit->context, ProcessId);
+
+ gcmkVERIFY_OK(gckOS_QueryNeedCopy(Command->os, ProcessId, &needCopy));
+
+ if (SubCommit->context)
+ {
+ context = gckKERNEL_QueryPointerFromName(
+ Command->kernel,
+ (gctUINT32)(SubCommit->context)
+ );
+ }
+
+ do
+ {
+ gctUINT64 next;
+
+ /* Skip the first nested one. */
+ if (userPtr)
+ {
+ /* Copy/map command buffer location from user. */
+ if (needCopy)
+ {
+ cmdLoc = &_cmdLoc;
+
+ status = gckOS_CopyFromUserData(
+ Command->os,
+ cmdLoc,
+ userPtr,
+ gcmSIZEOF(gcsHAL_COMMAND_LOCATION)
+ );
+ }
+ else
+ {
+ status = gckOS_MapUserPointer(
+ Command->os,
+ userPtr,
+ gcmSIZEOF(gcsHAL_COMMAND_LOCATION),
+ (gctPOINTER *)&cmdLoc
+ );
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ userPtr = gcvNULL;
+
+ gcmkONERROR(status);
+ }
+ }
+
+ if (Command->feType == gcvHW_FE_WAIT_LINK)
+ {
+ /* Commit command buffers. */
+ status = _CommitWaitLinkOnce(Command,
+ context,
+ cmdLoc,
+ delta,
+ ProcessId,
+ Shared,
+ contextSwitched);
+ }
+ else if (Command->feType == gcvHW_FE_MULTI_CHANNEL)
+ {
+ status = _CommitMultiChannelOnce(Command, context, cmdLoc);
+ }
+ else
+ {
+ gcmkASSERT(Command->feType == gcvHW_FE_ASYNC);
+
+ status = _CommitAsyncOnce(Command, cmdLoc);
+ }
+
+ if (status != gcvSTATUS_INTERRUPTED)
+ {
+ gcmkONERROR(status);
+ }
+
+ /* Do not need context or delta for later commands. */
+ context = gcvNULL;
+ delta = gcvNULL;
+
+ next = cmdLoc->next;
+
+ /* Unmap user pointer if mapped. */
+ if (!needCopy && userPtr)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Command->os,
+ userPtr,
+ gcmSIZEOF(gcsHAL_COMMAND_LOCATION),
+ cmdLoc
+ ));
+ }
+
+ /* Advance to next command buffer location from user. */
+ userPtr = gcmUINT64_TO_PTR(next);
+ }
+ while (userPtr);
+
+ if (Command->feType == gcvHW_FE_MULTI_CHANNEL)
+ {
+ /*
+ * Semphore synchronization.
+ *
+ * Here we blindly sync dirty other channels to the system channel.
+ * The scenario to sync channels to the system channel:
+ * 1. Need to sync channels who sent semaphores.
+ * 2. Need to sync dirty channels when event(interrupt) is to sent.
+ * 3. Need to sync dirty channels when system channel need run something
+ * such as flush mmu.
+ *
+ * When power management is on, blindly sync dirty channels is OK because
+ * there's always a event(intrrupt).
+ *
+ * The only condition we sync more than needed is:
+ * a. power manangement is off.
+ * b. no user event is attached when commit.
+ * c. no user event is to be submitted in next ioctl.
+ * That's a rare condition.
+ *
+ * Conclusion is that, blindly sync dirty channels is a good choice for
+ * now.
+ */
+ gcmkONERROR(_SyncToSystemChannel(Command, Command->dirtyChannel));
+ }
+
+ /* Output commit stamp. */
+ *CommitStamp = Command->commitStamp;
+ Command->commitStamp++;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (!needCopy && userPtr)
+ {
+ gckOS_UnmapUserPointer(
+ Command->os,
+ userPtr,
+ gcmSIZEOF(gcsHAL_COMMAND_LOCATION),
+ cmdLoc
+ );
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+
+/*******************************************************************************
+**
+** gckCOMMAND_Reserve
+**
+** Reserve space in the command queue. Also acquire the command queue mutex.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to an gckCOMMAND object.
+**
+** gctSIZE_T RequestedBytes
+** Number of bytes previously reserved.
+**
+** OUTPUT:
+**
+** gctPOINTER * Buffer
+** Pointer to a variable that will receive the address of the reserved
+** space.
+**
+** gctSIZE_T * BufferSize
+** Pointer to a variable that will receive the number of bytes
+** available in the command queue.
+*/
+gceSTATUS
+gckCOMMAND_Reserve(
+ IN gckCOMMAND Command,
+ IN gctUINT32 RequestedBytes,
+ OUT gctPOINTER * Buffer,
+ OUT gctUINT32 * BufferSize
+ )
+{
+ gceSTATUS status;
+ gctUINT32 bytes;
+ gctUINT32 requiredBytes;
+ gctUINT32 requestedAligned;
+
+ gcmkHEADER_ARG("Command=%p RequestedBytes=%lu", Command, RequestedBytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ if (Command->feType == gcvHW_FE_WAIT_LINK)
+ {
+ /* Compute aligned number of reuested bytes. */
+ requestedAligned = gcmALIGN(RequestedBytes, Command->alignment);
+
+ /* Another WAIT/LINK command sequence will have to be appended after
+ the requested area being reserved. Compute the number of bytes
+ required for WAIT/LINK at the location after the reserved area. */
+ gcmkONERROR(gckWLFE_WaitLink(
+ Command->kernel->hardware,
+ gcvNULL,
+ ~0U,
+ Command->offset + requestedAligned,
+ &requiredBytes,
+ gcvNULL,
+ gcvNULL
+ ));
+
+ /* Compute total number of bytes required. */
+ requiredBytes += requestedAligned;
+ }
+ else
+ {
+ requiredBytes = gcmALIGN(RequestedBytes, 8);
+ }
+
+ /* Compute number of bytes available in command queue. */
+ bytes = Command->pageSize - Command->offset;
+
+ /* Is there enough space in the current command queue? */
+ if (bytes < requiredBytes)
+ {
+ /* Create a new command queue. */
+ gcmkONERROR(_NewQueue(Command, gcvFALSE));
+
+ /* Recompute the number of bytes in the new kernel command queue. */
+ bytes = Command->pageSize - Command->offset;
+
+ /* Still not enough space? */
+ if (bytes < requiredBytes)
+ {
+ /* Rare case, not enough room in command queue. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+ }
+
+ /* Return pointer to empty slot command queue. */
+ *Buffer = (gctUINT8 *) Command->logical + Command->offset;
+
+ /* Return number of bytes left in command queue. */
+ *BufferSize = bytes;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Buffer=0x%x *BufferSize=%lu", *Buffer, *BufferSize);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckCOMMAND_Execute
+**
+** Execute a previously reserved command queue by appending a WAIT/LINK command
+** sequence after it and modifying the last WAIT into a LINK command. The
+** command FIFO mutex will be released whether this function succeeds or not.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to an gckCOMMAND object.
+**
+** gctSIZE_T RequestedBytes
+** Number of bytes previously reserved.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCOMMAND_Execute(
+ IN gckCOMMAND Command,
+ IN gctUINT32 RequestedBytes
+ )
+{
+ gceSTATUS status;
+
+ gctUINT8_PTR waitLinkLogical;
+ gctUINT32 waitLinkAddress;
+ gctUINT32 waitLinkOffset;
+ gctUINT32 waitLinkBytes;
+
+ gctUINT32 waitOffset;
+ gctUINT32 waitBytes;
+
+ gctUINT32 linkLow, linkHigh;
+
+ gctPOINTER execLogical;
+ gctUINT32 execAddress;
+ gctUINT32 execBytes;
+
+ gcmkHEADER_ARG("Command=%p RequestedBytes=%lu", Command, RequestedBytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ /* Compute offset for WAIT/LINK. */
+ waitLinkOffset = Command->offset + RequestedBytes;
+
+ /* Compute number of bytes left in command queue. */
+ waitLinkBytes = Command->pageSize - waitLinkOffset;
+
+ /* Compute the location if WAIT/LINK command sequence. */
+ waitLinkLogical = (gctUINT8_PTR) Command->logical + waitLinkOffset;
+ waitLinkAddress = Command->address + waitLinkOffset;
+
+ /* Append WAIT/LINK in command queue. */
+ gcmkONERROR(gckWLFE_WaitLink(
+ Command->kernel->hardware,
+ waitLinkLogical,
+ waitLinkAddress,
+ waitLinkOffset,
+ &waitLinkBytes,
+ &waitOffset,
+ &waitBytes
+ ));
+
+
+ /* Determine the location to jump to for the command buffer being
+ ** scheduled. */
+ if (Command->newQueue)
+ {
+ /* New command queue, jump to the beginning of it. */
+ execLogical = Command->logical;
+ execAddress = Command->address;
+ execBytes = Command->offset + RequestedBytes + waitLinkBytes;
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->videoMem,
+ 0,
+ execLogical,
+ execBytes
+ ));
+ }
+ else
+ {
+ /* Still within the preexisting command queue, jump directly to the
+ reserved area. */
+ execLogical = (gctUINT8 *) Command->logical + Command->offset;
+ execAddress = Command->address + Command->offset;
+ execBytes = RequestedBytes + waitLinkBytes;
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->videoMem,
+ Command->offset,
+ execLogical,
+ execBytes
+ ));
+ }
+
+#if gcdNULL_DRIVER
+ /*
+ * Skip link to execAddress.
+ * Instead, we directly link to final wait link position.
+ */
+ gcmkONERROR(gckWLFE_Link(
+ Command->kernel->hardware,
+ Command->waitPos.logical,
+ waitLinkAddress,
+ waitLinkBytes,
+ &Command->waitPos.size,
+ &linkLow,
+ &linkHigh
+ ));
+#else
+ /* Convert the last WAIT into a LINK. */
+ gcmkONERROR(gckWLFE_Link(
+ Command->kernel->hardware,
+ Command->waitPos.logical,
+ execAddress,
+ execBytes,
+ &Command->waitPos.size,
+ &linkLow,
+ &linkHigh
+ ));
+#endif
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->waitPos.videoMem,
+ Command->waitPos.offset,
+ Command->waitPos.logical,
+ Command->waitPos.size
+ ));
+
+#if gcdLINK_QUEUE_SIZE
+ if (Command->kernel->stuckDump >= gcvSTUCK_DUMP_ALL_COMMAND)
+ {
+ gcuQUEUEDATA data;
+
+ gcmkVERIFY_OK(gckOS_GetProcessID(&data.linkData.pid));
+
+ data.linkData.start = execAddress;
+ data.linkData.end = execAddress + execBytes;
+ data.linkData.linkLow = linkLow;
+ data.linkData.linkHigh = linkHigh;
+
+ gckQUEUE_Enqueue(&Command->kernel->hardware->linkQueue, &data);
+ }
+#endif
+
+ gcmkDUMP(Command->os, "#[command: kernel execute]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ execLogical,
+ execAddress,
+ execBytes
+ );
+
+#if gcdNULL_DRIVER
+ gcmkDUMP(Command->os,
+ "#[null driver: below command skipped link to 0x%08X 0x%08X]",
+ execAddress,
+ execBytes);
+#endif
+
+ gcmkDUMP(Command->os, "#[link: break prev wait-link]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ Command->waitPos.logical,
+ Command->waitPos.address,
+ Command->waitPos.size
+ );
+
+ /* Update the pointer to the last WAIT. */
+ Command->waitPos.videoMem = Command->videoMem;
+ Command->waitPos.offset = waitLinkOffset + waitOffset;
+ Command->waitPos.logical = (gctUINT8_PTR)waitLinkLogical + waitOffset;
+ Command->waitPos.address = waitLinkAddress + waitOffset;
+ Command->waitPos.size = waitBytes;
+
+ /* Update the command queue. */
+ Command->offset += RequestedBytes + waitLinkBytes;
+ Command->newQueue = gcvFALSE;
+
+ /* Update queue tail pointer. */
+ gcmkONERROR(gckHARDWARE_UpdateQueueTail(
+ Command->kernel->hardware, Command->logical, Command->offset
+ ));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckCOMMAND_ExecuteAsync(
+ IN gckCOMMAND Command,
+ IN gctUINT32 RequestedBytes
+ )
+{
+ gceSTATUS status;
+ gckHARDWARE hardware;
+ gctBOOL available;
+ gctPOINTER execLogical;
+ gctUINT32 execAddress;
+ gctUINT32 execBytes;
+
+ hardware = Command->kernel->hardware;
+
+ /* Determine the location to jump to for the command buffer being
+ ** scheduled. */
+ if (Command->newQueue)
+ {
+ /* New command queue, jump to the beginning of it. */
+ execLogical = Command->logical;
+ execAddress = Command->address;
+ execBytes = Command->offset + RequestedBytes;
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->videoMem,
+ 0,
+ execLogical,
+ execBytes
+ ));
+ }
+ else
+ {
+ /* Still within the preexisting command queue, jump directly to the
+ reserved area. */
+ execLogical = (gctUINT8 *) Command->logical + Command->offset;
+ execAddress = Command->address + Command->offset;
+ execBytes = RequestedBytes;
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->videoMem,
+ Command->offset,
+ execLogical,
+ execBytes
+ ));
+ }
+
+ /* Acquire a slot. */
+ for (;;)
+ {
+ gcmkONERROR(gckASYNC_FE_ReserveSlot(hardware, &available));
+
+ if (available)
+ {
+ break;
+ }
+ else
+ {
+ gckOS_Delay(Command->os, 1);
+ }
+ }
+
+#if gcdNULL_DRIVER
+ /* Skip submit to hardware for NULL driver. */
+ gcmkDUMP(Command->os, "#[null driver: below command is skipped]");
+#endif
+
+ gcmkDUMP(Command->os, "#[async-command: kernel execute]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ execLogical,
+ execAddress,
+ execBytes
+ );
+
+#if !gcdNULL_DRIVER
+ /* Send descriptor. */
+ gckASYNC_FE_Execute(hardware, execAddress, execBytes);
+#endif
+
+ /* Update the command queue. */
+ Command->offset += RequestedBytes;
+ Command->newQueue = gcvFALSE;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gckCOMMAND_ExecuteMultiChannel(
+ IN gckCOMMAND Command,
+ IN gctBOOL Priority,
+ IN gctUINT32 ChannelId,
+ IN gctUINT32 RequestedBytes
+ )
+{
+ gceSTATUS status;
+ gctPOINTER execLogical;
+ gctUINT32 execAddress;
+ gctUINT32 execBytes;
+
+ /* Determine the location to jump to for the command buffer being
+ ** scheduled. */
+ if (Command->newQueue)
+ {
+ /* New command queue, jump to the beginning of it. */
+ execLogical = Command->logical;
+ execAddress = Command->address;
+ execBytes = Command->offset + RequestedBytes;
+ }
+ else
+ {
+ /* Still within the preexisting command queue, jump directly to the
+ reserved area. */
+ execLogical = (gctUINT8 *) Command->logical + Command->offset;
+ execAddress = Command->address + Command->offset;
+ execBytes = RequestedBytes;
+ }
+
+ if (execBytes & 8)
+ {
+ gctSIZE_T bytes = 8;
+ gctUINT8_PTR tail = (gctUINT8_PTR)execLogical + execBytes;
+
+ gckMCFE_Nop(Command->kernel->hardware, tail, &bytes);
+ gcmkASSERT(bytes == 8);
+
+ execBytes += 8;
+ RequestedBytes += 8;
+ }
+
+ if (Command->newQueue)
+ {
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->videoMem,
+ 0,
+ execLogical,
+ execBytes
+ ));
+ }
+ else
+ {
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ Command->kernel,
+ Command->videoMem,
+ Command->offset,
+ execLogical,
+ execBytes
+ ));
+ }
+
+#if gcdNULL_DRIVER
+ /* Skip submit to hardware for NULL driver. */
+ gcmkDUMP(Command->os, "#[null driver: below command is skipped]");
+#endif
+
+ gcmkDUMP(Command->os, "#[mcfe-command: kernel execute]");
+ gcmkDUMP_BUFFER(
+ Command->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ execLogical,
+ execAddress,
+ execBytes
+ );
+
+ gcmkDUMP(Command->os,
+ "@[execute %u %u 0x%08X 0x%08X]",
+ ChannelId, Priority, execAddress, execBytes);
+
+#if !gcdNULL_DRIVER
+ /* Send descriptor. */
+ gcmkONERROR(
+ gckMCFE_Execute(Command->kernel->hardware,
+ Priority,
+ ChannelId,
+ execAddress,
+ execBytes));
+#endif
+
+ /* Update the command queue. */
+ Command->offset += RequestedBytes;
+ Command->newQueue = gcvFALSE;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckCOMMAND_Stall
+**
+** The calling thread will be suspended until the command queue has been
+** completed.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to an gckCOMMAND object.
+**
+** gctBOOL FromPower
+** Determines whether the call originates from inside the power
+** management or not.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCOMMAND_Stall(
+ IN gckCOMMAND Command,
+ IN gctBOOL FromPower
+ )
+{
+ gckOS os;
+ gckHARDWARE hardware;
+ gckEVENT eventObject;
+ gceSTATUS status;
+ gctSIGNAL signal = gcvNULL;
+ gctUINT timer = 0;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ /* Extract the gckOS object pointer. */
+ os = Command->os;
+ gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
+
+ /* Extract the gckHARDWARE object pointer. */
+ hardware = Command->kernel->hardware;
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ /* Extract the gckEVENT object pointer. */
+ eventObject = Command->kernel->eventObj;
+ gcmkVERIFY_OBJECT(eventObject, gcvOBJ_EVENT);
+
+ /* Allocate the signal. */
+ gcmkONERROR(gckOS_CreateSignal(os, gcvTRUE, &signal));
+
+ /* Append the EVENT command to trigger the signal. */
+ gcmkONERROR(gckEVENT_Signal(eventObject, signal, gcvKERNEL_PIXEL));
+
+ /* Submit the event queue. */
+ gcmkONERROR(gckEVENT_Submit(eventObject, gcvTRUE, FromPower));
+
+ gcmkDUMP(Command->os, "#[kernel.stall]");
+
+ if (status == gcvSTATUS_CHIP_NOT_READY)
+ {
+ /* Error. */
+ goto OnError;
+ }
+
+ do
+ {
+ /* Wait for the signal. */
+ status = gckOS_WaitSignal(os, signal, !FromPower, gcdGPU_ADVANCETIMER);
+
+ if (status == gcvSTATUS_TIMEOUT)
+ {
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+ gctUINT32 idle;
+
+ /* Read idle register. */
+ gcmkVERIFY_OK(gckHARDWARE_GetIdle(
+ hardware, gcvFALSE, &idle
+ ));
+
+ gcmkTRACE(
+ gcvLEVEL_ERROR,
+ "%s(%d): idle=%08x",
+ __FUNCTION__, __LINE__, idle
+ );
+
+ gcmkVERIFY_OK(gckOS_MemoryBarrier(os, gcvNULL));
+#endif
+
+ /* Advance timer. */
+ timer += gcdGPU_ADVANCETIMER;
+ }
+ else if (status == gcvSTATUS_INTERRUPTED)
+ {
+ gcmkONERROR(gcvSTATUS_INTERRUPTED);
+ }
+
+ }
+ while (gcmIS_ERROR(status));
+
+ /* Bail out on timeout. */
+ if (gcmIS_ERROR(status))
+ {
+ /* Broadcast the stuck GPU. */
+ gcmkONERROR(gckOS_Broadcast(
+ os, hardware, gcvBROADCAST_GPU_STUCK
+ ));
+ }
+
+ /* Delete the signal. */
+ gcmkVERIFY_OK(gckOS_DestroySignal(os, signal));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (signal != gcvNULL)
+ {
+ /* Free the signal. */
+ gcmkVERIFY_OK(gckOS_DestroySignal(os, signal));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+#if (gcdENABLE_3D || gcdENABLE_2D)
+static gceSTATUS
+_AttachWaitLinkFECommand(
+ IN gckCOMMAND Command,
+ OUT gckCONTEXT * Context,
+ OUT gctSIZE_T * MaxState,
+ OUT gctUINT32 * NumStates,
+ IN gctUINT32 ProcessID
+ )
+{
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ /* Acquire the context switching mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(
+ Command->os, Command->mutexContext, gcvINFINITE
+ ));
+ acquired = gcvTRUE;
+
+ /* Construct a gckCONTEXT object. */
+ gcmkONERROR(gckCONTEXT_Construct(
+ Command->os,
+ Command->kernel->hardware,
+ ProcessID,
+ Context
+ ));
+
+ /* Return the number of states in the context. */
+ * MaxState = (* Context)->maxState;
+ * NumStates = (* Context)->numStates;
+
+ /* Release the context switching mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Command->os, Command->mutexContext));
+ acquired = gcvFALSE;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Context=0x%x", *Context);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Release mutex. */
+ if (acquired)
+ {
+ /* Release the context switching mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Command->os, Command->mutexContext));
+ acquired = gcvFALSE;
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckCOMMAND_Attach
+**
+** Attach user process.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to a gckCOMMAND object.
+**
+** gctUINT32 ProcessID
+** Current process ID.
+**
+** OUTPUT:
+**
+** gckCONTEXT * Context
+** Pointer to a variable that will receive a pointer to a new
+** gckCONTEXT object.
+**
+** gctSIZE_T * StateCount
+** Pointer to a variable that will receive the number of states
+** in the context buffer.
+*/
+gceSTATUS
+gckCOMMAND_Attach(
+ IN gckCOMMAND Command,
+ OUT gckCONTEXT * Context,
+ OUT gctSIZE_T * MaxState,
+ OUT gctUINT32 * NumStates,
+ IN gctUINT32 ProcessID
+ )
+{
+ gctUINT32 allocationSize;
+ gctPOINTER pointer;
+ gceSTATUS status;
+
+ if (Command->feType == gcvHW_FE_WAIT_LINK)
+ {
+ status = _AttachWaitLinkFECommand(Command,
+ Context,
+ MaxState,
+ NumStates,
+ ProcessID);
+ }
+ else if (Command->feType == gcvHW_FE_MULTI_CHANNEL)
+ {
+ /*
+ * For mcfe, we only allocate context which is used to
+ * store profile counters.
+ */
+ allocationSize = gcmSIZEOF(struct _gckCONTEXT);
+
+ /* Allocate the object. */
+ gckOS_Allocate(Command->os, allocationSize, &pointer);
+ if (!pointer)
+ {
+ return gcvSTATUS_OUT_OF_MEMORY;
+ }
+ *Context = pointer;
+ /* Reset the entire object. */
+ gckOS_ZeroMemory(*Context, allocationSize);
+
+ /* Initialize the gckCONTEXT object. */
+ (*Context)->object.type = gcvOBJ_CONTEXT;
+ (*Context)->os = Command->os;
+ (*Context)->hardware = Command->kernel->hardware;
+ *MaxState = 0;
+ *NumStates = 0;
+
+ status = gcvSTATUS_OK;
+ }
+ else
+ {
+ /* Nothing to do. */
+ *Context = gcvNULL;
+ *MaxState = 0;
+ *NumStates = 0;
+
+ status = gcvSTATUS_OK;
+ }
+
+ return status;
+}
+#endif
+
+static gceSTATUS
+_DetachWaitLinkFECommand(
+ IN gckCOMMAND Command,
+ IN gckCONTEXT Context
+ )
+{
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Command=%p Context=%p", Command, Context);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ /* Acquire the context switching mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(
+ Command->os, Command->mutexContext, gcvINFINITE
+ ));
+ acquired = gcvTRUE;
+
+ /* Construct a gckCONTEXT object. */
+ gcmkONERROR(gckCONTEXT_Destroy(Context));
+
+ if (Command->currContext == Context)
+ {
+ /* Detach from gckCOMMAND object if the destoryed context is current context. */
+ Command->currContext = gcvNULL;
+ }
+
+ /* Release the context switching mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Command->os, Command->mutexContext));
+ acquired = gcvFALSE;
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Release mutex. */
+ if (acquired)
+ {
+ /* Release the context switching mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Command->os, Command->mutexContext));
+ acquired = gcvFALSE;
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckCOMMAND_Detach
+**
+** Detach user process.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to a gckCOMMAND object.
+**
+** gckCONTEXT Context
+** Pointer to a gckCONTEXT object to be destroyed.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCOMMAND_Detach(
+ IN gckCOMMAND Command,
+ IN gckCONTEXT Context
+ )
+{
+ if (Command->feType == gcvHW_FE_WAIT_LINK)
+ {
+ return _DetachWaitLinkFECommand(Command, Context);
+ }
+ else if (Command->feType == gcvHW_FE_MULTI_CHANNEL)
+ {
+ gcmkOS_SAFE_FREE(Context->os, Context);
+ return gcvSTATUS_OK;
+ }
+ else
+ {
+ /* Nothing to do. */
+ return gcvSTATUS_OK;
+ }
+}
+
+static void
+_DumpBuffer(
+ IN gctPOINTER Buffer,
+ IN gctUINT32 GpuAddress,
+ IN gctSIZE_T Size
+ )
+{
+ gctSIZE_T i, line, left;
+ gctUINT32_PTR data = Buffer;
+
+ line = Size / 32;
+ left = Size % 32;
+
+ for (i = 0; i < line; i++)
+ {
+ gcmkPRINT("%08X : %08X %08X %08X %08X %08X %08X %08X %08X",
+ GpuAddress, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
+ data += 8;
+ GpuAddress += 8 * 4;
+ }
+
+ switch(left)
+ {
+ case 28:
+ gcmkPRINT("%08X : %08X %08X %08X %08X %08X %08X %08X",
+ GpuAddress, data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
+ break;
+ case 24:
+ gcmkPRINT("%08X : %08X %08X %08X %08X %08X %08X",
+ GpuAddress, data[0], data[1], data[2], data[3], data[4], data[5]);
+ break;
+ case 20:
+ gcmkPRINT("%08X : %08X %08X %08X %08X %08X",
+ GpuAddress, data[0], data[1], data[2], data[3], data[4]);
+ break;
+ case 16:
+ gcmkPRINT("%08X : %08X %08X %08X %08X",
+ GpuAddress, data[0], data[1], data[2], data[3]);
+ break;
+ case 12:
+ gcmkPRINT("%08X : %08X %08X %08X",
+ GpuAddress, data[0], data[1], data[2]);
+ break;
+ case 8:
+ gcmkPRINT("%08X : %08X %08X",
+ GpuAddress, data[0], data[1]);
+ break;
+ case 4:
+ gcmkPRINT("%08X : %08X",
+ GpuAddress, data[0]);
+ break;
+ default:
+ break;
+ }
+}
+
+/*******************************************************************************
+**
+** gckCOMMAND_DumpExecutingBuffer
+**
+** Dump the command buffer which GPU is executing.
+**
+** INPUT:
+**
+** gckCOMMAND Command
+** Pointer to a gckCOMMAND object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckCOMMAND_DumpExecutingBuffer(
+ IN gckCOMMAND Command
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gctUINT32 gpuAddress;
+ gctPOINTER entry = gcvNULL;
+ gckOS os = Command->os;
+ gckKERNEL kernel = Command->kernel;
+ gctUINT32 i;
+ gckQUEUE queue = &kernel->hardware->linkQueue;
+ gctSIZE_T bytes;
+ gctUINT32 offset;
+ gctPOINTER entryDump;
+ gctUINT8 processName[24] = {0};
+
+ gcmkPRINT("**************************\n");
+ gcmkPRINT("**** COMMAND BUF DUMP ****\n");
+ gcmkPRINT("**************************\n");
+
+ gcmkPRINT(" Submitted commit stamp = %lld", Command->commitStamp - 1);
+ gcmkPRINT(" Executed commit stamp = %lld", *(gctUINT64_PTR)Command->fence->logical);
+
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(os, kernel->core, 0x664, &gpuAddress));
+ gcmkVERIFY_OK(gckOS_ReadRegisterEx(os, kernel->core, 0x664, &gpuAddress));
+
+ gcmkPRINT("DMA Address 0x%08X", gpuAddress);
+
+ /* Find GPU address in video memory list. */
+ status = gckVIDMEM_NODE_Find(kernel, gpuAddress, &nodeObject, &offset);
+
+ if (gcmIS_SUCCESS(status) && nodeObject->type == gcvVIDMEM_TYPE_COMMAND)
+ {
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ kernel,
+ nodeObject,
+ gcvFALSE,
+ gcvFALSE,
+ &entryDump
+ ));
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_GetSize(
+ kernel,
+ nodeObject,
+ &bytes
+ ));
+
+ gcmkPRINT("Command buffer around 0x%08X:", gpuAddress);
+
+ /* Align to 4096. */
+ offset &= 0xfffff000;
+ gpuAddress &= 0xfffff000;
+
+ /* Dump max 4096 bytes. */
+ bytes = (bytes - offset) > 4096 ? 4096 : (bytes - offset);
+
+ /* Kernel address of page where stall point stay. */
+ entryDump = (gctUINT8_PTR)entryDump + offset;
+
+ _DumpBuffer(entryDump, gpuAddress, bytes);
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ kernel,
+ nodeObject,
+ 0,
+ gcvFALSE,
+ gcvFALSE
+ ));
+ }
+ else
+ {
+ gcmkPRINT("Can not find command buffer around 0x%08X.\n", gpuAddress);
+ }
+
+ /* new line. */
+ gcmkPRINT("");
+
+ gcmkPRINT("Kernel command buffers:");
+
+ for (i = 0; i < gcdCOMMAND_QUEUES; i++)
+ {
+ entry = Command->queues[i].logical;
+ gpuAddress = Command->queues[i].address;
+
+ gcmkPRINT("command buffer %d at 0x%08X size %u",
+ i, gpuAddress, Command->pageSize);
+ _DumpBuffer(entry, gpuAddress, Command->pageSize);
+ }
+
+ /* new line. */
+ gcmkPRINT("");
+
+ if (queue->count)
+ {
+ gcmkPRINT("Dump Level is %d, dump %d valid record in link queue:",
+ Command->kernel->stuckDump, queue->count);
+ }
+
+ for (i = 0; i < queue->count; i++)
+ {
+ gcuQUEUEDATA * queueData;
+ gckLINKDATA linkData;
+
+ gckQUEUE_GetData(queue, i, &queueData);
+
+ linkData = &queueData->linkData;
+
+ /* Get gpu address of this command buffer. */
+ gpuAddress = linkData->start;
+ bytes = linkData->end - gpuAddress;
+
+ processName[0] = '\0';
+ gckOS_GetProcessNameByPid(linkData->pid, sizeof(processName), processName);
+
+ gcmkPRINT("Link record %d: [%08X - %08X] from command %08X %08X pid %u (%s):",
+ i,
+ linkData->start,
+ linkData->end,
+ linkData->linkLow,
+ linkData->linkHigh,
+ linkData->pid,
+ processName);
+
+ /* Find GPU address in video memory list. */
+ status = gckVIDMEM_NODE_Find(kernel, gpuAddress, &nodeObject, &offset);
+
+ if (gcmIS_SUCCESS(status) && nodeObject->type == gcvVIDMEM_TYPE_COMMAND)
+ {
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ kernel,
+ nodeObject,
+ gcvFALSE,
+ gcvFALSE,
+ &entryDump
+ ));
+
+ /* Kernel address of page where stall point stay. */
+ entryDump = (gctUINT8_PTR)entryDump + offset;
+
+ _DumpBuffer(entryDump, gpuAddress, bytes);
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ kernel,
+ nodeObject,
+ 0,
+ gcvFALSE,
+ gcvFALSE
+ ));
+ }
+ else
+ {
+ gcmkPRINT("Not found");
+ }
+
+ /* new line. */
+ gcmkPRINT("");
+ }
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c
new file mode 100644
index 000000000000..f0396798e3d7
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_command_vg.c
@@ -0,0 +1,3922 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+#if gcdENABLE_VG
+
+#include "gc_hal_kernel_hardware_command_vg.h"
+
+#define _GC_OBJ_ZONE gcvZONE_COMMAND
+
+#ifdef __QNXNTO__
+extern gceSTATUS
+drv_signal_mgr_add(
+ gctUINT32 Pid,
+ gctINT32 Coid,
+ gctINT32 Rcvid,
+ gctUINT64 Signal,
+ gctPOINTER *Handle);
+#endif
+
+/******************************************************************************\
+*********************************** Debugging **********************************
+\******************************************************************************/
+
+#define gcvDISABLE_TIMEOUT 1
+#define gcvDUMP_COMMAND_BUFFER 0
+#define gcvDUMP_COMMAND_LINES 0
+
+
+#if gcvDEBUG || defined(EMULATOR) || gcvDISABLE_TIMEOUT
+# define gcvQUEUE_TIMEOUT ~0
+#else
+# define gcvQUEUE_TIMEOUT 10
+#endif
+
+
+/******************************************************************************\
+********************************** Definitions *********************************
+\******************************************************************************/
+
+/* Minimum buffer size. */
+#define gcvMINUMUM_BUFFER \
+ gcmSIZEOF(gcsKERNEL_QUEUE_HEADER) + \
+ gcmSIZEOF(gcsKERNEL_CMDQUEUE) * 2
+
+#define gcmDECLARE_INTERRUPT_HANDLER(Block, Number) \
+ static gceSTATUS \
+ _EventHandler_##Block##_##Number( \
+ IN gckVGKERNEL Kernel \
+ )
+
+#define gcmDEFINE_INTERRUPT_HANDLER(Block, Number) \
+ gcmDECLARE_INTERRUPT_HANDLER(Block, Number) \
+ { \
+ return _EventHandler_Block( \
+ Kernel, \
+ &Kernel->command->taskTable[gcvBLOCK_##Block], \
+ gcvFALSE \
+ ); \
+ }
+
+#define gcmDEFINE_INTERRUPT_HANDLER_ENTRY(Block, Number) \
+ { gcvBLOCK_##Block, _EventHandler_##Block##_##Number }
+
+/* Block interrupt handling table entry. */
+typedef struct _gcsBLOCK_INTERRUPT_HANDLER * gcsBLOCK_INTERRUPT_HANDLER_PTR;
+typedef struct _gcsBLOCK_INTERRUPT_HANDLER
+{
+ gceBLOCK block;
+ gctINTERRUPT_HANDLER handler;
+}
+gcsBLOCK_INTERRUPT_HANDLER;
+
+/* Queue control functions. */
+typedef struct _gcsQUEUE_UPDATE_CONTROL * gcsQUEUE_UPDATE_CONTROL_PTR;
+typedef struct _gcsQUEUE_UPDATE_CONTROL
+{
+ gctOBJECT_HANDLER execute;
+ gctOBJECT_HANDLER update;
+ gctOBJECT_HANDLER lastExecute;
+ gctOBJECT_HANDLER lastUpdate;
+}
+gcsQUEUE_UPDATE_CONTROL;
+
+
+/******************************************************************************\
+********************************* Support Code *********************************
+\******************************************************************************/
+static gceSTATUS
+_FlushMMU(
+ IN gckVGCOMMAND Command
+ )
+{
+ gceSTATUS status;
+ gctUINT32 oldValue;
+ gckVGHARDWARE hardware = Command->hardware;
+
+ gcmkONERROR(gckOS_AtomicExchange(Command->os,
+ hardware->pageTableDirty,
+ 0,
+ &oldValue));
+
+ if (oldValue)
+ {
+ /* Page Table is upated, flush mmu before commit. */
+ gcmkONERROR(gckVGHARDWARE_FlushMMU(hardware));
+ }
+
+ return gcvSTATUS_OK;
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_WaitForIdle(
+ IN gckVGCOMMAND Command,
+ IN gcsKERNEL_QUEUE_HEADER_PTR Queue
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT32 idle;
+ gctUINT timeout = 0;
+
+ /* Loop while not idle. */
+ while (Queue->pending)
+ {
+ /* Did we reach the timeout limit? */
+ if (timeout == gcvQUEUE_TIMEOUT)
+ {
+ /* Hardware is probably dead... */
+ return gcvSTATUS_TIMEOUT;
+ }
+
+ /* Sleep for 100ms. */
+ gcmkERR_BREAK(gckOS_Delay(Command->os, 100));
+
+ /* Not the first loop? */
+ if (timeout > 0)
+ {
+ /* Read IDLE register. */
+ gcmkVERIFY_OK(gckVGHARDWARE_GetIdle(Command->hardware, &idle));
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_COMMAND,
+ "%s: timeout, IDLE=%08X\n",
+ __FUNCTION__, idle
+ );
+ }
+
+ /* Increment the timeout counter. */
+ timeout += 1;
+ }
+
+ /* Return status. */
+ return status;
+}
+
+static gctINT32
+_GetNextInterrupt(
+ IN gckVGCOMMAND Command,
+ IN gceBLOCK Block
+ )
+{
+ gctUINT index;
+ gcsBLOCK_TASK_ENTRY_PTR entry;
+ gctINT32 interrupt;
+
+ /* Get the block entry. */
+ entry = &Command->taskTable[Block];
+
+ /* Make sure we have initialized interrupts. */
+ gcmkASSERT(entry->interruptCount > 0);
+
+ /* Decrement the interrupt usage semaphore. */
+ gcmkVERIFY_OK(gckOS_DecrementSemaphore(
+ Command->os, entry->interruptSemaphore
+ ));
+
+ /* Get the value index. */
+ index = entry->interruptIndex;
+
+ /* Get the interrupt value. */
+ interrupt = entry->interruptArray[index];
+
+ /* Must be a valid value. */
+ gcmkASSERT((interrupt >= 0) && (interrupt <= 31));
+
+ /* Advance the index to the next value. */
+ index += 1;
+
+ /* Set the new index. */
+ entry->interruptIndex = (index == entry->interruptCount)
+ ? 0
+ : index;
+
+ /* Return interrupt value. */
+ return interrupt;
+}
+
+
+/******************************************************************************\
+***************************** Task Storage Management **************************
+\******************************************************************************/
+
+/* Minimum task buffer size. */
+#define gcvMIN_TASK_BUFFER \
+( \
+ gcmSIZEOF(gcsTASK_CONTAINER) + 128 \
+)
+
+/* Free list terminator. */
+#define gcvFREE_TASK_TERMINATOR \
+( \
+ (gcsTASK_CONTAINER_PTR) gcmINT2PTR(~0) \
+)
+
+
+/*----------------------------------------------------------------------------*/
+/*------------------- Allocated Task Buffer List Management ------------------*/
+
+static void
+_InsertTaskBuffer(
+ IN gcsTASK_CONTAINER_PTR AddAfter,
+ IN gcsTASK_CONTAINER_PTR Buffer
+ )
+{
+ gcsTASK_CONTAINER_PTR addBefore;
+
+ /* Cannot add before the first buffer. */
+ gcmkASSERT(AddAfter != gcvNULL);
+
+ /* Create a shortcut to the next buffer. */
+ addBefore = AddAfter->allocNext;
+
+ /* Initialize the links. */
+ Buffer->allocPrev = AddAfter;
+ Buffer->allocNext = addBefore;
+
+ /* Link to the previous buffer. */
+ AddAfter->allocNext = Buffer;
+
+ /* Link to the next buffer. */
+ if (addBefore != gcvNULL)
+ {
+ addBefore->allocPrev = Buffer;
+ }
+}
+
+static void
+_RemoveTaskBuffer(
+ IN gcsTASK_CONTAINER_PTR Buffer
+ )
+{
+ gcsTASK_CONTAINER_PTR prev;
+ gcsTASK_CONTAINER_PTR next;
+
+ /* Cannot remove the first buffer. */
+ gcmkASSERT(Buffer->allocPrev != gcvNULL);
+
+ /* Create shortcuts to the previous and next buffers. */
+ prev = Buffer->allocPrev;
+ next = Buffer->allocNext;
+
+ /* Tail buffer? */
+ if (next == gcvNULL)
+ {
+ /* Remove from the list. */
+ prev->allocNext = gcvNULL;
+ }
+
+ /* Buffer from the middle. */
+ else
+ {
+ prev->allocNext = next;
+ next->allocPrev = prev;
+ }
+}
+
+
+/*----------------------------------------------------------------------------*/
+/*--------------------- Free Task Buffer List Management ---------------------*/
+
+static void
+_AppendToFreeList(
+ IN gckVGCOMMAND Command,
+ IN gcsTASK_CONTAINER_PTR Buffer
+ )
+{
+ /* Cannot be a part of the free list already. */
+ gcmkASSERT(Buffer->freePrev == gcvNULL);
+ gcmkASSERT(Buffer->freeNext == gcvNULL);
+
+ /* First buffer to add? */
+ if (Command->taskFreeHead == gcvNULL)
+ {
+ /* Terminate the links. */
+ Buffer->freePrev = gcvFREE_TASK_TERMINATOR;
+ Buffer->freeNext = gcvFREE_TASK_TERMINATOR;
+
+ /* Initialize the list pointer. */
+ Command->taskFreeHead = Command->taskFreeTail = Buffer;
+ }
+
+ /* Not the first, add after the tail. */
+ else
+ {
+ /* Initialize the new tail buffer. */
+ Buffer->freePrev = Command->taskFreeTail;
+ Buffer->freeNext = gcvFREE_TASK_TERMINATOR;
+
+ /* Add after the tail. */
+ Command->taskFreeTail->freeNext = Buffer;
+ Command->taskFreeTail = Buffer;
+ }
+}
+
+static void
+_RemoveFromFreeList(
+ IN gckVGCOMMAND Command,
+ IN gcsTASK_CONTAINER_PTR Buffer
+ )
+{
+ /* Has to be a part of the free list. */
+ gcmkASSERT(Buffer->freePrev != gcvNULL);
+ gcmkASSERT(Buffer->freeNext != gcvNULL);
+
+ /* Head buffer? */
+ if (Buffer->freePrev == gcvFREE_TASK_TERMINATOR)
+ {
+ /* Tail buffer as well? */
+ if (Buffer->freeNext == gcvFREE_TASK_TERMINATOR)
+ {
+ /* Reset the list pointer. */
+ Command->taskFreeHead = Command->taskFreeTail = gcvNULL;
+ }
+
+ /* No, just the head. */
+ else
+ {
+ /* Update the head. */
+ Command->taskFreeHead = Buffer->freeNext;
+
+ /* Terminate the next buffer. */
+ Command->taskFreeHead->freePrev = gcvFREE_TASK_TERMINATOR;
+ }
+ }
+
+ /* Not the head. */
+ else
+ {
+ /* Tail buffer? */
+ if (Buffer->freeNext == gcvFREE_TASK_TERMINATOR)
+ {
+ /* Update the tail. */
+ Command->taskFreeTail = Buffer->freePrev;
+
+ /* Terminate the previous buffer. */
+ Command->taskFreeTail->freeNext = gcvFREE_TASK_TERMINATOR;
+ }
+
+ /* A buffer in the middle. */
+ else
+ {
+ /* Remove the buffer from the list. */
+ Buffer->freePrev->freeNext = Buffer->freeNext;
+ Buffer->freeNext->freePrev = Buffer->freePrev;
+ }
+ }
+
+ /* Reset free list pointers. */
+ Buffer->freePrev = gcvNULL;
+ Buffer->freeNext = gcvNULL;
+}
+
+
+/*----------------------------------------------------------------------------*/
+/*-------------------------- Task Buffer Allocation --------------------------*/
+
+static void
+_SplitTaskBuffer(
+ IN gckVGCOMMAND Command,
+ IN gcsTASK_CONTAINER_PTR Buffer,
+ IN gctUINT Size
+ )
+{
+ /* Determine the size of the new buffer. */
+ gctINT splitBufferSize = Buffer->size - Size;
+ gcmkASSERT(splitBufferSize >= 0);
+
+ /* Is the split buffer big enough to become a separate buffer? */
+ if (splitBufferSize >= gcvMIN_TASK_BUFFER)
+ {
+ /* Place the new path data. */
+ gcsTASK_CONTAINER_PTR splitBuffer = (gcsTASK_CONTAINER_PTR)
+ (
+ (gctUINT8_PTR) Buffer + Size
+ );
+
+ /* Set the trimmed buffer size. */
+ Buffer->size = Size;
+
+ /* Initialize the split buffer. */
+ splitBuffer->referenceCount = 0;
+ splitBuffer->size = splitBufferSize;
+ splitBuffer->freePrev = gcvNULL;
+ splitBuffer->freeNext = gcvNULL;
+
+ /* Link in. */
+ _InsertTaskBuffer(Buffer, splitBuffer);
+ _AppendToFreeList(Command, splitBuffer);
+ }
+}
+
+static gceSTATUS
+_AllocateTaskContainer(
+ IN gckVGCOMMAND Command,
+ IN gctUINT Size,
+ OUT gcsTASK_CONTAINER_PTR * Buffer
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Command=%p Size=0x%x, Buffer =%p", Command, Size, Buffer);
+
+ /* Verify arguments. */
+ gcmkVERIFY_ARGUMENT(Buffer != gcvNULL);
+
+ do
+ {
+ gcsTASK_STORAGE_PTR storage;
+ gcsTASK_CONTAINER_PTR buffer;
+
+ /* Adjust the size. */
+ Size += gcmSIZEOF(gcsTASK_CONTAINER);
+
+ /* Adjust the allocation size if not big enough. */
+ if (Size > Command->taskStorageUsable)
+ {
+ Command->taskStorageGranularity
+ = gcmALIGN(Size + gcmSIZEOF(gcsTASK_STORAGE), 1024);
+
+ Command->taskStorageUsable
+ = Command->taskStorageGranularity - gcmSIZEOF(gcsTASK_STORAGE);
+ }
+
+ /* Is there a free buffer available? */
+ else if (Command->taskFreeHead != gcvNULL)
+ {
+ /* Set the initial free buffer. */
+ gcsTASK_CONTAINER_PTR buffer = Command->taskFreeHead;
+
+ do
+ {
+ /* Is the buffer big enough? */
+ if (buffer->size >= Size)
+ {
+ /* Remove the buffer from the free list. */
+ _RemoveFromFreeList(Command, buffer);
+
+ /* Split the buffer. */
+ _SplitTaskBuffer(Command, buffer, Size);
+
+ /* Set the result. */
+ * Buffer = buffer;
+
+ gcmkFOOTER_ARG("*Buffer=0x%x",*Buffer);
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+
+ /* Get the next free buffer. */
+ buffer = buffer->freeNext;
+ }
+ while (buffer != gcvFREE_TASK_TERMINATOR);
+ }
+
+ /* Allocate a container. */
+ gcmkERR_BREAK(gckOS_Allocate(
+ Command->os,
+ Command->taskStorageGranularity,
+ (gctPOINTER *) &storage
+ ));
+
+ /* Link in the storage buffer. */
+ storage->next = Command->taskStorage;
+ Command->taskStorage = storage;
+
+ /* Place the task buffer. */
+ buffer = (gcsTASK_CONTAINER_PTR) (storage + 1);
+
+ /* Determine the size of the buffer. */
+ buffer->size
+ = Command->taskStorageGranularity
+ - gcmSIZEOF(gcsTASK_STORAGE);
+
+ /* Initialize the task buffer. */
+ buffer->referenceCount = 0;
+ buffer->allocPrev = gcvNULL;
+ buffer->allocNext = gcvNULL;
+ buffer->freePrev = gcvNULL;
+ buffer->freeNext = gcvNULL;
+
+ /* Split the buffer. */
+ _SplitTaskBuffer(Command, buffer, Size);
+
+ /* Set the result. */
+ * Buffer = buffer;
+
+ gcmkFOOTER_ARG("*Buffer=0x%x",*Buffer);
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+static void
+_FreeTaskContainer(
+ IN gckVGCOMMAND Command,
+ IN gcsTASK_CONTAINER_PTR Buffer
+ )
+{
+ gcsTASK_CONTAINER_PTR prev;
+ gcsTASK_CONTAINER_PTR next;
+ gcsTASK_CONTAINER_PTR merged;
+
+ gctUINT32 mergedSize;
+
+ /* Verify arguments. */
+ gcmkASSERT(Buffer != gcvNULL);
+ gcmkASSERT(Buffer->freePrev == gcvNULL);
+ gcmkASSERT(Buffer->freeNext == gcvNULL);
+
+ /* Get shortcuts to the previous and next path data buffers. */
+ prev = Buffer->allocPrev;
+ next = Buffer->allocNext;
+
+ /* Is the previous path data buffer already free? */
+ if (prev && prev->freeNext)
+ {
+ /* The previous path data buffer is the one that remains. */
+ merged = prev;
+
+ /* Is the next path data buffer already free? */
+ if (next && next->freeNext)
+ {
+ /* Merge all three path data buffers into the previous. */
+ mergedSize = prev->size + Buffer->size + next->size;
+
+ /* Remove the next path data buffer. */
+ _RemoveFromFreeList(Command, next);
+ _RemoveTaskBuffer(next);
+ }
+ else
+ {
+ /* Merge the current path data buffer into the previous. */
+ mergedSize = prev->size + Buffer->size;
+ }
+
+ /* Delete the current path data buffer. */
+ _RemoveTaskBuffer(Buffer);
+
+ /* Set new size. */
+ merged->size = mergedSize;
+ }
+ else
+ {
+ /* The current path data buffer is the one that remains. */
+ merged = Buffer;
+
+ /* Is the next buffer already free? */
+ if (next && next->freeNext)
+ {
+ /* Merge the next into the current. */
+ mergedSize = Buffer->size + next->size;
+
+ /* Remove the next buffer. */
+ _RemoveFromFreeList(Command, next);
+ _RemoveTaskBuffer(next);
+
+ /* Set new size. */
+ merged->size = mergedSize;
+ }
+
+ /* Add the current buffer into the free list. */
+ _AppendToFreeList(Command, merged);
+ }
+}
+
+gceSTATUS
+_RemoveRecordFromProcesDB(
+ IN gckVGCOMMAND Command,
+ IN gcsTASK_HEADER_PTR Task
+ )
+{
+ gceSTATUS status;
+ gcsTASK_PTR task = (gcsTASK_PTR)((gctUINT8_PTR)Task - sizeof(gcsTASK));
+ gcsTASK_FREE_VIDEO_MEMORY_PTR freeVideoMemory;
+ gcsTASK_UNLOCK_VIDEO_MEMORY_PTR unlockVideoMemory;
+ gctINT pid;
+ gctUINT32 size,id;
+ gctUINT32 handle;
+ gckKERNEL kernel = Command->kernel->kernel;
+ gckVIDMEM_NODE unlockNode = gcvNULL;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gceDATABASE_TYPE type;
+
+ /* Get the total size of all tasks. */
+
+ gcmkVERIFY_OK(gckOS_GetProcessID((gctUINT32_PTR)&pid));
+ gcmkVERIFY_OK(gckOS_ReadMappedPointer(Command->os, &task->size, &size));
+
+ do
+ {
+ gcmkVERIFY_OK(gckOS_ReadMappedPointer(Command->os, &Task->id, &id));
+ switch (id)
+ {
+ case gcvTASK_FREE_VIDEO_MEMORY:
+ freeVideoMemory = (gcsTASK_FREE_VIDEO_MEMORY_PTR)Task;
+
+ gcmkVERIFY_OK(gckOS_ReadMappedPointer(Command->os, &freeVideoMemory->node, &handle));
+
+ status = gckVIDMEM_HANDLE_Lookup(
+ Command->kernel->kernel,
+ pid,
+ handle,
+ &nodeObject);
+
+ if (gcmIS_ERROR(status))
+ {
+ return status;
+ }
+
+ gckVIDMEM_HANDLE_Dereference(kernel, pid, handle);
+ gcmkVERIFY_OK(gckOS_WriteMemory(Command->os, &freeVideoMemory->node, gcmALL_TO_UINT32(nodeObject)));
+
+ type = gcvDB_VIDEO_MEMORY
+ | (nodeObject->type << gcdDB_VIDEO_MEMORY_TYPE_SHIFT)
+ | (nodeObject->pool << gcdDB_VIDEO_MEMORY_POOL_SHIFT);
+
+ /* Remove record from process db. */
+ gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(
+ Command->kernel->kernel,
+ pid,
+ type,
+ gcmINT2PTR(handle)));
+
+ /* Advance to next task. */
+ size -= sizeof(gcsTASK_FREE_VIDEO_MEMORY);
+ Task = (gcsTASK_HEADER_PTR)(freeVideoMemory + 1);
+
+ break;
+ case gcvTASK_UNLOCK_VIDEO_MEMORY:
+ unlockVideoMemory = (gcsTASK_UNLOCK_VIDEO_MEMORY_PTR)Task;
+
+ gcmkVERIFY_OK(gckOS_ReadMappedPointer(Command->os, &unlockVideoMemory->node, &handle));
+ /* Remove record from process db. */
+ gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(
+ Command->kernel->kernel,
+ pid,
+ gcvDB_VIDEO_MEMORY_LOCKED,
+ gcmUINT64_TO_PTR(handle)));
+
+
+ status = gckVIDMEM_HANDLE_Lookup(
+ Command->kernel->kernel,
+ pid,
+ handle,
+ &unlockNode);
+
+ if (gcmIS_ERROR(status))
+ {
+ return status;
+ }
+
+ gckVIDMEM_HANDLE_Dereference(kernel, pid, handle);
+ gcmkVERIFY_OK(gckOS_WriteMemory(Command->os, &unlockVideoMemory->node, gcmALL_TO_UINT32(unlockNode)));
+
+ /* Advance to next task. */
+ size -= sizeof(gcsTASK_UNLOCK_VIDEO_MEMORY);
+ Task = (gcsTASK_HEADER_PTR)(unlockVideoMemory + 1);
+
+ break;
+ default:
+ /* Skip the whole task. */
+ size = 0;
+ break;
+ }
+ }
+ while(size);
+
+ return gcvSTATUS_OK;
+}
+
+/******************************************************************************\
+********************************* Task Scheduling ******************************
+\******************************************************************************/
+
+static gceSTATUS
+_ScheduleTasks(
+ IN gckVGCOMMAND Command,
+ IN gcsTASK_MASTER_TABLE_PTR TaskTable,
+ IN gctUINT8_PTR PreviousEnd
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ gctINT block;
+ gcsTASK_CONTAINER_PTR container;
+ gcsTASK_MASTER_ENTRY_PTR userTaskEntry;
+ gcsBLOCK_TASK_ENTRY_PTR kernelTaskEntry;
+ gcsTASK_PTR userTask;
+ gcsTASK userTaskObject;
+ gctUINT8_PTR kernelTask;
+ gctINT32 interrupt;
+ gctUINT8_PTR eventCommand;
+ gctBOOL needCopy = gcvFALSE;
+ gctINT pid;
+#ifdef __QNXNTO__
+ gcsTASK_PTR oldUserTask = gcvNULL;
+ gctPOINTER pointer;
+#endif
+
+ /* Nothing to schedule? */
+ if (TaskTable->size == 0)
+ {
+ status = gcvSTATUS_OK;
+ break;
+ }
+
+ /* Acquire the mutex. */
+ gcmkERR_BREAK(gckOS_AcquireMutex(
+ Command->os,
+ Command->taskMutex,
+ gcvINFINITE
+ ));
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s(%d)\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkVERIFY_OK(gckOS_GetProcessID((gctUINT32_PTR)&pid));
+ gcmkVERIFY_OK(gckOS_QueryNeedCopy(Command->os, pid, &needCopy));
+ do
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " number of tasks scheduled = %d\n"
+ " size of event data in bytes = %d\n",
+ TaskTable->count,
+ TaskTable->size
+ );
+
+ /* Allocate task buffer. */
+ gcmkERR_BREAK(_AllocateTaskContainer(
+ Command,
+ TaskTable->size,
+ &container
+ ));
+
+ /* Determine the task data pointer. */
+ kernelTask = (gctUINT8_PTR) (container + 1);
+
+ /* Initialize the reference count. */
+ container->referenceCount = TaskTable->count;
+
+ /* Process tasks. */
+ for (block = gcvBLOCK_COUNT - 1; block >= 0; block -= 1)
+ {
+ /* Get the current user table entry. */
+ userTaskEntry = &TaskTable->table[block];
+
+ /* Are there tasks scheduled? */
+ if (userTaskEntry->head == gcvNULL)
+ {
+ /* No, skip to the next block. */
+ continue;
+ }
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " processing tasks for block %d\n",
+ block
+ );
+
+ /* Get the current kernel table entry. */
+ kernelTaskEntry = &Command->taskTable[block];
+
+ /* Are there tasks for the current block scheduled? */
+ if (kernelTaskEntry->container == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " first task container for the block added\n",
+ block
+ );
+
+ /* Nothing yet, set the container buffer pointer. */
+ kernelTaskEntry->container = container;
+ kernelTaskEntry->task = (gcsTASK_HEADER_PTR) kernelTask;
+ }
+
+ /* Yes, append to the end. */
+ else
+ {
+ kernelTaskEntry->link->cotainer = container;
+ kernelTaskEntry->link->task = (gcsTASK_HEADER_PTR) kernelTask;
+ }
+
+ /* Set initial task. */
+ userTask = userTaskEntry->head;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " copying user tasks over to the kernel\n"
+ );
+
+ /* Copy tasks. */
+ do
+ {
+ gcsTASK_HEADER_PTR taskHeader;
+#ifdef __QNXNTO__
+ oldUserTask = userTask;
+
+ gcmkERR_BREAK(gckOS_MapUserPointer(
+ Command->os,
+ oldUserTask,
+ 0,
+ &pointer));
+
+ userTask = pointer;
+#endif
+ taskHeader = (gcsTASK_HEADER_PTR) (userTask + 1);
+ if(needCopy)
+ {
+ gcmkERR_BREAK(gckOS_CopyFromUserData(
+ Command->os,
+ &userTaskObject,
+ userTask,
+ gcmSIZEOF(gcsTASK)
+ ));
+ userTask = &userTaskObject;
+ }
+
+ gcmkVERIFY_OK(_RemoveRecordFromProcesDB(Command, taskHeader));
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " task ID = %d, size = %d\n",
+ ((gcsTASK_HEADER_PTR) (userTask + 1))->id,
+ userTask->size
+ );
+
+ /* Copy the task data. */
+ if(needCopy)
+ {
+ gcmkERR_BREAK(gckOS_CopyFromUserData(
+ Command->os,
+ kernelTask,
+ taskHeader,
+ userTask->size
+ ));
+ }
+ else
+ {
+
+ gcmkERR_BREAK(gckOS_MemCopy(
+ kernelTask, taskHeader, userTask->size
+ ));
+ }
+#ifdef __QNXNTO__
+ if (taskHeader->id == gcvTASK_SIGNAL)
+ {
+ gcsTASK_SIGNAL_PTR taskSignal = (gcsTASK_SIGNAL_PTR)kernelTask;
+ gctPOINTER signal;
+ gctUINT32 pid;
+
+ gcmkVERIFY_OK(gckOS_GetProcessID(&pid));
+
+ taskSignal->coid = TaskTable->coid;
+ taskSignal->rcvid = TaskTable->rcvid;
+
+ gcmkERR_BREAK(drv_signal_mgr_add(
+ pid,
+ taskSignal->coid,
+ taskSignal->rcvid,
+ gcmPTR_TO_UINT64(taskSignal->signal),
+ &signal));
+
+ taskSignal->signal = signal;
+ }
+#endif
+
+ /* Advance to the next task. */
+ kernelTask += userTask->size;
+ userTask = userTask->next;
+
+#ifdef __QNXNTO__
+ gcmkERR_BREAK(gckOS_UnmapUserPointer(
+ Command->os,
+ oldUserTask,
+ 0,
+ pointer));
+#endif
+ }
+ while (userTask != gcvNULL);
+
+ /* Update link pointer in the header. */
+ kernelTaskEntry->link = (gcsTASK_LINK_PTR) kernelTask;
+
+ /* Initialize link task. */
+ kernelTaskEntry->link->id = gcvTASK_LINK;
+ kernelTaskEntry->link->cotainer = gcvNULL;
+ kernelTaskEntry->link->task = gcvNULL;
+
+ /* Advance the task data pointer. */
+ kernelTask += gcmSIZEOF(gcsTASK_LINK);
+ }
+ }
+ while (gcvFALSE);
+
+ /* Release the mutex. */
+ gcmkERR_BREAK(gckOS_ReleaseMutex(
+ Command->os,
+ Command->taskMutex
+ ));
+
+ /* Assign interrupts to the blocks. */
+ eventCommand = PreviousEnd;
+
+ for (block = gcvBLOCK_COUNT - 1; block >= 0; block -= 1)
+ {
+ /* Get the current user table entry. */
+ userTaskEntry = &TaskTable->table[block];
+
+ /* Are there tasks scheduled? */
+ if (userTaskEntry->head == gcvNULL)
+ {
+ /* No, skip to the next block. */
+ continue;
+ }
+
+ /* Get the interrupt number. */
+ interrupt = _GetNextInterrupt(Command, block);
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s(%d): block = %d interrupt = %d\n",
+ __FUNCTION__, __LINE__,
+ block, interrupt
+ );
+
+ /* Determine the command position. */
+ eventCommand -= Command->info.eventCommandSize;
+
+ /* Append an EVENT command. */
+ gcmkERR_BREAK(gckVGCOMMAND_EventCommand(
+ Command, eventCommand, block, interrupt, gcvNULL
+ ));
+ }
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+
+/******************************************************************************\
+******************************** Memory Management *****************************
+\******************************************************************************/
+
+static gceSTATUS
+_HardwareToKernel(
+ IN gckOS Os,
+ IN gcuVIDMEM_NODE_PTR Node,
+ IN gctUINT32 Address,
+ OUT gctPOINTER * KernelPointer
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM memory;
+ gctUINT32 offset;
+ gctUINT32 nodePhysical;
+ gctPOINTER *logical;
+ gctSIZE_T bytes;
+ status = gcvSTATUS_OK;
+
+ memory = Node->VidMem.parent;
+
+ if (memory->object.type == gcvOBJ_VIDMEM)
+ {
+ nodePhysical = (gctUINT32)memory->physicalBase
+ + (gctUINT32)Node->VidMem.offset
+ + Node->VidMem.alignment;
+ bytes = Node->VidMem.bytes;
+ logical = &Node->VidMem.kernelVirtual;
+ }
+ else
+ {
+ gcmkSAFECASTPHYSADDRT(nodePhysical, Node->Virtual.physicalAddress);
+ bytes = Node->Virtual.bytes;
+ logical = &Node->Virtual.kernelVirtual;
+ }
+
+ if (*logical == gcvNULL)
+ {
+ status = gckOS_MapPhysical(Os, nodePhysical, bytes, logical);
+
+ if (gcmkIS_ERROR(status))
+ {
+ return status;
+ }
+ }
+
+ offset = Address - nodePhysical;
+ *KernelPointer = (gctPOINTER)((gctUINT8_PTR)(*logical) + offset);
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_ConvertUserCommandBufferPointer(
+ IN gckVGCOMMAND Command,
+ IN gcsCMDBUFFER_PTR UserCommandBuffer,
+ OUT gcsCMDBUFFER_PTR * KernelCommandBuffer
+ )
+{
+ gceSTATUS status, last;
+ gcsCMDBUFFER_PTR mappedUserCommandBuffer = gcvNULL;
+ gcsCMDBUFFER _CommandBufferObject;
+ gckKERNEL kernel = Command->kernel->kernel;
+ gctUINT32 pid;
+ gckVIDMEM_NODE node;
+ gctBOOL needCopy = gcvFALSE;
+
+ gckOS_GetProcessID(&pid);
+
+ do
+ {
+ gctUINT32 headerAddress;
+
+ gcmkERR_BREAK(gckOS_QueryNeedCopy(Command->os, pid, &needCopy));
+ if(needCopy)
+ {
+ gcmkERR_BREAK(gckOS_CopyFromUserData(
+ Command->os,
+ &_CommandBufferObject,
+ UserCommandBuffer,
+ gcmSIZEOF(gcsCMDBUFFER)
+ ));
+ mappedUserCommandBuffer = &_CommandBufferObject;
+ }
+ else
+ {
+ /* Map the command buffer structure into the kernel space. */
+ gcmkERR_BREAK(gckOS_MapUserPointer(
+ Command->os,
+ UserCommandBuffer,
+ gcmSIZEOF(gcsCMDBUFFER),
+ (gctPOINTER *) &mappedUserCommandBuffer
+ ));
+ }
+ /* Determine the address of the header. */
+ headerAddress
+ = mappedUserCommandBuffer->address
+ - mappedUserCommandBuffer->bufferOffset;
+
+ gcmkERR_BREAK(gckVIDMEM_HANDLE_Lookup(
+ kernel,
+ pid,
+ gcmPTR2INT32(mappedUserCommandBuffer->node),
+ &node));
+
+ /* Translate the logical address to the kernel space. */
+ gcmkERR_BREAK(_HardwareToKernel(
+ Command->os,
+ node->node,
+ headerAddress,
+ (gctPOINTER *) KernelCommandBuffer
+ ));
+ }
+ while (gcvFALSE);
+
+ /* Unmap the user command buffer. */
+ if (mappedUserCommandBuffer != gcvNULL && needCopy == gcvFALSE)
+ {
+ gcmkCHECK_STATUS(gckOS_UnmapUserPointer(
+ Command->os,
+ UserCommandBuffer,
+ gcmSIZEOF(gcsCMDBUFFER),
+ mappedUserCommandBuffer
+ ));
+ }
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_AllocateLinear(
+ IN gckVGCOMMAND Command,
+ IN gctUINT Size,
+ IN gctUINT Alignment,
+ OUT gcuVIDMEM_NODE_PTR * Node,
+ OUT gctUINT32 * Address,
+ OUT gctPOINTER * Logical
+ )
+{
+ gceSTATUS status, last;
+ gctPOINTER logical;
+ gctPHYS_ADDR physical;
+ gctUINT32 address;
+ gctSIZE_T size = Size;
+ gctPHYS_ADDR_T paddr;
+
+ do
+ {
+ gcmkERR_BREAK(gckOS_AllocateNonPagedMemory(
+ Command->os,
+ gcvFALSE,
+ gcvALLOC_FLAG_CONTIGUOUS,
+ &size,
+ &physical,
+ &logical
+ ));
+
+ gcmkERR_BREAK(gckOS_GetPhysicalFromHandle(Command->os, physical, 0, &paddr));
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Command->os, paddr, &paddr));
+
+ gcmkSAFECASTPHYSADDRT(address, paddr);
+
+ /* Set return values. */
+ * Node = physical;
+ * Address = address;
+ * Logical = logical;
+
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ /* Roll back. */
+ if (physical != gcvNULL)
+ {
+ /* Free the command buffer. */
+ gcmkCHECK_STATUS(gckOS_FreeNonPagedMemory(Command->os, physical, logical, size));
+ }
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_FreeLinear(
+ IN gckVGKERNEL Kernel,
+ IN gcuVIDMEM_NODE_PTR Node,
+ IN gctPOINTER Logical
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ do
+ {
+ gcmkERR_BREAK(gckOS_FreeNonPagedMemory(Kernel->os, Node, Logical, 1));
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+gceSTATUS
+_AllocateCommandBuffer(
+ IN gckVGCOMMAND Command,
+ IN gctSIZE_T Size,
+ OUT gcsCMDBUFFER_PTR * CommandBuffer
+ )
+{
+ gceSTATUS status, last;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+ gcsCMDBUFFER_PTR commandBuffer = gcvNULL;
+
+ do
+ {
+ gctUINT alignedHeaderSize;
+ gctUINT requestedSize;
+ gctUINT allocationSize;
+ gctUINT32 address = 0;
+ gctUINT8_PTR endCommand;
+
+ /* Determine the aligned header size. */
+ alignedHeaderSize
+ = (gctUINT32)gcmALIGN(gcmSIZEOF(gcsCMDBUFFER), Command->info.addressAlignment);
+
+ /* Align the requested size. */
+ requestedSize
+ = (gctUINT32)gcmALIGN(Size, Command->info.commandAlignment);
+
+ /* Determine the size of the buffer to allocate. */
+ allocationSize
+ = alignedHeaderSize
+ + requestedSize
+ + (gctUINT32)Command->info.staticTailSize;
+
+ /* Allocate the command buffer. */
+ gcmkERR_BREAK(_AllocateLinear(
+ Command,
+ allocationSize,
+ Command->info.addressAlignment,
+ &node,
+ &address,
+ (gctPOINTER *) &commandBuffer
+ ));
+
+ /* Initialize the structure. */
+ commandBuffer->completion = gcvVACANT_BUFFER;
+ commandBuffer->node = node;
+ commandBuffer->address = address + alignedHeaderSize;
+ commandBuffer->bufferOffset = alignedHeaderSize;
+ commandBuffer->size = requestedSize;
+ commandBuffer->offset = requestedSize;
+ commandBuffer->nextAllocated = gcvNULL;
+ commandBuffer->nextSubBuffer = gcvNULL;
+
+ /* Determine the data count. */
+ commandBuffer->dataCount
+ = (requestedSize + Command->info.staticTailSize)
+ / Command->info.commandAlignment;
+
+ /* Determine the location of the END command. */
+ endCommand
+ = (gctUINT8_PTR) commandBuffer
+ + alignedHeaderSize
+ + requestedSize;
+
+ /* Append an END command. */
+ gcmkERR_BREAK(gckVGCOMMAND_EndCommand(
+ Command,
+ endCommand,
+ Command->info.feBufferInt,
+ gcvNULL
+ ));
+
+ /* Set the return pointer. */
+ * CommandBuffer = commandBuffer;
+
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ /* Roll back. */
+ if (node != gcvNULL)
+ {
+ /* Free the command buffer. */
+ gcmkCHECK_STATUS(_FreeLinear(Command->kernel, node, commandBuffer));
+ }
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_FreeCommandBuffer(
+ IN gckVGKERNEL Kernel,
+ IN gcsCMDBUFFER_PTR CommandBuffer
+ )
+{
+ gceSTATUS status;
+
+ /* Free the buffer. */
+ status = _FreeLinear(Kernel, CommandBuffer->node, CommandBuffer);
+
+ /* Return status. */
+ return status;
+}
+
+
+/******************************************************************************\
+****************************** TS Overflow Handler *****************************
+\******************************************************************************/
+
+static gceSTATUS
+_EventHandler_TSOverflow(
+ IN gckVGKERNEL Kernel
+ )
+{
+ gcmkTRACE(
+ gcvLEVEL_ERROR,
+ "%s(%d): **** TS OVERFLOW ENCOUNTERED ****\n",
+ __FUNCTION__, __LINE__
+ );
+
+ return gcvSTATUS_OK;
+}
+
+
+/******************************************************************************\
+****************************** Bus Error Handler *******************************
+\******************************************************************************/
+
+static gceSTATUS
+_EventHandler_BusError(
+ IN gckVGKERNEL Kernel
+ )
+{
+ gcmkTRACE(
+ gcvLEVEL_ERROR,
+ "%s(%d): **** BUS ERROR ENCOUNTERED ****\n",
+ __FUNCTION__, __LINE__
+ );
+
+ return gcvSTATUS_OK;
+}
+
+/******************************************************************************\
+****************************** Power Stall Handler *******************************
+\******************************************************************************/
+
+static gceSTATUS
+_EventHandler_PowerStall(
+ IN gckVGKERNEL Kernel
+ )
+{
+ /* Signal. */
+ return gckOS_Signal(
+ Kernel->os,
+ Kernel->command->powerStallSignal,
+ gcvTRUE);
+}
+
+/******************************************************************************\
+******************************** Task Routines *********************************
+\******************************************************************************/
+
+typedef gceSTATUS (* gctTASKROUTINE) (
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ );
+
+static gceSTATUS
+_TaskLink(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ );
+
+static gceSTATUS
+_TaskCluster(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ );
+
+static gceSTATUS
+_TaskIncrement(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ );
+
+static gceSTATUS
+_TaskDecrement(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ );
+
+static gceSTATUS
+_TaskSignal(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ );
+
+static gceSTATUS
+_TaskLockdown(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ );
+
+static gceSTATUS
+_TaskUnlockVideoMemory(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ );
+
+static gceSTATUS
+_TaskFreeVideoMemory(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ );
+
+static gceSTATUS
+_TaskFreeContiguousMemory(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ );
+
+static gctTASKROUTINE _taskRoutine[] =
+{
+ _TaskLink, /* gcvTASK_LINK */
+ _TaskCluster, /* gcvTASK_CLUSTER */
+ _TaskIncrement, /* gcvTASK_INCREMENT */
+ _TaskDecrement, /* gcvTASK_DECREMENT */
+ _TaskSignal, /* gcvTASK_SIGNAL */
+ _TaskLockdown, /* gcvTASK_LOCKDOWN */
+ _TaskUnlockVideoMemory, /* gcvTASK_UNLOCK_VIDEO_MEMORY */
+ _TaskFreeVideoMemory, /* gcvTASK_FREE_VIDEO_MEMORY */
+ _TaskFreeContiguousMemory, /* gcvTASK_FREE_CONTIGUOUS_MEMORY */
+};
+
+static gceSTATUS
+_TaskLink(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ )
+{
+ /* Cast the task pointer. */
+ gcsTASK_LINK_PTR task = (gcsTASK_LINK_PTR) TaskHeader->task;
+
+ /* Save the pointer to the container. */
+ gcsTASK_CONTAINER_PTR container = TaskHeader->container;
+
+ /* No more tasks in the list? */
+ if (task->task == gcvNULL)
+ {
+ /* Reset the entry. */
+ TaskHeader->container = gcvNULL;
+ TaskHeader->task = gcvNULL;
+ TaskHeader->link = gcvNULL;
+ }
+ else
+ {
+ /* Update the entry. */
+ TaskHeader->container = task->cotainer;
+ TaskHeader->task = task->task;
+ }
+
+ /* Decrement the task buffer reference. */
+ gcmkASSERT(container->referenceCount >= 0);
+ if (container->referenceCount == 0)
+ {
+ /* Free the container. */
+ _FreeTaskContainer(Command, container);
+ }
+
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_TaskCluster(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ /* Cast the task pointer. */
+ gcsTASK_CLUSTER_PTR cluster = (gcsTASK_CLUSTER_PTR) TaskHeader->task;
+
+ /* Get the number of tasks. */
+ gctUINT taskCount = cluster->taskCount;
+
+ /* Advance to the next task. */
+ TaskHeader->task = (gcsTASK_HEADER_PTR) (cluster + 1);
+
+ /* Perform all tasks in the cluster. */
+ while (taskCount)
+ {
+ /* Perform the current task. */
+ gcmkERR_BREAK(_taskRoutine[TaskHeader->task->id](
+ Command,
+ TaskHeader
+ ));
+
+ /* Update the task count. */
+ taskCount -= 1;
+ }
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_TaskIncrement(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ /* Cast the task pointer. */
+ gcsTASK_INCREMENT_PTR task = (gcsTASK_INCREMENT_PTR) TaskHeader->task;
+
+ /* Convert physical into logical address. */
+ gctUINT32_PTR logical;
+ gcmkERR_BREAK(gckOS_MapPhysical(
+ Command->os,
+ task->address,
+ gcmSIZEOF(gctUINT32),
+ (gctPOINTER *) &logical
+ ));
+
+ /* Increment data. */
+ (* logical) += 1;
+
+ /* Unmap the physical memory. */
+ gcmkERR_BREAK(gckOS_UnmapPhysical(
+ Command->os,
+ logical,
+ gcmSIZEOF(gctUINT32)
+ ));
+
+ /* Update the reference counter. */
+ TaskHeader->container->referenceCount -= 1;
+
+ /* Update the task pointer. */
+ TaskHeader->task = (gcsTASK_HEADER_PTR) (task + 1);
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_TaskDecrement(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ /* Cast the task pointer. */
+ gcsTASK_DECREMENT_PTR task = (gcsTASK_DECREMENT_PTR) TaskHeader->task;
+
+ /* Convert physical into logical address. */
+ gctUINT32_PTR logical;
+ gcmkERR_BREAK(gckOS_MapPhysical(
+ Command->os,
+ task->address,
+ gcmSIZEOF(gctUINT32),
+ (gctPOINTER *) &logical
+ ));
+
+ /* Decrement data. */
+ (* logical) -= 1;
+
+ /* Unmap the physical memory. */
+ gcmkERR_BREAK(gckOS_UnmapPhysical(
+ Command->os,
+ logical,
+ gcmSIZEOF(gctUINT32)
+ ));
+
+ /* Update the reference counter. */
+ TaskHeader->container->referenceCount -= 1;
+
+ /* Update the task pointer. */
+ TaskHeader->task = (gcsTASK_HEADER_PTR) (task + 1);
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_TaskSignal(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ /* Cast the task pointer. */
+ gcsTASK_SIGNAL_PTR task = (gcsTASK_SIGNAL_PTR) TaskHeader->task;
+
+
+ /* Map the signal into kernel space. */
+#ifdef __QNXNTO__
+ status = gckOS_UserSignal(
+ Command->os, task->signal, task->rcvid, task->coid
+ );
+#else
+ status = gckOS_UserSignal(
+ Command->os, task->signal, task->process
+ );
+#endif /* __QNXNTO__ */
+
+ if (gcmIS_ERROR(status))
+ {
+ if (status == gcvSTATUS_NOT_FOUND)
+ {
+ status = gcvSTATUS_OK;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ /* Update the reference counter. */
+ TaskHeader->container->referenceCount -= 1;
+
+ /* Update the task pointer. */
+ TaskHeader->task = (gcsTASK_HEADER_PTR) (task + 1);
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_TaskLockdown(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ )
+{
+ gceSTATUS status;
+ gctUINT32_PTR userCounter = gcvNULL;
+ gctUINT32_PTR kernelCounter = gcvNULL;
+ gctSIGNAL signal = gcvNULL;
+
+ do
+ {
+ /* Cast the task pointer. */
+ gcsTASK_LOCKDOWN_PTR task = (gcsTASK_LOCKDOWN_PTR) TaskHeader->task;
+
+ /* Convert physical addresses into logical. */
+ gcmkERR_BREAK(gckOS_MapPhysical(
+ Command->os,
+ task->userCounter,
+ gcmSIZEOF(gctUINT32),
+ (gctPOINTER *) &userCounter
+ ));
+
+ gcmkERR_BREAK(gckOS_MapPhysical(
+ Command->os,
+ task->kernelCounter,
+ gcmSIZEOF(gctUINT32),
+ (gctPOINTER *) &kernelCounter
+ ));
+
+ /* Update the kernel counter. */
+ (* kernelCounter) += 1;
+
+ /* Are the counters equal? */
+ if ((* userCounter) == (* kernelCounter))
+ {
+ /* Map the signal into kernel space. */
+ gcmkERR_BREAK(gckOS_MapSignal(
+ Command->os, task->signal, task->process, &signal
+ ));
+
+ if (signal == gcvNULL)
+ {
+ /* Signal. */
+ gcmkERR_BREAK(gckOS_Signal(
+ Command->os, task->signal, gcvTRUE
+ ));
+ }
+ else
+ {
+ /* Signal. */
+ gcmkERR_BREAK(gckOS_Signal(
+ Command->os, signal, gcvTRUE
+ ));
+ }
+ }
+
+ /* Update the reference counter. */
+ TaskHeader->container->referenceCount -= 1;
+
+ /* Update the task pointer. */
+ TaskHeader->task = (gcsTASK_HEADER_PTR) (task + 1);
+ }
+ while (gcvFALSE);
+
+ /* Destroy the mapped signal. */
+ if (signal != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_DestroySignal(
+ Command->os, signal
+ ));
+ }
+
+ /* Unmap the physical memory. */
+ if (kernelCounter != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapPhysical(
+ Command->os,
+ kernelCounter,
+ gcmSIZEOF(gctUINT32)
+ ));
+ }
+
+ if (userCounter != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_UnmapPhysical(
+ Command->os,
+ userCounter,
+ gcmSIZEOF(gctUINT32)
+ ));
+ }
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_TaskUnlockVideoMemory(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ gctUINT32 processID;
+
+ /* Cast the task pointer. */
+ gcsTASK_UNLOCK_VIDEO_MEMORY_PTR task
+ = (gcsTASK_UNLOCK_VIDEO_MEMORY_PTR) TaskHeader->task;
+
+ gckOS_GetProcessID(&processID);
+
+ /* Unlock video memory. */
+ gcmkERR_BREAK(gckVIDMEM_NODE_Unlock(
+ Command->kernel->kernel,
+ (gckVIDMEM_NODE)gcmUINT64_TO_PTR(task->node),
+ processID,
+ gcvNULL));
+
+ gcmkERR_BREAK(gckVIDMEM_NODE_Dereference(
+ Command->kernel->kernel,
+ gcmUINT64_TO_PTR(task->node)));
+
+ /* Update the reference counter. */
+ TaskHeader->container->referenceCount -= 1;
+
+ /* Update the task pointer. */
+ TaskHeader->task = (gcsTASK_HEADER_PTR) (task + 1);
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_TaskFreeVideoMemory(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ /* Cast the task pointer. */
+ gcsTASK_FREE_VIDEO_MEMORY_PTR task
+ = (gcsTASK_FREE_VIDEO_MEMORY_PTR) TaskHeader->task;
+
+ /* Free video memory. */
+ gcmkERR_BREAK(gckVIDMEM_NODE_Dereference(
+ Command->kernel->kernel,
+ gcmINT2PTR(task->node)));
+
+ /* Update the reference counter. */
+ TaskHeader->container->referenceCount -= 1;
+
+ /* Update the task pointer. */
+ TaskHeader->task = (gcsTASK_HEADER_PTR) (task + 1);
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_TaskFreeContiguousMemory(
+ gckVGCOMMAND Command,
+ gcsBLOCK_TASK_ENTRY_PTR TaskHeader
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ /* Cast the task pointer. */
+ gcsTASK_FREE_CONTIGUOUS_MEMORY_PTR task
+ = (gcsTASK_FREE_CONTIGUOUS_MEMORY_PTR) TaskHeader->task;
+
+ /* Free contiguous memory. */
+ gcmkERR_BREAK(gckOS_FreeNonPagedMemory(
+ Command->os, task->physical, task->logical, task->bytes
+ ));
+
+ /* Update the reference counter. */
+ TaskHeader->container->referenceCount -= 1;
+
+ /* Update the task pointer. */
+ TaskHeader->task = (gcsTASK_HEADER_PTR) (task + 1);
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+/******************************************************************************\
+************ Hardware Block Interrupt Handlers For Scheduled Events ************
+\******************************************************************************/
+
+static gceSTATUS
+_EventHandler_Block(
+ IN gckVGKERNEL Kernel,
+ IN gcsBLOCK_TASK_ENTRY_PTR TaskHeader,
+ IN gctBOOL ProcessAll
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK, last;
+
+ gcmkHEADER_ARG("Kernel=%p TaskHeader=%p ProcessAll=0x%x", Kernel, TaskHeader, ProcessAll);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ if (TaskHeader->task == gcvNULL)
+ {
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+ }
+
+ do
+ {
+ gckVGCOMMAND command;
+
+ /* Get the command buffer object. */
+ command = Kernel->command;
+
+ /* Increment the interrupt usage semaphore. */
+ gcmkERR_BREAK(gckOS_IncrementSemaphore(
+ command->os, TaskHeader->interruptSemaphore
+ ));
+
+ /* Acquire the mutex. */
+ gcmkERR_BREAK(gckOS_AcquireMutex(
+ command->os,
+ command->taskMutex,
+ gcvINFINITE
+ ));
+
+ /* Verify inputs. */
+ gcmkASSERT(TaskHeader != gcvNULL);
+ gcmkASSERT(TaskHeader->container != gcvNULL);
+ gcmkASSERT(TaskHeader->task != gcvNULL);
+ gcmkASSERT(TaskHeader->link != gcvNULL);
+
+ /* Process tasks. */
+ do
+ {
+ /* Process the current task. */
+ gcmkERR_BREAK(_taskRoutine[TaskHeader->task->id](
+ command,
+ TaskHeader
+ ));
+
+ /* Is the next task is LINK? */
+ if (TaskHeader->task->id == gcvTASK_LINK)
+ {
+ gcmkERR_BREAK(_taskRoutine[TaskHeader->task->id](
+ command,
+ TaskHeader
+ ));
+
+ /* Done. */
+ break;
+ }
+ }
+ while (ProcessAll);
+
+ /* Release the mutex. */
+ gcmkCHECK_STATUS(gckOS_ReleaseMutex(
+ command->os,
+ command->taskMutex
+ ));
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+gcmDECLARE_INTERRUPT_HANDLER(COMMAND, 0)
+{
+ gceSTATUS status, last;
+
+ gcmkHEADER_ARG("Kernel=%p ", Kernel);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+
+ do
+ {
+ gckVGCOMMAND command;
+ gcsKERNEL_QUEUE_HEADER_PTR mergeQueue;
+ gcsKERNEL_QUEUE_HEADER_PTR queueTail;
+ gcsKERNEL_CMDQUEUE_PTR entry;
+ gctUINT entryCount;
+
+ /* Get the command buffer object. */
+ command = Kernel->command;
+
+ /* Acquire the mutex. */
+ gcmkERR_BREAK(gckOS_AcquireMutex(
+ command->os,
+ command->queueMutex,
+ gcvINFINITE
+ ));
+
+ /* Get the current queue. */
+ queueTail = command->queueTail;
+
+ /* Get the current queue entry. */
+ entry = queueTail->currentEntry;
+
+ /* Get the number of entries in the queue. */
+ entryCount = queueTail->pending;
+
+ /* Process all entries. */
+ while (entryCount > 0)
+ {
+ /* Call post-execution function. */
+ status = entry->handler(Kernel, entry);
+
+ /* Failed? */
+ if (gcmkIS_ERROR(status))
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR,
+ gcvZONE_COMMAND,
+ "[%s] line %d: post action failed.\n",
+ __FUNCTION__, __LINE__
+ );
+ }
+
+ /* Executed the next buffer? */
+ if (status == gcvSTATUS_EXECUTED)
+ {
+ /* Update the queue. */
+ queueTail->pending = entryCount;
+ queueTail->currentEntry = entry;
+
+ /* Success. */
+ status = gcvSTATUS_OK;
+
+ /* Break out of the loop. */
+ break;
+ }
+
+ /* Advance to the next entry. */
+ entry += 1;
+ entryCount -= 1;
+
+ /* Last entry? */
+ if (entryCount == 0)
+ {
+ /* Reset the queue to idle. */
+ queueTail->pending = 0;
+
+ /* Get a shortcut to the queue to merge with. */
+ mergeQueue = command->mergeQueue;
+
+ /* Merge the queues if necessary. */
+ if (mergeQueue != queueTail)
+ {
+ gcmkASSERT(mergeQueue < queueTail);
+ gcmkASSERT(mergeQueue->next == queueTail);
+
+ mergeQueue->size
+ += gcmSIZEOF(gcsKERNEL_QUEUE_HEADER)
+ + queueTail->size;
+
+ mergeQueue->next = queueTail->next;
+ }
+
+ /* Advance to the next queue. */
+ queueTail = queueTail->next;
+
+ /* Did it wrap around? */
+ if (command->queue == queueTail)
+ {
+ /* Reset merge queue. */
+ command->mergeQueue = queueTail;
+ }
+
+ /* Set new queue. */
+ command->queueTail = queueTail;
+
+ /* Is the next queue scheduled? */
+ if (queueTail->pending > 0)
+ {
+ gcsCMDBUFFER_PTR commandBuffer;
+
+ /* The first entry must be a command buffer. */
+ commandBuffer = queueTail->currentEntry->commandBuffer;
+
+ /* Start the command processor. */
+ status = gckVGHARDWARE_Execute(
+ command->hardware,
+ commandBuffer->address,
+ commandBuffer->dataCount
+ );
+
+ /* Failed? */
+ if (gcmkIS_ERROR(status))
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR,
+ gcvZONE_COMMAND,
+ "[%s] line %d: failed to start the next queue.\n",
+ __FUNCTION__, __LINE__
+ );
+ }
+ }
+ else
+ {
+ status = gckVGHARDWARE_SetPowerState(
+ Kernel->command->hardware, gcvPOWER_IDLE_BROADCAST
+ );
+ }
+
+ /* Break out of the loop. */
+ break;
+ }
+ }
+
+ /* Release the mutex. */
+ gcmkCHECK_STATUS(gckOS_ReleaseMutex(
+ command->os,
+ command->queueMutex
+ ));
+ }
+ while (gcvFALSE);
+
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+/* Define standard block interrupt handlers. */
+gcmDEFINE_INTERRUPT_HANDLER(TESSELLATOR, 0)
+gcmDEFINE_INTERRUPT_HANDLER(VG, 0)
+gcmDEFINE_INTERRUPT_HANDLER(PIXEL, 0)
+gcmDEFINE_INTERRUPT_HANDLER(PIXEL, 1)
+gcmDEFINE_INTERRUPT_HANDLER(PIXEL, 2)
+gcmDEFINE_INTERRUPT_HANDLER(PIXEL, 3)
+gcmDEFINE_INTERRUPT_HANDLER(PIXEL, 4)
+gcmDEFINE_INTERRUPT_HANDLER(PIXEL, 5)
+gcmDEFINE_INTERRUPT_HANDLER(PIXEL, 6)
+gcmDEFINE_INTERRUPT_HANDLER(PIXEL, 7)
+gcmDEFINE_INTERRUPT_HANDLER(PIXEL, 8)
+gcmDEFINE_INTERRUPT_HANDLER(PIXEL, 9)
+
+/* The entries in the array are arranged by event priority. */
+static gcsBLOCK_INTERRUPT_HANDLER _blockHandlers[] =
+{
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(TESSELLATOR, 0),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(VG, 0),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(PIXEL, 0),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(PIXEL, 1),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(PIXEL, 2),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(PIXEL, 3),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(PIXEL, 4),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(PIXEL, 5),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(PIXEL, 6),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(PIXEL, 7),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(PIXEL, 8),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(PIXEL, 9),
+ gcmDEFINE_INTERRUPT_HANDLER_ENTRY(COMMAND, 0),
+};
+
+
+/******************************************************************************\
+************************* Static Command Buffer Handlers ***********************
+\******************************************************************************/
+
+static gceSTATUS
+_UpdateStaticCommandBuffer(
+ IN gckVGKERNEL Kernel,
+ IN gcsKERNEL_CMDQUEUE_PTR Entry
+ )
+{
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s(%d)\n",
+ __FUNCTION__, __LINE__
+ );
+
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_ExecuteStaticCommandBuffer(
+ IN gckVGKERNEL Kernel,
+ IN gcsKERNEL_CMDQUEUE_PTR Entry
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ gcsCMDBUFFER_PTR commandBuffer;
+
+ /* Cast the command buffer header. */
+ commandBuffer = Entry->commandBuffer;
+
+ /* Set to update the command buffer next time. */
+ Entry->handler = _UpdateStaticCommandBuffer;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s(%d): executing next buffer @ 0x%08X, data count = %d\n",
+ __FUNCTION__, __LINE__,
+ commandBuffer->address,
+ commandBuffer->dataCount
+ );
+
+ /* Start the command processor. */
+ gcmkERR_BREAK(gckVGHARDWARE_Execute(
+ Kernel->hardware,
+ commandBuffer->address,
+ commandBuffer->dataCount
+ ));
+
+ /* Success. */
+ return gcvSTATUS_EXECUTED;
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_UpdateLastStaticCommandBuffer(
+ IN gckVGKERNEL Kernel,
+ IN gcsKERNEL_CMDQUEUE_PTR Entry
+ )
+{
+#if gcvDEBUG || gcdFORCE_MESSAGES
+ /* Get the command buffer header. */
+ gcsCMDBUFFER_PTR commandBuffer = Entry->commandBuffer;
+
+ /* Validate the command buffer. */
+ gcmkASSERT(commandBuffer->completion != gcvNULL);
+ gcmkASSERT(commandBuffer->completion != gcvVACANT_BUFFER);
+
+#endif
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s(%d): processing all tasks scheduled for FE.\n",
+ __FUNCTION__, __LINE__
+ );
+
+ /* Perform scheduled tasks. */
+ return _EventHandler_Block(
+ Kernel,
+ &Kernel->command->taskTable[gcvBLOCK_COMMAND],
+ gcvTRUE
+ );
+}
+
+static gceSTATUS
+_ExecuteLastStaticCommandBuffer(
+ IN gckVGKERNEL Kernel,
+ IN gcsKERNEL_CMDQUEUE_PTR Entry
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ /* Cast the command buffer header. */
+ gcsCMDBUFFER_PTR commandBuffer = Entry->commandBuffer;
+
+ /* Set to update the command buffer next time. */
+ Entry->handler = _UpdateLastStaticCommandBuffer;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s(%d): executing next buffer @ 0x%08X, data count = %d\n",
+ __FUNCTION__, __LINE__,
+ commandBuffer->address,
+ commandBuffer->dataCount
+ );
+
+ /* Start the command processor. */
+ gcmkERR_BREAK(gckVGHARDWARE_Execute(
+ Kernel->hardware,
+ commandBuffer->address,
+ commandBuffer->dataCount
+ ));
+
+ /* Success. */
+ return gcvSTATUS_EXECUTED;
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+
+/******************************************************************************\
+************************* Dynamic Command Buffer Handlers **********************
+\******************************************************************************/
+
+static gceSTATUS
+_UpdateDynamicCommandBuffer(
+ IN gckVGKERNEL Kernel,
+ IN gcsKERNEL_CMDQUEUE_PTR Entry
+ )
+{
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s(%d)\n",
+ __FUNCTION__, __LINE__
+ );
+
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_ExecuteDynamicCommandBuffer(
+ IN gckVGKERNEL Kernel,
+ IN gcsKERNEL_CMDQUEUE_PTR Entry
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ /* Cast the command buffer header. */
+ gcsCMDBUFFER_PTR commandBuffer = Entry->commandBuffer;
+
+ /* Set to update the command buffer next time. */
+ Entry->handler = _UpdateDynamicCommandBuffer;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s(%d): executing next buffer @ 0x%08X, data count = %d\n",
+ __FUNCTION__, __LINE__,
+ commandBuffer->address,
+ commandBuffer->dataCount
+ );
+
+ /* Start the command processor. */
+ gcmkERR_BREAK(gckVGHARDWARE_Execute(
+ Kernel->hardware,
+ commandBuffer->address,
+ commandBuffer->dataCount
+ ));
+
+ /* Success. */
+ return gcvSTATUS_EXECUTED;
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_UpdateLastDynamicCommandBuffer(
+ IN gckVGKERNEL Kernel,
+ IN gcsKERNEL_CMDQUEUE_PTR Entry
+ )
+{
+#if gcvDEBUG || gcdFORCE_MESSAGES
+ /* Get the command buffer header. */
+ gcsCMDBUFFER_PTR commandBuffer = Entry->commandBuffer;
+
+ /* Validate the command buffer. */
+ gcmkASSERT(commandBuffer->completion != gcvNULL);
+ gcmkASSERT(commandBuffer->completion != gcvVACANT_BUFFER);
+
+#endif
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s(%d): processing all tasks scheduled for FE.\n",
+ __FUNCTION__, __LINE__
+ );
+
+ /* Perform scheduled tasks. */
+ return _EventHandler_Block(
+ Kernel,
+ &Kernel->command->taskTable[gcvBLOCK_COMMAND],
+ gcvTRUE
+ );
+}
+
+static gceSTATUS
+_ExecuteLastDynamicCommandBuffer(
+ IN gckVGKERNEL Kernel,
+ IN gcsKERNEL_CMDQUEUE_PTR Entry
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ /* Cast the command buffer header. */
+ gcsCMDBUFFER_PTR commandBuffer = Entry->commandBuffer;
+
+ /* Set to update the command buffer next time. */
+ Entry->handler = _UpdateLastDynamicCommandBuffer;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s(%d): executing next buffer @ 0x%08X, data count = %d\n",
+ __FUNCTION__, __LINE__,
+ commandBuffer->address,
+ commandBuffer->dataCount
+ );
+
+ /* Start the command processor. */
+ gcmkERR_BREAK(gckVGHARDWARE_Execute(
+ Kernel->hardware,
+ commandBuffer->address,
+ commandBuffer->dataCount
+ ));
+
+ /* Success. */
+ return gcvSTATUS_EXECUTED;
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+
+/******************************************************************************\
+********************************* Other Handlers *******************************
+\******************************************************************************/
+
+static gceSTATUS
+_FreeKernelCommandBuffer(
+ IN gckVGKERNEL Kernel,
+ IN gcsKERNEL_CMDQUEUE_PTR Entry
+ )
+{
+ gceSTATUS status;
+
+ /* Free the command buffer. */
+ status = _FreeCommandBuffer(Kernel, Entry->commandBuffer);
+
+ /* Return status. */
+ return status;
+}
+
+
+/******************************************************************************\
+******************************* Queue Management *******************************
+\******************************************************************************/
+
+#if gcvDUMP_COMMAND_BUFFER
+static void
+_DumpCommandQueue(
+ IN gckVGCOMMAND Command,
+ IN gcsKERNEL_QUEUE_HEADER_PTR QueueHeader,
+ IN gctUINT EntryCount
+ )
+{
+ gcsKERNEL_CMDQUEUE_PTR entry;
+ gctUINT queueIndex;
+
+#if defined(gcvCOMMAND_BUFFER_NAME)
+ static gctUINT arrayCount = 0;
+#endif
+
+ /* Is dumpinng enabled? */
+ if (!Commad->enableDumping)
+ {
+ return;
+ }
+
+#if !defined(gcvCOMMAND_BUFFER_NAME)
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_COMMAND,
+ "COMMAND QUEUE DUMP: %d entries\n", EntryCount
+ );
+#endif
+
+ /* Get the pointer to the first entry. */
+ entry = QueueHeader->currentEntry;
+
+ /* Iterate through the queue. */
+ for (queueIndex = 0; queueIndex < EntryCount; queueIndex += 1)
+ {
+ gcsCMDBUFFER_PTR buffer;
+ gctUINT bufferCount;
+ gctUINT bufferIndex;
+ gctUINT i, count;
+ gctUINT size;
+ gctUINT32_PTR data;
+
+#if gcvDUMP_COMMAND_LINES
+ gctUINT lineNumber;
+#endif
+
+#if !defined(gcvCOMMAND_BUFFER_NAME)
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_COMMAND,
+ "ENTRY %d\n", queueIndex
+ );
+#endif
+
+ /* Reset the count. */
+ bufferCount = 0;
+
+ /* Set the initial buffer. */
+ buffer = entry->commandBuffer;
+
+ /* Loop through all subbuffers. */
+ while (buffer)
+ {
+ /* Update the count. */
+ bufferCount += 1;
+
+ /* Advance to the next subbuffer. */
+ buffer = buffer->nextSubBuffer;
+ }
+
+#if !defined(gcvCOMMAND_BUFFER_NAME)
+ if (bufferCount > 1)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO,
+ gcvZONE_COMMAND,
+ " COMMAND BUFFER SET: %d buffers.\n",
+ bufferCount
+ );
+ }
+#endif
+
+ /* Reset the buffer index. */
+ bufferIndex = 0;
+
+ /* Set the initial buffer. */
+ buffer = entry->commandBuffer;
+
+ /* Loop through all subbuffers. */
+ while (buffer)
+ {
+ /* Determine the size of the buffer. */
+ size = buffer->dataCount * Command->info.commandAlignment;
+
+#if !defined(gcvCOMMAND_BUFFER_NAME)
+ /* A single buffer? */
+ if (bufferCount == 1)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO,
+ gcvZONE_COMMAND,
+ " COMMAND BUFFER: count=%d (0x%X), size=%d bytes @ %08X.\n",
+ buffer->dataCount,
+ buffer->dataCount,
+ size,
+ buffer->address
+ );
+ }
+ else
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO,
+ gcvZONE_COMMAND,
+ " COMMAND BUFFER %d: count=%d (0x%X), size=%d bytes @ %08X\n",
+ bufferIndex,
+ buffer->dataCount,
+ buffer->dataCount,
+ size,
+ buffer->address
+ );
+ }
+#endif
+
+ /* Determine the number of double words to print. */
+ count = size / 4;
+
+ /* Determine the buffer location. */
+ data = (gctUINT32_PTR)
+ (
+ (gctUINT8_PTR) buffer + buffer->bufferOffset
+ );
+
+#if defined(gcvCOMMAND_BUFFER_NAME)
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO,
+ gcvZONE_COMMAND,
+ "unsigned int _" gcvCOMMAND_BUFFER_NAME "_%d[] =\n",
+ arrayCount
+ );
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO,
+ gcvZONE_COMMAND,
+ "{\n"
+ );
+
+ arrayCount += 1;
+#endif
+
+#if gcvDUMP_COMMAND_LINES
+ /* Reset the line number. */
+ lineNumber = 0;
+#endif
+
+#if defined(gcvCOMMAND_BUFFER_NAME)
+ count -= 2;
+#endif
+
+ for (i = 0; i < count; i += 1)
+ {
+ if ((i % 8) == 0)
+ {
+#if defined(gcvCOMMAND_BUFFER_NAME)
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_COMMAND, "\t");
+#else
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_COMMAND, " ");
+#endif
+ }
+
+#if gcvDUMP_COMMAND_LINES
+ if (lineNumber == gcvDUMP_COMMAND_LINES)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_COMMAND, " . . . . . . . . .\n");
+ break;
+ }
+#endif
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_COMMAND, "0x%08X", data[i]);
+
+ if (i + 1 == count)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_COMMAND, "\n");
+
+#if gcvDUMP_COMMAND_LINES
+ lineNumber += 1;
+#endif
+ }
+ else
+ {
+ if (((i + 1) % 8) == 0)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_COMMAND, ",\n");
+
+#if gcvDUMP_COMMAND_LINES
+ lineNumber += 1;
+#endif
+ }
+ else
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_COMMAND, ", ");
+ }
+ }
+ }
+
+#if defined(gcvCOMMAND_BUFFER_NAME)
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO,
+ gcvZONE_COMMAND,
+ "};\n\n"
+ );
+#endif
+
+ /* Advance to the next subbuffer. */
+ buffer = buffer->nextSubBuffer;
+ bufferIndex += 1;
+ }
+
+ /* Advance to the next entry. */
+ entry += 1;
+ }
+}
+#endif
+
+static gceSTATUS
+_LockCurrentQueue(
+ IN gckVGCOMMAND Command,
+ OUT gcsKERNEL_CMDQUEUE_PTR * Entries,
+ OUT gctUINT_PTR EntryCount
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ gcsKERNEL_QUEUE_HEADER_PTR queueHead;
+
+ /* Get a shortcut to the head of the queue. */
+ queueHead = Command->queueHead;
+
+ /* Is the head buffer still being worked on? */
+ if (queueHead->pending)
+ {
+ /* Increment overflow count. */
+ Command->queueOverflow += 1;
+
+ /* Wait until the head becomes idle. */
+ gcmkERR_BREAK(_WaitForIdle(Command, queueHead));
+ }
+
+ /* Acquire the mutex. */
+ gcmkERR_BREAK(gckOS_AcquireMutex(
+ Command->os,
+ Command->queueMutex,
+ gcvINFINITE
+ ));
+
+ /* Determine the first queue entry. */
+ queueHead->currentEntry = (gcsKERNEL_CMDQUEUE_PTR)
+ (
+ (gctUINT8_PTR) queueHead + gcmSIZEOF(gcsKERNEL_QUEUE_HEADER)
+ );
+
+ /* Set the pointer to the first entry. */
+ * Entries = queueHead->currentEntry;
+
+ /* Determine the number of available entries. */
+ * EntryCount = queueHead->size / gcmSIZEOF(gcsKERNEL_CMDQUEUE);
+
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+static gceSTATUS
+_UnlockCurrentQueue(
+ IN gckVGCOMMAND Command,
+ IN gctUINT EntryCount
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+#if !gcdENABLE_INFINITE_SPEED_HW
+ gcsKERNEL_QUEUE_HEADER_PTR queueTail;
+ gcsKERNEL_QUEUE_HEADER_PTR queueHead;
+ gcsKERNEL_QUEUE_HEADER_PTR queueNext;
+ gctUINT queueSize;
+ gctUINT newSize;
+ gctUINT unusedSize;
+
+ /* Get shortcut to the head and to the tail of the queue. */
+ queueTail = Command->queueTail;
+ queueHead = Command->queueHead;
+
+ /* Dump the command buffer. */
+#if gcvDUMP_COMMAND_BUFFER
+ _DumpCommandQueue(Command, queueHead, EntryCount);
+#endif
+
+ /* Get a shortcut to the current queue size. */
+ queueSize = queueHead->size;
+
+ /* Determine the new queue size. */
+ newSize = EntryCount * gcmSIZEOF(gcsKERNEL_CMDQUEUE);
+ gcmkASSERT(newSize <= queueSize);
+
+ /* Determine the size of the unused area. */
+ unusedSize = queueSize - newSize;
+
+ /* Is the unused area big enough to become a buffer? */
+ if (unusedSize >= gcvMINUMUM_BUFFER)
+ {
+ gcsKERNEL_QUEUE_HEADER_PTR nextHead;
+
+ /* Place the new header. */
+ nextHead = (gcsKERNEL_QUEUE_HEADER_PTR)
+ (
+ (gctUINT8_PTR) queueHead
+ + gcmSIZEOF(gcsKERNEL_QUEUE_HEADER)
+ + newSize
+ );
+
+ /* Initialize the buffer. */
+ nextHead->size = unusedSize - gcmSIZEOF(gcsKERNEL_QUEUE_HEADER);
+ nextHead->pending = 0;
+
+ /* Link the buffer in. */
+ nextHead->next = queueHead->next;
+ queueHead->next = nextHead;
+ queueNext = nextHead;
+
+ /* Update the size of the current buffer. */
+ queueHead->size = newSize;
+ }
+
+ /* Not big enough. */
+ else
+ {
+ /* Determine the next queue. */
+ queueNext = queueHead->next;
+ }
+
+ /* Mark the buffer as busy. */
+ queueHead->pending = EntryCount;
+
+ /* Advance to the next buffer. */
+ Command->queueHead = queueNext;
+
+ /* Start the command processor if the queue was empty. */
+ if (queueTail == queueHead)
+ {
+ gcsCMDBUFFER_PTR commandBuffer;
+
+ /* The first entry must be a command buffer. */
+ commandBuffer = queueTail->currentEntry->commandBuffer;
+
+ /* Start the command processor. */
+ gcmkERR_BREAK(gckVGHARDWARE_Execute(
+ Command->hardware,
+ commandBuffer->address,
+ commandBuffer->dataCount
+ ));
+ }
+
+ /* The queue was not empty. */
+ else
+ {
+ /* Advance the merge buffer if needed. */
+ if (queueHead == Command->mergeQueue)
+ {
+ Command->mergeQueue = queueNext;
+ }
+ }
+#endif
+
+ /* Release the mutex. */
+ gcmkERR_BREAK(gckOS_ReleaseMutex(
+ Command->os,
+ Command->queueMutex
+ ));
+
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ /* Return status. */
+ return status;
+}
+
+
+
+/******************************************************************************\
+****************************** gckVGCOMMAND API Code *****************************
+\******************************************************************************/
+gceSTATUS
+gckVGCOMMAND_Construct(
+ IN gckVGKERNEL Kernel,
+ IN gctUINT TaskGranularity,
+ IN gctUINT QueueSize,
+ OUT gckVGCOMMAND * Command
+ )
+{
+ gceSTATUS status, last;
+ gckVGCOMMAND command = gcvNULL;
+ gcsKERNEL_QUEUE_HEADER_PTR queue;
+ gctUINT i, j;
+
+ gcmkHEADER_ARG("Kernel=%p TaskGranularity=0x%x QueueSize=0x%x Command=%p",
+ Kernel, TaskGranularity, QueueSize, Command);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(QueueSize >= gcvMINUMUM_BUFFER);
+ gcmkVERIFY_ARGUMENT(Command != gcvNULL);
+
+ do
+ {
+ /***********************************************************************
+ ** Generic object initialization.
+ */
+
+ /* Allocate the gckVGCOMMAND structure. */
+ gcmkERR_BREAK(gckOS_Allocate(
+ Kernel->os,
+ gcmSIZEOF(struct _gckVGCOMMAND),
+ (gctPOINTER *) &command
+ ));
+
+ /* Initialize the object. */
+ command->object.type = gcvOBJ_COMMAND;
+
+ /* Set the object pointers. */
+ command->kernel = Kernel;
+ command->os = Kernel->os;
+ command->hardware = Kernel->hardware;
+
+ /* Reset pointers. */
+ command->queue = gcvNULL;
+ command->queueMutex = gcvNULL;
+ command->taskMutex = gcvNULL;
+ command->commitMutex = gcvNULL;
+
+ command->powerStallBuffer = gcvNULL;
+ command->powerStallSignal = gcvNULL;
+ command->powerSemaphore = gcvNULL;
+
+ /* Reset context states. */
+ command->contextCounter = 0;
+ command->currentContext = 0;
+
+ /* Enable command buffer dumping. */
+ command->enableDumping = gcvTRUE;
+
+ /* Set features. */
+ command->fe20 = Kernel->hardware->fe20;
+ command->vg20 = Kernel->hardware->vg20;
+ command->vg21 = Kernel->hardware->vg21;
+
+ /* Reset task table .*/
+ gcmkVERIFY_OK(gckOS_ZeroMemory(
+ command->taskTable, gcmSIZEOF(command->taskTable)
+ ));
+
+ /* Query command buffer attributes. */
+ gcmkERR_BREAK(gckVGCOMMAND_InitializeInfo(command));
+
+ /* Create the control mutexes. */
+ gcmkERR_BREAK(gckOS_CreateMutex(Kernel->os, &command->queueMutex));
+ gcmkERR_BREAK(gckOS_CreateMutex(Kernel->os, &command->taskMutex));
+ gcmkERR_BREAK(gckOS_CreateMutex(Kernel->os, &command->commitMutex));
+
+ /* Create the power management semaphore. */
+ gcmkERR_BREAK(gckOS_CreateSemaphore(Kernel->os,
+ &command->powerSemaphore));
+
+ gcmkERR_BREAK(gckOS_CreateSignal(Kernel->os,
+ gcvFALSE, &command->powerStallSignal));
+
+ /***********************************************************************
+ ** Command queue initialization.
+ */
+
+ /* Allocate the command queue. */
+ gcmkERR_BREAK(gckOS_Allocate(
+ Kernel->os,
+ QueueSize,
+ (gctPOINTER *) &command->queue
+ ));
+
+ /* Initialize the command queue. */
+ queue = command->queue;
+
+ queue->size = QueueSize - gcmSIZEOF(gcsKERNEL_QUEUE_HEADER);
+ queue->pending = 0;
+ queue->next = queue;
+
+ command->queueHead =
+ command->queueTail =
+ command->mergeQueue = command->queue;
+
+ command->queueOverflow = 0;
+
+
+ /***********************************************************************
+ ** Enable TS overflow interrupt.
+ */
+
+ command->info.tsOverflowInt = 0;
+ gcmkERR_BREAK(gckVGINTERRUPT_Enable(
+ Kernel->interrupt,
+ &command->info.tsOverflowInt,
+ _EventHandler_TSOverflow
+ ));
+
+ /* Mask out the interrupt. */
+ /* Kernel->hardware->eventMask &= ~(1 << command->info.tsOverflowInt); */
+
+
+ /***********************************************************************
+ ** Enable Bus Error interrupt.
+ */
+
+ /* Hardwired to bit 31. */
+ command->busErrorInt = 31;
+
+ /* Enable the interrupt. */
+ gcmkERR_BREAK(gckVGINTERRUPT_Enable(
+ Kernel->interrupt,
+ &command->busErrorInt,
+ _EventHandler_BusError
+ ));
+
+
+ command->powerStallInt = 30;
+ /* Enable the interrupt. */
+ gcmkERR_BREAK(gckVGINTERRUPT_Enable(
+ Kernel->interrupt,
+ &command->powerStallInt,
+ _EventHandler_PowerStall
+ ));
+
+ /***********************************************************************
+ ** Task management initialization.
+ */
+
+ command->taskStorage = gcvNULL;
+ command->taskStorageGranularity = TaskGranularity;
+ command->taskStorageUsable = TaskGranularity - gcmSIZEOF(gcsTASK_STORAGE);
+
+ command->taskFreeHead = gcvNULL;
+ command->taskFreeTail = gcvNULL;
+
+ /* Enable block handlers. */
+ for (i = 0; i < gcmCOUNTOF(_blockHandlers); i += 1)
+ {
+ /* Get the target hardware block. */
+ gceBLOCK block = _blockHandlers[i].block;
+
+ /* Get the interrupt array entry. */
+ gcsBLOCK_TASK_ENTRY_PTR entry = &command->taskTable[block];
+
+ /* Determine the interrupt value index. */
+ gctUINT index = entry->interruptCount;
+
+ /* Create the block semaphore. */
+ if (entry->interruptSemaphore == gcvNULL)
+ {
+ gcmkERR_BREAK(gckOS_CreateSemaphoreVG(
+ command->os, &entry->interruptSemaphore
+ ));
+ }
+
+ /* Enable auto-detection. */
+ entry->interruptArray[index] = -1;
+
+ /* Enable interrupt for the block. */
+ gcmkERR_BREAK(gckVGINTERRUPT_Enable(
+ Kernel->interrupt,
+ &entry->interruptArray[index],
+ _blockHandlers[i].handler
+ ));
+
+ /* Update the number of registered interrupts. */
+ entry->interruptCount += 1;
+
+ /* Inrement the semaphore to allow the usage of the registered
+ interrupt. */
+ gcmkERR_BREAK(gckOS_IncrementSemaphore(
+ command->os, entry->interruptSemaphore
+ ));
+
+ }
+
+ /* Error? */
+ if (gcmkIS_ERROR(status))
+ {
+ break;
+ }
+
+ /* Get the FE interrupt. */
+ command->info.feBufferInt
+ = command->taskTable[gcvBLOCK_COMMAND].interruptArray[0];
+
+ /* Return gckVGCOMMAND object pointer. */
+ *Command = command;
+
+ gcmkFOOTER_ARG("*Command=0x%x",*Command);
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ /* Roll back. */
+ if (command != gcvNULL)
+ {
+ /* Disable block handlers. */
+ for (i = 0; i < gcvBLOCK_COUNT; i += 1)
+ {
+ /* Get the task table entry. */
+ gcsBLOCK_TASK_ENTRY_PTR entry = &command->taskTable[i];
+
+ /* Destroy the semaphore. */
+ if (entry->interruptSemaphore != gcvNULL)
+ {
+ gcmkCHECK_STATUS(gckOS_DestroySemaphore(
+ command->os, entry->interruptSemaphore
+ ));
+ }
+
+ /* Disable all enabled interrupts. */
+ for (j = 0; j < entry->interruptCount; j += 1)
+ {
+ /* Must be a valid value. */
+ gcmkASSERT(entry->interruptArray[j] >= 0);
+ gcmkASSERT(entry->interruptArray[j] <= 31);
+
+ /* Disable the interrupt. */
+ gcmkCHECK_STATUS(gckVGINTERRUPT_Disable(
+ Kernel->interrupt,
+ entry->interruptArray[j]
+ ));
+ }
+ }
+
+ /* Disable the bus error interrupt. */
+ gcmkCHECK_STATUS(gckVGINTERRUPT_Disable(
+ Kernel->interrupt,
+ command->busErrorInt
+ ));
+
+ /* Disable TS overflow interrupt. */
+ if (command->info.tsOverflowInt != -1)
+ {
+ gcmkCHECK_STATUS(gckVGINTERRUPT_Disable(
+ Kernel->interrupt,
+ command->info.tsOverflowInt
+ ));
+ }
+
+ /* Delete the commit mutex. */
+ if (command->commitMutex != gcvNULL)
+ {
+ gcmkCHECK_STATUS(gckOS_DeleteMutex(
+ Kernel->os, command->commitMutex
+ ));
+ }
+
+ /* Delete the command queue mutex. */
+ if (command->taskMutex != gcvNULL)
+ {
+ gcmkCHECK_STATUS(gckOS_DeleteMutex(
+ Kernel->os, command->taskMutex
+ ));
+ }
+
+ /* Delete the command queue mutex. */
+ if (command->queueMutex != gcvNULL)
+ {
+ gcmkCHECK_STATUS(gckOS_DeleteMutex(
+ Kernel->os, command->queueMutex
+ ));
+ }
+
+ /* Delete the command queue. */
+ if (command->queue != gcvNULL)
+ {
+ gcmkCHECK_STATUS(gckOS_Free(
+ Kernel->os, command->queue
+ ));
+ }
+
+ if (command->powerSemaphore != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_DestroySemaphore(
+ Kernel->os, command->powerSemaphore));
+ }
+
+ if (command->powerStallSignal != gcvNULL)
+ {
+ /* Create the power management semaphore. */
+ gcmkVERIFY_OK(gckOS_DestroySignal(
+ Kernel->os,
+ command->powerStallSignal));
+ }
+
+ /* Free the gckVGCOMMAND structure. */
+ gcmkCHECK_STATUS(gckOS_Free(
+ Kernel->os, command
+ ));
+ }
+
+ gcmkFOOTER();
+ /* Return the error. */
+ return status;
+}
+
+gceSTATUS
+gckVGCOMMAND_Destroy(
+ OUT gckVGCOMMAND Command
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Command=%p", Command);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+
+ do
+ {
+ gctUINT i;
+ gcsTASK_STORAGE_PTR nextStorage;
+
+ if (Command->queueHead != gcvNULL)
+ {
+ /* Wait until the head becomes idle. */
+ gcmkERR_BREAK(_WaitForIdle(Command, Command->queueHead));
+ }
+
+ /* Disable block handlers. */
+ for (i = 0; i < gcvBLOCK_COUNT; i += 1)
+ {
+ /* Get the interrupt array entry. */
+ gcsBLOCK_TASK_ENTRY_PTR entry = &Command->taskTable[i];
+
+ /* Determine the index of the last interrupt in the array. */
+ gctINT index = entry->interruptCount - 1;
+
+ /* Destroy the semaphore. */
+ if (entry->interruptSemaphore != gcvNULL)
+ {
+ gcmkERR_BREAK(gckOS_DestroySemaphore(
+ Command->os, entry->interruptSemaphore
+ ));
+ }
+
+ /* Disable all enabled interrupts. */
+ while (index >= 0)
+ {
+ /* Must be a valid value. */
+ gcmkASSERT(entry->interruptArray[index] >= 0);
+ gcmkASSERT(entry->interruptArray[index] <= 31);
+
+ /* Disable the interrupt. */
+ gcmkERR_BREAK(gckVGINTERRUPT_Disable(
+ Command->kernel->interrupt,
+ entry->interruptArray[index]
+ ));
+
+ /* Update to the next interrupt. */
+ index -= 1;
+ entry->interruptCount -= 1;
+ }
+
+ /* Error? */
+ if (gcmkIS_ERROR(status))
+ {
+ break;
+ }
+ }
+
+ /* Error? */
+ if (gcmkIS_ERROR(status))
+ {
+ break;
+ }
+
+ /* Disable the bus error interrupt. */
+ gcmkERR_BREAK(gckVGINTERRUPT_Disable(
+ Command->kernel->interrupt,
+ Command->busErrorInt
+ ));
+
+ /* Disable TS overflow interrupt. */
+ if (Command->info.tsOverflowInt != -1)
+ {
+ gcmkERR_BREAK(gckVGINTERRUPT_Disable(
+ Command->kernel->interrupt,
+ Command->info.tsOverflowInt
+ ));
+
+ Command->info.tsOverflowInt = -1;
+ }
+
+ /* Delete the commit mutex. */
+ if (Command->commitMutex != gcvNULL)
+ {
+ gcmkERR_BREAK(gckOS_DeleteMutex(
+ Command->os, Command->commitMutex
+ ));
+
+ Command->commitMutex = gcvNULL;
+ }
+
+ /* Delete the command queue mutex. */
+ if (Command->taskMutex != gcvNULL)
+ {
+ gcmkERR_BREAK(gckOS_DeleteMutex(
+ Command->os, Command->taskMutex
+ ));
+
+ Command->taskMutex = gcvNULL;
+ }
+
+ /* Delete the command queue mutex. */
+ if (Command->queueMutex != gcvNULL)
+ {
+ gcmkERR_BREAK(gckOS_DeleteMutex(
+ Command->os, Command->queueMutex
+ ));
+
+ Command->queueMutex = gcvNULL;
+ }
+
+ if (Command->powerSemaphore != gcvNULL)
+ {
+ /* Destroy the power management semaphore. */
+ gcmkERR_BREAK(gckOS_DestroySemaphore(
+ Command->os, Command->powerSemaphore));
+ }
+
+ if (Command->powerStallSignal != gcvNULL)
+ {
+ /* Create the power management semaphore. */
+ gcmkERR_BREAK(gckOS_DestroySignal(
+ Command->os,
+ Command->powerStallSignal));
+ }
+
+ if (Command->queue != gcvNULL)
+ {
+ /* Delete the command queue. */
+ gcmkERR_BREAK(gckOS_Free(
+ Command->os, Command->queue
+ ));
+ }
+
+ /* Destroy all allocated buffers. */
+ while (Command->taskStorage)
+ {
+ /* Copy the buffer pointer. */
+ nextStorage = Command->taskStorage->next;
+
+ /* Free the current container. */
+ gcmkERR_BREAK(gckOS_Free(
+ Command->os, Command->taskStorage
+ ));
+
+ /* Advance to the next one. */
+ Command->taskStorage = nextStorage;
+ }
+
+ /* Error? */
+ if (gcmkIS_ERROR(status))
+ {
+ break;
+ }
+
+ /* Mark the object as unknown. */
+ Command->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the gckVGCOMMAND structure. */
+ gcmkERR_BREAK(gckOS_Free(Command->os, Command));
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ /* Restore the object type if failed. */
+ Command->object.type = gcvOBJ_COMMAND;
+
+ gcmkFOOTER();
+ /* Return the error. */
+ return status;
+}
+
+gceSTATUS
+gckVGCOMMAND_QueryCommandBuffer(
+ IN gckVGCOMMAND Command,
+ OUT gcsCOMMAND_BUFFER_INFO_PTR Information
+ )
+{
+ gcmkHEADER_ARG("Command=%p Information=%p", Command, Information);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+ gcmkVERIFY_ARGUMENT(Information != gcvNULL);
+
+ /* Copy the information. */
+ gcmkVERIFY_OK(gckOS_MemCopy(
+ Information, &Command->info, sizeof(gcsCOMMAND_BUFFER_INFO)
+ ));
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVGCOMMAND_Allocate(
+ IN gckVGCOMMAND Command,
+ IN gctSIZE_T Size,
+ OUT gcsCMDBUFFER_PTR * CommandBuffer,
+ OUT gctPOINTER * Data
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Command=%p Size=0x%x CommandBuffer=%p Data=0x%x",
+ Command, Size, CommandBuffer, Data);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+ gcmkVERIFY_ARGUMENT(Data != gcvNULL);
+
+ do
+ {
+ /* Allocate the buffer. */
+ gcmkERR_BREAK(_AllocateCommandBuffer(Command, Size, CommandBuffer));
+
+ /* Determine the data pointer. */
+ * Data = (gctUINT8_PTR) (*CommandBuffer) + (* CommandBuffer)->bufferOffset;
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+gceSTATUS
+gckVGCOMMAND_Free(
+ IN gckVGCOMMAND Command,
+ IN gcsCMDBUFFER_PTR CommandBuffer
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Command=%p CommandBuffer=%p",
+ Command, CommandBuffer);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+ gcmkVERIFY_ARGUMENT(CommandBuffer != gcvNULL);
+
+ /* Free command buffer. */
+ status = _FreeCommandBuffer(Command->kernel, CommandBuffer);
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+gceSTATUS
+gckVGCOMMAND_Execute(
+ IN gckVGCOMMAND Command,
+ IN gcsCMDBUFFER_PTR CommandBuffer
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Command=%p CommandBuffer=%p",
+ Command, CommandBuffer);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+ gcmkVERIFY_ARGUMENT(CommandBuffer != gcvNULL);
+
+ do
+ {
+ gctUINT queueLength;
+ gcsKERNEL_CMDQUEUE_PTR kernelEntry;
+
+ /* Lock the current queue. */
+ gcmkERR_BREAK(_LockCurrentQueue(
+ Command, &kernelEntry, &queueLength
+ ));
+
+ /* Set the buffer. */
+ kernelEntry->commandBuffer = CommandBuffer;
+ kernelEntry->handler = _FreeKernelCommandBuffer;
+
+ /* Lock the current queue. */
+ gcmkERR_BREAK(_UnlockCurrentQueue(
+ Command, 1
+ ));
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+gceSTATUS
+gckVGCOMMAND_Commit(
+ IN gckVGCOMMAND Command,
+ IN gcsVGCONTEXT_PTR Context,
+ IN gcsVGCMDQUEUE_PTR Queue,
+ IN gctUINT EntryCount,
+ IN gcsTASK_MASTER_TABLE_PTR TaskTable
+ )
+{
+ /*
+ The first buffer is executed through a direct gckVGHARDWARE_Execute call,
+ therefore only an update is needed after the execution is over. All
+ consequent buffers need to be executed upon the first update call from
+ the FE interrupt handler.
+ */
+ static gcsQUEUE_UPDATE_CONTROL _dynamicBuffer[] =
+ {
+ {
+ _UpdateDynamicCommandBuffer,
+ _UpdateDynamicCommandBuffer,
+ _UpdateLastDynamicCommandBuffer,
+ _UpdateLastDynamicCommandBuffer
+ },
+ {
+ _ExecuteDynamicCommandBuffer,
+ _UpdateDynamicCommandBuffer,
+ _ExecuteLastDynamicCommandBuffer,
+ _UpdateLastDynamicCommandBuffer
+ }
+ };
+
+ static gcsQUEUE_UPDATE_CONTROL _staticBuffer[] =
+ {
+ {
+ _UpdateStaticCommandBuffer,
+ _UpdateStaticCommandBuffer,
+ _UpdateLastStaticCommandBuffer,
+ _UpdateLastStaticCommandBuffer
+ },
+ {
+ _ExecuteStaticCommandBuffer,
+ _UpdateStaticCommandBuffer,
+ _ExecuteLastStaticCommandBuffer,
+ _UpdateLastStaticCommandBuffer
+ }
+ };
+
+ gceSTATUS status, last;
+ struct _gcsTASK_MASTER_TABLE _TaskTable;
+#ifdef __QNXNTO__
+ gcsVGCONTEXT_PTR userContext = gcvNULL;
+ gctBOOL userContextMapped = gcvFALSE;
+ gcsTASK_MASTER_TABLE_PTR userTaskTable = gcvNULL;
+ gctBOOL userTaskTableMapped = gcvFALSE;
+ gctPOINTER pointer = gcvNULL;
+#endif
+ struct _gcsVGCONTEXT _Context;
+ gctBOOL needCopy = gcvFALSE;
+
+ gcmkHEADER_ARG("Command=%p Context=%p Queue=%p EntryCount=0x%x TaskTable=%p",
+ Command, Context, Queue, EntryCount, TaskTable);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Command, gcvOBJ_COMMAND);
+ gcmkVERIFY_ARGUMENT(Context != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Queue != gcvNULL);
+ gcmkVERIFY_ARGUMENT(EntryCount > 1);
+
+ do
+ {
+ gctBOOL haveFETasks;
+ gctUINT queueSize = 0;
+ gcsVGCMDQUEUE_PTR mappedQueue=gcvNULL;
+ gcsVGCMDQUEUE_PTR userEntry=gcvNULL;
+ gcsKERNEL_CMDQUEUE_PTR kernelEntry;
+ gcsQUEUE_UPDATE_CONTROL_PTR queueControl;
+ gctUINT currentLength;
+ gctUINT queueLength;
+ gctUINT entriesQueued;
+ gctUINT8_PTR previousEnd;
+ gctBOOL previousDynamic;
+ gctBOOL previousExecuted;
+ gctUINT controlIndex;
+ gctINT pid;
+#ifdef __QNXNTO__
+ /* Map the context into the kernel space. */
+ userContext = Context;
+
+ gcmkERR_BREAK(gckOS_MapUserPointer(
+ Command->os,
+ userContext,
+ gcmSIZEOF(*userContext),
+ &pointer));
+
+ Context = pointer;
+
+ userContextMapped = gcvTRUE;
+
+ /* Map the taskTable into the kernel space. */
+ userTaskTable = TaskTable;
+
+ gcmkERR_BREAK(gckOS_MapUserPointer(
+ Command->os,
+ userTaskTable,
+ gcmSIZEOF(*userTaskTable),
+ &pointer));
+
+ TaskTable = pointer;
+
+ userTaskTableMapped = gcvTRUE;
+
+ /* Update the signal info. */
+ TaskTable->coid = Context->coid;
+ TaskTable->rcvid = Context->rcvid;
+#endif
+
+ gcmkERR_BREAK(gckOS_GetProcessID((gctUINT32_PTR)&pid));
+ gcmkERR_BREAK(gckOS_QueryNeedCopy(Command->os, pid, &needCopy));
+ if(needCopy)
+ {
+ gcmkERR_BREAK(gckOS_CopyFromUserData(
+ Command->os,
+ &_TaskTable,
+ TaskTable,
+ gcmSIZEOF(struct _gcsTASK_MASTER_TABLE)
+ ));
+ TaskTable = &_TaskTable;
+ /* Determine whether there are FE tasks to be performed. */
+ gcmkERR_BREAK(gckOS_CopyFromUserData(
+ Command->os,
+ &_Context,
+ Context,
+ gcmSIZEOF(struct _gcsVGCONTEXT)
+ ));
+ Context = &_Context;
+ }
+
+ gcmkERR_BREAK(gckVGHARDWARE_SetPowerState(
+ Command->hardware, gcvPOWER_ON_AUTO
+ ));
+
+ /* Acquire the power semaphore. */
+ gcmkERR_BREAK(gckOS_AcquireSemaphore(
+ Command->os, Command->powerSemaphore
+ ));
+
+ /* Acquire the mutex. */
+ status = gckOS_AcquireMutex(
+ Command->os,
+ Command->commitMutex,
+ gcvINFINITE
+ );
+
+ if (gcmIS_ERROR(status))
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseSemaphore(
+ Command->os, Command->powerSemaphore));
+ break;
+ }
+
+ do
+ {
+ gcmkERR_BREAK(_FlushMMU(Command));
+
+ /* Assign a context ID if not yet assigned. */
+ if (Context->id == 0)
+ {
+ /* Assign the next context number. */
+ Context->id = ++ Command->contextCounter;
+ /* See if we overflowed. */
+ if (Command->contextCounter == 0)
+ {
+ /* We actually did overflow, wow... */
+ status = gcvSTATUS_OUT_OF_RESOURCES;
+ break;
+ }
+ }
+
+ /* The first entry in the queue is always the context buffer.
+ Verify whether the user context is the same as the current
+ context and if that's the case, skip the first entry. */
+ if (Context->id == Command->currentContext)
+ {
+ /* Same context as before, skip the first entry. */
+ EntryCount -= 1;
+ Queue += 1;
+
+ /* Set the signal to avoid user waiting. */
+#ifdef __QNXNTO__
+ gcmkERR_BREAK(gckOS_UserSignal(
+ Command->os,
+ Context->userSignal,
+ Context->rcvid,
+ Context->coid
+ ));
+#else
+ gcmkERR_BREAK(gckOS_UserSignal(
+ Command->os, Context->signal, Context->process
+ ));
+#endif
+ }
+ else
+ {
+ /* Different user context - keep the first entry.
+ Set the user context as the current one. */
+ Command->currentContext = Context->id;
+ }
+
+ /* Reset pointers. */
+ queueControl = gcvNULL;
+ previousEnd = gcvNULL;
+
+ haveFETasks = (TaskTable->table[gcvBLOCK_COMMAND].head != gcvNULL);
+
+ /* Determine the size of the queue. */
+ queueSize = EntryCount * gcmSIZEOF(gcsVGCMDQUEUE);
+ if(needCopy)
+ {
+ gctPOINTER pointer = gcvNULL;
+ gcmkERR_BREAK(gckOS_Allocate(
+ Command->os,
+ queueSize,
+ &pointer
+ ));
+ userEntry = pointer;
+ mappedQueue = pointer;
+ gcmkERR_BREAK(gckOS_CopyFromUserData(
+ Command->os,
+ userEntry,
+ Queue,
+ queueSize
+ ));
+ }
+ else
+ {
+ /* Map the command queue into the kernel space. */
+ gcmkERR_BREAK(gckOS_MapUserPointer(
+ Command->os,
+ Queue,
+ queueSize,
+ (gctPOINTER *) &mappedQueue
+ ));
+ userEntry = mappedQueue;
+ }
+ /* Set the first entry. */
+
+ /* Process the command queue. */
+ while (EntryCount)
+ {
+ /* Lock the current queue. */
+ gcmkERR_BREAK(_LockCurrentQueue(
+ Command, &kernelEntry, &queueLength
+ ));
+
+ /* Determine the number of entries to process. */
+ currentLength = (queueLength < EntryCount)
+ ? queueLength
+ : EntryCount;
+
+ /* Update the number of the entries left to process. */
+ EntryCount -= currentLength;
+
+ /* Reset previous flags. */
+ previousDynamic = gcvFALSE;
+ previousExecuted = gcvFALSE;
+
+ /* Set the initial control index. */
+ controlIndex = 0;
+
+ /* Process entries. */
+ for (entriesQueued = 0; entriesQueued < currentLength; entriesQueued += 1)
+ {
+ /* Get the kernel pointer to the command buffer header. */
+ gcsCMDBUFFER_PTR commandBuffer = gcvNULL;
+ gcmkERR_BREAK(_ConvertUserCommandBufferPointer(
+ Command,
+ userEntry->commandBuffer,
+ &commandBuffer
+ ));
+
+ /* Is it a dynamic command buffer? */
+ if (userEntry->dynamic)
+ {
+ /* Select dynamic buffer control functions. */
+ queueControl = &_dynamicBuffer[controlIndex];
+ }
+
+ /* No, a static command buffer. */
+ else
+ {
+ /* Select static buffer control functions. */
+ queueControl = &_staticBuffer[controlIndex];
+ }
+
+ /* Set the command buffer pointer to the entry. */
+ kernelEntry->commandBuffer = commandBuffer;
+
+ /* If the previous entry was a dynamic command buffer,
+ link it to the current. */
+ if (previousDynamic)
+ {
+ gcmkERR_BREAK(gckVGCOMMAND_FetchCommand(
+ Command,
+ previousEnd,
+ commandBuffer->address,
+ commandBuffer->dataCount,
+ gcvNULL
+ ));
+
+ /* The buffer will be auto-executed, only need to
+ update it after it has been executed. */
+ kernelEntry->handler = queueControl->update;
+
+ /* The buffer is only being updated. */
+ previousExecuted = gcvFALSE;
+ }
+ else
+ {
+ /* Set the buffer up for execution. */
+ kernelEntry->handler = queueControl->execute;
+
+ /* The buffer is being updated. */
+ previousExecuted = gcvTRUE;
+ }
+
+ /* The current buffer's END command becomes the last END. */
+ previousEnd
+ = ((gctUINT8_PTR) commandBuffer)
+ + commandBuffer->bufferOffset
+ + commandBuffer->dataCount * Command->info.commandAlignment
+ - Command->info.staticTailSize;
+
+ /* Update the last entry info. */
+ previousDynamic = userEntry->dynamic;
+
+ /* Advance entries. */
+ userEntry ++;
+ kernelEntry ++;
+
+ /* Update the control index. */
+ controlIndex = 1;
+ }
+
+ /* If the previous entry was a dynamic command buffer,
+ terminate it with an END. */
+ if (previousDynamic)
+ {
+ gcmkERR_BREAK(gckVGCOMMAND_EndCommand(
+ Command,
+ previousEnd,
+ Command->info.feBufferInt,
+ gcvNULL
+ ));
+ }
+
+ /* Last buffer? */
+ if (EntryCount == 0)
+ {
+ /* Modify the last command buffer's routines to handle
+ tasks if any.*/
+ if (haveFETasks)
+ {
+ if (previousExecuted)
+ {
+ kernelEntry[-1].handler = queueControl->lastExecute;
+ }
+ else
+ {
+ kernelEntry[-1].handler = queueControl->lastUpdate;
+ }
+ }
+
+ /* Release the mutex. */
+ gcmkERR_BREAK(gckOS_ReleaseMutex(
+ Command->os,
+ Command->queueMutex
+ ));
+ /* Add a semaphore stall after PE EVENT (Before the END). */
+ {
+ gctUINT32_PTR memory = (gctUINT32_PTR)(previousEnd - 0x10);
+ *memory++ = 0x10000007;
+ *memory++ = 0;
+
+ *memory++ = 0x20000007;
+ *memory++ = 0;
+ }
+ /* Schedule tasks. */
+ gcmkERR_BREAK(_ScheduleTasks(Command, TaskTable, previousEnd - 0x10));
+
+ /* Acquire the mutex. */
+ gcmkERR_BREAK(gckOS_AcquireMutex(
+ Command->os,
+ Command->queueMutex,
+ gcvINFINITE
+ ));
+ }
+
+ /* Unkock and schedule the current queue for execution. */
+ gcmkERR_BREAK(_UnlockCurrentQueue(
+ Command, currentLength
+ ));
+ }
+ }
+ while (gcvFALSE);
+
+ if (mappedQueue)
+ {
+ if(!needCopy)
+ {
+ /* Unmap the user command buffer. */
+ gcmkERR_BREAK(gckOS_UnmapUserPointer(
+ Command->os,
+ Queue,
+ queueSize,
+ mappedQueue
+ ));
+ }
+ else
+ {
+ gcmkERR_BREAK(gckOS_Free(Command->os, mappedQueue));
+ }
+ }
+
+ /* Release the mutex. */
+ gcmkCHECK_STATUS(gckOS_ReleaseMutex(
+ Command->os,
+ Command->commitMutex
+ ));
+
+ gcmkVERIFY_OK(gckOS_ReleaseSemaphore(
+ Command->os, Command->powerSemaphore));
+ }
+ while (gcvFALSE);
+#ifdef __QNXNTO__
+ if (userContextMapped)
+ {
+ /* Unmap the user context. */
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Command->os,
+ userContext,
+ gcmSIZEOF(*userContext),
+ Context));
+ }
+
+ if (userTaskTableMapped)
+ {
+ /* Unmap the user taskTable. */
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(
+ Command->os,
+ userTaskTable,
+ gcmSIZEOF(*userTaskTable),
+ TaskTable));
+ }
+#endif
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+#endif /* gcdENABLE_VG */
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
new file mode 100644
index 000000000000..3bbb04bb372c
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_db.c
@@ -0,0 +1,1654 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+#define _GC_OBJ_ZONE gcvZONE_DATABASE
+
+/*******************************************************************************
+***** Private fuctions ********************************************************/
+
+#define _GetSlot(database, x) \
+ (gctUINT32)(gcmPTR_TO_UINT64(x) % gcmCOUNTOF(database->list))
+
+/*******************************************************************************
+** gckKERNEL_FindDatabase
+**
+** Find a database identified by a process ID and move it to the head of the
+** hash list.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** ProcessID that identifies the database.
+**
+** gctBOOL LastProcessID
+** gcvTRUE if searching for the last known process ID. gcvFALSE if
+** we need to search for the process ID specified by the ProcessID
+** argument.
+**
+** OUTPUT:
+**
+** gcsDATABASE_PTR * Database
+** Pointer to a variable receiving the database structure pointer on
+** success.
+*/
+gceSTATUS
+gckKERNEL_FindDatabase(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctBOOL LastProcessID,
+ OUT gcsDATABASE_PTR * Database
+ )
+{
+ gceSTATUS status;
+ gcsDATABASE_PTR database, previous;
+ gctSIZE_T slot;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d LastProcessID=%d",
+ Kernel, ProcessID, LastProcessID);
+
+ /* 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;
+
+ /* Check whether we are getting the last known database. */
+ if (LastProcessID)
+ {
+ /* Use last database. */
+ database = Kernel->db->lastDatabase;
+
+ if (database == gcvNULL)
+ {
+ /* Database not found. */
+ gcmkONERROR(gcvSTATUS_INVALID_DATA);
+ }
+ }
+ else
+ {
+ /* Walk the hash list. */
+ for (previous = gcvNULL, database = Kernel->db->db[slot];
+ database != gcvNULL;
+ database = database->next)
+ {
+ if (database->processID == ProcessID)
+ {
+ /* Found it! */
+ break;
+ }
+
+ previous = database;
+ }
+
+ if (database == gcvNULL)
+ {
+ /* Database not found. */
+ gcmkONERROR(gcvSTATUS_INVALID_DATA);
+ }
+
+ if (previous != gcvNULL)
+ {
+ /* Move database to the head of the hash list. */
+ previous->next = database->next;
+ database->next = Kernel->db->db[slot];
+ Kernel->db->db[slot] = database;
+ }
+ }
+
+ /* 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 (acquired)
+ {
+ /* Release the database mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** gckKERNEL_DeinitDatabase
+**
+** De-init a database structure.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gcsDATABASE_PTR Database
+** Pointer to the database structure to deinit.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+static gceSTATUS
+gckKERNEL_DeinitDatabase(
+ IN gckKERNEL Kernel,
+ IN gcsDATABASE_PTR Database
+ )
+{
+ gcmkHEADER_ARG("Kernel=%p Database=%p", Kernel, Database);
+
+ if (Database)
+ {
+ Database->deleted = gcvFALSE;
+
+ /* Destory handle db. */
+ if (Database->refs)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Kernel->os, Database->refs));
+ Database->refs = gcvNULL;
+ }
+
+ if (Database->handleDatabase)
+ {
+ gcmkVERIFY_OK(gckKERNEL_DestroyIntegerDatabase(Kernel, Database->handleDatabase));
+ Database->handleDatabase = gcvNULL;
+ }
+
+ if (Database->handleDatabaseMutex)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, Database->handleDatabaseMutex));
+ Database->handleDatabaseMutex = gcvNULL;
+ }
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+** gckKERNEL_NewRecord
+**
+** Create a new database record structure and insert it to the head of the
+** database.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gcsDATABASE_PTR Database
+** Pointer to a database structure.
+**
+** OUTPUT:
+**
+** gcsDATABASE_RECORD_PTR * Record
+** Pointer to a variable receiving the database record structure
+** pointer on success.
+*/
+static gceSTATUS
+gckKERNEL_NewRecord(
+ IN gckKERNEL Kernel,
+ IN gcsDATABASE_PTR Database,
+ IN gctUINT32 Slot,
+ OUT gcsDATABASE_RECORD_PTR * Record
+ )
+{
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+ gcsDATABASE_RECORD_PTR record = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=%p Database=%p", Kernel, Database);
+
+ /* Acquire the database mutex. */
+ gcmkONERROR(
+ gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ if (Kernel->db->freeRecord != gcvNULL)
+ {
+ /* Allocate the record from the free list. */
+ record = Kernel->db->freeRecord;
+ Kernel->db->freeRecord = record->next;
+ }
+ else
+ {
+ gctPOINTER pointer = gcvNULL;
+
+ /* Allocate the record from the heap. */
+ gcmkONERROR(gckOS_Allocate(Kernel->os,
+ gcmSIZEOF(gcsDATABASE_RECORD),
+ &pointer));
+
+ record = pointer;
+ }
+
+ /* Insert the record in the database. */
+ record->next = Database->list[Slot];
+ Database->list[Slot] = record;
+
+ /* Release the database mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
+
+ /* Return the record. */
+ *Record = record;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Record=0x%x", *Record);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Release the database mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
+ }
+ if (record != gcvNULL)
+ {
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, record));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** gckKERNEL_DeleteRecord
+**
+** Remove a database record from the database and delete its structure.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gcsDATABASE_PTR Database
+** Pointer to a database structure.
+**
+** gceDATABASE_TYPE Type
+** Type of the record to remove.
+**
+** gctPOINTER Data
+** Data of the record to remove.
+**
+** OUTPUT:
+**
+** gctSIZE_T_PTR Bytes
+** Pointer to a variable that receives the size of the record deleted.
+** Can be gcvNULL if the size is not required.
+*/
+static gceSTATUS
+gckKERNEL_DeleteRecord(
+ IN gckKERNEL Kernel,
+ IN gcsDATABASE_PTR Database,
+ IN gceDATABASE_TYPE Type,
+ IN gctPOINTER Data,
+ OUT gctSIZE_T_PTR Bytes OPTIONAL
+ )
+{
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+ gcsDATABASE_RECORD_PTR record, previous;
+ gctUINT32 slot = _GetSlot(Database, Data);
+
+ gcmkHEADER_ARG("Kernel=%p Database=%p Type=%d Data=%p",
+ Kernel, Database, Type, Data);
+
+ /* Acquire the database mutex. */
+ gcmkONERROR(
+ gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Scan the database for this record. */
+ for (record = Database->list[slot], previous = gcvNULL;
+ record != gcvNULL;
+ record = record->next
+ )
+ {
+ if ((record->type == Type)
+ && (record->data == Data)
+ )
+ {
+ /* Found it! */
+ break;
+ }
+
+ previous = record;
+ }
+
+ if (record == gcvNULL)
+ {
+ /* Ouch! This record is not found? */
+ gcmkONERROR(gcvSTATUS_INVALID_DATA);
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return size of record. */
+ *Bytes = record->bytes;
+ }
+
+ /* Remove record from database. */
+ if (previous == gcvNULL)
+ {
+ Database->list[slot] = record->next;
+ }
+ else
+ {
+ previous->next = record->next;
+ }
+
+ /* Insert record in free list. */
+ record->next = Kernel->db->freeRecord;
+ Kernel->db->freeRecord = record;
+
+ /* Release the database mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ 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;
+}
+
+/*******************************************************************************
+** gckKERNEL_FindRecord
+**
+** Find a database record from the database.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gcsDATABASE_PTR Database
+** Pointer to a database structure.
+**
+** gceDATABASE_TYPE Type
+** Type of the record to remove.
+**
+** gctPOINTER Data
+** Data of the record to remove.
+**
+** OUTPUT:
+**
+** gctSIZE_T_PTR Bytes
+** Pointer to a variable that receives the size of the record deleted.
+** Can be gcvNULL if the size is not required.
+*/
+static gceSTATUS
+gckKERNEL_FindRecord(
+ IN gckKERNEL Kernel,
+ IN gcsDATABASE_PTR Database,
+ IN gceDATABASE_TYPE Type,
+ IN gctPOINTER Data,
+ OUT gcsDATABASE_RECORD_PTR Record
+ )
+{
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+ gcsDATABASE_RECORD_PTR record;
+ gctUINT32 slot = _GetSlot(Database, Data);
+
+ gcmkHEADER_ARG("Kernel=%p Database=%p Type=%d Data=%p",
+ Kernel, Database, Type, Data);
+
+ /* Acquire the database mutex. */
+ gcmkONERROR(
+ gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Scan the database for this record. */
+ for (record = Database->list[slot];
+ record != gcvNULL;
+ record = record->next
+ )
+ {
+ if ((record->type == Type)
+ && (record->data == Data)
+ )
+ {
+ /* Found it! */
+ break;
+ }
+ }
+
+ if (record == gcvNULL)
+ {
+ /* Ouch! This record is not found? */
+ gcmkONERROR(gcvSTATUS_INVALID_DATA);
+ }
+
+ if (Record != gcvNULL)
+ {
+ /* Return information of record. */
+ gcmkONERROR(
+ gckOS_MemCopy(Record, record, sizeof(gcsDATABASE_RECORD)));
+ }
+
+ /* Release the database mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
+
+ /* Success. */
+ gcmkFOOTER_ARG("Record=0x%x", Record);
+ 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;
+}
+
+/*******************************************************************************
+***** Public API **************************************************************/
+
+/*******************************************************************************
+** gckKERNEL_CreateProcessDB
+**
+** Create a new process database.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** Process ID used to identify the database.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_CreateProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsDATABASE_PTR database = gcvNULL;
+ gctPOINTER pointer = gcvNULL;
+ gctBOOL acquired = gcvFALSE;
+ gctSIZE_T slot;
+ gctUINT32 i;
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d", Kernel, ProcessID);
+
+ /* 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;
+ }
+ }
+
+ 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. */
+ /* 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->mapMemory.bytes = 0;
+ database->mapMemory.maxBytes = 0;
+ database->mapMemory.totalBytes = 0;
+
+ for (i = 0; i < gcmCOUNTOF(database->list); i++)
+ {
+ database->list[i] = gcvNULL;
+ }
+
+ for (i = 0; i < gcvVIDMEM_TYPE_COUNT; i++)
+ {
+ database->vidMemType[i].bytes = 0;
+ database->vidMemType[i].maxBytes = 0;
+ database->vidMemType[i].totalBytes = 0;
+ }
+
+ for (i = 0; i < gcvPOOL_NUMBER_OF_POOLS; i++)
+ {
+ database->vidMemPool[i].bytes = 0;
+ database->vidMemPool[i].maxBytes = 0;
+ 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, 64, &database->handleDatabase));
+
+ gcmkASSERT(database->handleDatabaseMutex == gcvNULL);
+ gcmkONERROR(gckOS_CreateMutex(Kernel->os, &database->handleDatabaseMutex));
+
+ /* Insert the database into the hash. */
+ database->next = Kernel->db->db[slot];
+ Kernel->db->db[slot] = database;
+
+ /* Reset idle timer. */
+ Kernel->db->lastIdle = 0;
+
+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;
+}
+
+/*******************************************************************************
+** gckKERNEL_AddProcessDB
+**
+** Add a record to a process database.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** Process ID used to identify the database.
+**
+** gceDATABASE_TYPE TYPE
+** Type of the record to add.
+**
+** gctPOINTER Pointer
+** Data of the record to add.
+**
+** gctPHYS_ADDR Physical
+** Physical address of the record to add.
+**
+** gctSIZE_T Size
+** Size of the record to add.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_AddProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gceDATABASE_TYPE Type,
+ IN gctPOINTER Pointer,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Size
+ )
+{
+ gceSTATUS status;
+ gcsDATABASE_PTR database;
+ gcsDATABASE_RECORD_PTR record = gcvNULL;
+ gcsDATABASE_COUNTERS * count;
+ gctUINT32 vidMemType;
+ gcePOOL vidMemPool;
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d Type=%d Pointer=%p "
+ "Physical=%p Size=%lu",
+ Kernel, ProcessID, Type, Pointer, Physical, Size);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ /* Decode type. */
+ vidMemType = (Type & gcdDB_VIDEO_MEMORY_TYPE_MASK) >> gcdDB_VIDEO_MEMORY_TYPE_SHIFT;
+ vidMemPool = (Type & gcdDB_VIDEO_MEMORY_POOL_MASK) >> gcdDB_VIDEO_MEMORY_POOL_SHIFT;
+
+ Type &= gcdDATABASE_TYPE_MASK;
+
+ /* Special case the idle record. */
+ if (Type == gcvDB_IDLE)
+ {
+ gctUINT64 time;
+
+ /* Get the current profile time. */
+ gcmkONERROR(gckOS_GetProfileTick(&time));
+
+ if ((ProcessID == 0) && (Kernel->db->lastIdle != 0))
+ {
+ /* Out of idle, adjust time it was idle. */
+ Kernel->db->idleTime += time - Kernel->db->lastIdle;
+ Kernel->db->lastIdle = 0;
+ }
+ else if (ProcessID == 1)
+ {
+ /* Save current idle time. */
+ Kernel->db->lastIdle = time;
+ }
+
+#if gcdDYNAMIC_SPEED
+ {
+ /* Test for first call. */
+ if (Kernel->db->lastSlowdown == 0)
+ {
+ /* Save milliseconds. */
+ Kernel->db->lastSlowdown = time;
+ Kernel->db->lastSlowdownIdle = Kernel->db->idleTime;
+ }
+ else
+ {
+ /* Compute ellapsed time in milliseconds. */
+ gctUINT delta = gckOS_ProfileToMS(time - Kernel->db->lastSlowdown);
+
+ /* Test for end of period. */
+ if (delta >= gcdDYNAMIC_SPEED)
+ {
+ /* Compute number of idle milliseconds. */
+ gctUINT idle = gckOS_ProfileToMS(
+ Kernel->db->idleTime - Kernel->db->lastSlowdownIdle);
+
+ /* Broadcast to slow down the GPU. */
+ gcmkONERROR(gckOS_BroadcastCalibrateSpeed(Kernel->os,
+ Kernel->hardware,
+ idle,
+ delta));
+
+ /* Save current time. */
+ Kernel->db->lastSlowdown = time;
+ Kernel->db->lastSlowdownIdle = Kernel->db->idleTime;
+ }
+ }
+ }
+#endif
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(Pointer != gcvNULL);
+
+ /* Find the database. */
+ gcmkONERROR(gckKERNEL_FindDatabase(Kernel, ProcessID, gcvFALSE, &database));
+
+ /* Create a new record in the database. */
+ gcmkONERROR(gckKERNEL_NewRecord(Kernel, database, _GetSlot(database, Pointer), &record));
+
+ /* Initialize the record. */
+ record->kernel = Kernel;
+ record->type = Type;
+ record->data = Pointer;
+ record->physical = Physical;
+ record->bytes = Size;
+
+ /* Get pointer to counters. */
+ switch (Type)
+ {
+ case gcvDB_VIDEO_MEMORY:
+ count = &database->vidMem;
+ break;
+
+ case gcvDB_NON_PAGED:
+ count = &database->nonPaged;
+ break;
+
+ case gcvDB_MAP_MEMORY:
+ count = &database->mapMemory;
+ break;
+
+ default:
+ count = gcvNULL;
+ break;
+ }
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, database->counterMutex, gcvINFINITE));
+
+ if (count != gcvNULL)
+ {
+ /* Adjust counters. */
+ count->totalBytes += Size;
+ count->bytes += Size;
+ count->allocCount++;
+
+ if (count->bytes > count->maxBytes)
+ {
+ count->maxBytes = count->bytes;
+ }
+ }
+
+ if (Type == gcvDB_VIDEO_MEMORY)
+ {
+ count = &database->vidMemType[vidMemType];
+
+ /* Adjust counters. */
+ count->totalBytes += Size;
+ count->bytes += Size;
+ count->allocCount++;
+
+ if (count->bytes > count->maxBytes)
+ {
+ count->maxBytes = count->bytes;
+ }
+
+ count = &database->vidMemPool[vidMemPool];
+
+ /* Adjust counters. */
+ count->totalBytes += Size;
+ count->bytes += Size;
+ count->allocCount++;
+
+ if (count->bytes > count->maxBytes)
+ {
+ count->maxBytes = count->bytes;
+ }
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, database->counterMutex));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** gckKERNEL_RemoveProcessDB
+**
+** Remove a record from a process database.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** Process ID used to identify the database.
+**
+** gceDATABASE_TYPE TYPE
+** Type of the record to remove.
+**
+** gctPOINTER Pointer
+** Data of the record to remove.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_RemoveProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gceDATABASE_TYPE Type,
+ IN gctPOINTER Pointer
+ )
+{
+ gceSTATUS status;
+ gcsDATABASE_PTR database;
+ gctSIZE_T bytes = 0;
+ gctUINT32 vidMemType;
+ gcePOOL vidMemPool;
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d Type=%d Pointer=%p",
+ Kernel, ProcessID, Type, Pointer);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Pointer != gcvNULL);
+
+ /* Decode type. */
+ vidMemType = (Type & gcdDB_VIDEO_MEMORY_TYPE_MASK) >> gcdDB_VIDEO_MEMORY_TYPE_SHIFT;
+ vidMemPool = (Type & gcdDB_VIDEO_MEMORY_POOL_MASK) >> gcdDB_VIDEO_MEMORY_POOL_SHIFT;
+
+ Type &= gcdDATABASE_TYPE_MASK;
+
+ /* Find the database. */
+ gcmkONERROR(gckKERNEL_FindDatabase(Kernel, ProcessID, gcvFALSE, &database));
+
+ /* Delete the record. */
+ gcmkONERROR(
+ gckKERNEL_DeleteRecord(Kernel, database, Type, Pointer, &bytes));
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, database->counterMutex, gcvINFINITE));
+
+ /* Update counters. */
+ switch (Type)
+ {
+ case gcvDB_VIDEO_MEMORY:
+ database->vidMem.bytes -= bytes;
+ database->vidMem.freeCount++;
+ database->vidMemType[vidMemType].bytes -= bytes;
+ database->vidMemType[vidMemType].freeCount++;
+ database->vidMemPool[vidMemPool].bytes -= bytes;
+ database->vidMemPool[vidMemPool].freeCount++;
+ break;
+
+ case gcvDB_NON_PAGED:
+ database->nonPaged.bytes -= bytes;
+ database->nonPaged.freeCount++;
+ break;
+
+ case gcvDB_MAP_MEMORY:
+ database->mapMemory.bytes -= bytes;
+ database->mapMemory.freeCount++;
+ break;
+
+ default:
+ break;
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, database->counterMutex));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** gckKERNEL_FindProcessDB
+**
+** Find a record from a process database.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** Process ID used to identify the database.
+**
+** gceDATABASE_TYPE TYPE
+** Type of the record to remove.
+**
+** gctPOINTER Pointer
+** Data of the record to remove.
+**
+** OUTPUT:
+**
+** gcsDATABASE_RECORD_PTR Record
+** Copy of record.
+*/
+gceSTATUS
+gckKERNEL_FindProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 ThreadID,
+ IN gceDATABASE_TYPE Type,
+ IN gctPOINTER Pointer,
+ OUT gcsDATABASE_RECORD_PTR Record
+ )
+{
+ gceSTATUS status;
+ gcsDATABASE_PTR database;
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d Type=%d Pointer=%p",
+ Kernel, ProcessID, ThreadID, Type, Pointer);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Pointer != gcvNULL);
+
+ /* Find the database. */
+ gcmkONERROR(gckKERNEL_FindDatabase(Kernel, ProcessID, gcvFALSE, &database));
+
+ /* Find the record. */
+ gcmkONERROR(
+ gckKERNEL_FindRecord(Kernel, database, Type, Pointer, Record));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** gckKERNEL_DestroyProcessDB
+**
+** Destroy a process database. If the database contains any records, the data
+** inside those records will be deleted as well. This aids in the cleanup if
+** a process has died unexpectedly or has memory leaks.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** Process ID used to identify the database.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_DestroyProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gckKERNEL kernel = Kernel;
+ gcsDATABASE_PTR previous = gcvNULL;
+ gcsDATABASE_PTR database = gcvNULL;
+ gcsDATABASE_PTR db = gcvNULL;
+ gctBOOL acquired = gcvFALSE;
+ gctSIZE_T slot;
+ gctUINT32 i;
+
+ gcmkHEADER_ARG("Kernel=%p 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)
+ {
+ 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",
+ ProcessID, database->vidMem.totalBytes,
+ database->vidMem.maxBytes);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_DATABASE,
+ "DB(%d): NonPaged: total=%lu max=%lu",
+ ProcessID, database->nonPaged.totalBytes,
+ database->nonPaged.maxBytes);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_DATABASE,
+ "DB(%d): Idle time=%llu",
+ ProcessID, Kernel->db->idleTime);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_DATABASE,
+ "DB(%d): Map: total=%lu max=%lu",
+ ProcessID, database->mapMemory.totalBytes,
+ database->mapMemory.maxBytes);
+
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_DATABASE,
+ "Process %d has entries in its database:",
+ ProcessID);
+ }
+
+ for (i = 0; i < gcmCOUNTOF(database->list); i++)
+ {
+ gcsDATABASE_RECORD_PTR record, next;
+
+ /* Walk all records. */
+ for (record = database->list[i]; record != gcvNULL; record = next)
+ {
+ gctBOOL asynchronous = gcvTRUE;
+ gckVIDMEM_NODE nodeObject;
+ gctPHYS_ADDR physical;
+ gctUINT32 handle;
+
+ /* Next next record. */
+ next = record->next;
+
+ /* Dispatch on record type. */
+ switch (record->type)
+ {
+ 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;
+
+ case gcvDB_NON_PAGED:
+ physical = gcmNAME_TO_PTR(record->physical);
+
+ /* Free the non paged memory. */
+ status = gckOS_FreeNonPagedMemory(Kernel->os,
+ physical,
+ record->data,
+ record->bytes);
+
+ 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_SIGNAL:
+#if USE_NEW_LINUX_SIGNAL
+ status = gcvSTATUS_NOT_SUPPORTED;
+#else
+ /* 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;
+
+ case gcvDB_VIDEO_MEMORY_LOCKED:
+ handle = gcmPTR2INT32(record->data);
+
+ gcmkERR_BREAK(gckVIDMEM_HANDLE_Lookup(record->kernel,
+ ProcessID,
+ handle,
+ &nodeObject));
+
+ /* Unlock CPU. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_UnlockCPU(
+ record->kernel, nodeObject, ProcessID, gcvTRUE, gcvFALSE));
+
+ /* Unlock what we still locked */
+ status = gckVIDMEM_NODE_Unlock(record->kernel,
+ nodeObject,
+ ProcessID,
+ &asynchronous);
+
+#if gcdENABLE_VG
+ if (record->kernel->core == gcvCORE_VG)
+ {
+ if (gcmIS_SUCCESS(status) && (gcvTRUE == asynchronous))
+ {
+ status = gckVIDMEM_NODE_Unlock(record->kernel,
+ nodeObject,
+ ProcessID,
+ gcvNULL);
+ }
+
+ /* Deref handle. */
+ gcmkVERIFY_OK(gckVIDMEM_HANDLE_Dereference(record->kernel,
+ ProcessID,
+ handle));
+
+ /* Deref node. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(record->kernel,
+ nodeObject));
+ }
+ else
+#endif
+ {
+ /* Deref handle. */
+ gcmkVERIFY_OK(gckVIDMEM_HANDLE_Dereference(record->kernel,
+ ProcessID,
+ handle));
+
+ if (gcmIS_SUCCESS(status) && (gcvTRUE == asynchronous))
+ {
+ /* Schedule unlock: will unlock and deref node later. */
+ status = gckEVENT_Unlock(record->kernel->eventObj,
+ gcvKERNEL_PIXEL,
+ nodeObject);
+ }
+ else
+ {
+ /* Deref node */
+ 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;
+
+ 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;
+
+ 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_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;
+
+ 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;
+
+ /* Walk the hash list. */
+ for (db = Kernel->db->db[slot];
+ db != gcvNULL;
+ db = db->next)
+ {
+ if (db->processID == ProcessID)
+ {
+ break;
+ }
+ previous = db;
+ }
+
+ 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;
+ }
+
+ /* Deinit current database. */
+ gcmkVERIFY_OK(gckKERNEL_DeinitDatabase(Kernel, database));
+
+ 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;
+}
+
+/*******************************************************************************
+** gckKERNEL_QueryProcessDB
+**
+** Query a process database for the current usage of a particular record type.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to a gckKERNEL object.
+**
+** gctUINT32 ProcessID
+** Process ID used to identify the database.
+**
+** gctBOOL LastProcessID
+** gcvTRUE if searching for the last known process ID. gcvFALSE if
+** we need to search for the process ID specified by the ProcessID
+** argument.
+**
+** gceDATABASE_TYPE Type
+** Type of the record to query.
+**
+** OUTPUT:
+**
+** gcuDATABASE_INFO * Info
+** Pointer to a variable that receives the requested information.
+*/
+gceSTATUS
+gckKERNEL_QueryProcessDB(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctBOOL LastProcessID,
+ IN gceDATABASE_TYPE Type,
+ OUT gcuDATABASE_INFO * Info
+ )
+{
+ gceSTATUS status;
+ gcsDATABASE_PTR database;
+ gcePOOL vidMemPool;
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d Type=%d Info=%p",
+ Kernel, ProcessID, Type, Info);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Info != gcvNULL);
+
+ /* Deocde pool. */
+ vidMemPool = (Type & gcdDB_VIDEO_MEMORY_POOL_MASK) >> gcdDB_VIDEO_MEMORY_POOL_SHIFT;
+
+ Type &= gcdDATABASE_TYPE_MASK;
+
+ /* Find the database. */
+ gcmkONERROR(gckKERNEL_FindDatabase(Kernel, ProcessID, LastProcessID, &database));
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, database->counterMutex, gcvINFINITE));
+
+ /* Get pointer to counters. */
+ switch (Type)
+ {
+ case gcvDB_VIDEO_MEMORY:
+ if (vidMemPool != gcvPOOL_UNKNOWN)
+ {
+ gckOS_MemCopy(&Info->counters,
+ &database->vidMemPool[vidMemPool],
+ gcmSIZEOF(database->vidMemPool[vidMemPool]));
+ }
+ else
+ {
+ gckOS_MemCopy(&Info->counters,
+ &database->vidMem,
+ gcmSIZEOF(database->vidMem));
+ }
+ break;
+
+ case gcvDB_NON_PAGED:
+ gckOS_MemCopy(&Info->counters,
+ &database->nonPaged,
+ gcmSIZEOF(database->vidMem));
+ break;
+
+ case gcvDB_IDLE:
+ Info->time = Kernel->db->idleTime;
+ Kernel->db->idleTime = 0;
+ break;
+
+ case gcvDB_MAP_MEMORY:
+ gckOS_MemCopy(&Info->counters,
+ &database->mapMemory,
+ gcmSIZEOF(database->mapMemory));
+ break;
+
+ default:
+ break;
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, database->counterMutex));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_FindHandleDatbase(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ OUT gctPOINTER * HandleDatabase,
+ OUT gctPOINTER * HandleDatabaseMutex
+ )
+{
+ gceSTATUS status;
+ gcsDATABASE_PTR database;
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d",
+ Kernel, ProcessID);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ /* Find the database. */
+ gcmkONERROR(gckKERNEL_FindDatabase(Kernel, ProcessID, gcvFALSE, &database));
+
+ *HandleDatabase = database->handleDatabase;
+ *HandleDatabaseMutex = database->handleDatabaseMutex;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_DumpProcessDB(
+ IN gckKERNEL Kernel
+ )
+{
+ gcsDATABASE_PTR database;
+ gctINT i, pid;
+ gctUINT8 name[24];
+
+ gcmkHEADER_ARG("Kernel=%p", Kernel);
+
+ /* Acquire the database mutex. */
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(Kernel->os, Kernel->db->dbMutex, gcvINFINITE));
+
+ gcmkPRINT("**************************\n");
+ gcmkPRINT("*** PROCESS DB DUMP ***\n");
+ gcmkPRINT("**************************\n");
+
+ gcmkPRINT_N(8, "%-8s%s\n", "PID", "NAME");
+ /* Walk the databases. */
+ for (i = 0; i < gcmCOUNTOF(Kernel->db->db); ++i)
+ {
+ for (database = Kernel->db->db[i];
+ database != gcvNULL;
+ database = database->next)
+ {
+ pid = database->processID;
+
+ gcmkVERIFY_OK(gckOS_ZeroMemory(name, gcmSIZEOF(name)));
+
+ gcmkVERIFY_OK(gckOS_GetProcessNameByPid(pid, gcmSIZEOF(name), name));
+
+ gcmkPRINT_N(8, "%-8d%s\n", pid, name);
+ }
+ }
+
+ /* Release the database mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->db->dbMutex));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+void
+_DumpCounter(
+ IN gcsDATABASE_COUNTERS * Counter,
+ IN gctCONST_STRING Name
+ )
+{
+ gcmkPRINT("%s:", Name);
+ gcmkPRINT(" Currently allocated : %10lld", Counter->bytes);
+ gcmkPRINT(" Maximum allocated : %10lld", Counter->maxBytes);
+ gcmkPRINT(" Total allocated : %10lld", Counter->totalBytes);
+}
+
+gceSTATUS
+gckKERNEL_DumpVidMemUsage(
+ IN gckKERNEL Kernel,
+ IN gctINT32 ProcessID
+ )
+{
+ gceSTATUS status;
+ gcsDATABASE_PTR database;
+ gcsDATABASE_COUNTERS * counter;
+ gctUINT32 i = 0;
+
+ static gctCONST_STRING vidmemTypes[] = {
+ "GENERIC",
+ "INDEX",
+ "VERTEX",
+ "TEXTURE",
+ "RENDER_TARGET",
+ "DEPTH",
+ "BITMAP",
+ "TILE_STATUS",
+ "IMAGE",
+ "MASK",
+ "SCISSOR",
+ "HIERARCHICAL_DEPTH",
+ "ICACHE",
+ "TXDESC",
+ "FENCE",
+ "TFBHEADER",
+ "COMMAND",
+ };
+
+ gcmkHEADER_ARG("Kernel=%p ProcessID=%d",
+ Kernel, ProcessID);
+
+ gcmSTATIC_ASSERT(gcmCOUNTOF(vidmemTypes) == gcvVIDMEM_TYPE_COUNT,
+ "Video memory type mismatch");
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ /* Find the database. */
+ gcmkONERROR(
+ gckKERNEL_FindDatabase(Kernel, ProcessID, gcvFALSE, &database));
+
+ gcmkPRINT("VidMem Usage (Process %d):", ProcessID);
+
+ /* Get pointer to counters. */
+ counter = &database->vidMem;
+
+ _DumpCounter(counter, "Total Video Memory");
+
+ for (i = 0; i < gcvVIDMEM_TYPE_COUNT; i++)
+ {
+ counter = &database->vidMemType[i];
+
+ _DumpCounter(counter, vidmemTypes[i]);
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c
new file mode 100644
index 000000000000..474fd12dbbbe
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_debug.c
@@ -0,0 +1,1312 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+#include <gc_hal_kernel_debug.h>
+
+/******************************************************************************\
+******************************** Debug Variables *******************************
+\******************************************************************************/
+
+static gceSTATUS _lastError = gcvSTATUS_OK;
+static gctUINT32 _debugLevel = gcvLEVEL_ERROR;
+/*
+_debugZones config value
+Please Reference define in gc_hal_base.h
+*/
+static gctUINT32 _debugZones = gcdZONE_NONE;
+
+/******************************************************************************\
+********************************* Debug Switches *******************************
+\******************************************************************************/
+
+/*
+ gcdTHREAD_BUFFERS
+
+ When greater then one, will accumulate messages from the specified number
+ of threads in separate output buffers.
+*/
+#define gcdTHREAD_BUFFERS 1
+
+/*
+ gcdSHOW_LINE_NUMBER
+
+ When enabledm each print statement will be preceeded with the current
+ line number.
+*/
+#define gcdSHOW_LINE_NUMBER 0
+
+/*
+ gcdSHOW_PROCESS_ID
+
+ When enabledm each print statement will be preceeded with the current
+ process ID.
+*/
+#define gcdSHOW_PROCESS_ID 0
+
+/*
+ gcdSHOW_THREAD_ID
+
+ When enabledm each print statement will be preceeded with the current
+ thread ID.
+*/
+#define gcdSHOW_THREAD_ID 0
+
+/*
+ gcdSHOW_TIME
+
+ When enabled each print statement will be preceeded with the current
+ high-resolution time.
+*/
+#define gcdSHOW_TIME 0
+
+
+/******************************************************************************\
+****************************** Miscellaneous Macros ****************************
+\******************************************************************************/
+
+#if gcdSHOW_TIME || gcdSHOW_LINE_NUMBER || gcdSHOW_PROCESS_ID || gcdSHOW_THREAD_ID
+# define gcdHAVEPREFIX 1
+#else
+# define gcdHAVEPREFIX 0
+#endif
+
+/******************************************************************************\
+****************************** Private Structures ******************************
+\******************************************************************************/
+
+typedef struct _gcsBUFFERED_OUTPUT * gcsBUFFERED_OUTPUT_PTR;
+typedef struct _gcsBUFFERED_OUTPUT
+{
+#if gcdTHREAD_BUFFERS > 1
+ gctUINT32 threadID;
+#endif
+
+#if gcdSHOW_LINE_NUMBER
+ gctUINT lineNumber;
+#endif
+
+ gctINT indent;
+
+ gcsBUFFERED_OUTPUT_PTR prev;
+ gcsBUFFERED_OUTPUT_PTR next;
+}
+gcsBUFFERED_OUTPUT;
+
+static gcsBUFFERED_OUTPUT _outputBuffer[gcdTHREAD_BUFFERS];
+static gcsBUFFERED_OUTPUT_PTR _outputBufferHead = gcvNULL;
+static gcsBUFFERED_OUTPUT_PTR _outputBufferTail = gcvNULL;
+
+/******************************************************************************\
+******************************* Printing Functions *****************************
+\******************************************************************************/
+
+#if gcdHAVEPREFIX
+
+#if gcdSHOW_TIME
+static gcmINLINE gctUINT64
+_GetTime(
+ void
+ )
+{
+ gctUINT64 time;
+ gckOS_GetProfileTick(&time);
+ return time;
+}
+# define gcdPREFIX_LEADER 1
+# define gcdTIMEFORMAT "%18lld"
+# define gcdTIMEVALUE ,_GetTime()
+# else
+# define gcdTIMEFORMAT
+# define gcdTIMEVALUE
+# endif
+
+#if gcdSHOW_LINE_NUMBER
+#ifndef gcdPREFIX_LEADER
+# define gcdPREFIX_LEADER 1
+# define gcdNUMFORMAT "%8u"
+# else
+# define gcdNUMFORMAT ", %8u"
+# endif
+# define gcdNUMVALUE ,OutputBuffer->lineNumber
+# else
+# define gcdNUMFORMAT
+# define gcdNUMVALUE
+# endif
+
+#if gcdSHOW_PROCESS_ID
+#ifndef gcdPREFIX_LEADER
+# define gcdPREFIX_LEADER 1
+# define gcdPIDFORMAT "pid=%5u"
+# else
+# define gcdPIDFORMAT ", pid=%5u"
+# endif
+# define gcdPIDVALUE ,gcmkGETPROCESSID()
+# else
+# define gcdPIDFORMAT
+# define gcdPIDVALUE
+# endif
+
+#if gcdSHOW_THREAD_ID
+#ifndef gcdPREFIX_LEADER
+# define gcdPREFIX_LEADER 1
+# define gcdTIDFORMAT "tid=%5u"
+# else
+# define gcdTIDFORMAT ", tid=%5u"
+# endif
+# define gcdTIDVALUE ,gcmkGETTHREADID()
+# else
+# define gcdTIDFORMAT
+# define gcdTIDVALUE
+# endif
+
+static gctUINT
+_PrintPrefix(
+ IN gcsBUFFERED_OUTPUT_PTR OutputBuffer,
+ IN char Buffer[],
+ IN gctUINT Size
+ )
+{
+ gctINT len;
+
+ /* Format the string. */
+ len = gcmkSPRINTF(Buffer,
+ Size,
+ "[" gcdTIMEFORMAT gcdNUMFORMAT gcdPIDFORMAT gcdTIDFORMAT "] "
+ gcdTIMEVALUE gcdNUMVALUE gcdPIDVALUE gcdTIDVALUE);
+
+ if (len > 0)
+ {
+ Buffer[len] = '\0';
+ return (gctUINT)len;
+ }
+
+ return 0;
+}
+#endif
+
+static int
+_AppendIndent(
+ IN gctINT Indent,
+ IN char * Buffer,
+ IN int BufferSize
+ )
+{
+ gctINT i;
+
+ gctINT len = 0;
+ gctINT indent = Indent % 40;
+
+ for (i = 0; i < indent; i += 1)
+ {
+ Buffer[len++] = ' ';
+ }
+
+ if (indent != Indent)
+ {
+ len += gcmkSPRINTF(
+ Buffer + len, BufferSize - len, " <%d> ", Indent
+ );
+
+ Buffer[len] = '\0';
+ }
+
+ return len;
+}
+
+static gctUINT
+_PrintString(
+ IN gcsBUFFERED_OUTPUT_PTR OutputBuffer,
+ IN gctINT Indent,
+ IN gctCONST_STRING Message,
+ IN gctPOINTER Data,
+ IN char Buffer[],
+ IN gctUINT Size
+ )
+{
+ gctINT len;
+
+ /* Append the indent string. */
+ len = _AppendIndent(Indent, Buffer, Size);
+
+ /* Format the string. */
+ len += gcmkVSPRINTF(Buffer + len, Size - len, Message, Data);
+ Buffer[len] = '\0';
+
+ /* Add end-of-line if missing. */
+ if (Buffer[len - 1] != '\n')
+ {
+ Buffer[len++] = '\n';
+ Buffer[len] = '\0';
+ }
+
+ return (gctUINT)len;
+}
+
+/******************************************************************************\
+******************************* Private Functions ******************************
+\******************************************************************************/
+
+static gcmINLINE void
+_InitBuffers(
+ void
+ )
+{
+ int i;
+
+ if (_outputBufferHead == gcvNULL)
+ {
+ for (i = 0; i < gcdTHREAD_BUFFERS; i += 1)
+ {
+ if (_outputBufferTail == gcvNULL)
+ {
+ _outputBufferHead = &_outputBuffer[i];
+ }
+ else
+ {
+ _outputBufferTail->next = &_outputBuffer[i];
+ }
+
+#if gcdTHREAD_BUFFERS > 1
+ _outputBuffer[i].threadID = ~0U;
+#endif
+
+ _outputBuffer[i].prev = _outputBufferTail;
+ _outputBuffer[i].next = gcvNULL;
+
+ _outputBufferTail = &_outputBuffer[i];
+ }
+ }
+}
+
+static gcmINLINE gcsBUFFERED_OUTPUT_PTR
+_GetOutputBuffer(
+ void
+ )
+{
+ gcsBUFFERED_OUTPUT_PTR outputBuffer;
+
+#if gcdTHREAD_BUFFERS > 1
+ /* Get the current thread ID. */
+ gctUINT32 ThreadID = gcmkGETTHREADID();
+
+ /* Locate the output buffer for the thread. */
+ outputBuffer = _outputBufferHead;
+
+ while (outputBuffer != gcvNULL)
+ {
+ if (outputBuffer->threadID == ThreadID)
+ {
+ break;
+ }
+
+ outputBuffer = outputBuffer->next;
+ }
+
+ /* No matching buffer found? */
+ if (outputBuffer == gcvNULL)
+ {
+ /* Get the tail for the buffer. */
+ outputBuffer = _outputBufferTail;
+
+ /* Move it to the head. */
+ _outputBufferTail = _outputBufferTail->prev;
+ _outputBufferTail->next = gcvNULL;
+
+ outputBuffer->prev = gcvNULL;
+ outputBuffer->next = _outputBufferHead;
+
+ _outputBufferHead->prev = outputBuffer;
+ _outputBufferHead = outputBuffer;
+
+ /* Reset the buffer. */
+ outputBuffer->threadID = ThreadID;
+#if gcdSHOW_LINE_NUMBER
+ outputBuffer->lineNumber = 0;
+# endif
+ }
+#else
+ outputBuffer = _outputBufferHead;
+#endif
+
+ return outputBuffer;
+}
+
+static void
+_Print(
+ IN gctCONST_STRING Message,
+ IN gctARGUMENTS * Arguments
+ )
+{
+ gcsBUFFERED_OUTPUT_PTR outputBuffer;
+ char buffer[256];
+ char *ptr = buffer;
+ gctINT len = 0;
+ static gcmkDECLARE_MUTEX(printMutex);
+
+ gcmkMUTEX_LOCK(printMutex);
+
+ /* Initialize output buffer list. */
+ _InitBuffers();
+
+ /* Locate the proper output buffer. */
+ outputBuffer = _GetOutputBuffer();
+
+ /* Print prefix. */
+#if gcdHAVEPREFIX
+#if gcdSHOW_LINE_NUMBER
+ /* Update the line number. */
+ outputBuffer->lineNumber += 1;
+# endif
+
+ /* Print the prefix. */
+ len = _PrintPrefix(outputBuffer, buffer, gcmSIZEOF(buffer));
+ ptr += len;
+#endif
+
+ /* Form the indent string. */
+ if (Message[0] == '-' && Message[1] == '-')
+ {
+ outputBuffer->indent -= 2;
+ }
+
+ /* Print the message. */
+ len += _PrintString(
+ outputBuffer, outputBuffer->indent,
+ Message, ((gctPOINTER) Arguments),
+ ptr, gcmSIZEOF(buffer) - outputBuffer->indent - len
+ );
+
+ gcmkOUTPUT_STRING(buffer);
+
+ /* Check increasing indent. */
+ if (Message[0] == '+' && Message[1] == '+')
+ {
+ outputBuffer->indent += 2;
+ }
+
+ gcmkMUTEX_UNLOCK(printMutex);
+}
+
+
+/******************************************************************************\
+********************************* Debug Macros *********************************
+\******************************************************************************/
+
+#ifdef __QNXNTO__
+
+extern volatile unsigned g_nQnxInIsrs;
+
+#define gcmDEBUGPRINT(Message) \
+{ \
+ if (atomic_add_value(&g_nQnxInIsrs, 1) == 0) \
+ { \
+ gctARGUMENTS __arguments__; \
+ gcmkARGUMENTS_START(__arguments__, Message); \
+ _Print(Message, &__arguments__); \
+ gcmkARGUMENTS_END(__arguments__); \
+ } \
+ atomic_sub(&g_nQnxInIsrs, 1); \
+}
+
+#elif defined(__VXWORKS__)
+#define gcmDEBUGPRINT(Message) \
+{ \
+ printf(Message); \
+}
+
+#else
+
+#define gcmDEBUGPRINT(Message) \
+{ \
+ gctARGUMENTS __arguments__; \
+ gcmkARGUMENTS_START(__arguments__, Message); \
+ _Print(Message, &__arguments__); \
+ gcmkARGUMENTS_END(__arguments__); \
+}
+
+#endif
+
+/******************************************************************************\
+********************************** Debug Code **********************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** gckOS_Print
+**
+** Send a message to the debugger.
+**
+** INPUT:
+**
+** gctCONST_STRING Message
+** Pointer to message.
+**
+** ...
+** Optional arguments.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+void
+gckOS_Print(
+ IN gctCONST_STRING Message,
+ ...
+ )
+{
+ gcmDEBUGPRINT(Message);
+}
+
+/*******************************************************************************
+**
+** gckOS_DebugTrace
+**
+** Send a leveled message to the debugger.
+**
+** INPUT:
+**
+** gctUINT32 Level
+** Debug level of message.
+**
+** gctCONST_STRING Message
+** Pointer to message.
+**
+** ...
+** Optional arguments.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+void
+gckOS_DebugTrace(
+ IN gctUINT32 Level,
+ IN gctCONST_STRING Message,
+ ...
+ )
+{
+ if (Level > _debugLevel)
+ {
+ return;
+ }
+
+ gcmDEBUGPRINT(Message);
+}
+
+/*******************************************************************************
+**
+** gckOS_DebugTraceZone
+**
+** Send a leveled and zoned message to the debugger.
+**
+** INPUT:
+**
+** gctUINT32 Level
+** Debug level for message.
+**
+** gctUINT32 Zone
+** Debug zone for message.
+**
+** gctCONST_STRING Message
+** Pointer to message.
+**
+** ...
+** Optional arguments.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+void
+gckOS_DebugTraceZone(
+ IN gctUINT32 Level,
+ IN gctUINT32 Zone,
+ IN gctCONST_STRING Message,
+ ...
+ )
+{
+ if ((Level > _debugLevel) || !(Zone & _debugZones))
+ {
+ return;
+ }
+
+ gcmDEBUGPRINT(Message);
+}
+
+/*******************************************************************************
+**
+** gckOS_DebugBreak
+**
+** Break into the debugger.
+**
+** INPUT:
+**
+** Nothing.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+void
+gckOS_DebugBreak(
+ void
+ )
+{
+ gckOS_DebugTrace(gcvLEVEL_ERROR, "%s(%d)", __FUNCTION__, __LINE__);
+}
+
+/*******************************************************************************
+**
+** gckOS_DebugFatal
+**
+** Send a message to the debugger and break into the debugger.
+**
+** INPUT:
+**
+** gctCONST_STRING Message
+** Pointer to message.
+**
+** ...
+** Optional arguments.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+void
+gckOS_DebugFatal(
+ IN gctCONST_STRING Message,
+ ...
+ )
+{
+ gcmkPRINT_VERSION();
+ gcmDEBUGPRINT(Message);
+
+ /* Break into the debugger. */
+ gckOS_DebugBreak();
+}
+
+/*******************************************************************************
+**
+** gckOS_SetDebugLevel
+**
+** Set the debug level.
+**
+** INPUT:
+**
+** gctUINT32 Level
+** New debug level.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+void
+gckOS_SetDebugLevel(
+ IN gctUINT32 Level
+ )
+{
+ _debugLevel = Level;
+}
+
+/*******************************************************************************
+**
+** gckOS_SetDebugZone
+**
+** Set the debug zone.
+**
+** INPUT:
+**
+** gctUINT32 Zone
+** New debug zone.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+void
+gckOS_SetDebugZone(
+ IN gctUINT32 Zone
+ )
+{
+ _debugZones = Zone;
+}
+
+/*******************************************************************************
+**
+** gckOS_SetDebugLevelZone
+**
+** Set the debug level and zone.
+**
+** INPUT:
+**
+** gctUINT32 Level
+** New debug level.
+**
+** gctUINT32 Zone
+** New debug zone.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+void
+gckOS_SetDebugLevelZone(
+ IN gctUINT32 Level,
+ IN gctUINT32 Zone
+ )
+{
+ _debugLevel = Level;
+ _debugZones = Zone;
+}
+
+/*******************************************************************************
+**
+** gckOS_SetDebugZones
+**
+** Enable or disable debug zones.
+**
+** INPUT:
+**
+** gctUINT32 Zones
+** Debug zones to enable or disable.
+**
+** gctBOOL Enable
+** Set to gcvTRUE to enable the zones (or the Zones with the current
+** zones) or gcvFALSE to disable the specified Zones.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+void
+gckOS_SetDebugZones(
+ IN gctUINT32 Zones,
+ IN gctBOOL Enable
+ )
+{
+ if (Enable)
+ {
+ /* Enable the zones. */
+ _debugZones |= Zones;
+ }
+ else
+ {
+ /* Disable the zones. */
+ _debugZones &= ~Zones;
+ }
+}
+
+/*******************************************************************************
+**
+** gckOS_Verify
+**
+** Called to verify the result of a function call.
+**
+** INPUT:
+**
+** gceSTATUS Status
+** Function call result.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+void
+gckOS_Verify(
+ IN gceSTATUS status
+ )
+{
+ _lastError = status;
+}
+
+gctCONST_STRING
+gckOS_DebugStatus2Name(
+ gceSTATUS status
+ )
+{
+ switch (status)
+ {
+ case gcvSTATUS_OK:
+ return "gcvSTATUS_OK";
+ case gcvSTATUS_TRUE:
+ return "gcvSTATUS_TRUE";
+ case gcvSTATUS_NO_MORE_DATA:
+ return "gcvSTATUS_NO_MORE_DATA";
+ case gcvSTATUS_CACHED:
+ return "gcvSTATUS_CACHED";
+ case gcvSTATUS_MIPMAP_TOO_LARGE:
+ return "gcvSTATUS_MIPMAP_TOO_LARGE";
+ case gcvSTATUS_NAME_NOT_FOUND:
+ return "gcvSTATUS_NAME_NOT_FOUND";
+ case gcvSTATUS_NOT_OUR_INTERRUPT:
+ return "gcvSTATUS_NOT_OUR_INTERRUPT";
+ case gcvSTATUS_MISMATCH:
+ return "gcvSTATUS_MISMATCH";
+ case gcvSTATUS_MIPMAP_TOO_SMALL:
+ return "gcvSTATUS_MIPMAP_TOO_SMALL";
+ case gcvSTATUS_LARGER:
+ return "gcvSTATUS_LARGER";
+ case gcvSTATUS_SMALLER:
+ return "gcvSTATUS_SMALLER";
+ case gcvSTATUS_CHIP_NOT_READY:
+ return "gcvSTATUS_CHIP_NOT_READY";
+ case gcvSTATUS_NEED_CONVERSION:
+ return "gcvSTATUS_NEED_CONVERSION";
+ case gcvSTATUS_SKIP:
+ return "gcvSTATUS_SKIP";
+ case gcvSTATUS_DATA_TOO_LARGE:
+ return "gcvSTATUS_DATA_TOO_LARGE";
+ case gcvSTATUS_INVALID_CONFIG:
+ return "gcvSTATUS_INVALID_CONFIG";
+ case gcvSTATUS_CHANGED:
+ return "gcvSTATUS_CHANGED";
+ case gcvSTATUS_NOT_SUPPORT_DITHER:
+ return "gcvSTATUS_NOT_SUPPORT_DITHER";
+
+ case gcvSTATUS_INVALID_ARGUMENT:
+ return "gcvSTATUS_INVALID_ARGUMENT";
+ case gcvSTATUS_INVALID_OBJECT:
+ return "gcvSTATUS_INVALID_OBJECT";
+ case gcvSTATUS_OUT_OF_MEMORY:
+ return "gcvSTATUS_OUT_OF_MEMORY";
+ case gcvSTATUS_MEMORY_LOCKED:
+ return "gcvSTATUS_MEMORY_LOCKED";
+ case gcvSTATUS_MEMORY_UNLOCKED:
+ return "gcvSTATUS_MEMORY_UNLOCKED";
+ case gcvSTATUS_HEAP_CORRUPTED:
+ return "gcvSTATUS_HEAP_CORRUPTED";
+ case gcvSTATUS_GENERIC_IO:
+ return "gcvSTATUS_GENERIC_IO";
+ case gcvSTATUS_INVALID_ADDRESS:
+ return "gcvSTATUS_INVALID_ADDRESS";
+ case gcvSTATUS_CONTEXT_LOSSED:
+ return "gcvSTATUS_CONTEXT_LOSSED";
+ case gcvSTATUS_TOO_COMPLEX:
+ return "gcvSTATUS_TOO_COMPLEX";
+ case gcvSTATUS_BUFFER_TOO_SMALL:
+ return "gcvSTATUS_BUFFER_TOO_SMALL";
+ case gcvSTATUS_INTERFACE_ERROR:
+ return "gcvSTATUS_INTERFACE_ERROR";
+ case gcvSTATUS_NOT_SUPPORTED:
+ return "gcvSTATUS_NOT_SUPPORTED";
+ case gcvSTATUS_MORE_DATA:
+ return "gcvSTATUS_MORE_DATA";
+ case gcvSTATUS_TIMEOUT:
+ return "gcvSTATUS_TIMEOUT";
+ case gcvSTATUS_OUT_OF_RESOURCES:
+ return "gcvSTATUS_OUT_OF_RESOURCES";
+ case gcvSTATUS_INVALID_DATA:
+ return "gcvSTATUS_INVALID_DATA";
+ case gcvSTATUS_INVALID_MIPMAP:
+ return "gcvSTATUS_INVALID_MIPMAP";
+ case gcvSTATUS_NOT_FOUND:
+ return "gcvSTATUS_NOT_FOUND";
+ case gcvSTATUS_NOT_ALIGNED:
+ return "gcvSTATUS_NOT_ALIGNED";
+ case gcvSTATUS_INVALID_REQUEST:
+ return "gcvSTATUS_INVALID_REQUEST";
+ case gcvSTATUS_GPU_NOT_RESPONDING:
+ return "gcvSTATUS_GPU_NOT_RESPONDING";
+ case gcvSTATUS_TIMER_OVERFLOW:
+ return "gcvSTATUS_TIMER_OVERFLOW";
+ case gcvSTATUS_VERSION_MISMATCH:
+ return "gcvSTATUS_VERSION_MISMATCH";
+ case gcvSTATUS_LOCKED:
+ return "gcvSTATUS_LOCKED";
+ case gcvSTATUS_INTERRUPTED:
+ return "gcvSTATUS_INTERRUPTED";
+ case gcvSTATUS_DEVICE:
+ return "gcvSTATUS_DEVICE";
+ case gcvSTATUS_NOT_MULTI_PIPE_ALIGNED:
+ return "gcvSTATUS_NOT_MULTI_PIPE_ALIGNED";
+
+ /* Linker errors. */
+ case gcvSTATUS_GLOBAL_TYPE_MISMATCH:
+ return "gcvSTATUS_GLOBAL_TYPE_MISMATCH";
+ case gcvSTATUS_TOO_MANY_ATTRIBUTES:
+ return "gcvSTATUS_TOO_MANY_ATTRIBUTES";
+ case gcvSTATUS_TOO_MANY_UNIFORMS:
+ return "gcvSTATUS_TOO_MANY_UNIFORMS";
+ case gcvSTATUS_TOO_MANY_VARYINGS:
+ return "gcvSTATUS_TOO_MANY_VARYINGS";
+ case gcvSTATUS_UNDECLARED_VARYING:
+ return "gcvSTATUS_UNDECLARED_VARYING";
+ case gcvSTATUS_VARYING_TYPE_MISMATCH:
+ return "gcvSTATUS_VARYING_TYPE_MISMATCH";
+ case gcvSTATUS_MISSING_MAIN:
+ return "gcvSTATUS_MISSING_MAIN";
+ case gcvSTATUS_NAME_MISMATCH:
+ return "gcvSTATUS_NAME_MISMATCH";
+ case gcvSTATUS_INVALID_INDEX:
+ return "gcvSTATUS_INVALID_INDEX";
+ case gcvSTATUS_UNIFORM_MISMATCH:
+ return "gcvSTATUS_UNIFORM_MISMATCH";
+ case gcvSTATUS_UNSAT_LIB_SYMBOL:
+ return "gcvSTATUS_UNSAT_LIB_SYMBOL";
+ case gcvSTATUS_TOO_MANY_SHADERS:
+ return "gcvSTATUS_TOO_MANY_SHADERS";
+ case gcvSTATUS_LINK_INVALID_SHADERS:
+ return "gcvSTATUS_LINK_INVALID_SHADERS";
+ case gcvSTATUS_CS_NO_WORKGROUP_SIZE:
+ return "gcvSTATUS_CS_NO_WORKGROUP_SIZE";
+ case gcvSTATUS_LINK_LIB_ERROR:
+ return "gcvSTATUS_LINK_LIB_ERROR";
+ case gcvSTATUS_SHADER_VERSION_MISMATCH:
+ return "gcvSTATUS_SHADER_VERSION_MISMATCH";
+ case gcvSTATUS_TOO_MANY_INSTRUCTION:
+ return "gcvSTATUS_TOO_MANY_INSTRUCTION";
+ case gcvSTATUS_SSBO_MISMATCH:
+ return "gcvSTATUS_SSBO_MISMATCH";
+ case gcvSTATUS_TOO_MANY_OUTPUT:
+ return "gcvSTATUS_TOO_MANY_OUTPUT";
+ case gcvSTATUS_TOO_MANY_INPUT:
+ return "gcvSTATUS_TOO_MANY_INPUT";
+ case gcvSTATUS_NOT_SUPPORT_CL:
+ return "gcvSTATUS_NOT_SUPPORT_CL";
+ case gcvSTATUS_NOT_SUPPORT_INTEGER:
+ return "gcvSTATUS_NOT_SUPPORT_INTEGER";
+ case gcvSTATUS_UNIFORM_TYPE_MISMATCH:
+ return "gcvSTATUS_UNIFORM_TYPE_MISMATCH";
+ case gcvSTATUS_MISSING_PRIMITIVE_TYPE:
+ return "gcvSTATUS_MISSING_PRIMITIVE_TYPE";
+ case gcvSTATUS_MISSING_OUTPUT_VERTEX_COUNT:
+ return "gcvSTATUS_MISSING_OUTPUT_VERTEX_COUNT";
+ case gcvSTATUS_NON_INVOCATION_ID_AS_INDEX:
+ return "gcvSTATUS_NON_INVOCATION_ID_AS_INDEX";
+ case gcvSTATUS_INPUT_ARRAY_SIZE_MISMATCH:
+ return "gcvSTATUS_INPUT_ARRAY_SIZE_MISMATCH";
+ case gcvSTATUS_OUTPUT_ARRAY_SIZE_MISMATCH:
+ return "gcvSTATUS_OUTPUT_ARRAY_SIZE_MISMATCH";
+
+ /* Compiler errors. */
+ case gcvSTATUS_COMPILER_FE_PREPROCESSOR_ERROR:
+ return "gcvSTATUS_COMPILER_FE_PREPROCESSOR_ERROR";
+ case gcvSTATUS_COMPILER_FE_PARSER_ERROR:
+ return "gcvSTATUS_COMPILER_FE_PARSER_ERROR";
+ default:
+ return "nil";
+ }
+}
+
+/*******************************************************************************
+***** Kernel Dump **************************************************************
+*******************************************************************************/
+
+/*
+ * TODO: Dump to file is only valid in linux currently.
+ */
+#ifndef gcmkDUMP_STRING
+# define gcmkDUMP_STRING(os, s) gcmkOUTPUT_STRING((s))
+#endif
+
+static gcmkDECLARE_MUTEX(_dumpMutex);
+static gctCHAR _dumpStorage[512];
+
+/*******************************************************************************
+**
+** gckOS_Dump
+**
+** Formated print string to dump pool.
+**
+** INPUT:
+**
+** gctCONST_STRING Format
+** String format.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+void
+gckOS_Dump(
+ IN gckOS Os,
+ IN gctCONST_STRING Format,
+ ...
+ )
+{
+ char buffer[256];
+ gctINT len;
+ gctARGUMENTS args;
+
+ gcmkARGUMENTS_START(args, Format);
+ len = gcmkVSPRINTF(buffer, gcmSIZEOF(buffer) - 2, Format, &args);
+ gcmkARGUMENTS_END(args);
+
+ if (len > 0)
+ {
+ if (buffer[len - 1] != '\n')
+ {
+ buffer[len] = '\n';
+ buffer[len + 1] = '\0';
+ }
+
+ gcmkMUTEX_LOCK(_dumpMutex);
+ gcmkDUMP_STRING(Os, buffer);
+ gcmkMUTEX_UNLOCK(_dumpMutex);
+ }
+}
+
+static void
+_DumpUserString(
+ IN gckOS Os,
+ IN gctPOINTER UserStr,
+ IN gctSIZE_T Size
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctSIZE_T offset = 0;
+ gctSIZE_T length = 0;
+ gctBOOL needCopy = gcvTRUE;
+ const gctSIZE_T maxLength = gcmSIZEOF(_dumpStorage) - 1;
+
+ gcmkVERIFY_OK(gckOS_QueryNeedCopy(Os, 0, &needCopy));
+
+ gcmkMUTEX_LOCK(_dumpMutex);
+
+ while (offset < Size)
+ {
+ length = maxLength < (Size - offset) ? maxLength : (Size - offset);
+
+ /* Copy or map from user. */
+ if (needCopy)
+ {
+ gcmkONERROR(gckOS_CopyFromUserData(
+ Os,
+ _dumpStorage,
+ UserStr,
+ length
+ ));
+ }
+ else
+ {
+ gctPOINTER ptr = gcvNULL;
+
+ gcmkONERROR(gckOS_MapUserPointer(
+ Os,
+ UserStr,
+ length,
+ (gctPOINTER *)&ptr
+ ));
+
+ gckOS_MemCopy(_dumpStorage, ptr, length);
+ gckOS_UnmapUserPointer(Os, UserStr, length, ptr);
+ }
+
+ _dumpStorage[length] = '\0';
+ gcmkDUMP_STRING(Os, _dumpStorage);
+
+ UserStr = (gctUINT8_PTR)UserStr + length;
+ offset += length;
+ }
+
+ gcmkDUMP_STRING(Os, "\n");
+
+OnError:
+ gcmkMUTEX_UNLOCK(_dumpMutex);
+}
+
+static void
+_DumpDataBuffer(
+ IN gckOS Os,
+ IN gceDUMP_BUFFER_TYPE Type,
+ IN gctPOINTER Data,
+ IN gctUINT64 Address,
+ IN gctSIZE_T Size
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctSIZE_T offset = 0;
+ gctSIZE_T length = 0;
+ gctBOOL needCopy = gcvTRUE;
+ gctCONST_STRING dumpTag;
+ char buffer[256];
+ const gctSIZE_T maxLength = gcmSIZEOF(_dumpStorage);
+
+ switch (Type)
+ {
+ case gcvDUMP_BUFFER_VERIFY:
+ dumpTag = "verify";
+ break;
+ case gcvDUMP_BUFFER_PHYSICAL_MEMORY:
+ dumpTag = "physical";
+ break;
+ default:
+ dumpTag = "memory";
+ break;
+ }
+
+ if (Type <= gcvDUMP_BUFFER_USER_TYPE_LAST)
+ {
+ gcmkVERIFY_OK(gckOS_QueryNeedCopy(Os, 0, &needCopy));
+ }
+
+ gcmkMUTEX_LOCK(_dumpMutex);
+
+ /* Form and print the opening string. */
+ if (Type == gcvDUMP_BUFFER_PHYSICAL_MEMORY)
+ {
+ gcmkSPRINTF(buffer, gcmSIZEOF(buffer) - 1,
+ "@[%s 0x%010llX 0x%08X\n",
+ dumpTag, (unsigned long long)Address, (gctUINT32)Size);
+ }
+ else
+ {
+ gcmkSPRINTF(buffer, gcmSIZEOF(buffer) - 1,
+ "@[%s 0x%08X 0x%08X\n",
+ dumpTag, (gctUINT32)Address, (gctUINT32)Size);
+ }
+
+ gcmkDUMP_STRING(Os, buffer);
+
+
+ while (offset < Size)
+ {
+ gctPOINTER data = gcvNULL;
+ gctUINT32_PTR ptr;
+ gctUINT8_PTR bytePtr;
+ gctSIZE_T count, tailByteCount;
+
+ length = maxLength < (Size - offset) ? maxLength : (Size - offset);
+ count = length / 4;
+ tailByteCount = length % 4;
+
+ ptr = (gctUINT32_PTR)Data;
+
+ if (Type <= gcvDUMP_BUFFER_USER_TYPE_LAST)
+ {
+ /* Copy or map from user. */
+ if (needCopy)
+ {
+ gcmkONERROR(gckOS_CopyFromUserData(
+ Os,
+ _dumpStorage,
+ Data,
+ length
+ ));
+
+ ptr = (gctUINT32_PTR)_dumpStorage;
+ }
+ else
+ {
+ gcmkONERROR(gckOS_MapUserPointer(
+ Os,
+ Data,
+ length,
+ (gctPOINTER *)&data
+ ));
+
+ ptr = (gctUINT32_PTR)data;
+ }
+ }
+
+ while (count >= 4)
+ {
+ gcmkSPRINTF(buffer, gcmSIZEOF(buffer) - 1,
+ " 0x%08X 0x%08X 0x%08X 0x%08X\n",
+ ptr[0], ptr[1], ptr[2], ptr[3]);
+
+ ptr += 4;
+ count -= 4;
+
+ gcmkDUMP_STRING(Os, buffer);
+ }
+
+ switch (count)
+ {
+ case 3:
+ gcmkSPRINTF(buffer, gcmSIZEOF(buffer) - 1,
+ " 0x%08X 0x%08X 0x%08X",
+ ptr[0], ptr[1], ptr[2]);
+ break;
+ case 2:
+ gcmkSPRINTF(buffer, gcmSIZEOF(buffer) - 1,
+ " 0x%08X 0x%08X",
+ ptr[0], ptr[1]);
+ break;
+ case 1:
+ gcmkSPRINTF(buffer, gcmSIZEOF(buffer) - 1, " 0x%08X", ptr[0]);
+ break;
+ }
+
+ if (count > 0)
+ {
+ gcmkDUMP_STRING(Os, buffer);
+ }
+
+ bytePtr = (gctUINT8_PTR)(ptr + count);
+
+ if (!count && tailByteCount)
+ {
+ /* There is an extra space for the new line. */
+ gcmkDUMP_STRING(Os, " ");
+ }
+
+ switch (tailByteCount)
+ {
+ case 3:
+ gcmkSPRINTF(buffer, gcmSIZEOF(buffer) - 1,
+ " 0x00%02X%02X%02X",
+ bytePtr[2], bytePtr[1], bytePtr[0]);
+ break;
+ case 2:
+ gcmkSPRINTF(buffer, gcmSIZEOF(buffer) - 1,
+ " 0x0000%02X%02X",
+ bytePtr[1], bytePtr[0]);
+ break;
+ case 1:
+ gcmkSPRINTF(buffer, gcmSIZEOF(buffer) - 1,
+ " 0x000000%02X", bytePtr[0]);
+ break;
+ }
+
+ if (tailByteCount)
+ {
+ gcmkDUMP_STRING(Os, buffer);
+ }
+
+ if (count || tailByteCount)
+ {
+ gcmkDUMP_STRING(Os, "\n");
+ }
+
+ if (Type <= gcvDUMP_BUFFER_USER_TYPE_LAST && !needCopy)
+ {
+ gckOS_UnmapUserPointer(Os, Data, length, data);
+ }
+ /* advance to next batch. */
+ Data = (gctUINT8_PTR)Data + length;
+ offset += length;
+ }
+
+OnError:
+ gcmkSPRINTF(buffer, gcmSIZEOF(buffer) - 1, "] -- %s\n", dumpTag);
+ gcmkDUMP_STRING(Os, buffer);
+
+ gcmkMUTEX_UNLOCK(_dumpMutex);
+}
+
+/*******************************************************************************
+**
+** gckOS_DumpBuffer
+**
+** Print the contents of the specified buffer.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to gckOS object.
+**
+** gceDUMP_BUFFER_TYPE Type
+** Buffer type.
+**
+** gctPOINTER Buffer
+** Pointer to the buffer to print.
+**
+** gctUINT64 Address
+** Address.
+**
+** gctUINT Size
+** Size of the buffer.
+**
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+void
+gckOS_DumpBuffer(
+ IN gckOS Os,
+ IN gceDUMP_BUFFER_TYPE Type,
+ IN gctPOINTER Buffer,
+ IN gctUINT64 Address,
+ IN gctSIZE_T Size
+ )
+{
+ if (!Buffer)
+ {
+ return;
+ }
+
+ /* memory dump below. */
+ if (Type >= gcvDUMP_BUFFER_TYPE_COUNT)
+ {
+ gcmkPRINT("#[ERROR: invalid buffer type]\n");
+ return;
+ }
+
+ if (Type == gcvDUMP_BUFFER_USER_STRING)
+ {
+ _DumpUserString(Os, Buffer, Size);
+ }
+ else
+ {
+ _DumpDataBuffer(Os, Type, Buffer, Address, Size);
+ }
+}
+
+
+/*******************************************************************************
+***** Binary Trace *************************************************************
+*******************************************************************************/
+
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
new file mode 100644
index 000000000000..76a33053a034
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_event.c
@@ -0,0 +1,2392 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+#include "gc_hal_kernel_buffer.h"
+
+#ifdef __QNXNTO__
+#include "gc_hal_kernel_qnx.h"
+#endif
+
+#define _GC_OBJ_ZONE gcvZONE_EVENT
+
+#define gcdEVENT_ALLOCATION_COUNT (4096 / gcmSIZEOF(gcsHAL_INTERFACE))
+#define gcdEVENT_MIN_THRESHOLD 4
+
+/******************************************************************************\
+********************************* Support Code *********************************
+\******************************************************************************/
+
+static gcmINLINE gceSTATUS
+gckEVENT_AllocateQueue(
+ IN gckEVENT Event,
+ OUT gcsEVENT_QUEUE_PTR * Queue
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Event=0x%x", Event);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+ gcmkVERIFY_ARGUMENT(Queue != gcvNULL);
+
+ /* Do we have free queues? */
+ if (Event->freeList == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ /* Move one free queue from the free list. */
+ * Queue = Event->freeList;
+ Event->freeList = Event->freeList->next;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Queue=0x%x", gcmOPT_POINTER(Queue));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+gckEVENT_FreeQueue(
+ IN gckEVENT Event,
+ OUT gcsEVENT_QUEUE_PTR Queue
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Event=0x%x", Event);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+ gcmkVERIFY_ARGUMENT(Queue != gcvNULL);
+
+ /* Move one free queue from the free list. */
+ Queue->next = Event->freeList;
+ Event->freeList = Queue;
+
+ /* Success. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+gckEVENT_FreeRecord(
+ IN gckEVENT Event,
+ IN gcsEVENT_PTR Record
+ )
+{
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Event=0x%x Record=0x%x", Event, Record);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+ gcmkVERIFY_ARGUMENT(Record != gcvNULL);
+
+ /* Acquire the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Event->os,
+ Event->freeEventMutex,
+ gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Push the record on the free list. */
+ Record->next = Event->freeEventList;
+ Event->freeEventList = Record;
+ Event->freeEventCount += 1;
+
+ /* Release the mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Event->os, Event->freeEventMutex));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Event->os, Event->freeEventMutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+gckEVENT_IsEmpty(
+ IN gckEVENT Event,
+ OUT gctBOOL_PTR IsEmpty
+ )
+{
+ gceSTATUS status;
+ gctSIZE_T i;
+
+ gcmkHEADER_ARG("Event=0x%x", Event);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+ gcmkVERIFY_ARGUMENT(IsEmpty != gcvNULL);
+
+ /* Assume the event queue is empty. */
+ *IsEmpty = gcvTRUE;
+
+ /* Walk the event queue. */
+ for (i = 0; i < gcmCOUNTOF(Event->queues); ++i)
+ {
+ /* Check whether this event is in use. */
+ if (Event->queues[i].head != gcvNULL)
+ {
+ /* The event is in use, hence the queue is not empty. */
+ *IsEmpty = gcvFALSE;
+ break;
+ }
+ }
+
+ /* Try acquiring the mutex. */
+ status = gckOS_AcquireMutex(Event->os, Event->eventQueueMutex, 0);
+ if (status == gcvSTATUS_TIMEOUT)
+ {
+ /* Timeout - queue is no longer empty. */
+ *IsEmpty = gcvFALSE;
+ }
+ else
+ {
+ /* Bail out on error. */
+ gcmkONERROR(status);
+
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Event->os, Event->eventQueueMutex));
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*IsEmpty=%d", gcmOPT_VALUE(IsEmpty));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_TryToIdleGPU(
+ IN gckEVENT Event
+ )
+{
+ gceSTATUS status;
+ gctBOOL empty = gcvFALSE, idle = gcvFALSE;
+ gctBOOL powerLocked = gcvFALSE;
+ gckHARDWARE hardware;
+
+ gcmkHEADER_ARG("Event=0x%x", Event);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+
+ /* Grab gckHARDWARE object. */
+ hardware = Event->kernel->hardware;
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ /* Check whether the event queue is empty. */
+ gcmkONERROR(gckEVENT_IsEmpty(Event, &empty));
+
+ if (empty)
+ {
+ status = gckOS_AcquireMutex(hardware->os, hardware->powerMutex, 0);
+ if (status == gcvSTATUS_TIMEOUT)
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ powerLocked = gcvTRUE;
+
+ /* Query whether the hardware is idle. */
+ gcmkONERROR(gckHARDWARE_QueryIdle(Event->kernel->hardware, &idle));
+
+ gcmkONERROR(gckOS_ReleaseMutex(hardware->os, hardware->powerMutex));
+ powerLocked = gcvFALSE;
+
+ if (idle)
+ {
+ /* Inform the system of idle GPU. */
+ gcmkONERROR(gckOS_Broadcast(Event->os,
+ Event->kernel->hardware,
+ gcvBROADCAST_GPU_IDLE));
+ }
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (powerLocked)
+ {
+ gcmkONERROR(gckOS_ReleaseMutex(hardware->os, hardware->powerMutex));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+__RemoveRecordFromProcessDB(
+ IN gckEVENT Event,
+ IN gcsEVENT_PTR Record
+ )
+{
+ gcmkHEADER_ARG("Event=0x%x Record=0x%x", Event, Record);
+ gcmkVERIFY_ARGUMENT(Record != gcvNULL);
+
+ switch (Record->info.command)
+ {
+ case gcvHAL_UNLOCK_VIDEO_MEMORY:
+ gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(
+ Event->kernel,
+ Record->processID,
+ gcvDB_VIDEO_MEMORY_LOCKED,
+ gcmUINT64_TO_PTR(Record->info.u.UnlockVideoMemory.node)));
+ break;
+
+ default:
+ break;
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_ReleaseVideoMemoryHandle(
+ IN gckKERNEL Kernel,
+ IN OUT gcsEVENT_PTR Record,
+ IN OUT gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE nodeObject;
+ gctUINT32 handle;
+
+ switch(Interface->command)
+ {
+ case gcvHAL_UNLOCK_VIDEO_MEMORY:
+ handle = (gctUINT32)Interface->u.UnlockVideoMemory.node;
+
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(
+ Kernel, Record->processID, handle, &nodeObject));
+
+ Record->info.u.UnlockVideoMemory.node = gcmPTR_TO_UINT64(nodeObject);
+
+ gckVIDMEM_HANDLE_Dereference(Kernel, Record->processID, handle);
+ break;
+
+ default:
+ break;
+ }
+
+ return gcvSTATUS_OK;
+OnError:
+ return status;
+}
+
+/*******************************************************************************
+**
+** _QueryFlush
+**
+** Check the type of surfaces which will be released by current event and
+** determine the cache needed to flush.
+**
+*/
+static gceSTATUS
+_QueryFlush(
+ IN gckEVENT Event,
+ IN gcsEVENT_PTR Record,
+ OUT gceKERNEL_FLUSH *Flush
+ )
+{
+ gceKERNEL_FLUSH flush = 0;
+ gckVIDMEM_NODE nodeObject;
+
+ gcmkHEADER_ARG("Event=0x%x Record=0x%x", Event, Record);
+ gcmkVERIFY_ARGUMENT(Record != gcvNULL);
+
+ while (Record != gcvNULL)
+ {
+ switch (Record->info.command)
+ {
+ case gcvHAL_UNLOCK_VIDEO_MEMORY:
+ nodeObject = gcmUINT64_TO_PTR(Record->info.u.UnlockVideoMemory.node);
+
+ switch (nodeObject->type)
+ {
+ case gcvVIDMEM_TYPE_TILE_STATUS:
+ flush |= gcvFLUSH_TILE_STATUS;
+ break;
+ case gcvVIDMEM_TYPE_COLOR_BUFFER:
+ flush |= gcvFLUSH_COLOR;
+ break;
+ case gcvVIDMEM_TYPE_DEPTH_BUFFER:
+ flush |= gcvFLUSH_DEPTH;
+ break;
+ case gcvVIDMEM_TYPE_TEXTURE:
+ flush |= gcvFLUSH_TEXTURE;
+ break;
+ case gcvVIDMEM_TYPE_ICACHE:
+ flush |= gcvFLUSH_ICACHE;
+ break;
+ case gcvVIDMEM_TYPE_TXDESC:
+ flush |= gcvFLUSH_TXDESC;
+ break;
+ case gcvVIDMEM_TYPE_FENCE:
+ flush |= gcvFLUSH_FENCE;
+ break;
+ case gcvVIDMEM_TYPE_VERTEX_BUFFER:
+ flush |= gcvFLUSH_VERTEX;
+ break;
+ case gcvVIDMEM_TYPE_TFBHEADER:
+ flush |= gcvFLUSH_TFBHEADER;
+ break;
+ case gcvVIDMEM_TYPE_GENERIC:
+ flush = gcvFLUSH_ALL;
+ goto Out;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ Record = Record->next;
+ }
+
+Out:
+ *Flush = flush;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+void
+_SubmitTimerFunction(
+ gctPOINTER Data
+ )
+{
+ gckEVENT event = (gckEVENT)Data;
+ gcmkVERIFY_OK(gckEVENT_Submit(event, gcvTRUE, gcvFALSE));
+}
+
+/******************************************************************************\
+******************************* gckEVENT API Code *******************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** gckEVENT_Construct
+**
+** Construct a new gckEVENT object.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** OUTPUT:
+**
+** gckEVENT * Event
+** Pointer to a variable that receives the gckEVENT object pointer.
+*/
+gceSTATUS
+gckEVENT_Construct(
+ IN gckKERNEL Kernel,
+ IN gckCOMMAND Command,
+ OUT gckEVENT * Event
+ )
+{
+ gckOS os;
+ gceSTATUS status;
+ gckEVENT eventObj = gcvNULL;
+ int i;
+ gcsEVENT_PTR record;
+ gctPOINTER pointer = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=0x%x", Kernel);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Event != gcvNULL);
+
+ /* Extract the pointer to the gckOS object. */
+ os = Kernel->os;
+ gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
+
+ /* Allocate the gckEVENT object. */
+ gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(struct _gckEVENT), &pointer));
+
+ eventObj = pointer;
+
+ /* Reset the object. */
+ gcmkVERIFY_OK(gckOS_ZeroMemory(eventObj, gcmSIZEOF(struct _gckEVENT)));
+
+ /* Initialize the gckEVENT object. */
+ eventObj->object.type = gcvOBJ_EVENT;
+ eventObj->kernel = Kernel;
+ eventObj->os = os;
+ eventObj->command = Command;
+
+ /* Create the mutexes. */
+ gcmkONERROR(gckOS_CreateMutex(os, &eventObj->eventQueueMutex));
+ gcmkONERROR(gckOS_CreateMutex(os, &eventObj->freeEventMutex));
+ gcmkONERROR(gckOS_CreateMutex(os, &eventObj->eventListMutex));
+
+ /* Create a bunch of event reccords. */
+ for (i = 0; i < gcdEVENT_ALLOCATION_COUNT; i += 1)
+ {
+ /* Allocate an event record. */
+ gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(gcsEVENT), &pointer));
+
+ record = pointer;
+
+ /* Push it on the free list. */
+ record->next = eventObj->freeEventList;
+ eventObj->freeEventList = record;
+ eventObj->freeEventCount += 1;
+ }
+
+ /* Initialize the free list of event queues. */
+ for (i = 0; i < gcdREPO_LIST_COUNT; i += 1)
+ {
+ eventObj->repoList[i].next = eventObj->freeList;
+ eventObj->freeList = &eventObj->repoList[i];
+ }
+
+ eventObj->freeQueueCount = gcmCOUNTOF(eventObj->queues);
+
+ gcmkONERROR(gckOS_AtomConstruct(os, &eventObj->pending));
+
+ gcmkVERIFY_OK(gckOS_CreateTimer(os,
+ _SubmitTimerFunction,
+ (gctPOINTER)eventObj,
+ &eventObj->submitTimer));
+
+#if gcdINTERRUPT_STATISTIC
+ gcmkONERROR(gckOS_AtomConstruct(os, &eventObj->interruptCount));
+ gcmkONERROR(gckOS_AtomSet(os,eventObj->interruptCount, 0));
+#endif
+
+ eventObj->notifyState = -1;
+
+ /* Return pointer to the gckEVENT object. */
+ *Event = eventObj;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Event=0x%x", *Event);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (eventObj != gcvNULL)
+ {
+ if (eventObj->eventQueueMutex != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(os, eventObj->eventQueueMutex));
+ }
+
+ if (eventObj->freeEventMutex != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(os, eventObj->freeEventMutex));
+ }
+
+ if (eventObj->eventListMutex != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(os, eventObj->eventListMutex));
+ }
+
+ while (eventObj->freeEventList != gcvNULL)
+ {
+ record = eventObj->freeEventList;
+ eventObj->freeEventList = record->next;
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, record));
+ }
+
+ if (eventObj->pending != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(os, eventObj->pending));
+ }
+
+#if gcdINTERRUPT_STATISTIC
+ if (eventObj->interruptCount)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(os, eventObj->interruptCount));
+ }
+#endif
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, eventObj));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckEVENT_Destroy
+**
+** Destroy an gckEVENT object.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckEVENT_Destroy(
+ IN gckEVENT Event
+ )
+{
+ gcsEVENT_PTR record;
+ gcsEVENT_QUEUE_PTR queue;
+
+ gcmkHEADER_ARG("Event=0x%x", Event);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+
+ if (Event->submitTimer != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_StopTimer(Event->os, Event->submitTimer));
+ gcmkVERIFY_OK(gckOS_DestroyTimer(Event->os, Event->submitTimer));
+ }
+
+ /* Delete the queue mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Event->os, Event->eventQueueMutex));
+
+ /* Free all free events. */
+ while (Event->freeEventList != gcvNULL)
+ {
+ record = Event->freeEventList;
+ Event->freeEventList = record->next;
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Event->os, record));
+ }
+
+ /* Delete the free mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Event->os, Event->freeEventMutex));
+
+ /* Free all pending queues. */
+ while (Event->queueHead != gcvNULL)
+ {
+ /* Get the current queue. */
+ queue = Event->queueHead;
+
+ /* Free all pending events. */
+ while (queue->head != gcvNULL)
+ {
+ record = queue->head;
+ queue->head = record->next;
+
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_WARNING, gcvZONE_EVENT,
+ gcmSIZEOF(record) + gcmSIZEOF(queue->source),
+ "Event record 0x%x is still pending for %d.",
+ record, queue->source
+ );
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Event->os, record));
+ }
+
+ /* Remove the top queue from the list. */
+ if (Event->queueHead == Event->queueTail)
+ {
+ Event->queueHead =
+ Event->queueTail = gcvNULL;
+ }
+ else
+ {
+ Event->queueHead = Event->queueHead->next;
+ }
+
+ /* Free the queue. */
+ gcmkVERIFY_OK(gckEVENT_FreeQueue(Event, queue));
+ }
+
+ /* Delete the list mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Event->os, Event->eventListMutex));
+
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Event->os, Event->pending));
+
+#if gcdINTERRUPT_STATISTIC
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Event->os, Event->interruptCount));
+#endif
+
+ /* Mark the gckEVENT object as unknown. */
+ Event->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the gckEVENT object. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Event->os, Event));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckEVENT_GetEvent
+**
+** Reserve the next available hardware event.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** gctBOOL Wait
+** Set to gcvTRUE to force the function to wait if no events are
+** immediately available.
+**
+** gceKERNEL_WHERE Source
+** Source of the event.
+**
+** OUTPUT:
+**
+** gctUINT8 * EventID
+** Reserved event ID.
+*/
+#define gcdINVALID_EVENT_PTR ((gcsEVENT_PTR)gcvMAXUINTPTR_T)
+
+gceSTATUS
+gckEVENT_GetEvent(
+ IN gckEVENT Event,
+ IN gctBOOL Wait,
+ OUT gctUINT8 * EventID,
+ IN gceKERNEL_WHERE Source
+ )
+{
+ gctINT i, id;
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Event=0x%x Source=%d", Event, Source);
+
+ while (gcvTRUE)
+ {
+ /* Grab the queue mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Event->os,
+ Event->eventQueueMutex,
+ gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Walk through all events. */
+ id = Event->lastID;
+ for (i = 0; i < gcmCOUNTOF(Event->queues); ++i)
+ {
+ gctINT nextID = id + 1;
+
+ if (nextID == gcmCOUNTOF(Event->queues))
+ {
+ nextID = 0;
+ }
+
+ if (Event->queues[id].head == gcvNULL)
+ {
+ *EventID = (gctUINT8) id;
+
+ Event->lastID = (gctUINT8) nextID;
+
+ /* Save time stamp of event. */
+ Event->queues[id].head = gcdINVALID_EVENT_PTR;
+ Event->queues[id].stamp = ++(Event->stamp);
+ Event->queues[id].source = Source;
+
+ /* Decrease the number of free events. */
+ --Event->freeQueueCount;
+
+#if gcdDYNAMIC_SPEED
+ if (Event->freeQueueCount <= gcdDYNAMIC_EVENT_THRESHOLD)
+ {
+ gcmkONERROR(gckOS_BroadcastHurry(
+ Event->os,
+ Event->kernel->hardware,
+ gcdDYNAMIC_EVENT_THRESHOLD - Event->freeQueueCount));
+ }
+#endif
+
+ /* Release the queue mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Event->os,
+ Event->eventQueueMutex));
+
+ /* Success. */
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_INFO, gcvZONE_EVENT,
+ gcmSIZEOF(id),
+ "Using id=%d",
+ id
+ );
+
+ gcmkFOOTER_ARG("*EventID=%u", *EventID);
+ return gcvSTATUS_OK;
+ }
+
+ id = nextID;
+ }
+
+#if gcdDYNAMIC_SPEED
+ /* No free events, speed up the GPU right now! */
+ gcmkONERROR(gckOS_BroadcastHurry(Event->os,
+ Event->kernel->hardware,
+ gcdDYNAMIC_EVENT_THRESHOLD));
+#endif
+
+ /* Release the queue mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Event->os, Event->eventQueueMutex));
+ acquired = gcvFALSE;
+
+ /* Fail if wait is not requested. */
+ if (!Wait)
+ {
+ /* Out of resources. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ /* Delay a while. */
+ gcmkONERROR(gckOS_Delay(Event->os, 1));
+ }
+
+OnError:
+ if (acquired)
+ {
+ /* Release the queue mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Event->os, Event->eventQueueMutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckEVENT_AllocateRecord
+**
+** Allocate a record for the new event.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** gctBOOL AllocateAllowed
+** State for allocation if out of free events.
+**
+** OUTPUT:
+**
+** gcsEVENT_PTR * Record
+** Allocated event record.
+*/
+static gcmINLINE gceSTATUS
+gckEVENT_AllocateRecord(
+ IN gckEVENT Event,
+ IN gctBOOL AllocateAllowed,
+ OUT gcsEVENT_PTR * Record
+ )
+{
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+ gctINT i;
+ gcsEVENT_PTR record;
+ gctPOINTER pointer = gcvNULL;
+
+ gcmkHEADER_ARG("Event=0x%x AllocateAllowed=%d", Event, AllocateAllowed);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+ gcmkVERIFY_ARGUMENT(Record != gcvNULL);
+
+ /* Acquire the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Event->os, Event->freeEventMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Test if we are below the allocation threshold. */
+ if ( (AllocateAllowed && (Event->freeEventCount < gcdEVENT_MIN_THRESHOLD)) ||
+ (Event->freeEventCount == 0) )
+ {
+ /* Allocate a bunch of records. */
+ for (i = 0; i < gcdEVENT_ALLOCATION_COUNT; i += 1)
+ {
+ /* Allocate an event record. */
+ gcmkONERROR(gckOS_Allocate(Event->os,
+ gcmSIZEOF(gcsEVENT),
+ &pointer));
+
+ record = pointer;
+
+ /* Push it on the free list. */
+ record->next = Event->freeEventList;
+ Event->freeEventList = record;
+ Event->freeEventCount += 1;
+ }
+ }
+
+ *Record = Event->freeEventList;
+ Event->freeEventList = Event->freeEventList->next;
+ Event->freeEventCount -= 1;
+
+ /* Release the mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Event->os, Event->freeEventMutex));
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Record=0x%x", gcmOPT_POINTER(Record));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Event->os, Event->freeEventMutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckEVENT_AddList
+**
+** Add a new event to the list of events.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** gcsHAL_INTERFACE_PTR Interface
+** Pointer to the interface for the event to be added.
+**
+** gceKERNEL_WHERE FromWhere
+** Place in the pipe where the event needs to be generated.
+**
+** gctBOOL AllocateAllowed
+** State for allocation if out of free events.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckEVENT_AddList(
+ IN gckEVENT Event,
+ IN gcsHAL_INTERFACE_PTR Interface,
+ IN gceKERNEL_WHERE FromWhere,
+ IN gctBOOL AllocateAllowed,
+ IN gctBOOL FromKernel
+ )
+{
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+ gcsEVENT_PTR record = gcvNULL;
+ gcsEVENT_QUEUE_PTR queue;
+
+ gcmkHEADER_ARG("Event=0x%x Interface=0x%x",
+ Event, Interface);
+
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, _GC_OBJ_ZONE,
+ "FromWhere=%d AllocateAllowed=%d",
+ FromWhere, AllocateAllowed);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+ gcmkVERIFY_ARGUMENT(Interface != gcvNULL);
+
+ /* Verify the event command. */
+ gcmkASSERT
+ ( (Interface->command == gcvHAL_WRITE_DATA)
+ || (Interface->command == gcvHAL_UNLOCK_VIDEO_MEMORY)
+ || (Interface->command == gcvHAL_SIGNAL)
+ || (Interface->command == gcvHAL_TIMESTAMP)
+ || (Interface->command == gcvHAL_COMMIT_DONE)
+ || (Interface->command == gcvHAL_DESTROY_MMU)
+ );
+
+ /* Validate the source. */
+ if ((FromWhere != gcvKERNEL_COMMAND) && (FromWhere != gcvKERNEL_PIXEL))
+ {
+ /* Invalid argument. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ /* Allocate a free record. */
+ gcmkONERROR(gckEVENT_AllocateRecord(Event, AllocateAllowed, &record));
+
+ /* Termninate the record. */
+ record->next = gcvNULL;
+
+ /* Record the committer. */
+ record->fromKernel = FromKernel;
+
+ /* Copy the event interface into the record. */
+ gckOS_MemCopy(&record->info, Interface, gcmSIZEOF(record->info));
+
+ /* Get process ID. */
+ gcmkONERROR(gckOS_GetProcessID(&record->processID));
+
+ if (FromKernel == gcvFALSE)
+ {
+ gcmkONERROR(__RemoveRecordFromProcessDB(Event, record));
+
+ /* Handle is belonged to current process, it must be released now. */
+ status = _ReleaseVideoMemoryHandle(Event->kernel, record, Interface);
+
+ if (gcmIS_ERROR(status))
+ {
+ /* Ingore error because there are other events in the queue. */
+ status = gcvSTATUS_OK;
+ goto OnError;
+ }
+ }
+
+#ifdef __QNXNTO__
+ record->kernel = Event->kernel;
+#endif
+
+ /* Acquire the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Event->os, Event->eventListMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Do we need to allocate a new queue? */
+ if ((Event->queueTail == gcvNULL) || (Event->queueTail->source < FromWhere))
+ {
+ /* Allocate a new queue. */
+ gcmkONERROR(gckEVENT_AllocateQueue(Event, &queue));
+
+ /* Initialize the queue. */
+ queue->source = FromWhere;
+ queue->head = gcvNULL;
+ queue->next = gcvNULL;
+
+ /* Attach it to the list of allocated queues. */
+ if (Event->queueTail == gcvNULL)
+ {
+ Event->queueHead =
+ Event->queueTail = queue;
+ }
+ else
+ {
+ Event->queueTail->next = queue;
+ Event->queueTail = queue;
+ }
+ }
+ else
+ {
+ queue = Event->queueTail;
+ }
+
+ /* Attach the record to the queue. */
+ if (queue->head == gcvNULL)
+ {
+ queue->head = record;
+ queue->tail = record;
+ }
+ else
+ {
+ queue->tail->next = record;
+ queue->tail = record;
+ }
+
+ /* Release the mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Event->os, Event->eventListMutex));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Event->os, Event->eventListMutex));
+ }
+
+ if (record != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckEVENT_FreeRecord(Event, record));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckEVENT_Unlock
+**
+** Schedule an event to unlock virtual memory.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** gceKERNEL_WHERE FromWhere
+** Place in the pipe where the event needs to be generated.
+**
+** gcuVIDMEM_NODE_PTR Node
+** Pointer to a gcuVIDMEM_NODE union that specifies the virtual memory
+** to unlock.
+**
+** gceVIDMEM_TYPE Type
+** Video memory allocation type to unlock.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckEVENT_Unlock(
+ IN gckEVENT Event,
+ IN gceKERNEL_WHERE FromWhere,
+ IN gctPOINTER Node
+ )
+{
+ gceSTATUS status;
+ gcsHAL_INTERFACE iface;
+
+ gcmkHEADER_ARG("Event=0x%x FromWhere=%d Node=0x%x",
+ Event, FromWhere, Node);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+ gcmkVERIFY_ARGUMENT(Node != gcvNULL);
+
+ /* Mark the event as an unlock. */
+ iface.command = gcvHAL_UNLOCK_VIDEO_MEMORY;
+ iface.u.UnlockVideoMemory.node = gcmPTR_TO_UINT64(Node);
+ iface.u.UnlockVideoMemory.asynchroneous = 0;
+
+ /* 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;
+}
+
+/*******************************************************************************
+**
+** gckEVENT_Signal
+**
+** Schedule an event to trigger a signal.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** gctSIGNAL Signal
+** Pointer to the signal to trigger.
+**
+** gceKERNEL_WHERE FromWhere
+** Place in the pipe where the event needs to be generated.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckEVENT_Signal(
+ IN gckEVENT Event,
+ IN gctSIGNAL Signal,
+ IN gceKERNEL_WHERE FromWhere
+ )
+{
+ gceSTATUS status;
+ gcsHAL_INTERFACE iface;
+
+ gcmkHEADER_ARG("Event=0x%x Signal=0x%x FromWhere=%d",
+ Event, Signal, FromWhere);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+ gcmkVERIFY_ARGUMENT(Signal != gcvNULL);
+
+ /* Mark the event as a signal. */
+ iface.command = gcvHAL_SIGNAL;
+ iface.u.Signal.signal = gcmPTR_TO_UINT64(Signal);
+ iface.u.Signal.auxSignal = 0;
+ iface.u.Signal.process = 0;
+
+#ifdef __QNXNTO__
+ iface.u.Signal.coid = 0;
+ iface.u.Signal.rcvid = 0;
+
+ gcmkONERROR(gckOS_SignalPending(Event->os, Signal));
+#endif
+
+ /* 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;
+}
+
+/*******************************************************************************
+**
+** gckEVENT_Submit
+**
+** Submit the current event queue to the GPU.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** gctBOOL Wait
+** Submit requires one vacant event; if Wait is set to not zero,
+** and there are no vacant events at this time, the function will
+** wait until an event becomes vacant so that submission of the
+** queue is successful.
+**
+** gctBOOL FromPower
+** Determines whether the call originates from inside the power
+** management or not.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckEVENT_Submit(
+ IN gckEVENT Event,
+ IN gctBOOL Wait,
+ IN gctBOOL FromPower
+ )
+{
+ gceSTATUS status;
+ gctUINT8 id = 0xFF;
+ gcsEVENT_QUEUE_PTR queue;
+ gctBOOL acquired = gcvFALSE;
+ gckCOMMAND command = gcvNULL;
+ gctBOOL commitEntered = gcvFALSE;
+ gctUINT32 bytes;
+ gctPOINTER buffer;
+ gctUINT32 executeBytes;
+ gctUINT32 flushBytes;
+
+#if gcdINTERRUPT_STATISTIC
+ gctINT32 oldValue;
+#endif
+
+#if gcdSECURITY
+ gctPOINTER reservedBuffer;
+#endif
+
+ gckHARDWARE hardware;
+
+ gceKERNEL_FLUSH flush = gcvFALSE;
+ gctUINT64 commitStamp;
+
+ gcmkHEADER_ARG("Event=0x%x Wait=%d", Event, Wait);
+
+ /* Get gckCOMMAND object. */
+ command = Event->command;
+ hardware = Event->kernel->hardware;
+
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ gckOS_GetTicks(&Event->lastCommitStamp);
+
+ /* Are there event queues? */
+ if (Event->queueHead != gcvNULL)
+ {
+ /* Acquire the command queue. */
+ gcmkONERROR(gckCOMMAND_EnterCommit(command, FromPower));
+ commitEntered = gcvTRUE;
+
+ /* Get current commit stamp. */
+ commitStamp = command->commitStamp;
+
+ if (commitStamp)
+ {
+ commitStamp -= 1;
+ }
+
+ /* Process all queues. */
+ while (Event->queueHead != gcvNULL)
+ {
+ /* Acquire the list mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Event->os,
+ Event->eventListMutex,
+ gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Get the current queue. */
+ queue = Event->queueHead;
+
+ /* Allocate an event ID. */
+ gcmkONERROR(gckEVENT_GetEvent(Event, Wait, &id, queue->source));
+
+ /* Copy event list to event ID queue. */
+ Event->queues[id].head = queue->head;
+
+ /* Update current commit stamp. */
+ Event->queues[id].commitStamp = commitStamp;
+
+ /* Remove the top queue from the list. */
+ if (Event->queueHead == Event->queueTail)
+ {
+ Event->queueHead = gcvNULL;
+ Event->queueTail = gcvNULL;
+ }
+ else
+ {
+ Event->queueHead = Event->queueHead->next;
+ }
+
+ /* Free the queue. */
+ gcmkONERROR(gckEVENT_FreeQueue(Event, queue));
+
+ /* Release the list mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(Event->os, Event->eventListMutex));
+ acquired = gcvFALSE;
+
+
+ if (command->feType == gcvHW_FE_WAIT_LINK)
+ {
+ /* Determine cache needed to flush. */
+ gcmkVERIFY_OK(_QueryFlush(Event, Event->queues[id].head, &flush));
+
+ /* Get the size of the hardware event. */
+ gcmkONERROR(gckWLFE_Event(
+ hardware,
+ gcvNULL,
+ id,
+ Event->queues[id].source,
+ &bytes
+ ));
+
+ /* Get the size of flush command. */
+ gcmkONERROR(gckHARDWARE_Flush(
+ hardware,
+ flush,
+ gcvNULL,
+ &flushBytes
+ ));
+
+ bytes += flushBytes;
+ }
+ else if (command->feType == gcvHW_FE_ASYNC)
+ {
+ /* Get the size of the hardware event. */
+ gcmkONERROR(gckASYNC_FE_Event(
+ hardware,
+ gcvNULL,
+ id,
+ Event->queues[id].source,
+ &bytes
+ ));
+ }
+ else
+ {
+ /* Get the size of the hardware event. */
+ gcmkONERROR(gckMCFE_Event(
+ hardware,
+ gcvNULL,
+ id,
+ Event->queues[id].source,
+ &bytes
+ ));
+ }
+
+ /* Total bytes need to execute. */
+ executeBytes = bytes;
+
+ /* Reserve space in the command queue. */
+ gcmkONERROR(gckCOMMAND_Reserve(command, bytes, &buffer, &bytes));
+#if gcdSECURITY
+ reservedBuffer = buffer;
+#endif
+
+#if gcdINTERRUPT_STATISTIC
+ gcmkVERIFY_OK(gckOS_AtomIncrement(
+ Event->os,
+ Event->interruptCount,
+ &oldValue
+ ));
+#endif
+
+ if (command->feType == gcvHW_FE_WAIT_LINK)
+ {
+ /* Set the flush in the command queue. */
+ gcmkONERROR(gckHARDWARE_Flush(
+ hardware,
+ flush,
+ buffer,
+ &flushBytes
+ ));
+
+ /* Advance to next command. */
+ buffer = (gctUINT8_PTR)buffer + flushBytes;
+
+ /* Set the hardware event in the command queue. */
+ gcmkONERROR(gckWLFE_Event(
+ hardware,
+ buffer,
+ id,
+ Event->queues[id].source,
+ &bytes
+ ));
+
+#if gcdSECURITY
+ gckKERNEL_SecurityExecute(
+ Event->kernel,
+ reservedBuffer,
+ executeBytes
+ );
+#else
+ /* Execute the hardware event. */
+ gcmkONERROR(gckCOMMAND_Execute(command, executeBytes));
+#endif
+ }
+ else if (command->feType == gcvHW_FE_ASYNC)
+ {
+ /* Set the hardware event in the command queue. */
+ gcmkONERROR(gckASYNC_FE_Event(
+ hardware,
+ buffer,
+ id,
+ Event->queues[id].source,
+ &bytes
+ ));
+
+ /* Execute the hardware event. */
+ gcmkONERROR(gckCOMMAND_ExecuteAsync(command, executeBytes));
+ }
+ else
+ {
+ /* Set the hardware event in the command queue. */
+ gcmkONERROR(gckMCFE_Event(
+ hardware,
+ buffer,
+ id,
+ Event->queues[id].source,
+ &bytes
+ ));
+
+ /* Execute the hardware event. */
+ gcmkONERROR(gckCOMMAND_ExecuteMultiChannel(command, 0, 0, executeBytes));
+ }
+
+#if gcdNULL_DRIVER
+ /* Notify immediately on infinite hardware. */
+ gcmkONERROR(gckEVENT_Interrupt(Event, 1 << id));
+
+ gcmkONERROR(gckEVENT_Notify(Event, 0));
+#endif
+ }
+
+ /* Release the command queue. */
+ gcmkONERROR(gckCOMMAND_ExitCommit(command, FromPower));
+
+#if !gcdNULL_DRIVER
+ if (!FromPower)
+ {
+ gcmkVERIFY_OK(_TryToIdleGPU(Event));
+ }
+#endif
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Need to unroll the mutex acquire. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Event->os, Event->eventListMutex));
+ }
+
+ if (commitEntered)
+ {
+ /* Release the command queue mutex. */
+ gcmkVERIFY_OK(gckCOMMAND_ExitCommit(command, FromPower));
+ }
+
+ if (id != 0xFF)
+ {
+ /* Need to unroll the event allocation. */
+ Event->queues[id].head = gcvNULL;
+ }
+
+ if (status == gcvSTATUS_GPU_NOT_RESPONDING)
+ {
+ /* Broadcast GPU stuck. */
+ status = gckOS_Broadcast(Event->os,
+ Event->kernel->hardware,
+ gcvBROADCAST_GPU_STUCK);
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckEVENT_Commit
+**
+** Commit an event queue from the user.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** 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.
+*/
+gceSTATUS
+gckEVENT_Commit(
+ IN gckEVENT Event,
+ IN gcsQUEUE_PTR Queue,
+ IN gctBOOL Forced
+ )
+{
+ gceSTATUS status;
+ gcsQUEUE_PTR record = gcvNULL, next;
+ gctUINT32 processID;
+ gctBOOL needCopy = gcvFALSE;
+ gctPOINTER pointer = gcvNULL;
+
+ gcmkHEADER_ARG("Event=0x%x Queue=0x%x", Event, Queue);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+
+ /* Get the current process ID. */
+ gcmkONERROR(gckOS_GetProcessID(&processID));
+
+ /* Query if we need to copy the client data. */
+ gcmkONERROR(gckOS_QueryNeedCopy(Event->os, processID, &needCopy));
+
+ /* Loop while there are records in the queue. */
+ while (Queue != gcvNULL)
+ {
+ gcsQUEUE queue;
+
+ if (needCopy)
+ {
+ /* Point to stack record. */
+ record = &queue;
+
+ /* Copy the data from the client. */
+ gcmkONERROR(gckOS_CopyFromUserData(Event->os,
+ record,
+ Queue,
+ gcmSIZEOF(gcsQUEUE)));
+ }
+ else
+ {
+
+ /* Map record into kernel memory. */
+ gcmkONERROR(gckOS_MapUserPointer(Event->os,
+ Queue,
+ gcmSIZEOF(gcsQUEUE),
+ &pointer));
+
+ record = pointer;
+ }
+
+ /* Append event record to event queue. */
+ gcmkONERROR(
+ gckEVENT_AddList(Event, &record->iface, gcvKERNEL_PIXEL, gcvTRUE, gcvFALSE));
+
+ /* Next record in the queue. */
+ next = gcmUINT64_TO_PTR(record->next);
+
+ if (!needCopy)
+ {
+ /* Unmap record from kernel memory. */
+ gcmkONERROR(
+ gckOS_UnmapUserPointer(Event->os,
+ Queue,
+ gcmSIZEOF(gcsQUEUE),
+ (gctPOINTER *) record));
+ record = gcvNULL;
+ }
+
+ 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));
+
+ /* Success */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (pointer)
+ {
+ /* Roll back. */
+ gcmkVERIFY_OK(gckOS_UnmapUserPointer(Event->os,
+ Queue,
+ gcmSIZEOF(gcsQUEUE),
+ (gctPOINTER*)pointer));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckEVENT_Interrupt
+**
+** Called by the interrupt service routine to store the triggered interrupt
+** mask to be later processed by gckEVENT_Notify.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** gctUINT32 Data
+** Mask for the 32 interrupts.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckEVENT_Interrupt(
+ IN gckEVENT Event,
+ IN gctUINT32 Data
+ )
+{
+ /* Combine current interrupt status with pending flags. */
+ gckOS_AtomSetMask(Event->pending, Data);
+
+#if gcdINTERRUPT_STATISTIC
+ {
+ gctINT j = 0;
+ gctINT32 oldValue;
+
+ for (j = 0; j < gcmCOUNTOF(Event->queues); j++)
+ {
+ if ((Data & (1 << j)))
+ {
+ gckOS_AtomDecrement(Event->os,
+ Event->interruptCount,
+ &oldValue);
+ }
+ }
+ }
+#endif
+
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckEVENT_Notify
+**
+** Process all triggered interrupts.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckEVENT_Notify(
+ IN gckEVENT Event,
+ IN gctUINT32 IDs
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctINT i;
+ gcsEVENT_QUEUE * queue;
+ gctUINT mask = 0;
+ gctBOOL acquired = gcvFALSE;
+ gctSIGNAL signal;
+ gctUINT pending = 0;
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ gctINT eventNumber = 0;
+#endif
+ gckVIDMEM_NODE nodeObject;
+
+ gcmkHEADER_ARG("Event=0x%x IDs=0x%x", Event, IDs);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+
+ gcmDEBUG_ONLY(
+ if (IDs != 0)
+ {
+ for (i = 0; i < gcmCOUNTOF(Event->queues); ++i)
+ {
+ if (Event->queues[i].head != gcvNULL)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+ "Queue(%d): stamp=%llu source=%d",
+ i,
+ Event->queues[i].stamp,
+ Event->queues[i].source);
+ }
+ }
+ }
+ );
+
+ /* Begin of event handling. */
+ Event->notifyState = 0;
+
+ for (;;)
+ {
+ gcsEVENT_PTR record;
+
+ /* Grab the mutex queue. */
+ gcmkONERROR(gckOS_AcquireMutex(Event->os,
+ Event->eventQueueMutex,
+ gcvINFINITE));
+ acquired = gcvTRUE;
+
+ gckOS_AtomGet(Event->os, Event->pending, (gctINT32_PTR)&pending);
+
+ if (pending == 0)
+ {
+ /* Release the mutex queue. */
+ gcmkONERROR(gckOS_ReleaseMutex(Event->os, Event->eventQueueMutex));
+ acquired = gcvFALSE;
+
+ /* No more pending interrupts - done. */
+ break;
+ }
+
+ if (pending & 0x80000000)
+ {
+ gcmkPRINT("AXI BUS ERROR");
+ gckHARDWARE_DumpGPUState(Event->kernel->hardware);
+ pending &= 0x7FFFFFFF;
+ }
+
+ if ((pending & 0x40000000) && Event->kernel->hardware->mmuVersion)
+ {
+#if gcdUSE_MMU_EXCEPTION
+#if gcdALLOC_ON_FAULT
+ status = gckHARDWARE_HandleFault(Event->kernel->hardware);
+#endif
+ if (gcmIS_ERROR(status))
+ {
+ /* Dump error is fault can't be handle. */
+ gckHARDWARE_DumpMMUException(Event->kernel->hardware);
+
+ gckHARDWARE_DumpGPUState(Event->kernel->hardware);
+ }
+#endif
+
+ pending &= 0xBFFFFFFF;
+ }
+
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_INFO, gcvZONE_EVENT,
+ gcmSIZEOF(pending),
+ "Pending interrupts 0x%x",
+ pending
+ );
+
+ queue = gcvNULL;
+
+ gcmDEBUG_ONLY(
+ if (IDs == 0)
+ {
+ for (i = 0; i < gcmCOUNTOF(Event->queues); ++i)
+ {
+ if (Event->queues[i].head != gcvNULL)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+ "Queue(%d): stamp=%llu source=%d",
+ i,
+ Event->queues[i].stamp,
+ Event->queues[i].source);
+ }
+ }
+ }
+ );
+
+ /* Find the oldest pending interrupt. */
+ for (i = 0; i < gcmCOUNTOF(Event->queues); ++i)
+ {
+ if ((Event->queues[i].head != gcvNULL)
+ && (pending & (1 << i))
+ )
+ {
+ if ((queue == gcvNULL)
+ || (Event->queues[i].stamp < queue->stamp)
+ )
+ {
+ queue = &Event->queues[i];
+ mask = 1 << i;
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ eventNumber = i;
+#endif
+ }
+ }
+ }
+
+ if (queue == gcvNULL)
+ {
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_ERROR, gcvZONE_EVENT,
+ gcmSIZEOF(pending),
+ "Interrupts 0x%x are not pending.",
+ pending
+ );
+
+ gckOS_AtomClearMask(Event->pending, pending);
+
+ /* Release the mutex queue. */
+ gcmkONERROR(gckOS_ReleaseMutex(Event->os, Event->eventQueueMutex));
+ acquired = gcvFALSE;
+ break;
+ }
+
+ /* Check whether there is a missed interrupt. */
+ for (i = 0; i < gcmCOUNTOF(Event->queues); ++i)
+ {
+ if ((Event->queues[i].head != gcvNULL)
+ && (Event->queues[i].stamp < queue->stamp)
+ && (Event->queues[i].source <= queue->source)
+ )
+ {
+ gcmkTRACE_N(
+ gcvLEVEL_ERROR,
+ gcmSIZEOF(i) + gcmSIZEOF(Event->queues[i].stamp),
+ "Event %d lost (stamp %llu)",
+ i, Event->queues[i].stamp
+ );
+
+ /* Use this event instead. */
+ queue = &Event->queues[i];
+ mask = 0;
+ }
+ }
+
+ if (mask != 0)
+ {
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_INFO, gcvZONE_EVENT,
+ gcmSIZEOF(eventNumber),
+ "Processing interrupt %d",
+ eventNumber
+ );
+#endif
+ }
+
+ gckOS_AtomClearMask(Event->pending, mask);
+
+ if (!gckHARDWARE_IsFeatureAvailable(Event->kernel->hardware, gcvFEATURE_FENCE_64BIT))
+ {
+ /* Write out commit stamp.*/
+ *(gctUINT64 *)(Event->kernel->command->fence->logical) = queue->commitStamp;
+ }
+
+ /* Signal clients waiting for fence. */
+ gcmkVERIFY_OK(gckFENCE_Signal(
+ Event->os,
+ Event->kernel->command->fence
+ ));
+
+ /* Grab the event head. */
+ record = queue->head;
+
+ /* Now quickly clear its event list. */
+ queue->head = gcvNULL;
+
+ /* Increase the number of free events. */
+ Event->freeQueueCount++;
+
+ /* Release the mutex queue. */
+ gcmkONERROR(gckOS_ReleaseMutex(Event->os, Event->eventQueueMutex));
+ acquired = gcvFALSE;
+
+ /* Walk all events for this interrupt. */
+ while (record != gcvNULL)
+ {
+ gcsEVENT_PTR recordNext;
+#ifndef __QNXNTO__
+ gctPOINTER logical;
+#endif
+ /* Grab next record. */
+ recordNext = record->next;
+
+#ifdef __QNXNTO__
+ /*
+ * Assign record->processID as the pid for this galcore thread.
+ * Used in the OS calls which do not take a pid.
+ */
+ drv_thread_specific_key_assign(record->processID, 0);
+#endif
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_INFO, gcvZONE_EVENT,
+ gcmSIZEOF(record->info.command),
+ "Processing event type: %d",
+ record->info.command
+ );
+
+ switch (record->info.command)
+ {
+ case gcvHAL_WRITE_DATA:
+#ifndef __QNXNTO__
+ /* Convert physical into logical address. */
+ gcmkERR_BREAK(
+ gckOS_MapPhysical(Event->os,
+ record->info.u.WriteData.address,
+ gcmSIZEOF(gctUINT32),
+ &logical));
+
+ /* Write data. */
+ gcmkERR_BREAK(
+ gckOS_WriteMemory(Event->os,
+ logical,
+ record->info.u.WriteData.data));
+
+ /* Unmap the physical memory. */
+ gcmkERR_BREAK(
+ gckOS_UnmapPhysical(Event->os,
+ logical,
+ gcmSIZEOF(gctUINT32)));
+#else
+ /* Write data. */
+ gcmkERR_BREAK(
+ gckOS_WriteMemory(Event->os,
+ gcmUINT64_TO_PTR(record->info.u.WriteData.address),
+ record->info.u.WriteData.data));
+#endif
+ break;
+
+ case gcvHAL_UNLOCK_VIDEO_MEMORY:
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+ "gcvHAL_UNLOCK_VIDEO_MEMORY: 0x%x",
+ record->info.u.UnlockVideoMemory.node);
+
+ nodeObject = gcmUINT64_TO_PTR(record->info.u.UnlockVideoMemory.node);
+
+ /* Unlock, sync'ed. */
+ status = gckVIDMEM_NODE_Unlock(
+ Event->kernel,
+ nodeObject,
+ record->processID,
+ gcvNULL
+ );
+
+ /* Deref node. */
+ status = gckVIDMEM_NODE_Dereference(Event->kernel, nodeObject);
+ break;
+
+ case gcvHAL_SIGNAL:
+ signal = gcmUINT64_TO_PTR(record->info.u.Signal.signal);
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+ "gcvHAL_SIGNAL: 0x%x",
+ signal);
+
+#ifdef __QNXNTO__
+ if ((record->info.u.Signal.coid == 0)
+ && (record->info.u.Signal.rcvid == 0)
+ )
+ {
+ /* Kernel signal. */
+ gcmkERR_BREAK(
+ gckOS_SignalPulse(Event->os,
+ signal));
+ }
+ else
+ {
+ /* User signal. */
+ gcmkERR_BREAK(
+ gckOS_UserSignal(Event->os,
+ signal,
+ record->info.u.Signal.rcvid,
+ record->info.u.Signal.coid));
+ }
+#else
+ /* Set signal. */
+ if (gcmUINT64_TO_PTR(record->info.u.Signal.process) == gcvNULL)
+ {
+ /* Kernel signal. */
+ gcmkERR_BREAK(
+ gckOS_Signal(Event->os,
+ signal,
+ gcvTRUE));
+ }
+ else
+ {
+ /* User signal. */
+ gcmkERR_BREAK(
+ gckOS_UserSignal(Event->os,
+ signal,
+ gcmUINT64_TO_PTR(record->info.u.Signal.process)));
+ }
+
+ gcmkASSERT(record->info.u.Signal.auxSignal == 0);
+#endif
+ break;
+
+ case gcvHAL_TIMESTAMP:
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+ "gcvHAL_TIMESTAMP: %d %d",
+ record->info.u.TimeStamp.timer,
+ record->info.u.TimeStamp.request);
+
+ /* Process the timestamp. */
+ switch (record->info.u.TimeStamp.request)
+ {
+ case 0:
+ status = gckOS_GetTime(&Event->kernel->timers[
+ record->info.u.TimeStamp.timer].
+ stopTime);
+ break;
+
+ case 1:
+ status = gckOS_GetTime(&Event->kernel->timers[
+ record->info.u.TimeStamp.timer].
+ startTime);
+ break;
+
+ default:
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_ERROR, gcvZONE_EVENT,
+ gcmSIZEOF(record->info.u.TimeStamp.request),
+ "Invalid timestamp request: %d",
+ record->info.u.TimeStamp.request
+ );
+
+ status = gcvSTATUS_INVALID_ARGUMENT;
+ break;
+ }
+ break;
+
+ case gcvHAL_COMMIT_DONE:
+ break;
+
+ default:
+ /* Invalid argument. */
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_ERROR, gcvZONE_EVENT,
+ gcmSIZEOF(record->info.command),
+ "Unknown event type: %d",
+ record->info.command
+ );
+
+ status = gcvSTATUS_INVALID_ARGUMENT;
+ break;
+ }
+
+ /* Make sure there are no errors generated. */
+ if (gcmIS_ERROR(status))
+ {
+ gcmkTRACE_ZONE_N(
+ gcvLEVEL_WARNING, gcvZONE_EVENT,
+ gcmSIZEOF(status),
+ "Event produced status: %d(%s)",
+ status, gckOS_DebugStatus2Name(status));
+ }
+
+ /* Free the event. */
+ gcmkVERIFY_OK(gckEVENT_FreeRecord(Event, record));
+
+ /* Advance to next record. */
+ record = recordNext;
+ }
+
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_EVENT,
+ "Handled interrupt 0x%x", mask);
+ }
+
+ if (IDs == 0)
+ {
+ gcmkONERROR(_TryToIdleGPU(Event));
+ }
+
+ /* End of event handling. */
+ Event->notifyState = -1;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Release mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Event->os, Event->eventQueueMutex));
+ }
+
+ /* End of event handling. */
+ Event->notifyState = -1;
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** gckEVENT_FreeProcess
+**
+** Free all events owned by a particular process ID.
+**
+** INPUT:
+**
+** gckEVENT Event
+** Pointer to an gckEVENT object.
+**
+** gctUINT32 ProcessID
+** Process ID of the process to be freed up.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckEVENT_FreeProcess(
+ IN gckEVENT Event,
+ IN gctUINT32 ProcessID
+ )
+{
+ gctSIZE_T i;
+ gctBOOL acquired = gcvFALSE;
+ gcsEVENT_PTR record, next;
+ gceSTATUS status;
+ gcsEVENT_PTR deleteHead, deleteTail;
+
+ gcmkHEADER_ARG("Event=0x%x ProcessID=%d", Event, ProcessID);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Event, gcvOBJ_EVENT);
+
+ /* Walk through all queues. */
+ for (i = 0; i < gcmCOUNTOF(Event->queues); ++i)
+ {
+ if (Event->queues[i].head != gcvNULL)
+ {
+ /* Grab the event queue mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Event->os,
+ Event->eventQueueMutex,
+ gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Grab the mutex head. */
+ record = Event->queues[i].head;
+ Event->queues[i].head = gcvNULL;
+ Event->queues[i].tail = gcvNULL;
+ deleteHead = gcvNULL;
+ deleteTail = gcvNULL;
+
+ while (record != gcvNULL)
+ {
+ next = record->next;
+ if (record->processID == ProcessID)
+ {
+ if (deleteHead == gcvNULL)
+ {
+ deleteHead = record;
+ }
+ else
+ {
+ deleteTail->next = record;
+ }
+
+ deleteTail = record;
+ }
+ else
+ {
+ if (Event->queues[i].head == gcvNULL)
+ {
+ Event->queues[i].head = record;
+ }
+ else
+ {
+ Event->queues[i].tail->next = record;
+ }
+
+ Event->queues[i].tail = record;
+ }
+
+ record->next = gcvNULL;
+ record = next;
+ }
+
+ /* Release the mutex queue. */
+ gcmkONERROR(gckOS_ReleaseMutex(Event->os, Event->eventQueueMutex));
+ acquired = gcvFALSE;
+
+ /* Loop through the entire list of events. */
+ for (record = deleteHead; record != gcvNULL; record = next)
+ {
+ /* Get the next event record. */
+ next = record->next;
+
+ /* Free the event record. */
+ gcmkONERROR(gckEVENT_FreeRecord(Event, record));
+ }
+ }
+ }
+
+ gcmkONERROR(_TryToIdleGPU(Event));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Release the event queue mutex. */
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Event->os, Event->eventQueueMutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static void
+_PrintRecord(
+ gcsEVENT_PTR record
+ )
+{
+ switch (record->info.command)
+ {
+ case gcvHAL_WRITE_DATA:
+ gcmkPRINT(" gcvHAL_WRITE_DATA");
+ break;
+
+ case gcvHAL_UNLOCK_VIDEO_MEMORY:
+ gcmkPRINT(" gcvHAL_UNLOCK_VIDEO_MEMORY");
+ break;
+
+ case gcvHAL_SIGNAL:
+ gcmkPRINT(" gcvHAL_SIGNAL process=%lld signal=0x%llx",
+ record->info.u.Signal.process,
+ record->info.u.Signal.signal);
+ break;
+
+ case gcvHAL_TIMESTAMP:
+ gcmkPRINT(" gcvHAL_TIMESTAMP");
+ break;
+
+ case gcvHAL_COMMIT_DONE:
+ gcmkPRINT(" gcvHAL_COMMIT_DONE");
+ break;
+
+ case gcvHAL_DESTROY_MMU:
+ gcmkPRINT(" gcvHAL_DESTORY_MMU mmu=%p",
+ gcmUINT64_TO_PTR(record->info.u.DestroyMmu.mmu));
+
+ break;
+ default:
+ gcmkPRINT(" Illegal Event %d", record->info.command);
+ break;
+ }
+}
+
+/*******************************************************************************
+** gckEVENT_Dump
+**
+** Dump record in event queue when stuck happens.
+** No protection for the event queue.
+**/
+gceSTATUS
+gckEVENT_Dump(
+ IN gckEVENT Event
+ )
+{
+ gcsEVENT_QUEUE_PTR queueHead = Event->queueHead;
+ gcsEVENT_QUEUE_PTR queue;
+ gcsEVENT_PTR record = gcvNULL;
+ gctINT i;
+#if gcdINTERRUPT_STATISTIC
+ gctINT32 pendingInterrupt;
+ gctUINT32 intrAcknowledge;
+#endif
+ gctINT32 pending;
+
+ gcmkHEADER_ARG("Event=0x%x", Event);
+
+ gcmkPRINT("**************************\n");
+ gcmkPRINT("*** EVENT STATE DUMP ***\n");
+ gcmkPRINT("**************************\n");
+
+ gcmkPRINT(" Unsumbitted Event:");
+ while(queueHead)
+ {
+ queue = queueHead;
+ record = queueHead->head;
+
+ gcmkPRINT(" [%p]:", queue);
+ while(record)
+ {
+ _PrintRecord(record);
+ record = record->next;
+ }
+
+ if (queueHead == Event->queueTail)
+ {
+ queueHead = gcvNULL;
+ }
+ else
+ {
+ queueHead = queueHead->next;
+ }
+ }
+
+ gcmkPRINT(" Untriggered Event:");
+ for (i = 0; i < gcmCOUNTOF(Event->queues); i++)
+ {
+ queue = &Event->queues[i];
+ record = queue->head;
+
+ gcmkPRINT(" [%d]:", i);
+ while(record)
+ {
+ _PrintRecord(record);
+ record = record->next;
+ }
+ }
+
+#if gcdINTERRUPT_STATISTIC
+ gckOS_AtomGet(Event->os, Event->interruptCount, &pendingInterrupt);
+ gcmkPRINT(" Number of Pending Interrupt: %d", pendingInterrupt);
+
+ if (Event->kernel->recovery == 0)
+ {
+ gceSTATUS status;
+
+ status = gckOS_ReadRegisterEx(
+ Event->os,
+ Event->kernel->core,
+ 0x10,
+ &intrAcknowledge
+ );
+ if (gcmIS_ERROR(status))
+ {
+ gcmkPRINT(" READ INTR_ACKNOWLEDGE ERROR!");
+ }
+ else
+ {
+ gcmkPRINT(" INTR_ACKNOWLEDGE=0x%x", intrAcknowledge);
+ }
+ }
+#endif
+
+ gcmkPRINT(" Notify State=%d", Event->notifyState);
+
+ gckOS_AtomGet(Event->os, Event->pending, &pending);
+
+ gcmkPRINT(" Pending=0x%x", pending);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_heap.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_heap.c
new file mode 100644
index 000000000000..325cdd74c733
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_heap.c
@@ -0,0 +1,888 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+/**
+** @file
+** gckHEAP object for kernel HAL layer. The heap implemented here is an arena-
+** based memory allocation. An arena-based memory heap allocates data quickly
+** from specified arenas and reduces memory fragmentation.
+**
+*/
+#include "gc_hal_kernel_precomp.h"
+
+#define _GC_OBJ_ZONE gcvZONE_HEAP
+
+/*******************************************************************************
+***** Structures ***************************************************************
+*******************************************************************************/
+#define gcdIN_USE ((gcskNODE_PTR)gcvMAXUINTPTR_T)
+
+typedef struct _gcskNODE * gcskNODE_PTR;
+typedef struct _gcskNODE
+{
+ /* Number of byets in node. */
+ gctSIZE_T bytes;
+
+ /* Pointer to next free node, or gcvNULL to mark the node as freed, or
+ ** gcdIN_USE to mark the node as used. */
+ gcskNODE_PTR next;
+
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+ /* Time stamp of allocation. */
+ gctUINT64 timeStamp;
+#endif
+}
+gcskNODE;
+
+typedef struct _gcskHEAP * gcskHEAP_PTR;
+typedef struct _gcskHEAP
+{
+ /* Linked list. */
+ gcskHEAP_PTR next;
+ gcskHEAP_PTR prev;
+
+ /* Heap size. */
+ gctSIZE_T size;
+
+ /* Free list. */
+ gcskNODE_PTR freeList;
+}
+gcskHEAP;
+
+struct _gckHEAP
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* Pointer to a gckOS object. */
+ gckOS os;
+
+ /* Locking mutex. */
+ gctPOINTER mutex;
+
+ /* Allocation parameters. */
+ gctSIZE_T allocationSize;
+
+ /* Heap list. */
+ gcskHEAP_PTR heap;
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+ gctUINT64 timeStamp;
+#endif
+
+#if VIVANTE_PROFILER_SYSTEM_MEMORY || gcmIS_DEBUG(gcdDEBUG_CODE)
+ /* Profile information. */
+ gctUINT32 allocCount;
+ gctUINT64 allocBytes;
+ gctUINT64 allocBytesMax;
+ gctUINT64 allocBytesTotal;
+ gctUINT32 heapCount;
+ gctUINT32 heapCountMax;
+ gctUINT64 heapMemory;
+ gctUINT64 heapMemoryMax;
+#endif
+};
+
+/*******************************************************************************
+***** Static Support Functions *************************************************
+*******************************************************************************/
+
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+static gctSIZE_T
+_DumpHeap(
+ IN gcskHEAP_PTR Heap
+ )
+{
+ gctPOINTER p;
+ gctSIZE_T leaked = 0;
+
+ /* Start at first node. */
+ for (p = Heap + 1;;)
+ {
+ /* Convert the pointer. */
+ gcskNODE_PTR node = (gcskNODE_PTR) p;
+
+ /* Check if this is a used node. */
+ if (node->next == gcdIN_USE)
+ {
+ /* Print the leaking node. */
+ gcmkTRACE_ZONE(gcvLEVEL_WARNING, gcvZONE_HEAP,
+ "Detected leaking: node=0x%x bytes=%lu timeStamp=%llu "
+ "(%08X %c%c%c%c)",
+ node, node->bytes, node->timeStamp,
+ ((gctUINT32_PTR) (node + 1))[0],
+ gcmPRINTABLE(((gctUINT8_PTR) (node + 1))[0]),
+ gcmPRINTABLE(((gctUINT8_PTR) (node + 1))[1]),
+ gcmPRINTABLE(((gctUINT8_PTR) (node + 1))[2]),
+ gcmPRINTABLE(((gctUINT8_PTR) (node + 1))[3]));
+
+ /* Add leaking byte count. */
+ leaked += node->bytes;
+ }
+
+ /* Test for end of heap. */
+ if (node->bytes == 0)
+ {
+ break;
+ }
+
+ else
+ {
+ /* Move to next node. */
+ p = (gctUINT8_PTR) node + node->bytes;
+ }
+ }
+
+ /* Return the number of leaked bytes. */
+ return leaked;
+}
+#endif
+
+static gceSTATUS
+_CompactKernelHeap(
+ IN gckHEAP Heap
+ )
+{
+ gcskHEAP_PTR heap, next;
+ gctPOINTER p;
+ gcskHEAP_PTR freeList = gcvNULL;
+
+ gcmkHEADER_ARG("Heap=0x%x", Heap);
+
+ /* Walk all the heaps. */
+ for (heap = Heap->heap; heap != gcvNULL; heap = next)
+ {
+ gcskNODE_PTR lastFree = gcvNULL;
+
+ /* Zero out the free list. */
+ heap->freeList = gcvNULL;
+
+ /* Start at the first node. */
+ for (p = (gctUINT8_PTR) (heap + 1);;)
+ {
+ /* Convert the pointer. */
+ gcskNODE_PTR node = (gcskNODE_PTR) p;
+
+ gcmkASSERT(p <= (gctPOINTER) ((gctUINT8_PTR) (heap + 1) + heap->size));
+
+ /* Test if this node not used. */
+ if (node->next != gcdIN_USE)
+ {
+ /* Test if this is the end of the heap. */
+ if (node->bytes == 0)
+ {
+ break;
+ }
+
+ /* Test of this is the first free node. */
+ else if (lastFree == gcvNULL)
+ {
+ /* Initialzie the free list. */
+ heap->freeList = node;
+ lastFree = node;
+ }
+
+ else
+ {
+ /* Test if this free node is contiguous with the previous
+ ** free node. */
+ if ((gctUINT8_PTR) lastFree + lastFree->bytes == p)
+ {
+ /* Just increase the size of the previous free node. */
+ lastFree->bytes += node->bytes;
+ }
+ else
+ {
+ /* Add to linked list. */
+ lastFree->next = node;
+ lastFree = node;
+ }
+ }
+ }
+
+ /* Move to next node. */
+ p = (gctUINT8_PTR) node + node->bytes;
+ }
+
+ /* Mark the end of the chain. */
+ if (lastFree != gcvNULL)
+ {
+ lastFree->next = gcvNULL;
+ }
+
+ /* Get next heap. */
+ next = heap->next;
+
+ /* Check if the entire heap is free. */
+ if ((heap->freeList != gcvNULL)
+ && (heap->freeList->bytes == heap->size - gcmSIZEOF(gcskNODE))
+ )
+ {
+ /* Remove the heap from the linked list. */
+ if (heap->prev == gcvNULL)
+ {
+ Heap->heap = next;
+ }
+ else
+ {
+ heap->prev->next = next;
+ }
+
+ if (heap->next != gcvNULL)
+ {
+ heap->next->prev = heap->prev;
+ }
+
+#if VIVANTE_PROFILER_SYSTEM_MEMORY || gcmIS_DEBUG(gcdDEBUG_CODE)
+ /* Update profiling. */
+ Heap->heapCount -= 1;
+ Heap->heapMemory -= heap->size + gcmSIZEOF(gcskHEAP);
+#endif
+
+ /* Add this heap to the list of heaps that need to be freed. */
+ heap->next = freeList;
+ freeList = heap;
+ }
+ }
+
+ if (freeList != gcvNULL)
+ {
+ /* Release the mutex, remove any chance for a dead lock. */
+ gcmkVERIFY_OK(
+ gckOS_ReleaseMutex(Heap->os, Heap->mutex));
+
+ /* Free all heaps in the free list. */
+ for (heap = freeList; heap != gcvNULL; heap = next)
+ {
+ /* Get pointer to the next heap. */
+ next = heap->next;
+
+ /* Free the heap. */
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HEAP,
+ "Freeing heap 0x%x (%lu bytes)",
+ heap, heap->size + gcmSIZEOF(gcskHEAP));
+ gcmkVERIFY_OK(gckOS_FreeMemory(Heap->os, heap));
+ }
+
+ /* Acquire the mutex again. */
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(Heap->os, Heap->mutex, gcvINFINITE));
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+***** gckHEAP API Code *********************************************************
+*******************************************************************************/
+
+/*******************************************************************************
+**
+** gckHEAP_Construct
+**
+** Construct a new gckHEAP object.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctSIZE_T AllocationSize
+** Minimum size per arena.
+**
+** OUTPUT:
+**
+** gckHEAP * Heap
+** Pointer to a variable that will hold the pointer to the gckHEAP
+** object.
+*/
+gceSTATUS
+gckHEAP_Construct(
+ IN gckOS Os,
+ IN gctSIZE_T AllocationSize,
+ OUT gckHEAP * Heap
+ )
+{
+ gceSTATUS status;
+ gckHEAP heap = gcvNULL;
+ gctPOINTER pointer = gcvNULL;
+
+ gcmkHEADER_ARG("Os=0x%x AllocationSize=%lu", Os, AllocationSize);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Heap != gcvNULL);
+
+ /* Allocate the gckHEAP object. */
+ gcmkONERROR(gckOS_AllocateMemory(Os,
+ gcmSIZEOF(struct _gckHEAP),
+ &pointer));
+
+ heap = pointer;
+
+ /* Initialize the gckHEAP object. */
+ heap->object.type = gcvOBJ_HEAP;
+ heap->os = Os;
+ heap->allocationSize = AllocationSize;
+ heap->heap = gcvNULL;
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+ heap->timeStamp = 0;
+#endif
+
+#if VIVANTE_PROFILER_SYSTEM_MEMORY || gcmIS_DEBUG(gcdDEBUG_CODE)
+ /* Zero the counters. */
+ heap->allocCount = 0;
+ heap->allocBytes = 0;
+ heap->allocBytesMax = 0;
+ heap->allocBytesTotal = 0;
+ heap->heapCount = 0;
+ heap->heapCountMax = 0;
+ heap->heapMemory = 0;
+ heap->heapMemoryMax = 0;
+#endif
+
+ /* Create the mutex. */
+ gcmkONERROR(gckOS_CreateMutex(Os, &heap->mutex));
+
+ /* Return the pointer to the gckHEAP object. */
+ *Heap = heap;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Heap=0x%x", *Heap);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (heap != gcvNULL)
+ {
+ /* Free the heap structure. */
+ gcmkVERIFY_OK(gckOS_FreeMemory(Os, heap));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHEAP_Destroy
+**
+** Destroy a gckHEAP object.
+**
+** INPUT:
+**
+** gckHEAP Heap
+** Pointer to a gckHEAP object to destroy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckHEAP_Destroy(
+ IN gckHEAP Heap
+ )
+{
+ gcskHEAP_PTR heap;
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+ gctSIZE_T leaked = 0;
+#endif
+
+ gcmkHEADER_ARG("Heap=0x%x", Heap);
+
+ for (heap = Heap->heap; heap != gcvNULL; heap = Heap->heap)
+ {
+ /* Unlink heap from linked list. */
+ Heap->heap = heap->next;
+
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+ /* Check for leaked memory. */
+ leaked += _DumpHeap(heap);
+#endif
+
+ /* Free the heap. */
+ gcmkVERIFY_OK(gckOS_FreeMemory(Heap->os, heap));
+ }
+
+ /* Free the mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Heap->os, Heap->mutex));
+
+ /* Free the heap structure. */
+ gcmkVERIFY_OK(gckOS_FreeMemory(Heap->os, Heap));
+
+ /* Success. */
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+ gcmkFOOTER_ARG("leaked=%lu", leaked);
+#else
+ gcmkFOOTER_NO();
+#endif
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckHEAP_Allocate
+**
+** Allocate data from the heap.
+**
+** INPUT:
+**
+** gckHEAP Heap
+** Pointer to a gckHEAP object.
+**
+** IN gctSIZE_T Bytes
+** Number of byte to allocate.
+**
+** OUTPUT:
+**
+** gctPOINTER * Memory
+** Pointer to a variable that will hold the address of the allocated
+** memory.
+*/
+gceSTATUS
+gckHEAP_Allocate(
+ IN gckHEAP Heap,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Memory
+ )
+{
+ gctBOOL acquired = gcvFALSE;
+ gcskHEAP_PTR heap;
+ gceSTATUS status;
+ gctSIZE_T bytes;
+ gcskNODE_PTR node, used, prevFree = gcvNULL;
+ gctPOINTER memory = gcvNULL;
+
+ gcmkHEADER_ARG("Heap=0x%x Bytes=%lu", Heap, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Heap, gcvOBJ_HEAP);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Memory != gcvNULL);
+
+ /* Determine number of bytes required for a node. */
+ bytes = gcmALIGN(Bytes + gcmSIZEOF(gcskNODE), 8);
+
+ /* Acquire the mutex. */
+ gcmkONERROR(
+ gckOS_AcquireMutex(Heap->os, Heap->mutex, gcvINFINITE));
+
+ acquired = gcvTRUE;
+
+ /* Check if this allocation is bigger than the default allocation size. */
+ if (bytes > Heap->allocationSize - gcmSIZEOF(gcskHEAP) - gcmSIZEOF(gcskNODE))
+ {
+ /* Adjust allocation size. */
+ Heap->allocationSize = bytes * 2;
+ }
+
+ else if (Heap->heap != gcvNULL)
+ {
+ gctINT i;
+
+ /* 2 retries, since we might need to compact. */
+ for (i = 0; i < 2; ++i)
+ {
+ /* Walk all the heaps. */
+ for (heap = Heap->heap; heap != gcvNULL; heap = heap->next)
+ {
+ /* Check if this heap has enough bytes to hold the request. */
+ if (bytes <= heap->size - gcmSIZEOF(gcskNODE))
+ {
+ prevFree = gcvNULL;
+
+ /* Walk the chain of free nodes. */
+ for (node = heap->freeList;
+ node != gcvNULL;
+ node = node->next
+ )
+ {
+ gcmkASSERT(node->next != gcdIN_USE);
+
+ /* Check if this free node has enough bytes. */
+ if (node->bytes >= bytes)
+ {
+ /* Use the node. */
+ goto UseNode;
+ }
+
+ /* Save current free node for linked list management. */
+ prevFree = node;
+ }
+ }
+ }
+
+ if (i == 0)
+ {
+ /* Compact the heap. */
+ gcmkVERIFY_OK(_CompactKernelHeap(Heap));
+
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_HEAP,
+ "===== KERNEL HEAP =====");
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_HEAP,
+ "Number of allocations : %12u",
+ Heap->allocCount);
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_HEAP,
+ "Number of bytes allocated : %12llu",
+ Heap->allocBytes);
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_HEAP,
+ "Maximum allocation size : %12llu",
+ Heap->allocBytesMax);
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_HEAP,
+ "Total number of bytes allocated : %12llu",
+ Heap->allocBytesTotal);
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_HEAP,
+ "Number of heaps : %12u",
+ Heap->heapCount);
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_HEAP,
+ "Heap memory in bytes : %12llu",
+ Heap->heapMemory);
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_HEAP,
+ "Maximum number of heaps : %12u",
+ Heap->heapCountMax);
+ gcmkTRACE_ZONE(gcvLEVEL_VERBOSE, gcvZONE_HEAP,
+ "Maximum heap memory in bytes : %12llu",
+ Heap->heapMemoryMax);
+#endif
+ }
+ }
+ }
+
+ /* Release the mutex. */
+ gcmkONERROR(
+ gckOS_ReleaseMutex(Heap->os, Heap->mutex));
+
+ acquired = gcvFALSE;
+
+ /* Allocate a new heap. */
+ gcmkONERROR(
+ gckOS_AllocateMemory(Heap->os,
+ Heap->allocationSize,
+ &memory));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HEAP,
+ "Allocated heap 0x%x (%lu bytes)",
+ memory, Heap->allocationSize);
+
+ /* Acquire the mutex. */
+ gcmkONERROR(
+ gckOS_AcquireMutex(Heap->os, Heap->mutex, gcvINFINITE));
+
+ acquired = gcvTRUE;
+
+ /* Use the allocated memory as the heap. */
+ heap = (gcskHEAP_PTR) memory;
+
+ /* Insert this heap to the head of the chain. */
+ heap->next = Heap->heap;
+ heap->prev = gcvNULL;
+ heap->size = Heap->allocationSize - gcmSIZEOF(gcskHEAP);
+
+ if (heap->next != gcvNULL)
+ {
+ heap->next->prev = heap;
+ }
+ Heap->heap = heap;
+
+ /* Mark the end of the heap. */
+ node = (gcskNODE_PTR) ( (gctUINT8_PTR) heap
+ + Heap->allocationSize
+ - gcmSIZEOF(gcskNODE)
+ );
+ node->bytes = 0;
+ node->next = gcvNULL;
+
+ /* Create a free list. */
+ node = (gcskNODE_PTR) (heap + 1);
+ heap->freeList = node;
+
+ /* Initialize the free list. */
+ node->bytes = heap->size - gcmSIZEOF(gcskNODE);
+ node->next = gcvNULL;
+
+ /* No previous free. */
+ prevFree = gcvNULL;
+
+#if VIVANTE_PROFILER_SYSTEM_MEMORY || gcmIS_DEBUG(gcdDEBUG_CODE)
+ /* Update profiling. */
+ Heap->heapCount += 1;
+ Heap->heapMemory += Heap->allocationSize;
+
+ if (Heap->heapCount > Heap->heapCountMax)
+ {
+ Heap->heapCountMax = Heap->heapCount;
+ }
+ if (Heap->heapMemory > Heap->heapMemoryMax)
+ {
+ Heap->heapMemoryMax = Heap->heapMemory;
+ }
+#endif
+
+UseNode:
+ /* Verify some stuff. */
+ gcmkASSERT(heap != gcvNULL);
+ gcmkASSERT(node != gcvNULL);
+ gcmkASSERT(node->bytes >= bytes);
+
+ if (heap->prev != gcvNULL)
+ {
+ /* Unlink the heap from the linked list. */
+ heap->prev->next = heap->next;
+ if (heap->next != gcvNULL)
+ {
+ heap->next->prev = heap->prev;
+ }
+
+ /* Move the heap to the front of the list. */
+ heap->next = Heap->heap;
+ heap->prev = gcvNULL;
+ Heap->heap = heap;
+ heap->next->prev = heap;
+ }
+
+ /* Check if there is enough free space left after usage for another free
+ ** node. */
+ if (node->bytes - bytes >= gcmSIZEOF(gcskNODE))
+ {
+ /* Allocated used space from the back of the free list. */
+ used = (gcskNODE_PTR) ((gctUINT8_PTR) node + node->bytes - bytes);
+
+ /* Adjust the number of free bytes. */
+ node->bytes -= bytes;
+ gcmkASSERT(node->bytes >= gcmSIZEOF(gcskNODE));
+ }
+ else
+ {
+ /* Remove this free list from the chain. */
+ if (prevFree == gcvNULL)
+ {
+ heap->freeList = node->next;
+ }
+ else
+ {
+ prevFree->next = node->next;
+ }
+
+ /* Consume the entire free node. */
+ used = (gcskNODE_PTR) node;
+ bytes = node->bytes;
+ }
+
+ /* Mark node as used. */
+ used->bytes = bytes;
+ used->next = gcdIN_USE;
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+ used->timeStamp = ++Heap->timeStamp;
+#endif
+
+#if VIVANTE_PROFILER_SYSTEM_MEMORY || gcmIS_DEBUG(gcdDEBUG_CODE)
+ /* Update profile counters. */
+ Heap->allocCount += 1;
+ Heap->allocBytes += bytes;
+ Heap->allocBytesMax = gcmMAX(Heap->allocBytes, Heap->allocBytesMax);
+ Heap->allocBytesTotal += bytes;
+#endif
+
+ /* Release the mutex. */
+ gcmkVERIFY_OK(
+ gckOS_ReleaseMutex(Heap->os, Heap->mutex));
+
+ /* Return pointer to memory. */
+ *Memory = used + 1;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Memory=0x%x", *Memory);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(
+ gckOS_ReleaseMutex(Heap->os, Heap->mutex));
+ }
+
+ if (memory != gcvNULL)
+ {
+ /* Free the heap memory. */
+ gckOS_FreeMemory(Heap->os, memory);
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckHEAP_Free
+**
+** Free allocated memory from the heap.
+**
+** INPUT:
+**
+** gckHEAP Heap
+** Pointer to a gckHEAP object.
+**
+** IN gctPOINTER Memory
+** Pointer to memory to free.
+**
+** OUTPUT:
+**
+** NOTHING.
+*/
+gceSTATUS
+gckHEAP_Free(
+ IN gckHEAP Heap,
+ IN gctPOINTER Memory
+ )
+{
+ gcskNODE_PTR node;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Heap=0x%x Memory=0x%x", Heap, Memory);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Heap, gcvOBJ_HEAP);
+ gcmkVERIFY_ARGUMENT(Memory != gcvNULL);
+
+ /* Acquire the mutex. */
+ gcmkONERROR(
+ gckOS_AcquireMutex(Heap->os, Heap->mutex, gcvINFINITE));
+
+ /* Pointer to structure. */
+ node = (gcskNODE_PTR) Memory - 1;
+
+ /* Mark the node as freed. */
+ node->next = gcvNULL;
+
+#if VIVANTE_PROFILER_SYSTEM_MEMORY || gcmIS_DEBUG(gcdDEBUG_CODE)
+ /* Update profile counters. */
+ Heap->allocBytes -= node->bytes;
+#endif
+
+ /* Release the mutex. */
+ gcmkVERIFY_OK(
+ gckOS_ReleaseMutex(Heap->os, Heap->mutex));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+#if VIVANTE_PROFILER_SYSTEM_MEMORY
+gceSTATUS
+gckHEAP_ProfileStart(
+ IN gckHEAP Heap
+ )
+{
+ gcmkHEADER_ARG("Heap=0x%x", Heap);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Heap, gcvOBJ_HEAP);
+
+ /* Zero the counters. */
+ Heap->allocCount = 0;
+ Heap->allocBytes = 0;
+ Heap->allocBytesMax = 0;
+ Heap->allocBytesTotal = 0;
+ Heap->heapCount = 0;
+ Heap->heapCountMax = 0;
+ Heap->heapMemory = 0;
+ Heap->heapMemoryMax = 0;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckHEAP_ProfileEnd(
+ IN gckHEAP Heap,
+ IN gctCONST_STRING Title
+ )
+{
+ gcmkHEADER_ARG("Heap=0x%x Title=0x%x", Heap, Title);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Heap, gcvOBJ_HEAP);
+ gcmkVERIFY_ARGUMENT(Title != gcvNULL);
+
+ gcmkPRINT("\n");
+ gcmkPRINT("=====[ HEAP - %s ]=====", Title);
+ gcmkPRINT("Number of allocations : %12u", Heap->allocCount);
+ gcmkPRINT("Number of bytes allocated : %12llu", Heap->allocBytes);
+ gcmkPRINT("Maximum allocation size : %12llu", Heap->allocBytesMax);
+ gcmkPRINT("Total number of bytes allocated : %12llu", Heap->allocBytesTotal);
+ gcmkPRINT("Number of heaps : %12u", Heap->heapCount);
+ gcmkPRINT("Heap memory in bytes : %12llu", Heap->heapMemory);
+ gcmkPRINT("Maximum number of heaps : %12u", Heap->heapCountMax);
+ gcmkPRINT("Maximum heap memory in bytes : %12llu", Heap->heapMemoryMax);
+ gcmkPRINT("==============================================");
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+#endif /* VIVANTE_PROFILER_SYSTEM_MEMORY */
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c
new file mode 100644
index 000000000000..1480e1793b68
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_interrupt_vg.c
@@ -0,0 +1,911 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+#if gcdENABLE_VG
+
+/******************************************************************************\
+*********************** Support Functions and Definitions **********************
+\******************************************************************************/
+
+/* Interruot statistics will be accumulated if not zero. */
+#define gcmENABLE_INTERRUPT_STATISTICS 0
+
+#define _GC_OBJ_ZONE gcvZONE_INTERRUPT
+
+/* Object structure. */
+struct _gckVGINTERRUPT
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* gckVGKERNEL pointer. */
+ gckVGKERNEL kernel;
+
+ /* gckOS pointer. */
+ gckOS os;
+
+ /* Interrupt handlers. */
+ gctINTERRUPT_HANDLER handlers[32];
+
+ /* Main interrupt handler thread. */
+ gctTHREAD handler;
+ gctBOOL terminate;
+
+ /* Interrupt FIFO. */
+ gctSEMAPHORE fifoValid;
+ gctUINT32 fifo[256];
+ gctUINT fifoItems;
+ gctUINT8 head;
+ gctUINT8 tail;
+
+ /* Interrupt statistics. */
+#if gcmENABLE_INTERRUPT_STATISTICS
+ gctUINT maxFifoItems;
+ gctUINT fifoOverflow;
+ gctUINT maxSimultaneous;
+ gctUINT multipleCount;
+#endif
+};
+
+
+/*******************************************************************************
+**
+** _ProcessInterrupt
+**
+** The interrupt processor.
+**
+** INPUT:
+**
+** ThreadParameter
+** Pointer to the gckVGINTERRUPT object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+#if gcmENABLE_INTERRUPT_STATISTICS
+static void
+_ProcessInterrupt(
+ gckVGINTERRUPT Interrupt,
+ gctUINT_PTR TriggeredCount
+ )
+#else
+static void
+_ProcessInterrupt(
+ gckVGINTERRUPT Interrupt
+ )
+#endif
+{
+ gceSTATUS status;
+ gctUINT32 triggered;
+ gctUINT i;
+
+ /* Advance to the next entry. */
+ Interrupt->tail += 1;
+ Interrupt->fifoItems -= 1;
+
+ /* Get the interrupt value. */
+ triggered = Interrupt->fifo[Interrupt->tail];
+ gcmkASSERT(triggered != 0);
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s: triggered=0x%08X\n",
+ __FUNCTION__,
+ triggered
+ );
+
+ /* Walk through all possible interrupts. */
+ for (i = 0; i < gcmSIZEOF(Interrupt->handlers); i += 1)
+ {
+ /* Test if interrupt happened. */
+ if ((triggered & 1) == 1)
+ {
+#if gcmENABLE_INTERRUPT_STATISTICS
+ if (TriggeredCount != gcvNULL)
+ {
+ (* TriggeredCount) += 1;
+ }
+#endif
+
+ /* Make sure we have valid handler. */
+ if (Interrupt->handlers[i] == gcvNULL)
+ {
+ gcmkTRACE(
+ gcvLEVEL_ERROR,
+ "%s: Interrupt %d isn't registered.\n",
+ __FUNCTION__, i
+ );
+ }
+ else
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s: interrupt=%d\n",
+ __FUNCTION__,
+ i
+ );
+
+ /* Call the handler. */
+ status = Interrupt->handlers[i] (Interrupt->kernel);
+
+ if (gcmkIS_ERROR(status))
+ {
+ /* Failed to signal the semaphore. */
+ gcmkTRACE(
+ gcvLEVEL_ERROR,
+ "%s: Error %d incrementing the semaphore #%d.\n",
+ __FUNCTION__, status, i
+ );
+ }
+ }
+ }
+
+ /* Next interrupt. */
+ triggered >>= 1;
+
+ /* No more interrupts to handle? */
+ if (triggered == 0)
+ {
+ break;
+ }
+ }
+}
+
+
+/*******************************************************************************
+**
+** _MainInterruptHandler
+**
+** The main interrupt thread serves the interrupt FIFO and calls registered
+** handlers for the interrupts that occured. The handlers are called in the
+** sequence interrupts occured with the exception when multiple interrupts
+** occured at the same time. In that case the handler calls are "sorted" by
+** the interrupt number therefore giving the interrupts with lower numbers
+** higher priority.
+**
+** INPUT:
+**
+** ThreadParameter
+** Pointer to the gckVGINTERRUPT object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+static gctTHREADFUNCRESULT gctTHREADFUNCTYPE
+_MainInterruptHandler(
+ gctTHREADFUNCPARAMETER ThreadParameter
+ )
+{
+ gceSTATUS status;
+ gckVGINTERRUPT interrupt;
+
+#if gcmENABLE_INTERRUPT_STATISTICS
+ gctUINT count;
+#endif
+
+ /* Cast the object. */
+ interrupt = (gckVGINTERRUPT) ThreadParameter;
+
+ /* Enter the loop. */
+ while (gcvTRUE)
+ {
+ /* Wait for an interrupt. */
+ status = gckOS_DecrementSemaphore(interrupt->os, interrupt->fifoValid);
+
+ /* Error? */
+ if (gcmkIS_ERROR(status))
+ {
+ break;
+ }
+
+ /* System termination request? */
+ if (status == gcvSTATUS_TERMINATE)
+ {
+ break;
+ }
+
+ /* Driver is shutting down? */
+ if (interrupt->terminate)
+ {
+ break;
+ }
+
+#if gcmENABLE_INTERRUPT_STATISTICS
+ /* Reset triggered count. */
+ count = 0;
+
+ /* Process the interrupt. */
+ _ProcessInterrupt(interrupt, &count);
+
+ /* Update conters. */
+ if (count > interrupt->maxSimultaneous)
+ {
+ interrupt->maxSimultaneous = count;
+ }
+
+ if (count > 1)
+ {
+ interrupt->multipleCount += 1;
+ }
+#else
+ /* Process the interrupt. */
+ _ProcessInterrupt(interrupt);
+#endif
+ }
+
+ return 0;
+}
+
+
+/*******************************************************************************
+**
+** _StartInterruptHandler / _StopInterruptHandler
+**
+** Main interrupt handler routine control.
+**
+** INPUT:
+**
+** ThreadParameter
+** Pointer to the gckVGINTERRUPT object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+static gceSTATUS
+_StartInterruptHandler(
+ gckVGINTERRUPT Interrupt
+ )
+{
+ gceSTATUS status, last;
+
+ do
+ {
+ /* Objects must not be already created. */
+ gcmkASSERT(Interrupt->fifoValid == gcvNULL);
+ gcmkASSERT(Interrupt->handler == gcvNULL);
+
+ /* Reset the termination request. */
+ Interrupt->terminate = gcvFALSE;
+
+#if !gcdENABLE_INFINITE_SPEED_HW
+ /* Construct the fifo semaphore. */
+ gcmkERR_BREAK(gckOS_CreateSemaphoreVG(
+ Interrupt->os, &Interrupt->fifoValid
+ ));
+
+ /* Start the interrupt handler thread. */
+ gcmkERR_BREAK(gckOS_StartThread(
+ Interrupt->os,
+ _MainInterruptHandler,
+ Interrupt,
+ &Interrupt->handler
+ ));
+#endif
+
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ /* Roll back. */
+ if (Interrupt->fifoValid != gcvNULL)
+ {
+ gcmkCHECK_STATUS(gckOS_DestroySemaphore(
+ Interrupt->os, Interrupt->fifoValid
+ ));
+
+ Interrupt->fifoValid = gcvNULL;
+ }
+
+ /* Return the status. */
+ return status;
+}
+
+static gceSTATUS
+_StopInterruptHandler(
+ gckVGINTERRUPT Interrupt
+ )
+{
+ gceSTATUS status;
+
+ do
+ {
+ /* Does the thread exist? */
+ if (Interrupt->handler == gcvNULL)
+ {
+ /* The semaphore must be NULL as well. */
+ gcmkASSERT(Interrupt->fifoValid == gcvNULL);
+
+ /* Success. */
+ status = gcvSTATUS_OK;
+ break;
+ }
+
+ /* The semaphore must exist as well. */
+ gcmkASSERT(Interrupt->fifoValid != gcvNULL);
+
+ /* Set the termination request. */
+ Interrupt->terminate = gcvTRUE;
+
+ /* Unlock the thread. */
+ gcmkERR_BREAK(gckOS_IncrementSemaphore(
+ Interrupt->os, Interrupt->fifoValid
+ ));
+
+ /* Wait until the thread quits. */
+ gcmkERR_BREAK(gckOS_StopThread(
+ Interrupt->os,
+ Interrupt->handler
+ ));
+
+ /* Destroy the semaphore. */
+ gcmkERR_BREAK(gckOS_DestroySemaphore(
+ Interrupt->os, Interrupt->fifoValid
+ ));
+
+ /* Reset handles. */
+ Interrupt->handler = gcvNULL;
+ Interrupt->fifoValid = gcvNULL;
+ }
+ while (gcvFALSE);
+
+ /* Return the status. */
+ return status;
+}
+
+
+/******************************************************************************\
+***************************** Interrupt Object API *****************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** gckVGINTERRUPT_Construct
+**
+** Construct an interrupt object.
+**
+** INPUT:
+**
+** Kernel
+** Pointer to the gckVGKERNEL object.
+**
+** OUTPUT:
+**
+** Interrupt
+** Pointer to the new gckVGINTERRUPT object.
+*/
+
+gceSTATUS
+gckVGINTERRUPT_Construct(
+ IN gckVGKERNEL Kernel,
+ OUT gckVGINTERRUPT * Interrupt
+ )
+{
+ gceSTATUS status;
+ gckVGINTERRUPT interrupt = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=0x%x Interrupt=0x%x", Kernel, Interrupt);
+
+ /* Verify argeuments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Interrupt != gcvNULL);
+
+ do
+ {
+ /* Allocate the gckVGINTERRUPT structure. */
+ gcmkERR_BREAK(gckOS_Allocate(
+ Kernel->os,
+ gcmSIZEOF(struct _gckVGINTERRUPT),
+ (gctPOINTER *) &interrupt
+ ));
+
+ /* Reset the object data. */
+ gcmkVERIFY_OK(gckOS_ZeroMemory(
+ interrupt, gcmSIZEOF(struct _gckVGINTERRUPT)
+ ));
+
+ /* Initialize the object. */
+ interrupt->object.type = gcvOBJ_INTERRUPT;
+
+ /* Initialize the object pointers. */
+ interrupt->kernel = Kernel;
+ interrupt->os = Kernel->os;
+
+ /* Initialize the current FIFO position. */
+ interrupt->head = (gctUINT8)~0;
+ interrupt->tail = (gctUINT8)~0;
+
+ /* Start the thread. */
+ gcmkERR_BREAK(_StartInterruptHandler(interrupt));
+
+ /* Return interrupt object. */
+ *Interrupt = interrupt;
+
+ gcmkFOOTER_ARG("*Interrup=0x%x", *Interrupt);
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ /* Roll back. */
+ if (interrupt != gcvNULL)
+ {
+ /* Free the gckVGINTERRUPT structure. */
+ gcmkVERIFY_OK(gckOS_Free(interrupt->os, interrupt));
+ }
+
+ gcmkFOOTER();
+
+ /* Return the status. */
+ return status;
+}
+
+
+/*******************************************************************************
+**
+** gckVGINTERRUPT_Destroy
+**
+** Destroy an interrupt object.
+**
+** INPUT:
+**
+** Interrupt
+** Pointer to the gckVGINTERRUPT object to destroy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+gceSTATUS
+gckVGINTERRUPT_Destroy(
+ IN gckVGINTERRUPT Interrupt
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Interrupt=0x%x", Interrupt);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Interrupt, gcvOBJ_INTERRUPT);
+
+ do
+ {
+ /* Stop the interrupt thread. */
+ gcmkERR_BREAK(_StopInterruptHandler(Interrupt));
+
+ /* Mark the object as unknown. */
+ Interrupt->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the gckVGINTERRUPT structure. */
+ gcmkERR_BREAK(gckOS_Free(Interrupt->os, Interrupt));
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+
+ /* Return the status. */
+ return status;
+}
+
+
+/*******************************************************************************
+**
+** gckVGINTERRUPT_DumpState
+**
+** Print the current state of the interrupt manager.
+**
+** INPUT:
+**
+** Interrupt
+** Pointer to a gckVGINTERRUPT object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+#if gcvDEBUG
+gceSTATUS
+gckVGINTERRUPT_DumpState(
+ IN gckVGINTERRUPT Interrupt
+ )
+{
+ gcmkHEADER_ARG("Interrupt=0x%x", Interrupt);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Interrupt, gcvOBJ_INTERRUPT);
+
+ /* Print the header. */
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ "%s: INTERRUPT OBJECT STATUS\n",
+ __FUNCTION__
+ );
+
+ /* Print statistics. */
+#if gcmENABLE_INTERRUPT_STATISTICS
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " Maximum number of FIFO items accumulated at a single time: %d\n",
+ Interrupt->maxFifoItems
+ );
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " Interrupt FIFO overflow happened times: %d\n",
+ Interrupt->fifoOverflow
+ );
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " Maximum number of interrupts simultaneously generated: %d\n",
+ Interrupt->maxSimultaneous
+ );
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " Number of times when there were multiple interrupts generated: %d\n",
+ Interrupt->multipleCount
+ );
+#endif
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " The current number of entries in the FIFO: %d\n",
+ Interrupt->fifoItems
+ );
+
+ /* Print the FIFO contents. */
+ if (Interrupt->fifoItems != 0)
+ {
+ gctUINT8 index;
+ gctUINT8 last;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " FIFO current contents:\n"
+ );
+
+ /* Get the current pointers. */
+ index = Interrupt->tail;
+ last = Interrupt->head;
+
+ while (index != last)
+ {
+ /* Advance to the next entry. */
+ index += 1;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_VERBOSE, gcvZONE_COMMAND,
+ " %d: 0x%08X\n",
+ index, Interrupt->fifo[index]
+ );
+ }
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+#endif
+
+
+/*******************************************************************************
+**
+** gckVGINTERRUPT_Enable
+**
+** Enable the specified interrupt.
+**
+** INPUT:
+**
+** Interrupt
+** Pointer to a gckVGINTERRUPT object.
+**
+** Id
+** Pointer to the variable that holds the interrupt number to be
+** registered in range 0..31.
+** If the value is less then 0, gckVGINTERRUPT_Enable will attempt
+** to find an unused interrupt. If such interrupt is found, the number
+** will be assigned to the variable if the functuion call succeedes.
+**
+** Handler
+** Pointer to the handler to register for the interrupt.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+gceSTATUS
+gckVGINTERRUPT_Enable(
+ IN gckVGINTERRUPT Interrupt,
+ IN OUT gctINT32_PTR Id,
+ IN gctINTERRUPT_HANDLER Handler
+ )
+{
+ gceSTATUS status;
+ gctINT32 i;
+
+ gcmkHEADER_ARG("Interrupt=0x%x Id=0x%x Handler=0x%x", Interrupt, Id, Handler);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Interrupt, gcvOBJ_INTERRUPT);
+ gcmkVERIFY_ARGUMENT(Id != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Handler != gcvNULL);
+
+ do
+ {
+ /* See if we need to allocate an ID. */
+ if (*Id < 0)
+ {
+ /* Find the first unused interrupt handler. */
+ for (i = 0; i < gcmCOUNTOF(Interrupt->handlers); ++i)
+ {
+ if (Interrupt->handlers[i] == gcvNULL)
+ {
+ break;
+ }
+ }
+
+ /* No unused innterrupts? */
+ if (i == gcmCOUNTOF(Interrupt->handlers))
+ {
+ status = gcvSTATUS_OUT_OF_RESOURCES;
+ break;
+ }
+
+ /* Update the interrupt ID. */
+ *Id = i;
+ }
+
+ /* Make sure the ID is in range. */
+ else if (*Id >= gcmCOUNTOF(Interrupt->handlers))
+ {
+ status = gcvSTATUS_INVALID_ARGUMENT;
+ break;
+ }
+
+ /* Set interrupt handler. */
+ Interrupt->handlers[*Id] = Handler;
+
+ /* Success. */
+ status = gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return the status. */
+ return status;
+}
+
+
+/*******************************************************************************
+**
+** gckVGINTERRUPT_Disable
+**
+** Disable the specified interrupt.
+**
+** INPUT:
+**
+** Interrupt
+** Pointer to a gckVGINTERRUPT object.
+**
+** Id
+** Interrupt number to be disabled in range 0..31.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+gceSTATUS
+gckVGINTERRUPT_Disable(
+ IN gckVGINTERRUPT Interrupt,
+ IN gctINT32 Id
+ )
+{
+ gcmkHEADER_ARG("Interrupt=0x%x Id=0x%x", Interrupt, Id);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Interrupt, gcvOBJ_INTERRUPT);
+ gcmkVERIFY_ARGUMENT((Id >= 0) && (Id < gcmCOUNTOF(Interrupt->handlers)));
+
+ /* Reset interrupt handler. */
+ Interrupt->handlers[Id] = gcvNULL;
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+
+/*******************************************************************************
+**
+** gckVGINTERRUPT_Enque
+**
+** Read the interrupt status register and put the value in the interrupt FIFO.
+**
+** INPUT:
+**
+** Interrupt
+** Pointer to a gckVGINTERRUPT object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+
+#ifndef __QNXNTO__
+gceSTATUS
+gckVGINTERRUPT_Enque(
+ IN gckVGINTERRUPT Interrupt
+ )
+#else
+gceSTATUS
+gckVGINTERRUPT_Enque(
+ IN gckVGINTERRUPT Interrupt,
+ OUT gckOS *Os,
+ OUT gctSEMAPHORE *Semaphore
+ )
+#endif
+{
+ gceSTATUS status;
+ gctUINT32 triggered;
+
+ gcmkHEADER_ARG("Interrupt=0x%x", Interrupt);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Interrupt, gcvOBJ_INTERRUPT);
+
+#ifdef __QNXNTO__
+ *Os = gcvNULL;
+ *Semaphore = gcvNULL;
+#endif
+
+ do
+ {
+ /* Read interrupt status register. */
+ gcmkERR_BREAK(gckVGHARDWARE_ReadInterrupt(
+ Interrupt->kernel->hardware, &triggered
+ ));
+
+ /* Mask out TS overflow interrupt */
+ triggered &= 0xfffffffe;
+
+ /* No interrupts to process? */
+ if (triggered == 0)
+ {
+ status = gcvSTATUS_NOT_OUR_INTERRUPT;
+ break;
+ }
+
+ /* FIFO overflow? */
+ if (Interrupt->fifoItems == gcmCOUNTOF(Interrupt->fifo))
+ {
+#if gcmENABLE_INTERRUPT_STATISTICS
+ Interrupt->fifoOverflow += 1;
+#endif
+
+ /* OR the interrupt with the last value in the FIFO. */
+ Interrupt->fifo[Interrupt->head] |= triggered;
+
+ /* Success (kind of). */
+ status = gcvSTATUS_OK;
+ }
+ else
+ {
+ /* Advance to the next entry. */
+ Interrupt->head += 1;
+ Interrupt->fifoItems += 1;
+
+#if gcmENABLE_INTERRUPT_STATISTICS
+ if (Interrupt->fifoItems > Interrupt->maxFifoItems)
+ {
+ Interrupt->maxFifoItems = Interrupt->fifoItems;
+ }
+#endif
+
+ /* Set the new value. */
+ Interrupt->fifo[Interrupt->head] = triggered;
+
+#ifndef __QNXNTO__
+ /* Increment the FIFO semaphore. */
+ gcmkERR_BREAK(gckOS_IncrementSemaphore(
+ Interrupt->os, Interrupt->fifoValid
+ ));
+#else
+ *Os = Interrupt->os;
+ *Semaphore = Interrupt->fifoValid;
+#endif
+
+ /* Windows kills our threads prematurely when the application
+ exists. Verify here that the thread is still alive. */
+ status = gckOS_VerifyThread(Interrupt->os, Interrupt->handler);
+
+ /* Has the thread been prematurely terminated? */
+ if (status != gcvSTATUS_OK)
+ {
+ /* Process all accumulated interrupts. */
+ while (Interrupt->head != Interrupt->tail)
+ {
+#if gcmENABLE_INTERRUPT_STATISTICS
+ /* Process the interrupt. */
+ _ProcessInterrupt(Interrupt, gcvNULL);
+#else
+ /* Process the interrupt. */
+ _ProcessInterrupt(Interrupt);
+#endif
+ }
+
+ /* Set success. */
+ status = gcvSTATUS_OK;
+ }
+ }
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+#endif /* gcdENABLE_VG */
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
new file mode 100644
index 000000000000..a22a229a3159
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu.c
@@ -0,0 +1,3409 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+#define _GC_OBJ_ZONE gcvZONE_MMU
+
+typedef enum _gceMMU_TYPE
+{
+ gcvMMU_USED = (0 << 4),
+ gcvMMU_SINGLE = (1 << 4),
+ gcvMMU_FREE = (2 << 4),
+}
+gceMMU_TYPE;
+
+/* VIP SRAM start virtual address. */
+#define gcdRESERVE_START (4 << 20)
+#define gcdRESERVE_ALIGN (4 << 10)
+
+#define gcmENTRY_TYPE(x) (x & 0xF0)
+
+#define gcmENTRY_COUNT(x) ((x & 0xFFFFFF00) >> 8)
+
+#define gcdMMU_TABLE_DUMP 0
+
+#define gcdVERTEX_START (128 << 10)
+
+typedef struct _gcsMMU_STLB_CHUNK *gcsMMU_STLB_CHUNK_PTR;
+
+typedef struct _gcsMMU_STLB_CHUNK
+{
+ gckVIDMEM_NODE videoMem;
+ gctUINT32_PTR logical;
+ gctSIZE_T size;
+ gctPHYS_ADDR_T physBase;
+ gctSIZE_T pageCount;
+ gctUINT32 mtlbIndex;
+ gctUINT32 mtlbEntryNum;
+ gcsMMU_STLB_CHUNK_PTR next;
+} gcsMMU_STLB_CHUNK;
+
+#if gcdSHARED_PAGETABLE
+typedef struct _gcsSharedPageTable * gcsSharedPageTable_PTR;
+typedef struct _gcsSharedPageTable
+{
+ /* Shared gckMMU object. */
+ gckMMU mmu;
+
+ /* Hardwares which use this shared pagetable. */
+ gckHARDWARE hardwares[gcdMAX_GPU_COUNT];
+
+ /* Number of cores use this shared pagetable. */
+ gctUINT32 reference;
+}
+gcsSharedPageTable;
+
+static gcsSharedPageTable_PTR sharedPageTable = gcvNULL;
+#endif
+
+typedef struct _gcsFreeSpaceNode * gcsFreeSpaceNode_PTR;
+typedef struct _gcsFreeSpaceNode
+{
+ gctUINT32 start;
+ gctINT32 entries;
+}
+gcsFreeSpaceNode;
+
+#if gcdENDIAN_BIG
+
+# define _WritePageEntry(pageEntry, entryValue) \
+ *(gctUINT32_PTR)(pageEntry) = gcmBSWAP32((gctUINT32)(entryValue))
+
+# define _ReadPageEntry(pageEntry) \
+ gcmBSWAP32(*(gctUINT32_PTR)(pageEntry))
+
+#else
+
+# define _WritePageEntry(pageEntry, entryValue) \
+ *(gctUINT32_PTR)(pageEntry) = (gctUINT32)(entryValue)
+
+# define _ReadPageEntry(pageEntry) \
+ *(gctUINT32_PTR)(pageEntry)
+
+#endif
+
+static gceSTATUS
+_FillPageTable(
+ IN gctUINT32_PTR PageTable,
+ IN gctUINT32 PageCount,
+ IN gctUINT32 EntryValue
+)
+{
+ gctUINT i;
+
+ for (i = 0; i < PageCount; i++)
+ {
+ _WritePageEntry(PageTable + i, EntryValue);
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_FillMap(
+ IN gctUINT32_PTR Map,
+ IN gctUINT32 PageCount,
+ IN gctUINT32 EntryValue
+)
+{
+ gctUINT i;
+
+ for (i = 0; i < PageCount; i++)
+ {
+ Map[i] = EntryValue;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_Link(
+ IN gcsADDRESS_AREA_PTR Area,
+ IN gctUINT32 Index,
+ IN gctUINT32 Next
+ )
+{
+ if (Index >= Area->stlbEntries)
+ {
+ /* Just move heap pointer. */
+ Area->heapList = Next;
+ }
+ else
+ {
+ /* Address page table. */
+ gctUINT32_PTR map = Area->mapLogical;
+
+ /* Dispatch on node type. */
+ switch (gcmENTRY_TYPE(map[Index]))
+ {
+ case gcvMMU_SINGLE:
+ /* Set single index. */
+ map[Index] = (Next << 8) | gcvMMU_SINGLE;
+ break;
+
+ case gcvMMU_FREE:
+ /* Set index. */
+ map[Index + 1] = Next;
+ break;
+
+ default:
+ gcmkFATAL("MMU table correcupted at index %u!", Index);
+ return gcvSTATUS_HEAP_CORRUPTED;
+ }
+ }
+
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_AddFree(
+ IN gcsADDRESS_AREA_PTR Area,
+ IN gctUINT32 Index,
+ IN gctUINT32 Node,
+ IN gctUINT32 Count
+ )
+{
+ gctUINT32_PTR map = Area->mapLogical;
+
+ if (Count == 1)
+ {
+ /* Initialize a single page node. */
+ map[Node] = (~((1U<<8)-1)) | gcvMMU_SINGLE;
+ }
+ else
+ {
+ /* Initialize the node. */
+ map[Node + 0] = (Count << 8) | gcvMMU_FREE;
+ map[Node + 1] = ~0U;
+ }
+
+ /* Append the node. */
+ return _Link(Area, Index, Node);
+}
+
+static gceSTATUS
+_Collect(
+ IN gcsADDRESS_AREA_PTR Area
+ )
+{
+ gctUINT32_PTR map = Area->mapLogical;
+ gceSTATUS status;
+ gctUINT32 i, previous, start = 0, count = 0;
+
+ previous = Area->heapList = ~0U;
+ Area->freeNodes = gcvFALSE;
+
+ /* Walk the entire page table. */
+ for (i = 0; i < Area->stlbEntries; ++i)
+ {
+ /* Dispatch based on type of page. */
+ switch (gcmENTRY_TYPE(map[i]))
+ {
+ case gcvMMU_USED:
+ /* Used page, so close any open node. */
+ if (count > 0)
+ {
+ /* Add the node. */
+ gcmkONERROR(_AddFree(Area, previous, start, count));
+
+ /* Reset the node. */
+ previous = start;
+ count = 0;
+ }
+ break;
+
+ case gcvMMU_SINGLE:
+ /* Single free node. */
+ if (count++ == 0)
+ {
+ /* Start a new node. */
+ start = i;
+ }
+ break;
+
+ case gcvMMU_FREE:
+ /* A free node. */
+ if (count == 0)
+ {
+ /* Start a new node. */
+ start = i;
+ }
+
+ /* Advance the count. */
+ count += map[i] >> 8;
+
+ /* Advance the index into the page table. */
+ i += (map[i] >> 8) - 1;
+ break;
+
+ default:
+ gcmkFATAL("MMU page table correcupted at index %u!", i);
+ return gcvSTATUS_HEAP_CORRUPTED;
+ }
+ }
+
+ /* See if we have an open node left. */
+ if (count > 0)
+ {
+ /* Add the node to the list. */
+ gcmkONERROR(_AddFree(Area, previous, start, count));
+ }
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_MMU,
+ "Performed a garbage collection of the MMU heap.");
+
+ /* Success. */
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the staus. */
+ return status;
+}
+
+static gctUINT32
+_SetPage(gctUINT32 PageAddress, gctUINT32 PageAddressExt, gctBOOL Writable)
+{
+ gctUINT32 entry = PageAddress
+ /* AddressExt */
+ | (PageAddressExt << 4)
+ /* Ignore exception */
+ | (0 << 1)
+ /* Present */
+ | (1 << 0);
+
+ if (Writable)
+ {
+ /* writable */
+ entry |= (1 << 2);
+ }
+#if gcdUSE_MMU_EXCEPTION
+ else
+ {
+ /* If this page is read only, set exception bit to make exception happens
+ ** when writing to it. */
+ entry |= gcdMMU_STLB_EXCEPTION;
+ }
+#endif
+
+ return entry;
+}
+
+static gctUINT32
+_MtlbOffset(
+ gctUINT32 Address
+ )
+{
+ return (Address & gcdMMU_MTLB_MASK) >> gcdMMU_MTLB_SHIFT;
+}
+
+gctUINT32
+_AddressToIndex(
+ IN gcsADDRESS_AREA_PTR Area,
+ IN gctUINT32 Address
+ )
+{
+
+ gctUINT32 stlbShift = (Area->areaType == gcvAREA_TYPE_1M) ? gcdMMU_STLB_1M_SHIFT : gcdMMU_STLB_4K_SHIFT;
+ gctUINT32 stlbMask = (Area->areaType == gcvAREA_TYPE_1M) ? gcdMMU_STLB_1M_MASK : gcdMMU_STLB_4K_MASK;
+ gctUINT32 stlbEntryNum = (Area->areaType == gcvAREA_TYPE_1M) ? gcdMMU_STLB_1M_ENTRY_NUM : gcdMMU_STLB_4K_ENTRY_NUM;
+ gctUINT32 mtlbOffset = (Address & gcdMMU_MTLB_MASK) >> gcdMMU_MTLB_SHIFT;
+ gctUINT32 stlbOffset = (Address & stlbMask) >> stlbShift;
+
+ return (mtlbOffset - Area->mappingStart) * stlbEntryNum + stlbOffset;
+}
+
+static gctUINT32_PTR
+_StlbEntry(
+ gcsADDRESS_AREA_PTR Area,
+ gctUINT32 Address
+ )
+{
+ gctUINT32 index = _AddressToIndex(Area, Address);
+
+ return &Area->stlbLogical[index];
+}
+
+static gctBOOL
+_IsRangeInsected(
+ gctUINT64 baseAddress1,
+ gctSIZE_T size1,
+ gctUINT64 baseAddress2,
+ gctSIZE_T size2
+ )
+{
+ gctUINT64 endAddress1 = baseAddress1 + size1 - 1;
+ gctUINT64 endAddress2 = baseAddress2 + size2 - 1;
+
+ if (!size1 || !size2)
+ {
+ return gcvFALSE;
+ }
+
+ return (((baseAddress2 <= endAddress1) && (endAddress2 >= baseAddress1)) ||
+ ((baseAddress1 <= endAddress2) && (endAddress1 >= baseAddress2)));
+}
+
+static gceSTATUS
+_FillFlatMappingInMap(
+ gcsADDRESS_AREA_PTR Area,
+ gctUINT32 Index,
+ gctUINT32 NumPages
+ )
+{
+ gceSTATUS status;
+ gctUINT32 i;
+ gctBOOL gotIt = gcvFALSE;
+ gctUINT32 index = Index;
+ gctUINT32_PTR map = Area->mapLogical;
+ gctUINT32 previous = ~0U;
+
+ /* Find node which contains index. */
+ for (i = 0; !gotIt && (i < Area->stlbEntries);)
+ {
+ gctUINT32 numPages;
+
+ switch (gcmENTRY_TYPE(map[i]))
+ {
+ case gcvMMU_SINGLE:
+ if (i == index)
+ {
+ gotIt = gcvTRUE;
+ }
+ else
+ {
+ previous = i;
+ i = map[i] >> 8;
+ }
+ break;
+
+ case gcvMMU_FREE:
+ numPages = map[i] >> 8;
+ if (index >= i && index + NumPages - 1 < i + numPages)
+ {
+ gotIt = gcvTRUE;
+ }
+ else
+ {
+ previous = i;
+ i = map[i + 1];
+ }
+ break;
+
+ case gcvMMU_USED:
+ i++;
+ break;
+
+ default:
+ gcmkFATAL("MMU table correcupted at index %u!", index);
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+ }
+
+ switch (gcmENTRY_TYPE(map[i]))
+ {
+ case gcvMMU_SINGLE:
+ /* Unlink single node from free list. */
+ gcmkONERROR(
+ _Link(Area, previous, map[i] >> 8));
+ break;
+
+ case gcvMMU_FREE:
+ /* Split the node. */
+ {
+ gctUINT32 start;
+ gctUINT32 next = map[i+1];
+ gctUINT32 total = map[i] >> 8;
+ gctUINT32 countLeft = index - i;
+ gctUINT32 countRight = total - countLeft - NumPages;
+
+ if (countLeft)
+ {
+ start = i;
+ _AddFree(Area, previous, start, countLeft);
+ previous = start;
+ }
+
+ if (countRight)
+ {
+ start = index + NumPages;
+ _AddFree(Area, previous, start, countRight);
+ previous = start;
+ }
+
+ _Link(Area, previous, next);
+ }
+ break;
+ }
+
+ _FillMap(&map[index], NumPages, gcvMMU_USED);
+
+ return gcvSTATUS_OK;
+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;
+}
+
+static gcePOOL _GetPageTablePool(IN gckOS Os)
+{
+ gcePOOL pool = gcvPOOL_DEFAULT;
+ gctUINT64 data = 0;
+ gceSTATUS status;
+
+ status = gckOS_QueryOption(Os, "mmuPageTablePool", &data);
+
+ if (status == gcvSTATUS_OK)
+ {
+ if (data == 1)
+ {
+ pool = gcvPOOL_VIRTUAL;
+ }
+ }
+
+ return pool;
+}
+
+static gceSTATUS
+_FillFlatMapping(
+ IN gckMMU Mmu,
+ IN gctUINT64 PhysBase,
+ IN gctSIZE_T Size,
+ IN gctBOOL reserved,
+ IN gctBOOL ableToShift,
+ OUT gctUINT32 *GpuBaseAddress
+ )
+{
+ gceSTATUS status;
+ gctUINT32 mtlb;
+ gctUINT32 physBase;
+ gckKERNEL kernel = Mmu->hardware->kernel;
+ gcsADDRESS_AREA_PTR area = &Mmu->dynamicArea4K;
+ gctBOOL physicalRangeOverlapped = gcvFALSE;
+ gctBOOL virtualRangeOverlapped = gcvFALSE;
+ gctBOOL specificFlatMapping = gcvFALSE;
+ gctBOOL needShiftMapping = gcvFALSE;
+ gctUINT64 flatBase = PhysBase;
+ gctUINT32 flatSize = (gctUINT32) Size;
+ gctUINT64 base = flatBase;
+ gctUINT64 end = base + flatSize;
+ gctUINT32 reqVirtualBase = 0;
+ gctUINT32 flatVirtualBase = 0;
+ gctUINT32 i;
+
+ /************************ Get flat mapping type and range. ************************/
+ {
+ for (i = 0; i < Mmu->gpuPhysicalRangeCount; i++)
+ {
+ if (base < Mmu->gpuPhysicalRanges[i].start)
+ {
+ if (end > Mmu->gpuPhysicalRanges[i].start)
+ {
+ physicalRangeOverlapped = gcvTRUE;
+ if (Mmu->gpuPhysicalRanges[i].flag == gcvFLATMAP_DIRECT)
+ {
+ /* Overlapped part is direct mapping, continue direct mapping */
+ end = Mmu->gpuPhysicalRanges[i].start;
+ }
+ else
+ {
+ /* Overlapped part is shift mapping, do entire shift mapping */
+ needShiftMapping = gcvTRUE;
+ }
+ }
+
+ flatSize = (gctUINT32) (end - base);
+ }
+ else if (end > Mmu->gpuPhysicalRanges[i].end)
+ {
+ if (base < Mmu->gpuPhysicalRanges[i].end)
+ {
+ physicalRangeOverlapped = gcvTRUE;
+ if (Mmu->gpuPhysicalRanges[i].flag == gcvFLATMAP_DIRECT)
+ {
+ /* Overlapped part is direct mapping, continue direct mapping */
+ base = Mmu->gpuPhysicalRanges[i].end + 1;
+ }
+ else
+ {
+ /* Overlapped part is shift mapping, do entire shift mapping */
+ needShiftMapping = gcvTRUE;
+ }
+
+ }
+
+ flatBase = base;
+ flatSize = (gctUINT32) (end - base);
+ }
+ else
+ {
+ /* it is already inside existing flat mapping ranges. */
+ flatSize = 0;
+ }
+
+ if (flatSize == 0)
+ {
+ if (GpuBaseAddress)
+ {
+ *GpuBaseAddress = (gctUINT32) PhysBase;
+ }
+
+ return gcvSTATUS_OK;
+ }
+ }
+ }
+
+ /* overwrite the orignal parameters */
+ PhysBase = flatBase;
+ physBase = (gctUINT32)flatBase;
+
+ mtlb = _MtlbOffset(physBase);
+
+ if (GpuBaseAddress)
+ {
+ reqVirtualBase = *GpuBaseAddress;
+ }
+
+ /*
+ * if no partcial physical range overlap to request entire shift mapping,
+ * it is specific shift mapping or directly mapping by default.
+ */
+ if (!needShiftMapping)
+ {
+ flatVirtualBase = reqVirtualBase ? reqVirtualBase : (gctUINT32)flatBase;
+ }
+
+ for (i = 0; i < Mmu->gpuAddressRangeCount; i++)
+ {
+ if (_IsRangeInsected(flatVirtualBase, flatSize,
+ Mmu->gpuAddressRanges[i].start, Mmu->gpuAddressRanges[i].size))
+ {
+ virtualRangeOverlapped = gcvTRUE;
+ }
+ }
+
+ /* If gpu virtual range overlapped or gpu physical over 4G, still need entire shift mapping */
+ if ((!physicalRangeOverlapped && virtualRangeOverlapped) ||
+ PhysBase + flatSize - 1 > 0xffffffff)
+ {
+ needShiftMapping = gcvTRUE;
+ }
+
+ if (needShiftMapping && !ableToShift)
+ {
+ /*
+ * Return without mapping any address.
+ * By now, only physBase physSize could run here.
+ */
+ return gcvSTATUS_OK;
+ }
+
+ specificFlatMapping = (reqVirtualBase && !virtualRangeOverlapped && !physicalRangeOverlapped);
+
+ /************************ Setup flat mapping in dynamic range. ****************/
+ if (area->mappingStart != gcvINVALID_ADDRESS && mtlb >= area->mappingStart && mtlb < area->mappingEnd)
+ {
+ /* This path is useless now, keep it 4K page size */
+
+ gctUINT32_PTR stlbEntry;
+
+ stlbEntry = _StlbEntry(area, physBase);
+
+ /* Must be aligned to page. */
+ gcmkASSERT((flatSize & 0xFFF) == 0);
+
+ for (i = 0; i < (flatSize / gcdMMU_PAGE_4K_SIZE); i++)
+ {
+ /* Flat mapping in page table. */
+ _WritePageEntry(stlbEntry, _SetPage(physBase + i * gcdMMU_PAGE_4K_SIZE, 0, gcvTRUE));
+#if gcdMMU_TABLE_DUMP
+ gckOS_Print("%s(%d): insert MTLB[%d] STLB[%d]: %08x\n",
+ __FUNCTION__, __LINE__,
+ (physBase & gcdMMU_MTLB_MASK) >> gcdMMU_MTLB_SHIFT,
+ ((physBase & gcdMMU_STLB_4K_MASK) >> gcdMMU_STLB_4K_SHIFT) + i,
+ _ReadPageEntry(stlbEntry));
+#endif
+ stlbEntry++;
+ }
+
+#if gcdDUMP_IN_KERNEL
+ {
+ gctPHYS_ADDR_T physical;
+ gctUINT32 data = _SetPage(physBase, 0, gcvTRUE) & ~0xF;
+ gctUINT32 step = (_SetPage(physBase + gcdMMU_PAGE_4K_SIZE, 0, gcvTRUE) & ~0xF) - data;
+ gctUINT32 mask = _SetPage(physBase, 0, gcvTRUE) & 0xF;
+
+ physical = area->stlbPhysical + 4 * _AddressToIndex(area, physBase);
+
+ gcmkDUMP(Mmu->os,
+ "#[mmu-stlb: flat-mapping in dynamic: 0x%08X - 0x%08X]",
+ physBase, physBase - 1 + flatSize);
+
+ gcmkDUMP(Mmu->os,
+ "@[physical.step 0x%010llX 0x%08X 0x%08lX 0x%08X 0x%08X",
+ (unsigned long long)physical, data,
+ (unsigned long)(flatSize / gcdMMU_PAGE_4K_SIZE * sizeof(gctUINT32)),
+ step, mask);
+ }
+#endif
+
+ /* Flat mapping in map. */
+ _FillFlatMappingInMap(area, _AddressToIndex(area, physBase), flatSize / gcdMMU_PAGE_4K_SIZE);
+
+ return gcvSTATUS_OK;
+ }
+
+ /************************ Setup flat mapping in non dynamic range. **************/
+ {
+ gctBOOL mutex = gcvFALSE;
+ gctUINT32 physBaseExt = (gctUINT32) (PhysBase >> 32);
+ gctUINT32 start = physBase & ~gcdMMU_PAGE_1M_MASK;
+ gctUINT32 end = (gctUINT32) (physBase + flatSize - 1) & ~gcdMMU_PAGE_1M_MASK;
+ gctUINT32 mStart = start >> gcdMMU_MTLB_SHIFT;
+ gctUINT32 mEnd = end >> gcdMMU_MTLB_SHIFT;
+ gctUINT32 sStart = (start & gcdMMU_STLB_1M_MASK) >> gcdMMU_STLB_1M_SHIFT;
+ gctUINT32 sEnd = (end & gcdMMU_STLB_1M_MASK) >> gcdMMU_STLB_1M_SHIFT;
+ gctPHYS_ADDR_T physical;
+ gcsMMU_STLB_CHUNK_PTR newStlbChunk = gcvNULL;
+ gctUINT32 stlbIndex = 0;
+ gctUINT32 totalNewStlbs = 0;
+ gctINT32 firstMtlbEntry = -1;
+ gctUINT32 mtlbCurEntry;
+ gcsMMU_STLB_CHUNK_PTR curStlbChunk = gcvNULL;
+ gceFLATMAP_FLAG mapFlag = gcvFLATMAP_DIRECT;
+ enum
+ {
+ COLOR_NONE = 0,
+ COLOR_RED = 1, /* occupied entry */
+ COLOR_BLUE = 2, /* empty entry */
+ COLOR_MAX = COLOR_BLUE,
+ } lastColor = COLOR_NONE;
+ gctUINT32 colorNumber = 0;
+
+ /* Grab the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Mmu->os, Mmu->pageTableMutex, gcvINFINITE));
+ mutex = gcvTRUE;
+
+ if (needShiftMapping)
+ {
+ gctUINT32 mEntries;
+ gctUINT32 sEntries;
+
+ mEntries = (flatSize + (1 << gcdMMU_MTLB_SHIFT) - 1) / (1 << gcdMMU_MTLB_SHIFT);
+
+ gcmkONERROR(_GetMtlbFreeSpace(Mmu, mEntries, &mStart, &mEnd));
+
+ sStart = 0;
+ sEntries = (flatSize + gcdMMU_PAGE_1M_SIZE - 1) / gcdMMU_PAGE_1M_SIZE;
+ sEnd = (sEntries - 1) % gcdMMU_STLB_1M_ENTRY_NUM;
+ mapFlag = gcvFLATMAP_SHIFT;
+ }
+
+ if (specificFlatMapping)
+ {
+ start = reqVirtualBase & ~gcdMMU_PAGE_1M_MASK;
+ end = (reqVirtualBase + flatSize - 1) & ~gcdMMU_PAGE_1M_MASK;
+ mStart = start >> gcdMMU_MTLB_SHIFT;
+ mEnd = end >> gcdMMU_MTLB_SHIFT;
+ sStart = (start & gcdMMU_STLB_1M_MASK) >> gcdMMU_STLB_1M_SHIFT;
+ sEnd = (end & gcdMMU_STLB_1M_MASK) >> gcdMMU_STLB_1M_SHIFT;
+ mapFlag = gcvFLATMAP_SHIFT;
+ }
+
+ /* No matter direct mapping or shift mapping or specific mapping, store gpu virtual ranges */
+ flatVirtualBase = (mStart << gcdMMU_MTLB_SHIFT)
+ | (sStart << gcdMMU_STLB_1M_SHIFT)
+ | (physBase & gcdMMU_PAGE_1M_MASK);
+
+ /* Return GPU virtual base address if necessary */
+ if (GpuBaseAddress)
+ {
+ *GpuBaseAddress = flatVirtualBase;
+ }
+
+ mtlbCurEntry = mStart;
+
+ /* find all new stlbs, part of new flat mapping range may already have stlbs*/
+ while (mtlbCurEntry <= mEnd)
+ {
+ if (*(Mmu->mtlbLogical + mtlbCurEntry) == 0)
+ {
+ if (lastColor != COLOR_BLUE)
+ {
+ if (colorNumber < COLOR_MAX)
+ {
+ lastColor = COLOR_BLUE;
+ colorNumber++;
+ }
+ else
+ {
+ gcmkPRINT("There is a hole in new flat mapping range, which is not correct");
+ }
+ }
+
+ totalNewStlbs++;
+ if (-1 == firstMtlbEntry)
+ {
+ firstMtlbEntry = mtlbCurEntry;
+ }
+ }
+ else
+ {
+ if (lastColor != COLOR_RED)
+ {
+ if (colorNumber < COLOR_MAX)
+ {
+ lastColor = COLOR_RED;
+ colorNumber++;
+ }
+ else
+ {
+ gcmkPRINT("There is a hole in new flat mapping range, which is not correct");
+ }
+ }
+ }
+ mtlbCurEntry++;
+ }
+
+ /* Need allocate a new chunk of stlbs */
+ if (totalNewStlbs)
+ {
+ gcePOOL pool = Mmu->pool;
+ gctUINT32 allocFlag = gcvALLOC_FLAG_CONTIGUOUS;
+
+ gcmkONERROR(
+ gckOS_Allocate(Mmu->os,
+ sizeof(struct _gcsMMU_STLB_CHUNK),
+ (gctPOINTER *)&newStlbChunk));
+
+ newStlbChunk->mtlbEntryNum = totalNewStlbs;
+ newStlbChunk->next = gcvNULL;
+ newStlbChunk->videoMem = gcvNULL;
+ newStlbChunk->logical = gcvNULL;
+ newStlbChunk->size = gcdMMU_STLB_1M_SIZE * newStlbChunk->mtlbEntryNum;
+ newStlbChunk->pageCount = 0;
+ newStlbChunk->mtlbIndex = firstMtlbEntry;
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ allocFlag |= gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+ allocFlag |= gcvALLOC_FLAG_4GB_ADDR;
+
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ kernel,
+ gcdMMU_STLB_1M_SIZE,
+ gcvVIDMEM_TYPE_COMMAND,
+ allocFlag | gcvALLOC_FLAG_4K_PAGES,
+ &newStlbChunk->size,
+ &pool,
+ &newStlbChunk->videoMem));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ kernel,
+ newStlbChunk->videoMem,
+ gcvFALSE,
+ gcvFALSE,
+ (gctPOINTER *)&newStlbChunk->logical));
+
+ gcmkONERROR(gckOS_ZeroMemory(newStlbChunk->logical, newStlbChunk->size));
+
+ /* Get CPU physical address. */
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(
+ kernel,
+ newStlbChunk->videoMem,
+ 0,
+ &physical));
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(
+ Mmu->os,
+ physical,
+ &physical));
+
+ newStlbChunk->physBase = physical;
+ }
+
+ while (mStart <= mEnd)
+ {
+ gctUINT32 last = (mStart == mEnd) ? sEnd : (gcdMMU_STLB_1M_ENTRY_NUM - 1);
+ gctPHYS_ADDR_T stlbPhyBase;
+ gctUINT32_PTR stlbLogical;
+
+ gcmkASSERT(mStart < gcdMMU_MTLB_ENTRY_NUM);
+
+ if (*(Mmu->mtlbLogical + mStart) == 0)
+ {
+ gctUINT32 mtlbEntry;
+ curStlbChunk = newStlbChunk;
+ stlbPhyBase = curStlbChunk->physBase + (stlbIndex * gcdMMU_STLB_1M_SIZE);
+ stlbLogical = (gctUINT32_PTR)((gctUINT8_PTR)curStlbChunk->logical + (stlbIndex * gcdMMU_STLB_1M_SIZE));
+
+ physical = stlbPhyBase
+ /* 1MB page size */
+ | (1 << 3)
+ /* Ignore exception */
+ | (0 << 1)
+ /* Present */
+ | (1 << 0);
+
+ gcmkSAFECASTPHYSADDRT(mtlbEntry, physical);
+
+ _WritePageEntry(Mmu->mtlbLogical + mStart, mtlbEntry);
+
+#if gcdMMU_TABLE_DUMP
+ gckOS_Print("%s(%d): insert MTLB[%d]: %08x\n",
+ __FUNCTION__, __LINE__,
+ mStart,
+ _ReadPageEntry(Mmu->mtlbLogical + mStart));
+
+ gckOS_Print("%s(%d): STLB: logical:%08x -> physical:%08x\n",
+ __FUNCTION__, __LINE__,
+ stlbLogical,
+ stlbPhyBase);
+#endif
+
+ gcmkDUMP(Mmu->os, "#[mmu-mtlb: flat-mapping, slot: %d]", mStart);
+
+ gcmkDUMP(Mmu->os, "@[physical.fill 0x%010llX 0x%08X 0x%08X]",
+ (unsigned long long)Mmu->mtlbPhysical + mStart * 4,
+ Mmu->mtlbLogical[mStart], 4);
+
+ ++stlbIndex;
+ }
+ else
+ {
+ gctUINT32 mtlbEntry = _ReadPageEntry(Mmu->mtlbLogical + mStart);
+ gctUINT stlbOffset;
+
+ curStlbChunk = (gcsMMU_STLB_CHUNK_PTR)Mmu->staticSTLB;
+
+ while (curStlbChunk)
+ {
+ if ((mStart >= curStlbChunk->mtlbIndex) &&
+ (mStart < (curStlbChunk->mtlbIndex + curStlbChunk->mtlbEntryNum)))
+ {
+ break;
+ }
+ curStlbChunk = curStlbChunk->next;
+ }
+ gcmkASSERT(curStlbChunk);
+
+ if (!curStlbChunk)
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+
+ stlbOffset = mStart - curStlbChunk->mtlbIndex;
+
+ stlbPhyBase = curStlbChunk->physBase + (stlbOffset * gcdMMU_STLB_1M_SIZE);
+ stlbLogical = (gctUINT32_PTR)((gctUINT8_PTR)curStlbChunk->logical + (stlbOffset * gcdMMU_STLB_1M_SIZE));
+ if (stlbPhyBase != (mtlbEntry & gcdMMU_MTLB_ENTRY_STLB_MASK))
+ {
+ gcmkASSERT(0);
+ }
+ }
+
+#if gcdDUMP_IN_KERNEL
+ /* Start index. */
+ i = sStart;
+
+ gcmkDUMP(Mmu->os, "#[mmu-stlb: flat-mapping: 0x%08X - 0x%08X]",
+ start, start + (last - sStart) * gcdMMU_PAGE_1M_SIZE - 1);
+#endif
+
+ while (sStart <= last)
+ {
+ gcmkASSERT(!(start & gcdMMU_PAGE_1M_MASK));
+ if (reserved)
+ {
+ /* program NOT_PRESENT | EXCEPTION for reserved entries */
+ _WritePageEntry(stlbLogical + sStart, 1 << 1);
+ }
+ else
+ {
+ _WritePageEntry(stlbLogical + sStart, _SetPage(start, physBaseExt, gcvTRUE));
+ }
+#if gcdMMU_TABLE_DUMP
+ gckOS_Print("%s(%d): insert STLB[%d]: %08x\n",
+ __FUNCTION__, __LINE__,
+ sStart,
+ _ReadPageEntry(stlbLogical + sStart));
+#endif
+ /* next page. */
+ start += gcdMMU_PAGE_1M_SIZE;
+ if (start == 0)
+ {
+ physBaseExt++;
+ }
+ sStart++;
+ curStlbChunk->pageCount++;
+ }
+
+#if gcdDUMP_IN_KERNEL
+ {
+ gctUINT32 data = stlbLogical[i] & ~0xF;
+ gctUINT32 step = (last > i) ? (stlbLogical[i + 1] - stlbLogical[i]) : 0;
+ gctUINT32 mask = stlbLogical[i] & 0xF;
+
+ gcmkDUMP(Mmu->os,
+ "@[physical.step 0x%010llX 0x%08X 0x%08X 0x%08X 0x%08X]",
+ (unsigned long long)stlbPhyBase + i * 4,
+ data, (last - i) * 4, step, mask);
+ }
+#endif
+
+ gcmkONERROR(gckVIDMEM_NODE_CleanCache(
+ kernel,
+ curStlbChunk->videoMem,
+ 0,
+ curStlbChunk->logical,
+ curStlbChunk->size
+ ));
+
+ sStart = 0;
+ ++mStart;
+ }
+
+ gcmkASSERT(totalNewStlbs == stlbIndex);
+
+ if (newStlbChunk)
+ {
+ /* Insert the stlbChunk into staticSTLB. */
+ if (Mmu->staticSTLB == gcvNULL)
+ {
+ Mmu->staticSTLB = newStlbChunk;
+ }
+ else
+ {
+ gcmkASSERT(newStlbChunk != gcvNULL);
+ gcmkASSERT(newStlbChunk->next == gcvNULL);
+ newStlbChunk->next = Mmu->staticSTLB;
+ Mmu->staticSTLB = newStlbChunk;
+ }
+ }
+
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Mmu->os, Mmu->pageTableMutex));
+
+#if gcdENABLE_TRUST_APPLICATION
+ if (Mmu->hardware->options.secureMode == gcvSECURE_IN_TA)
+ {
+ gckKERNEL_SecurityMapMemory(Mmu->hardware->kernel, gcvNULL, physBase, flatSize / gcdMMU_PAGE_4K_SIZE, &physBase);
+ }
+#endif
+
+ /* Store the gpu physical ranges */
+ Mmu->gpuPhysicalRanges[Mmu->gpuPhysicalRangeCount].start = flatBase;
+ Mmu->gpuPhysicalRanges[Mmu->gpuPhysicalRangeCount].end = flatBase + flatSize - 1;
+ Mmu->gpuPhysicalRanges[Mmu->gpuPhysicalRangeCount].size = flatSize;
+ Mmu->gpuPhysicalRanges[Mmu->gpuPhysicalRangeCount].flag = mapFlag;
+ Mmu->gpuPhysicalRangeCount++;
+
+ gcmkASSERT(Mmu->gpuPhysicalRangeCount <= gcdMAX_FLAT_MAPPING_COUNT);
+
+ /* Store the gpu virtual ranges */
+ Mmu->gpuAddressRanges[Mmu->gpuAddressRangeCount].start = flatVirtualBase;
+ Mmu->gpuAddressRanges[Mmu->gpuAddressRangeCount].end = flatVirtualBase + flatSize - 1;
+ Mmu->gpuAddressRanges[Mmu->gpuAddressRangeCount].size = flatSize;
+ Mmu->gpuAddressRanges[Mmu->gpuAddressRangeCount].flag = mapFlag;
+ Mmu->gpuAddressRangeCount++;
+
+ gcmkASSERT(Mmu->gpuAddressRangeCount <= gcdMAX_FLAT_MAPPING_COUNT);
+
+ return gcvSTATUS_OK;
+OnError:
+ /* Roll back the allocation.
+ ** We don't need roll back mtlb programming as gckmONERROR
+ ** is only used during allocation time.
+ */
+ if (newStlbChunk)
+ {
+ if (newStlbChunk->videoMem)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(
+ kernel,
+ newStlbChunk->videoMem
+ ));
+ }
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Mmu->os, newStlbChunk));
+ }
+ if (mutex)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Mmu->os, Mmu->pageTableMutex));
+ }
+ return status;
+ }
+}
+
+static gceSTATUS
+_SetupAddressArea(
+ IN gckOS Os,
+ IN gcsADDRESS_AREA_PTR Area,
+ IN gctUINT32 NumMTLBEntries
+ )
+{
+ gceSTATUS status;
+ gctUINT32_PTR map;
+ gctUINT32 stlbSize = (Area->areaType == gcvAREA_TYPE_1M)
+ ? gcdMMU_STLB_1M_SIZE : gcdMMU_STLB_4K_SIZE;
+
+ gcmkHEADER();
+ Area->stlbSize = NumMTLBEntries * stlbSize;
+
+ gcmkSAFECASTSIZET(Area->stlbEntries, Area->stlbSize / gcmSIZEOF(gctUINT32));
+
+ gcmkONERROR(gckOS_Allocate(Os, Area->stlbSize, (void **)&Area->mapLogical));
+
+ /* Initialization. */
+ map = Area->mapLogical;
+ map[0] = (Area->stlbEntries << 8) | gcvMMU_FREE;
+ map[1] = ~0U;
+ Area->heapList = 0;
+ Area->freeNodes = gcvFALSE;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_ConstructDynamicStlb(
+ IN gckMMU Mmu,
+ IN gcsADDRESS_AREA_PTR Area,
+ IN gctUINT32 NumEntries
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctBOOL acquired = gcvFALSE;
+ gckKERNEL kernel = Mmu->hardware->kernel;
+ gctUINT32 allocFlag = gcvALLOC_FLAG_CONTIGUOUS;
+ gcePOOL pool = Mmu->pool;
+ gctUINT32 address;
+ gctUINT32 mtlbEntry;
+ gctUINT32 i;
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ allocFlag |= gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+ allocFlag |= gcvALLOC_FLAG_4GB_ADDR;
+
+ /* Construct Slave TLB. */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ kernel,
+ 64,
+ gcvVIDMEM_TYPE_COMMAND,
+ allocFlag | gcvALLOC_FLAG_4K_PAGES,
+ &Area->stlbSize,
+ &pool,
+ &Area->stlbVideoMem));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ kernel,
+ Area->stlbVideoMem,
+ gcvFALSE,
+ gcvFALSE,
+ (gctPOINTER *)&Area->stlbLogical));
+
+#if gcdUSE_MMU_EXCEPTION
+ gcmkONERROR(_FillPageTable(Area->stlbLogical,
+ Area->stlbEntries,
+ /* Enable exception */
+ 1 << 1));
+#else
+ /* Invalidate all entries. */
+ gcmkONERROR(gckOS_ZeroMemory(Area->stlbLogical,
+ Area->stlbSize));
+#endif
+
+ /* Get stlb table physical. */
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(
+ kernel,
+ Area->stlbVideoMem,
+ 0,
+ &Area->stlbPhysical));
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Mmu->os,
+ Area->stlbPhysical,
+ &Area->stlbPhysical));
+
+ if (Area->areaType == gcvAREA_TYPE_1M)
+ {
+ gcmkDUMP(Mmu->os, "#[mmu: 1M page size dynamic space: 0x%08X - 0x%08X]",
+ (Area->mappingStart << gcdMMU_MTLB_SHIFT),
+ (Area->mappingEnd << gcdMMU_MTLB_SHIFT) - 1);
+ }
+ else
+ {
+ gcmkDUMP(Mmu->os, "#[mmu: 4K page size dynamic space: 0x%08X - 0x%08X]",
+ (Area->mappingStart << gcdMMU_MTLB_SHIFT),
+ (Area->mappingEnd << gcdMMU_MTLB_SHIFT) - 1);
+ }
+
+ gcmkDUMP(Mmu->os, "#[mmu-stlb]");
+
+ gcmkDUMP(Mmu->os, "@[physical.fill 0x%010llX 0x%08X 0x%08lX]",
+ (unsigned long long)Area->stlbPhysical,
+ Area->stlbLogical[0],
+ (unsigned long)Area->stlbSize);
+
+ gcmkSAFECASTPHYSADDRT(address, Area->stlbPhysical);
+
+ /* Grab the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Mmu->os, Mmu->pageTableMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Map to Master TLB. */
+ for (i = Area->mappingStart;
+ i < Area->mappingStart + NumEntries;
+ i++)
+ {
+ if (Area->areaType == gcvAREA_TYPE_1M)
+ {
+ mtlbEntry = address
+ /* 1M page size */
+ | (1 << 3)
+ /*Ignore exception */
+ | (0 << 1)
+ /* Present */
+ | (1 << 0);
+
+ address += gcdMMU_STLB_1M_SIZE;
+ }
+ else
+ {
+ mtlbEntry = address
+ /* 4KB page size */
+ | (0 << 2)
+ /*Ignore exception */
+ | (0 << 1)
+ /* Present */
+ | (1 << 0);
+
+ address += gcdMMU_STLB_4K_SIZE;
+ }
+
+ _WritePageEntry(Mmu->mtlbLogical + i, mtlbEntry);
+
+#if gcdMMU_TABLE_DUMP
+ gckOS_Print("%s(%d): insert MTLB[%d]: %08x\n",
+ __FUNCTION__, __LINE__,
+ i,
+ _ReadPageEntry(Mmu->mtlbLogical + i));
+#endif
+ }
+
+ gcmkDUMP(Mmu->os, "#[mmu-mtlb: slot: %d - %d]",
+ Area->mappingStart, Area->mappingEnd - 1);
+
+#if gcdDUMP_IN_KERNEL
+ {
+ gctUINT32 data = Mmu->mtlbLogical[Area->mappingStart] & ~0x3F;
+ gctUINT32 step = 0;
+ gctUINT32 mask = Mmu->mtlbLogical[Area->mappingStart] & 0x3F;
+
+ if (NumEntries > 1)
+ {
+ step = Mmu->mtlbLogical[Area->mappingStart + 1]
+ - Mmu->mtlbLogical[Area->mappingStart];
+ }
+
+ gcmkDUMP(Mmu->os,
+ "@[physical.step 0x%010llX 0x%08X 0x%08X 0x%08X 0x%08X]",
+ (unsigned long long)(Mmu->mtlbPhysical + Area->mappingStart * 4),
+ data, NumEntries * 4, step, mask);
+ }
+#endif
+
+OnError:
+ if (acquired)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Mmu->os, Mmu->pageTableMutex));
+ }
+
+ return status;
+}
+
+gceSTATUS
+gckMMU_SetupDynamicSpace(
+ IN gckMMU Mmu
+ )
+{
+ gceSTATUS status;
+ gcsFreeSpaceNode_PTR nodeArray = gcvNULL;
+ gctINT i, nodeArraySize = 0;
+ gctINT numEntries = 0;
+ gckKERNEL kernel = Mmu->hardware->kernel;
+ gcsADDRESS_AREA_PTR area4K = &Mmu->dynamicArea4K;
+#if gcdENABLE_GPU_1M_PAGE
+ gcsADDRESS_AREA_PTR area1M = &Mmu->dynamicArea1M;
+ gctINT numEntries1M;
+#endif
+
+ /* Find all the free address space. */
+ gcmkONERROR(_CollectFreeSpace(Mmu, &nodeArray, &nodeArraySize));
+
+ for (i = 0; i < nodeArraySize; i++)
+ {
+ if (nodeArray[i].entries > numEntries)
+ {
+ area4K->mappingStart = nodeArray[i].start;
+ numEntries = nodeArray[i].entries;
+ area4K->mappingEnd = area4K->mappingStart + numEntries - 1;
+ }
+ }
+
+ gckOS_Free(Mmu->os, (gctPOINTER)nodeArray);
+
+#if gcdENABLE_TRUST_APPLICATION
+ if (gckHARDWARE_IsFeatureAvailable(Mmu->hardware, gcvFEATURE_SECURITY) == gcvSTATUS_TRUE)
+ {
+ /* Setup secure address area when needed. */
+ gctUINT32 secureAreaSize = gcdMMU_SECURE_AREA_SIZE;
+ gcsADDRESS_AREA_PTR secureArea = &Mmu->secureArea;
+
+ gcmkASSERT(numEntries > (gctINT)secureAreaSize);
+
+ secureArea->mappingStart = area4K->mappingStart
+ + (numEntries - secureAreaSize);
+
+ gcmkONERROR(_SetupAddressArea(Mmu->os, secureArea, secureAreaSize));
+
+ numEntries -= secureAreaSize;
+ area4K->mappingEnd -= secureAreaSize;
+ }
+#endif
+
+#if gcdENABLE_GPU_1M_PAGE
+ numEntries1M = numEntries >> 1;
+ area1M->mappingStart = area4K->mappingStart + (numEntries - numEntries1M);
+ area1M->mappingEnd = area1M->mappingStart + numEntries1M - 1;
+ area1M->areaType = gcvAREA_TYPE_1M;
+ numEntries -= numEntries1M;
+ area4K->mappingEnd -= numEntries1M;
+
+ gcmkONERROR(_SetupAddressArea(Mmu->os, area1M, numEntries1M));
+
+ gcmkONERROR(_ConstructDynamicStlb(Mmu, area1M, numEntries1M));
+#endif
+
+ area4K->areaType = gcvAREA_TYPE_4K;
+
+ /* Setup normal address area. */
+ gcmkONERROR(_SetupAddressArea(Mmu->os, area4K, numEntries));
+
+ gcmkONERROR(_ConstructDynamicStlb(Mmu, area4K, numEntries));
+
+ return gcvSTATUS_OK;
+
+OnError:
+#if gcdENABLE_GPU_1M_PAGE
+ if (area1M->mapLogical)
+ {
+ gcmkVERIFY_OK(
+ gckOS_Free(Mmu->os, (gctPOINTER) area1M->mapLogical));
+ }
+
+ if (area1M->stlbVideoMem)
+ {
+ gcmkVERIFY_OK(
+ gckVIDMEM_NODE_Dereference(kernel,
+ area1M->stlbVideoMem));
+ }
+#endif
+
+ if (area4K->mapLogical)
+ {
+ gcmkVERIFY_OK(
+ gckOS_Free(Mmu->os, (gctPOINTER) area4K->mapLogical));
+ }
+
+ if (area4K->stlbVideoMem)
+ {
+ gcmkVERIFY_OK(
+ gckVIDMEM_NODE_Dereference(kernel,
+ area4K->stlbVideoMem));
+ }
+
+ return status;
+}
+
+gctUINT32
+_GetPageCountOfUsedNode(
+ gctUINT32_PTR Node
+ )
+{
+ gctUINT32 count;
+
+ count = gcmENTRY_COUNT(*Node);
+
+ if ((count << 8) == (~((1U<<8)-1)))
+ {
+ count = 1;
+ }
+
+ return count;
+}
+
+static gcsADDRESS_AREA_PTR
+_GetProcessArea(
+ IN gckMMU Mmu,
+ IN gcePAGE_TYPE PageType,
+ IN gctBOOL Secure
+ )
+{
+#if gcdENABLE_TRUST_APPLICATION
+ if (Secure == gcvTRUE)
+ {
+ return &Mmu->secureArea;
+ }
+#endif
+
+ if (PageType == gcvPAGE_TYPE_1M)
+ {
+ return &Mmu->dynamicArea1M;
+ }
+ else
+ {
+ return &Mmu->dynamicArea4K;
+ }
+}
+
+/*******************************************************************************
+**
+** _Construct
+**
+** Construct a new gckMMU object.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctSIZE_T MmuSize
+** Number of bytes for the page table.
+**
+** OUTPUT:
+**
+** gckMMU * Mmu
+** Pointer to a variable that receives the gckMMU object pointer.
+*/
+gceSTATUS
+_Construct(
+ IN gckKERNEL Kernel,
+ IN gctSIZE_T MmuSize,
+ OUT gckMMU * Mmu
+ )
+{
+ gckOS os;
+ gckHARDWARE hardware;
+ gceSTATUS status;
+ gckMMU mmu = gcvNULL;
+ gctUINT32_PTR map;
+ gctPOINTER pointer = gcvNULL;
+ gctPHYS_ADDR_T physBase;
+ gctSIZE_T physSize;
+ gctPHYS_ADDR_T contiguousBase;
+ gctSIZE_T contiguousSize = 0;
+ gctPHYS_ADDR_T externalBase;
+ gctSIZE_T externalSize = 0;
+ gctUINT32 gpuAddress;
+ gctPHYS_ADDR_T gpuPhysical;
+ gcsADDRESS_AREA_PTR area = gcvNULL;
+ gcePOOL pool;
+ gctUINT64 data;
+ gctUINT32 allocFlag = gcvALLOC_FLAG_CONTIGUOUS;
+ gctUINT64 mmuEnabled;
+
+ gcmkHEADER_ARG("Kernel=0x%x MmuSize=%lu", Kernel, MmuSize);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(MmuSize > 0);
+ gcmkVERIFY_ARGUMENT(Mmu != gcvNULL);
+
+ /* Extract the gckOS object pointer. */
+ os = Kernel->os;
+ gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
+
+ /* Extract the gckHARDWARE object pointer. */
+ hardware = Kernel->hardware;
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ /* Allocate memory for the gckMMU object. */
+ gcmkONERROR(gckOS_Allocate(os, sizeof(struct _gckMMU), &pointer));
+
+ gckOS_ZeroMemory(pointer, sizeof(struct _gckMMU));
+
+ mmu = pointer;
+
+ /* Initialize the gckMMU object. */
+ mmu->object.type = gcvOBJ_MMU;
+ mmu->os = os;
+ mmu->hardware = hardware;
+ mmu->pageTableMutex = gcvNULL;
+ mmu->mtlbLogical = gcvNULL;
+ mmu->staticSTLB = gcvNULL;
+ mmu->enabled = gcvFALSE;
+
+ mmu->dynamicAreaSetuped = gcvFALSE;
+ mmu->pool = _GetPageTablePool(mmu->os);
+ gcsLIST_Init(&mmu->hardwareList);
+
+ /* Use 4K page size for MMU version 0. */
+ area = &mmu->dynamicArea4K;
+ area->mapLogical = gcvNULL;
+ area->stlbLogical = gcvNULL;
+
+ /* Create the page table mutex. */
+ gcmkONERROR(gckOS_CreateMutex(os, &mmu->pageTableMutex));
+
+ gcmkONERROR(gckOS_QueryOption(os, "mmu", &mmuEnabled));
+
+ if (hardware->mmuVersion == 0)
+ {
+ area->stlbSize = MmuSize;
+
+ /* Construct address space management table. */
+ gcmkONERROR(gckOS_Allocate(mmu->os,
+ area->stlbSize,
+ &pointer));
+
+ area->mapLogical = pointer;
+
+ pool = mmu->pool;
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ allocFlag |= gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+ /* Construct page table read by GPU. */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ Kernel,
+ 4096,
+ gcvVIDMEM_TYPE_COMMAND,
+ allocFlag,
+ &area->stlbSize,
+ &pool,
+ &area->stlbVideoMem));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ Kernel,
+ area->stlbVideoMem,
+ gcvFALSE,
+ gcvFALSE,
+ &pointer));
+
+ area->stlbLogical = pointer;
+
+ /* Get CPU physical address. */
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(
+ Kernel,
+ area->stlbVideoMem,
+ 0,
+ &area->stlbPhysical));
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(mmu->os,
+ area->stlbPhysical,
+ &area->stlbPhysical));
+
+ /* Compute number of entries in page table. */
+ gcmkSAFECASTSIZET(area->stlbEntries, area->stlbSize / sizeof(gctUINT32));
+
+ /* Mark all pages as free. */
+ map = area->mapLogical;
+
+ _FillPageTable(area->stlbLogical, area->stlbEntries, mmu->safeAddress);
+
+ gcmkDUMP(mmu->os,
+ "#[mmu0: fill with safe address]");
+
+ gcmkDUMP(mmu->os,
+ "@[physical.fill 0x%010llX 0x%08X 0x%08lX]",
+ (unsigned long long)area->stlbPhysical,
+ area->stlbLogical[0],
+ (unsigned long)area->stlbSize);
+
+ map[0] = (area->stlbEntries << 8) | gcvMMU_FREE;
+ 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", &data);
+ contiguousSize = (gctSIZE_T)data;
+ }
+
+ if (gcmIS_SUCCESS(status) && contiguousSize)
+ {
+ /* Convert to GPU address. */
+ mmu->contiguousBaseAddress = (gctUINT32)(contiguousBase - Kernel->hardware->baseAddress);
+ }
+ }
+ else
+ {
+ mmu->mtlbSize = gcdMMU_MTLB_SIZE;
+
+ pool = mmu->pool;
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ allocFlag |= gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+ allocFlag |= gcvALLOC_FLAG_4GB_ADDR;
+
+ /* 1K mode is 1024 byte aligned. */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ Kernel,
+ 1024,
+ gcvVIDMEM_TYPE_COMMAND,
+ allocFlag | gcvALLOC_FLAG_4K_PAGES,
+ &mmu->mtlbSize,
+ &pool,
+ &mmu->mtlbVideoMem));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ Kernel,
+ mmu->mtlbVideoMem,
+ gcvFALSE,
+ gcvFALSE,
+ &pointer));
+
+ mmu->mtlbLogical = pointer;
+
+ mmu->dynamicArea4K.mappingStart = gcvINVALID_ADDRESS;
+ mmu->dynamicArea1M.mappingStart = gcvINVALID_ADDRESS;
+
+ /* Get mtlb table physical. */
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(
+ Kernel,
+ mmu->mtlbVideoMem,
+ 0,
+ &mmu->mtlbPhysical));
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(
+ mmu->os,
+ mmu->mtlbPhysical,
+ &mmu->mtlbPhysical));
+
+ /* Invalid all the entries. */
+ gcmkONERROR(
+ gckOS_ZeroMemory(pointer, mmu->mtlbSize));
+
+ gcmkONERROR(
+ gckOS_QueryOption(mmu->os, "physBase", &physBase));
+
+ gcmkONERROR(
+ gckOS_QueryOption(mmu->os, "physSize", &data));
+ physSize = (gctSIZE_T)data;
+
+ gcmkONERROR(
+ gckOS_CPUPhysicalToGPUPhysical(mmu->os, physBase, &gpuPhysical));
+
+ gcmkSAFECASTPHYSADDRT(gpuAddress, gpuPhysical);
+
+ if (physSize)
+ {
+ /* Setup user specified flat mapping. */
+ gcmkONERROR(_FillFlatMapping(mmu, gpuAddress, physSize, gcvFALSE, gcvFALSE, gcvNULL));
+ }
+
+ if (!_ReadPageEntry(mmu->mtlbLogical + 0))
+ {
+ gctUINT32 mtlbEntry;
+ /*
+ * Reserved the first mtlb.
+ * 1MB page size, Ingore exception, Not Present.
+ */
+ mtlbEntry = (1 << 3)
+ | (0 << 1)
+ | (0 << 0);
+
+ _WritePageEntry(mmu->mtlbLogical + 0, mtlbEntry);
+
+ gcmkDUMP(mmu->os, "#[mmu-mtlb: reserved 16M space, slot: 0]");
+ gcmkDUMP(mmu->os,
+ "@[physical.fill 0x%010llX 0x%08X 0x%08X]",
+ (unsigned long long)mmu->mtlbPhysical,
+ mmu->mtlbLogical[0], 4);
+
+ /* Store the gpu virtual ranges */
+ mmu->gpuAddressRanges[mmu->gpuAddressRangeCount].start = 0;
+ mmu->gpuAddressRanges[mmu->gpuAddressRangeCount].end = (16 << 20) - 1;
+ mmu->gpuAddressRanges[mmu->gpuAddressRangeCount].size = (16 << 20);
+ mmu->gpuAddressRanges[mmu->gpuAddressRangeCount].flag = gcvFLATMAP_DIRECT;
+ mmu->gpuAddressRangeCount++;
+ }
+
+ status = gckOS_QueryOption(mmu->os, "contiguousBase", &contiguousBase);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ status = gckOS_QueryOption(mmu->os, "contiguousSize", &data);
+ contiguousSize = (gctSIZE_T)data;
+ }
+
+ if (gcmIS_SUCCESS(status) && contiguousSize)
+ {
+ gctUINT64 gpuContiguousBase;
+ gctUINT32 contiguousBaseAddress = 0;
+
+ gcmkONERROR(gckOS_CPUPhysicalToGPUPhysical(mmu->os, contiguousBase, &gpuContiguousBase));
+
+ /* Setup flat mapping for reserved memory (VIDMEM). */
+ gcmkONERROR(_FillFlatMapping(mmu, gpuContiguousBase, contiguousSize, gcvFALSE, gcvTRUE, &contiguousBaseAddress));
+
+ if (mmuEnabled)
+ {
+ mmu->contiguousBaseAddress = contiguousBaseAddress;
+ }
+ else
+ {
+ gcmkSAFECASTPHYSADDRT(mmu->contiguousBaseAddress, gpuContiguousBase);
+ }
+ }
+
+ status = gckOS_QueryOption(mmu->os, "externalBase", &externalBase);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ status = gckOS_QueryOption(mmu->os, "externalSize", &data);
+ externalSize = (gctSIZE_T)data;
+ }
+
+ if (gcmIS_SUCCESS(status) && externalSize)
+ {
+ gctUINT64 gpuExternalBase;
+ gctUINT32 externalBaseAddress = 0;
+
+ gcmkONERROR(gckOS_CPUPhysicalToGPUPhysical(mmu->os, externalBase, &gpuExternalBase));
+
+ /* Setup flat mapping for external memory. */
+ gcmkONERROR(_FillFlatMapping(mmu, gpuExternalBase, externalSize, gcvFALSE, gcvTRUE, &externalBaseAddress));
+
+ mmu->externalBaseAddress = externalBaseAddress;
+ }
+ }
+
+ /* A 64 byte for safe address, we use 256 here. */
+ mmu->safePageSize = 256;
+
+ pool = mmu->pool;
+
+ /* Allocate safe page from video memory. */
+ gcmkONERROR(gckKERNEL_AllocateVideoMemory(
+ Kernel,
+ 256,
+ gcvVIDMEM_TYPE_COMMAND,
+ gcvALLOC_FLAG_CONTIGUOUS | gcvALLOC_FLAG_4K_PAGES | gcvALLOC_FLAG_4GB_ADDR,
+ &mmu->safePageSize,
+ &pool,
+ &mmu->safePageVideoMem
+ ));
+
+ /* Lock for kernel side CPU access. */
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(
+ Kernel,
+ mmu->safePageVideoMem,
+ gcvFALSE,
+ gcvFALSE,
+ &mmu->safePageLogical
+ ));
+
+ /* Get CPU physical address. */
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(
+ Kernel,
+ mmu->safePageVideoMem,
+ 0,
+ &mmu->safePagePhysical
+ ));
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(
+ os,
+ mmu->safePagePhysical,
+ &mmu->safePagePhysical
+ ));
+
+ gcmkSAFECASTPHYSADDRT(mmu->safeAddress, mmu->safePagePhysical);
+
+ gckOS_ZeroMemory(mmu->safePageLogical, mmu->safePageSize);
+
+ gcmkDUMP(mmu->os, "#[safe page]");
+ gcmkDUMP(mmu->os,
+ "@[physical.fill 0x%010llX 0x%08X 0x%08lX]",
+ (unsigned long long)mmu->safePagePhysical,
+ 0,
+ (unsigned long)mmu->safePageSize);
+
+ gcmkDUMP_BUFFER(
+ mmu->os,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+ mmu->safePageLogical,
+ mmu->safeAddress,
+ mmu->safePageSize
+ );
+
+ gcmkONERROR(gckQUEUE_Allocate(os, &mmu->recentFreedAddresses, 16));
+
+ mmu->sRAMMapped = gcvFALSE;
+
+ /* Return the gckMMU object pointer. */
+ *Mmu = mmu;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Mmu=0x%x", *Mmu);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (mmu != gcvNULL)
+ {
+ if (area != gcvNULL && area->mapLogical != gcvNULL)
+ {
+ gcmkVERIFY_OK(
+ gckOS_Free(os, (gctPOINTER) area->mapLogical));
+
+ gcmkVERIFY_OK(
+ gckVIDMEM_NODE_Dereference(Kernel,
+ area->stlbVideoMem));
+ }
+
+ if (mmu->mtlbLogical != gcvNULL)
+ {
+ gcmkVERIFY_OK(
+ gckVIDMEM_NODE_Dereference(Kernel,
+ mmu->mtlbVideoMem));
+ }
+
+ if (mmu->pageTableMutex != gcvNULL)
+ {
+ /* Delete the mutex. */
+ gcmkVERIFY_OK(
+ gckOS_DeleteMutex(os, mmu->pageTableMutex));
+ }
+
+ gcmkVERIFY_OK(gckQUEUE_Free(os, &mmu->recentFreedAddresses));
+
+ /* Mark the gckMMU object as unknown. */
+ mmu->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the allocates memory. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, mmu));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_FreeAddressArea(
+ gckKERNEL Kernel,
+ gcsADDRESS_AREA * Area
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ if (Area->mapLogical != gcvNULL)
+ {
+ gcmkVERIFY_OK(
+ gckOS_Free(Kernel->os, (gctPOINTER) Area->mapLogical));
+ }
+
+ if (Area->stlbLogical != gcvNULL)
+ {
+ /* Free page table. */
+ gcmkVERIFY_OK(
+ gckVIDMEM_NODE_Dereference(Kernel,
+ Area->stlbVideoMem));
+ }
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** _Destroy
+**
+** Destroy a gckMMU object.
+**
+** INPUT:
+**
+** gckMMU Mmu
+** Pointer to an gckMMU object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+_Destroy(
+ IN gckMMU Mmu
+ )
+{
+ gckKERNEL kernel = Mmu->hardware->kernel;
+
+ gcmkHEADER_ARG("Mmu=0x%x", Mmu);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Mmu, gcvOBJ_MMU);
+
+ while (Mmu->staticSTLB != gcvNULL)
+ {
+ gcsMMU_STLB_CHUNK_PTR pre = Mmu->staticSTLB;
+ Mmu->staticSTLB = pre->next;
+
+ if (pre->videoMem)
+ {
+ gcmkVERIFY_OK(
+ gckVIDMEM_NODE_Dereference(kernel,
+ pre->videoMem));
+ }
+
+ if (pre->mtlbEntryNum != 0)
+ {
+ gctUINT i;
+ for (i = 0; i < pre->mtlbEntryNum; ++i)
+ {
+ _WritePageEntry(Mmu->mtlbLogical + pre->mtlbIndex + i, 0);
+#if gcdMMU_TABLE_DUMP
+ gckOS_Print("%s(%d): clean MTLB[%d]\n",
+ __FUNCTION__, __LINE__,
+ pre->mtlbIndex + i);
+#endif
+ }
+
+ gcmkDUMP(Mmu->os,
+ "#[mmu-mtlb: clean up slot: %d - %d]",
+ pre->mtlbIndex,
+ pre->mtlbIndex + pre->mtlbEntryNum - 1);
+
+ gcmkDUMP(Mmu->os,
+ "@[physical.fill 0x%010llX 0x%08X 0x%08lX]",
+ (unsigned long long)(Mmu->mtlbPhysical + pre->mtlbIndex * 4),
+ Mmu->mtlbLogical[pre->mtlbIndex],
+ (unsigned long)(pre->mtlbEntryNum * 4));
+ }
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Mmu->os, pre));
+ }
+
+ if (Mmu->hardware->mmuVersion != 0)
+ {
+ gcmkVERIFY_OK(
+ gckVIDMEM_NODE_Dereference(kernel,
+ Mmu->mtlbVideoMem));
+ }
+
+ /* Free address area. */
+ gcmkVERIFY_OK(_FreeAddressArea(kernel, &Mmu->dynamicArea4K));
+#if gcdENABLE_GPU_1M_PAGE
+ gcmkVERIFY_OK(_FreeAddressArea(kernel, &Mmu->dynamicArea1M));
+#endif
+ gcmkVERIFY_OK(_FreeAddressArea(kernel, &Mmu->secureArea));
+
+ /* Delete the page table mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Mmu->os, Mmu->pageTableMutex));
+
+ if (Mmu->safePageLogical != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(
+ kernel,
+ Mmu->safePageVideoMem
+ ));
+ }
+
+ gcmkVERIFY_OK(gckQUEUE_Free(Mmu->os, &Mmu->recentFreedAddresses));
+
+ /* Mark the gckMMU object as unknown. */
+ Mmu->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the gckMMU object. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Mmu->os, Mmu));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+** _AdjstIndex
+**
+** Adjust the index from which we search for a usable node to make sure
+** index allocated is greater than Start.
+*/
+gceSTATUS
+_AdjustIndex(
+ IN gckMMU Mmu,
+ IN gctUINT32 Index,
+ IN gctUINT32 PageCount,
+ IN gctUINT32 Start,
+ OUT gctUINT32 * IndexAdjusted
+ )
+{
+ gceSTATUS status;
+ gctUINT32 index = Index;
+ gcsADDRESS_AREA_PTR area = &Mmu->dynamicArea4K;
+ gctUINT32_PTR map = area->mapLogical;
+
+ gcmkHEADER();
+
+ for (; index < area->stlbEntries;)
+ {
+ gctUINT32 result = 0;
+ gctUINT32 nodeSize = 0;
+
+ if (index >= Start)
+ {
+ break;
+ }
+
+ switch (gcmENTRY_TYPE(map[index]))
+ {
+ case gcvMMU_SINGLE:
+ nodeSize = 1;
+ break;
+
+ case gcvMMU_FREE:
+ nodeSize = map[index] >> 8;
+ break;
+
+ default:
+ gcmkFATAL("MMU table correcupted at index %u!", index);
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ if (nodeSize > PageCount)
+ {
+ result = index + (nodeSize - PageCount);
+
+ if (result >= Start)
+ {
+ break;
+ }
+ }
+
+ switch (gcmENTRY_TYPE(map[index]))
+ {
+ case gcvMMU_SINGLE:
+ index = map[index] >> 8;
+ break;
+
+ case gcvMMU_FREE:
+ index = map[index + 1];
+ break;
+
+ default:
+ gcmkFATAL("MMU table correcupted at index %u!", index);
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+ }
+
+ *IndexAdjusted = index;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckMMU_Construct(
+ IN gckKERNEL Kernel,
+ IN gctSIZE_T MmuSize,
+ OUT gckMMU * Mmu
+ )
+{
+#if gcdSHARED_PAGETABLE
+ gceSTATUS status;
+ gctPOINTER pointer;
+
+ gcmkHEADER_ARG("Kernel=0x%08x", Kernel);
+
+ if (sharedPageTable == gcvNULL)
+ {
+ gcmkONERROR(
+ gckOS_Allocate(Kernel->os,
+ sizeof(struct _gcsSharedPageTable),
+ &pointer));
+ sharedPageTable = pointer;
+
+ gcmkONERROR(
+ gckOS_ZeroMemory(sharedPageTable,
+ sizeof(struct _gcsSharedPageTable)));
+
+ gcmkONERROR(_Construct(Kernel, MmuSize, &sharedPageTable->mmu));
+ }
+
+ *Mmu = sharedPageTable->mmu;
+
+ sharedPageTable->hardwares[sharedPageTable->reference] = Kernel->hardware;
+
+ sharedPageTable->reference++;
+
+ gcmkFOOTER_ARG("sharedPageTable->reference=%lu", sharedPageTable->reference);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (sharedPageTable)
+ {
+ if (sharedPageTable->mmu)
+ {
+ gcmkVERIFY_OK(gckMMU_Destroy(sharedPageTable->mmu));
+ }
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, sharedPageTable));
+ }
+
+ gcmkFOOTER();
+ return status;
+#else
+ return _Construct(Kernel, MmuSize, Mmu);
+#endif
+}
+
+gceSTATUS
+gckMMU_Destroy(
+ IN gckMMU Mmu
+ )
+{
+#if gcdSHARED_PAGETABLE
+ gckOS os = Mmu->os;
+
+ sharedPageTable->reference--;
+
+ if (sharedPageTable->reference == 0)
+ {
+ if (sharedPageTable->mmu)
+ {
+ gcmkVERIFY_OK(_Destroy(Mmu));
+ }
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, sharedPageTable));
+ }
+
+ return gcvSTATUS_OK;
+#else
+ return _Destroy(Mmu);
+#endif
+}
+
+/*******************************************************************************
+**
+** gckMMU_AllocatePages
+**
+** Allocate pages inside the page table.
+**
+** INPUT:
+**
+** gckMMU Mmu
+** Pointer to an gckMMU object.
+**
+** gctSIZE_T PageCount
+** Number of pages to allocate.
+**
+** OUTPUT:
+**
+** gctPOINTER * PageTable
+** Pointer to a variable that receives the base address of the page
+** table.
+**
+** gctUINT32 * Address
+** Pointer to a variable that receives the hardware specific address.
+*/
+gceSTATUS
+_AllocatePages(
+ IN gckMMU Mmu,
+ IN gctSIZE_T PageCount,
+ IN gceVIDMEM_TYPE Type,
+ IN gcePAGE_TYPE PageType,
+ IN gctBOOL Secure,
+ OUT gctPOINTER * PageTable,
+ OUT gctUINT32 * Address
+ )
+{
+ gceSTATUS status;
+ gctBOOL mutex = gcvFALSE;
+ gctUINT32 index = 0, previous = ~0U, left;
+ gctUINT32_PTR map;
+ gctBOOL gotIt;
+ gctUINT32 address;
+ gctUINT32 pageCount;
+ gcsADDRESS_AREA_PTR area = _GetProcessArea(Mmu, PageType, Secure);
+
+ gcmkHEADER_ARG("Mmu=0x%x PageCount=%lu", Mmu, PageCount);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Mmu, gcvOBJ_MMU);
+ gcmkVERIFY_ARGUMENT(PageCount > 0);
+ gcmkVERIFY_ARGUMENT(PageTable != gcvNULL);
+
+ if (PageCount > area->stlbEntries)
+ {
+ /* Not enough pages avaiable. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ gcmkSAFECASTSIZET(pageCount, PageCount);
+
+#if gcdBOUNDARY_CHECK
+ /* Extra pages as bounary. */
+ pageCount += gcdBOUNDARY_CHECK * 2;
+#endif
+
+ /* Grab the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Mmu->os, Mmu->pageTableMutex, gcvINFINITE));
+ mutex = gcvTRUE;
+
+ /* Cast pointer to page table. */
+ for (map = area->mapLogical, gotIt = gcvFALSE; !gotIt;)
+ {
+ index = area->heapList;
+
+ if ((Mmu->hardware->mmuVersion == 0) &&
+ (Type == gcvVIDMEM_TYPE_VERTEX_BUFFER))
+ {
+ gcmkONERROR(_AdjustIndex(
+ Mmu,
+ index,
+ pageCount,
+ gcdVERTEX_START / gcmSIZEOF(gctUINT32),
+ &index
+ ));
+ }
+
+ /* Walk the heap list. */
+ for (; !gotIt && (index < area->stlbEntries);)
+ {
+ /* Check the node type. */
+ switch (gcmENTRY_TYPE(map[index]))
+ {
+ case gcvMMU_SINGLE:
+ /* Single odes are valid if we only need 1 page. */
+ if (pageCount == 1)
+ {
+ gotIt = gcvTRUE;
+ }
+ else
+ {
+ /* Move to next node. */
+ previous = index;
+ index = map[index] >> 8;
+ }
+ break;
+
+ case gcvMMU_FREE:
+ /* Test if the node has enough space. */
+ if (pageCount <= (map[index] >> 8))
+ {
+ gotIt = gcvTRUE;
+ }
+ else
+ {
+ /* Move to next node. */
+ previous = index;
+ index = map[index + 1];
+ }
+ break;
+
+ default:
+ gcmkFATAL("MMU table correcupted at index %u!", index);
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+ }
+
+ /* Test if we are out of memory. */
+ if (index >= area->stlbEntries)
+ {
+ if (area->freeNodes)
+ {
+ /* Time to move out the trash! */
+ gcmkONERROR(_Collect(area));
+
+ /* We are going to search from start, so reset previous to start. */
+ previous = ~0U;
+ }
+ else
+ {
+ /* Out of resources. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+ }
+ }
+
+ switch (gcmENTRY_TYPE(map[index]))
+ {
+ case gcvMMU_SINGLE:
+ /* Unlink single node from free list. */
+ gcmkONERROR(
+ _Link(area, previous, map[index] >> 8));
+ break;
+
+ case gcvMMU_FREE:
+ /* Check how many pages will be left. */
+ left = (map[index] >> 8) - pageCount;
+ switch (left)
+ {
+ case 0:
+ /* The entire node is consumed, just unlink it. */
+ gcmkONERROR(
+ _Link(area, previous, map[index + 1]));
+ break;
+
+ case 1:
+ /* One page will remain. Convert the node to a single node and
+ ** advance the index. */
+ map[index] = (map[index + 1] << 8) | gcvMMU_SINGLE;
+ index ++;
+ break;
+
+ default:
+ /* Enough pages remain for a new node. However, we will just adjust
+ ** the size of the current node and advance the index. */
+ map[index] = (left << 8) | gcvMMU_FREE;
+ index += left;
+ break;
+ }
+ break;
+ }
+
+ /* Mark node as used. */
+ gcmkONERROR(_FillMap(&map[index], pageCount, gcvMMU_USED));
+
+#if gcdBOUNDARY_CHECK
+ index += gcdBOUNDARY_CHECK;
+#endif
+
+ /* Record pageCount of allocated node at the beginning of node. */
+ if (pageCount == 1)
+ {
+ map[index] = (~((1U<<8)-1)) | gcvMMU_USED;
+ }
+ else
+ {
+ map[index] = (pageCount << 8) | gcvMMU_USED;
+ }
+
+ if (area->stlbLogical != gcvNULL)
+ {
+ /* Return pointer to page table. */
+ *PageTable = &area->stlbLogical[index];
+ }
+ else
+ {
+ /* Page table for secure area is handled in trust application. */
+ *PageTable = gcvNULL;
+ }
+
+ /* Build virtual address. */
+ if (Mmu->hardware->mmuVersion == 0)
+ {
+ gcmkONERROR(
+ gckHARDWARE_BuildVirtualAddress(Mmu->hardware, index, 0, &address));
+ }
+ else
+ {
+ gctUINT32 num = (PageType == gcvPAGE_TYPE_1M) ? gcdMMU_STLB_1M_ENTRY_NUM : gcdMMU_STLB_4K_ENTRY_NUM;
+ gctUINT32 shift = (PageType == gcvPAGE_TYPE_1M) ? gcdMMU_STLB_1M_SHIFT : gcdMMU_STLB_4K_SHIFT;
+ gctUINT32 masterOffset = index / num + area->mappingStart;
+ gctUINT32 slaveOffset = index % num;
+
+ address = (masterOffset << gcdMMU_MTLB_SHIFT)
+ | (slaveOffset << shift);
+ }
+
+ if (Address != gcvNULL)
+ {
+ *Address = address;
+ }
+
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Mmu->os, Mmu->pageTableMutex));
+
+ /* Success. */
+ gcmkFOOTER_ARG("*PageTable=0x%x *Address=%08x",
+ *PageTable, gcmOPT_VALUE(Address));
+ return gcvSTATUS_OK;
+
+OnError:
+
+ if (mutex)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Mmu->os, Mmu->pageTableMutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckMMU_FreePages
+**
+** Free pages inside the page table.
+**
+** INPUT:
+**
+** gckMMU Mmu
+** Pointer to an gckMMU object.
+**
+** gctPOINTER PageTable
+** Base address of the page table to free.
+**
+** gctSIZE_T PageCount
+** Number of pages to free.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+_FreePages(
+ IN gckMMU Mmu,
+ IN gctBOOL Secure,
+ IN gcePAGE_TYPE PageType,
+ IN gctUINT32 Address,
+ IN gctPOINTER PageTable,
+ IN gctSIZE_T PageCount
+ )
+{
+ gctUINT32 index;
+ gctUINT32_PTR node;
+ gceSTATUS status;
+ gctBOOL acquired = gcvFALSE;
+ gctUINT32 pageCount;
+ gcuQUEUEDATA data;
+ gcsADDRESS_AREA_PTR area = _GetProcessArea(Mmu, PageType, gcvFALSE);
+ gctUINT32 pageSize = (PageType == gcvPAGE_TYPE_1M)
+ ? gcdMMU_PAGE_1M_SIZE : gcdMMU_PAGE_4K_SIZE;
+
+ gcmkHEADER_ARG("Mmu=0x%x PageTable=0x%x PageCount=%lu",
+ Mmu, PageTable, PageCount);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Mmu, gcvOBJ_MMU);
+ gcmkVERIFY_ARGUMENT(PageCount > 0);
+
+ gcmkSAFECASTSIZET(pageCount, PageCount);
+
+#if gcdBOUNDARY_CHECK
+ pageCount += gcdBOUNDARY_CHECK * 2;
+#endif
+
+ /* Get the node by index. */
+ index = (gctUINT32)((gctUINT32_PTR)PageTable - area->stlbLogical);
+
+ node = area->mapLogical + index;
+
+ if (pageCount != _GetPageCountOfUsedNode(node))
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_REQUEST);
+ }
+
+#if gcdBOUNDARY_CHECK
+ node -= gcdBOUNDARY_CHECK;
+#endif
+
+ gcmkONERROR(gckOS_AcquireMutex(Mmu->os, Mmu->pageTableMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ if (Mmu->hardware->mmuVersion == 0)
+ {
+ _FillPageTable(PageTable, pageCount, Mmu->safeAddress);
+ }
+
+ if (pageCount == 1)
+ {
+ /* Single page node. */
+ node[0] = (~((1U<<8)-1)) | gcvMMU_SINGLE;
+
+ if (PageTable != gcvNULL)
+ {
+#if gcdUSE_MMU_EXCEPTION
+ /* Enable exception */
+ _WritePageEntry(PageTable, (1 << 1));
+#else
+ _WritePageEntry(PageTable, 0);
+#endif
+ }
+ }
+ else
+ {
+ /* Mark the node as free. */
+ node[0] = (pageCount << 8) | gcvMMU_FREE;
+ node[1] = ~0U;
+
+ if (PageTable != gcvNULL)
+ {
+#if gcdUSE_MMU_EXCEPTION
+ /* Enable exception */
+ gcmkVERIFY_OK(_FillPageTable(PageTable, (gctUINT32)PageCount, 1 << 1));
+#else
+ gcmkVERIFY_OK(_FillPageTable(PageTable, (gctUINT32)PageCount, 0));
+#endif
+ }
+ }
+
+ gcmkDUMP(Mmu->os,
+ "#[mmu-stlb: free 0x%08X - 0x%08X]",
+ Address, Address + pageCount * pageSize - 1);
+
+ gcmkDUMP(Mmu->os,
+ "@[physical.fill 0x%010llX 0x%08X 0x%08X]",
+ (unsigned long long)(area->stlbPhysical + index * 4),
+ *(gctUINT32_PTR)PageTable,
+ pageCount * 4);
+
+ /* We have free nodes. */
+ area->freeNodes = gcvTRUE;
+
+ /* Record freed address range. */
+ data.addressData.start = Address;
+ data.addressData.end = Address + (gctUINT32)PageCount * pageSize;
+ gckQUEUE_Enqueue(&Mmu->recentFreedAddresses, &data);
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Mmu->os, Mmu->pageTableMutex));
+ acquired = gcvFALSE;
+
+#if gcdENABLE_TRUST_APPLICATION
+ if (Mmu->hardware->options.secureMode == gcvSECURE_IN_TA)
+ {
+ gckKERNEL_SecurityUnmapMemory(Mmu->hardware->kernel, Address, (gctUINT32)PageCount);
+ }
+#endif
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Mmu->os, Mmu->pageTableMutex));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckMMU_AllocatePages(
+ IN gckMMU Mmu,
+ IN gctSIZE_T PageCount,
+ IN gcePAGE_TYPE PageType,
+ OUT gctPOINTER * PageTable,
+ OUT gctUINT32 * Address
+ )
+{
+ return gckMMU_AllocatePagesEx(
+ Mmu, PageCount, gcvVIDMEM_TYPE_GENERIC, PageType, gcvFALSE, PageTable, Address);
+}
+
+gceSTATUS
+gckMMU_AllocatePagesEx(
+ IN gckMMU Mmu,
+ IN gctSIZE_T PageCount,
+ IN gceVIDMEM_TYPE Type,
+ IN gcePAGE_TYPE PageType,
+ IN gctBOOL Secure,
+ OUT gctPOINTER * PageTable,
+ OUT gctUINT32 * Address
+ )
+{
+#if gcdDISABLE_GPU_VIRTUAL_ADDRESS
+ gcmkPRINT("GPU virtual address is disabled.");
+ return gcvSTATUS_NOT_SUPPORTED;
+#else
+ return _AllocatePages(Mmu, PageCount, Type, PageType, Secure, PageTable, Address);
+#endif
+}
+
+gceSTATUS
+gckMMU_FreePages(
+ IN gckMMU Mmu,
+ IN gctBOOL Secure,
+ IN gcePAGE_TYPE PageType,
+ IN gctUINT32 Address,
+ IN gctPOINTER PageTable,
+ IN gctSIZE_T PageCount
+ )
+{
+ return _FreePages(Mmu, Secure, PageType, Address, PageTable, PageCount);
+}
+
+gceSTATUS
+gckMMU_SetPage(
+ IN gckMMU Mmu,
+ IN gctPHYS_ADDR_T PageAddress,
+ IN gcePAGE_TYPE PageType,
+ IN gctBOOL Writable,
+ IN gctUINT32 *PageEntry
+ )
+{
+ gctUINT32 addressExt;
+ gctUINT32 address;
+
+ gcmkHEADER_ARG("Mmu=0x%x", Mmu);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Mmu, gcvOBJ_MMU);
+ gcmkVERIFY_ARGUMENT(PageEntry != gcvNULL);
+
+ if (PageType == gcvPAGE_TYPE_1M)
+ {
+ gcmkVERIFY_ARGUMENT(!(PageAddress & 0xFFFFF));
+ }
+ else
+ {
+ gcmkVERIFY_ARGUMENT(!(PageAddress & 0xFFF));
+ }
+
+ /* [31:0]. */
+ address = (gctUINT32)(PageAddress & 0xFFFFFFFF);
+ /* [39:32]. */
+ addressExt = (gctUINT32)((PageAddress >> 32) & 0xFF);
+
+ if (Mmu->hardware->mmuVersion == 0)
+ {
+ _WritePageEntry(PageEntry, address);
+ }
+ else
+ {
+ _WritePageEntry(PageEntry, _SetPage(address, addressExt, gcvTRUE));
+ }
+
+#ifdef DUMP_IN_KERNEL
+ {
+ gctUINT32 *stlbLogical = (PageType == gcvPAGE_TYPE_1M)
+ ? Mmu->dynamicArea1M.stlbLogical
+ : Mmu->dynamicArea4K.stlbLogical;
+
+ gctPHYS_ADDR_T stlbPhysical = (PageType == gcvPAGE_TYPE_1M)
+ ? Mmu->dynamicArea1M.stlbPhysical
+ : Mmu->dynamicArea4K.stlbPhysical;
+
+ gctPHYS_ADDR_T physical = stlbPhysical + (stlbLogical - PageEntry) * 4;
+
+ gckDUMP(Mmu->os, "@[physical.fill 0x%010llX 0x%08X 4",
+ physical, *PageEntry);
+ }
+#endif
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckMMU_Flush(
+ IN gckMMU Mmu,
+ IN gceVIDMEM_TYPE Type
+ )
+{
+ gckHARDWARE hardware;
+ gctUINT32 mask;
+ gctINT i;
+
+ if (Type == gcvVIDMEM_TYPE_VERTEX_BUFFER ||
+ Type == gcvVIDMEM_TYPE_INDEX_BUFFER ||
+ Type == gcvVIDMEM_TYPE_COMMAND)
+ {
+ mask = gcvPAGE_TABLE_DIRTY_BIT_FE;
+ }
+ else
+ {
+ mask = gcvPAGE_TABLE_DIRTY_BIT_OTHER;
+ }
+
+#if gcdSHARED_PAGETABLE
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ gctUINT j;
+ hardware = sharedPageTable->hardwares[i];
+ if (hardware)
+ {
+ for (j = 0; j < gcvENGINE_GPU_ENGINE_COUNT; j++)
+ {
+ gcmkVERIFY_OK(gckOS_AtomSetMask(hardware->pageTableDirty[j], mask));
+ }
+ }
+ }
+#else
+ hardware = Mmu->hardware;
+
+ for (i = 0 ; i < gcvENGINE_GPU_ENGINE_COUNT; i++)
+ {
+ gcmkVERIFY_OK(
+ gckOS_AtomSetMask(hardware->pageTableDirty[i], mask));
+ }
+
+ {
+ gcsLISTHEAD_PTR hardwareHead;
+ gcmkLIST_FOR_EACH(hardwareHead, &Mmu->hardwareList)
+ {
+ hardware = gcmCONTAINEROF(hardwareHead, struct _gckHARDWARE, mmuHead);
+
+ if (hardware != Mmu->hardware)
+ {
+ for (i = 0 ; i < gcvENGINE_GPU_ENGINE_COUNT; i++)
+ {
+ gcmkVERIFY_OK(
+ gckOS_AtomSetMask(hardware->pageTableDirty[i], mask));
+ }
+ }
+ }
+ }
+#endif
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckMMU_DumpPageTableEntry(
+ IN gckMMU Mmu,
+ IN gceAREA_TYPE AreaType,
+ IN gctUINT32 Address
+ )
+{
+ gctUINT32_PTR pageTable;
+ gctUINT32 index;
+ gctUINT32 mtlb, stlb;
+ gcsADDRESS_AREA_PTR area = (AreaType == gcvAREA_TYPE_4K)
+ ? &Mmu->dynamicArea4K : &Mmu->dynamicArea1M;
+
+ gctUINT32 stlbShift = (AreaType == gcvAREA_TYPE_4K)
+ ? gcdMMU_STLB_4K_SHIFT : gcdMMU_STLB_1M_SHIFT;
+
+ gctUINT32 stlbMask = (AreaType == gcvAREA_TYPE_4K)
+ ? gcdMMU_STLB_4K_MASK : gcdMMU_STLB_1M_MASK;
+
+ gctUINT32 stlbEntryNum = (AreaType == gcvAREA_TYPE_4K)
+ ? gcdMMU_STLB_4K_ENTRY_NUM : gcdMMU_STLB_1M_ENTRY_NUM;
+
+ gcmkHEADER_ARG("Mmu=0x%08X Address=0x%08X", Mmu, Address);
+ gcmkVERIFY_OBJECT(Mmu, gcvOBJ_MMU);
+
+ gcmkASSERT(Mmu->hardware->mmuVersion > 0);
+
+ mtlb = (Address & gcdMMU_MTLB_MASK) >> gcdMMU_MTLB_SHIFT;
+
+ if (AreaType != gcvAREA_TYPE_FLATMAP)
+ {
+ stlb = (Address & stlbMask) >> stlbShift;
+
+ pageTable = area->stlbLogical;
+
+ index = (mtlb - area->mappingStart)
+ * stlbEntryNum
+ + stlb;
+
+ gcmkPRINT(" Page table entry = 0x%08X", _ReadPageEntry(pageTable + index));
+ }
+ else
+ {
+ gcsMMU_STLB_CHUNK_PTR stlbChunkObj = Mmu->staticSTLB;
+ gctUINT32 entry = Mmu->mtlbLogical[mtlb];
+
+ stlb = (Address & gcdMMU_STLB_1M_MASK) >> gcdMMU_STLB_1M_SHIFT;
+
+ entry &= 0xFFFFFFF0;
+
+ while (stlbChunkObj)
+ {
+ gctUINT i;
+ gctBOOL found = gcvFALSE;
+ for (i = 0; i < stlbChunkObj->mtlbEntryNum; ++i)
+ {
+ gctPHYS_ADDR_T stlbPhysBase = stlbChunkObj->physBase + (i * gcdMMU_STLB_1M_SIZE);
+ gctUINT32_PTR stlbLogical =
+ (gctUINT32_PTR)((gctUINT8_PTR)stlbChunkObj->logical + (i * gcdMMU_STLB_1M_SIZE));
+ if (entry == stlbPhysBase)
+ {
+ gcmkPRINT(" Page table entry = 0x%08X", stlbLogical[stlb]);
+ found = gcvTRUE;
+ break;
+ }
+ }
+ if (found)
+ break;
+ stlbChunkObj = stlbChunkObj->next;
+ }
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+void
+gckMMU_CheckSaftPage(
+ IN gckMMU Mmu
+ )
+{
+ gctUINT8_PTR safeLogical = Mmu->safePageLogical;
+ gctUINT32 offsets[] = {
+ 0,
+ 64,
+ 128,
+ 256,
+ 2560,
+ 4000
+ };
+
+ gctUINT32 i = 0;
+
+ while (i < gcmCOUNTOF(offsets))
+ {
+ if (safeLogical[offsets[i]] != 0)
+ {
+ gcmkPRINT("%s(%d) safe page is over written [%d] = %x",
+ __FUNCTION__, __LINE__, i, safeLogical[offsets[i]]);
+ }
+ }
+}
+
+void
+gckMMU_DumpAddressSpace(
+ IN gckMMU Mmu
+ )
+{
+ gctUINT i;
+ gctUINT next;
+ /* TODO: */
+ gcsADDRESS_AREA_PTR area = &Mmu->dynamicArea4K;
+ gctUINT32_PTR map = area->mapLogical;
+ gctBOOL used = gcvFALSE;
+ gctUINT32 numPages;
+
+ /* Grab the mutex. */
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Mmu->os, Mmu->pageTableMutex, gcvINFINITE));
+
+ /* Find node which contains index. */
+ for (i = 0; i < area->stlbEntries; i = next)
+ {
+ switch (gcmENTRY_TYPE(map[i]))
+ {
+ case gcvMMU_SINGLE:
+ numPages = 1;
+ next = i + numPages;
+ used = gcvFALSE;
+ break;
+
+ case gcvMMU_FREE:
+ numPages = map[i] >> 8;
+ next = i + numPages;
+ used = gcvFALSE;
+ break;
+
+ case gcvMMU_USED:
+ numPages = 1;
+ next = i + numPages;
+ used = gcvTRUE;
+ break;
+
+ default:
+ gcmkFATAL("MMU table correcupted at index %u!", i);
+ return;
+ }
+
+ if (!used)
+ {
+ gcmkPRINT("Available Range [%d - %d)", i, i + numPages);
+ }
+ }
+
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Mmu->os, Mmu->pageTableMutex));
+
+}
+
+void
+gckMMU_DumpRecentFreedAddress(
+ IN gckMMU Mmu
+ )
+{
+ gckQUEUE queue = &Mmu->recentFreedAddresses;
+ gctUINT32 i;
+ gcuQUEUEDATA *data;
+
+ if (queue->count)
+ {
+ gcmkPRINT(" Recent %d freed GPU address ranges:", queue->count);
+
+ for (i = 0; i < queue->count; i++)
+ {
+ gckQUEUE_GetData(queue, i, &data);
+
+ gcmkPRINT(" [%08X - %08X]", data->addressData.start, data->addressData.end);
+ }
+ }
+}
+
+gceSTATUS
+gckMMU_FillFlatMapping(
+ IN gckMMU Mmu,
+ IN gctUINT64 PhysBase,
+ IN gctSIZE_T Size
+ )
+{
+ gceSTATUS status;
+ gckHARDWARE hardware = Mmu->hardware;
+
+ if (hardware->mmuVersion)
+ {
+ gcmkONERROR(_FillFlatMapping(Mmu, PhysBase, Size, gcvFALSE, gcvTRUE, gcvNULL));
+ }
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gckMMU_IsFlatMapped(
+ IN gckMMU Mmu,
+ IN gctUINT64 Physical,
+ IN gctUINT32 Address,
+ OUT gctBOOL *In
+ )
+{
+ gceSTATUS status;
+ gctUINT32 i;
+ gctBOOL inFlatmapping = gcvFALSE;
+
+ gcmkHEADER();
+
+ gcmkVERIFY_ARGUMENT(In != gcvNULL);
+
+ if (gckHARDWARE_IsFeatureAvailable(Mmu->hardware, gcvFEATURE_MMU) == gcvFALSE)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ if (Physical != gcvINVALID_PHYSICAL_ADDRESS)
+ {
+ for (i = 0; i < Mmu->gpuPhysicalRangeCount; i++)
+ {
+ if ((Physical >= Mmu->gpuPhysicalRanges[i].start) &&
+ (Physical <= Mmu->gpuPhysicalRanges[i].end))
+ {
+ inFlatmapping = gcvTRUE;
+ break;
+ }
+ }
+ }
+
+ if (Address != gcvINVALID_ADDRESS)
+ {
+ for (i = 0; i < Mmu->gpuAddressRangeCount; i++)
+ {
+ if ((Address >= Mmu->gpuAddressRanges[i].start) &&
+ (Address <= Mmu->gpuAddressRanges[i].end))
+ {
+ inFlatmapping = gcvTRUE;
+ break;
+ }
+ }
+ }
+
+ *In = inFlatmapping;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckMMU_SetupSRAM(
+ IN gckMMU Mmu,
+ IN gckHARDWARE Hardware,
+ IN gckDEVICE Device
+ )
+{
+ gctBOOL needMapInternalSRAM = gcvFALSE;
+ gctPHYS_ADDR_T reservedBase = gcvINVALID_PHYSICAL_ADDRESS;
+ gctUINT32 reservedSize = 0;
+ gctUINT i = 0;
+ gctUINT j = 0;
+ gceSTATUS status;
+ gckKERNEL kernel = Hardware->kernel;
+
+ gcmkHEADER_ARG("Mmu=0x%x Hardware=0x%x", Mmu, Hardware);
+
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ if (Hardware->mmuVersion == 0)
+ {
+ gcmkONERROR(gcvSTATUS_OK);
+ }
+
+ if (!Mmu->sRAMMapped)
+ {
+ gctUINT32 address = gcvINVALID_ADDRESS;
+ gctUINT32 size = 0;
+
+ /* Map all the SRAMs in MMU table. */
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ for (j = gcvSRAM_INTERNAL0; j < gcvSRAM_INTER_COUNT; j++)
+ {
+ reservedBase = Device->sRAMBases[i][j];
+ reservedSize = Device->sRAMSizes[i][j];
+
+ needMapInternalSRAM = reservedSize && (reservedBase != gcvINVALID_PHYSICAL_ADDRESS);
+
+ /* Map the internal SRAM. */
+ if (needMapInternalSRAM)
+ {
+ if (Device->showSRAMMapInfo)
+ {
+ gcmkPRINT("Galcore Info: MMU mapped core%d SRAM base=0x%llx size=0x%x",
+ i,
+ reservedBase,
+ reservedSize
+ );
+ }
+
+ /*
+ * Default gpu virtual base = 0.
+ * It can be specified if not conflict with existing mapping.
+ */
+
+ Device->sRAMBaseAddresses[i][j] = 0;
+
+ gcmkONERROR(gckOS_CPUPhysicalToGPUPhysical(
+ Mmu->os,
+ reservedBase,
+ &reservedBase
+ ));
+
+ gcmkONERROR(_FillFlatMapping(
+ Mmu,
+ reservedBase,
+ reservedSize,
+ gcvTRUE,
+ gcvTRUE,
+ &Device->sRAMBaseAddresses[i][j]
+ ));
+
+ Device->sRAMBases[i][j] = reservedBase;
+ }
+ else if (reservedSize && reservedBase == gcvINVALID_PHYSICAL_ADDRESS)
+ {
+ /*
+ * Reserve the internal SRAM range in first reserved MMU mtlb,
+ * when CPU physical base address is not specified, which means it is reserve usage.
+ */
+ Device->sRAMBaseAddresses[i][j] = (address == gcvINVALID_ADDRESS) ? gcdRESERVE_START :
+ address + gcmALIGN(size, gcdRESERVE_ALIGN);
+
+ Device->sRAMBases[i][j] = address = Device->sRAMBaseAddresses[i][j];
+
+ size = Device->sRAMSizes[i][j];
+
+ Device->sRAMPhysFaked[i][j] = gcvTRUE;
+ }
+ }
+ }
+
+ /* Map all the external SRAMs in MMU table. */
+ for (i = gcvSRAM_EXTERNAL0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ if (Device->extSRAMSizes[i] &&
+ (Device->extSRAMBases[i] != gcvINVALID_PHYSICAL_ADDRESS))
+ {
+
+ Device->extSRAMBaseAddresses[i] = 0;
+
+ Hardware->options.extSRAMCPUPhysAddrs[i] = Device->extSRAMBases[i];
+
+ gcmkONERROR(gckOS_CPUPhysicalToGPUPhysical(
+ Mmu->os,
+ Device->extSRAMBases[i],
+ &Device->extSRAMBases[i]
+ ));
+
+ Hardware->options.extSRAMGPUPhysAddrs[i] = Device->extSRAMBases[i];
+
+ gcmkONERROR(_FillFlatMapping(
+ Mmu,
+ Device->extSRAMBases[i],
+ Device->extSRAMSizes[i],
+ gcvFALSE,
+ gcvTRUE,
+ &Device->extSRAMBaseAddresses[i]
+ ));
+
+ kernel->extSRAMBaseAddresses[i] = Device->extSRAMBaseAddresses[i];
+
+ Hardware->options.extSRAMGPUVirtAddrs[i] = Device->extSRAMBaseAddresses[i];
+ Hardware->options.extSRAMSizes[i] = Device->extSRAMSizes[i];
+
+ if (Device->showSRAMMapInfo)
+ {
+ gcmkPRINT("Galcore Info: MMU mapped external shared SRAM[%d] CPU base=0x%llx GPU virtual address=0x%x size=0x%x",
+ i,
+ Device->extSRAMBases[i],
+ kernel->extSRAMBaseAddresses[i],
+ Device->extSRAMSizes[i]
+ );
+ }
+ }
+ }
+
+ Mmu->sRAMMapped = gcvTRUE;
+ }
+
+ /* Get per core SRAM hardware base address. */
+ for (i = gcvSRAM_INTERNAL0; i < gcvSRAM_INTER_COUNT; i++)
+ {
+ if (Device->sRAMSizes[Hardware->core][i] &&
+ (Device->sRAMBases[Hardware->core][i] != gcvINVALID_PHYSICAL_ADDRESS))
+ {
+ kernel->sRAMBaseAddresses[i] = Device->sRAMBaseAddresses[Hardware->core][i];
+ kernel->sRAMSizes[i] = Hardware->options.sRAMSizes[i]
+ = Device->sRAMSizes[Hardware->core][i];
+
+ kernel->sRAMPhysFaked[i] = Device->sRAMPhysFaked[Hardware->core][i];
+ Hardware->options.sRAMGPUVirtAddrs[i] = Device->sRAMBaseAddresses[Hardware->core][i];
+
+ /* If the internal SRAM usage is reserve. */
+ if (kernel->sRAMPhysFaked[i])
+ {
+ /* Use virtual address as the faked physical address which will never be accessed. */
+ status = gckVIDMEM_Construct(
+ Mmu->os,
+ (gctPHYS_ADDR_T)kernel->sRAMBaseAddresses[i],
+ kernel->sRAMSizes[i],
+ 64,
+ 0,
+ &kernel->sRAMVidMem[i]
+ );
+
+ if (gcmIS_ERROR(status))
+ {
+ kernel->sRAMSizes[i] = 0;
+ kernel->sRAMVidMem[i] = gcvNULL;
+ }
+ else
+ {
+ gcmkONERROR(gckOS_RequestReservedMemory(
+ Mmu->os,
+ (gctPHYS_ADDR_T)kernel->sRAMBaseAddresses[i],
+ kernel->sRAMSizes[i],
+ "Per core SRAM reserve usage region",
+ gcvTRUE,
+ &kernel->sRAMPhysical[i]
+ ));
+
+ kernel->sRAMVidMem[i]->physical = kernel->sRAMPhysical[i];
+ }
+ }
+
+ if (Device->showSRAMMapInfo)
+ {
+ gcmkPRINT("Galcore Info: MMU mapped core %d SRAM[%d] hardware virtual address=0x%x size=0x%x",
+ Hardware->core,
+ i,
+ kernel->sRAMBaseAddresses[i],
+ kernel->sRAMSizes[i]
+ );
+ }
+ }
+ }
+
+ gcsLIST_Add(&Hardware->mmuHead, &Mmu->hardwareList);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the error. */
+ gcmkFOOTER();
+ return status;
+}
+
+
+gceSTATUS
+gckMMU_GetPageEntry(
+ IN gckMMU Mmu,
+ IN gcePAGE_TYPE PageType,
+ IN gctUINT32 Address,
+ IN gctUINT32_PTR *PageTable
+ )
+{
+ gctUINT32_PTR pageTable;
+ gctUINT32 index;
+ gctUINT32 mtlbOffset, stlbOffset;
+ gcsADDRESS_AREA_PTR area = _GetProcessArea(Mmu, PageType, gcvFALSE);
+
+ gcmkHEADER_ARG("Mmu=0x%08X Address=0x%08X", Mmu, Address);
+ gcmkVERIFY_OBJECT(Mmu, gcvOBJ_MMU);
+
+ gcmkASSERT(Mmu->hardware->mmuVersion > 0);
+
+ mtlbOffset = (Address & gcdMMU_MTLB_MASK) >> gcdMMU_MTLB_SHIFT;
+
+ if (mtlbOffset >= area->mappingStart)
+ {
+ gctUINT32 stlbShift = (PageType == gcvPAGE_TYPE_1M) ? gcdMMU_STLB_1M_SHIFT : gcdMMU_STLB_4K_SHIFT;
+ gctUINT32 stlbMask = (PageType == gcvPAGE_TYPE_1M) ? gcdMMU_STLB_1M_MASK : gcdMMU_STLB_4K_MASK;
+ gctUINT32 stlbEntryNum = (PageType == gcvPAGE_TYPE_1M) ? gcdMMU_STLB_1M_ENTRY_NUM : gcdMMU_STLB_4K_ENTRY_NUM;
+
+ stlbOffset = (Address & stlbMask) >> stlbShift;
+
+ pageTable = area->stlbLogical;
+
+ index = (mtlbOffset - area->mappingStart) * stlbEntryNum + stlbOffset;
+
+ *PageTable = pageTable + index;
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckMMU_GetAreaType(
+ IN gckMMU Mmu,
+ IN gctUINT32 GpuAddress,
+ OUT gceAREA_TYPE *AreaType
+ )
+{
+ gctUINT32 mtlbIndex;
+ gctBOOL flatMapped;
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsADDRESS_AREA_PTR area4K = &Mmu->dynamicArea4K;
+#if gcdENABLE_GPU_1M_PAGE
+ gcsADDRESS_AREA_PTR area1M = &Mmu->dynamicArea1M;
+#endif
+
+ mtlbIndex = _MtlbOffset(GpuAddress);
+
+ gcmkONERROR(gckMMU_IsFlatMapped(Mmu, gcvINVALID_PHYSICAL_ADDRESS, GpuAddress, &flatMapped));
+
+ if (flatMapped)
+ {
+ *AreaType = gcvAREA_TYPE_FLATMAP;
+ }
+#if gcdENABLE_GPU_1M_PAGE
+ else if (mtlbIndex >= area1M->mappingStart && mtlbIndex <= area1M->mappingEnd)
+ {
+ *AreaType = gcvAREA_TYPE_1M;
+ }
+#endif
+ else if (mtlbIndex >= area4K->mappingStart && mtlbIndex <= area4K->mappingEnd)
+ {
+ *AreaType = gcvAREA_TYPE_4K;
+ }
+ else
+ {
+ *AreaType = gcvAREA_TYPE_UNKNOWN;
+ }
+
+OnError:
+ return status;
+}
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu_vg.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu_vg.c
new file mode 100644
index 000000000000..b1cdd1b2f5f7
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_mmu_vg.c
@@ -0,0 +1,557 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+#if gcdENABLE_VG
+
+#define _GC_OBJ_ZONE gcvZONE_MMU
+
+/*******************************************************************************
+**
+** gckVGMMU_Construct
+**
+** Construct a new gckVGMMU object.
+**
+** INPUT:
+**
+** gckVGKERNEL Kernel
+** Pointer to an gckVGKERNEL object.
+**
+** gctSIZE_T MmuSize
+** Number of bytes for the page table.
+**
+** OUTPUT:
+**
+** gckVGMMU * Mmu
+** Pointer to a variable that receives the gckVGMMU object pointer.
+*/
+gceSTATUS gckVGMMU_Construct(
+ IN gckVGKERNEL Kernel,
+ IN gctUINT32 MmuSize,
+ OUT gckVGMMU * Mmu
+ )
+{
+ gckOS os;
+ gckVGHARDWARE hardware;
+ gceSTATUS status;
+ gckVGMMU mmu;
+ gctUINT32 * pageTable;
+ gctUINT32 i;
+
+ gcmkHEADER_ARG("Kernel=0x%x MmuSize=0x%x Mmu=0x%x", Kernel, MmuSize, Mmu);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(MmuSize > 0);
+ gcmkVERIFY_ARGUMENT(Mmu != gcvNULL);
+
+ /* Extract the gckOS object pointer. */
+ os = Kernel->os;
+ gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
+
+ /* Extract the gckVGHARDWARE object pointer. */
+ hardware = Kernel->hardware;
+ gcmkVERIFY_OBJECT(hardware, gcvOBJ_HARDWARE);
+
+ /* Allocate memory for the gckVGMMU object. */
+ status = gckOS_Allocate(os, sizeof(struct _gckVGMMU), (gctPOINTER *) &mmu);
+
+ if (status < 0)
+ {
+ /* Error. */
+ gcmkFATAL(
+ "%s(%d): could not allocate gckVGMMU object.",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkFOOTER();
+ return status;
+ }
+
+ /* Initialize the gckVGMMU object. */
+ mmu->object.type = gcvOBJ_MMU;
+ mmu->os = os;
+ mmu->hardware = hardware;
+
+ /* Create the mutex. */
+ status = gckOS_CreateMutex(os, &mmu->mutex);
+
+ if (status < 0)
+ {
+ /* Roll back. */
+ mmu->object.type = gcvOBJ_UNKNOWN;
+ gcmkVERIFY_OK(gckOS_Free(os, mmu));
+
+ gcmkFOOTER();
+ /* Error. */
+ return status;
+ }
+
+ /* Allocate the page table. */
+ mmu->pageTableSize = (gctUINT32)MmuSize;
+ status = gckOS_AllocateNonPagedMemory(os,
+ gcvFALSE,
+ gcvALLOC_FLAG_CONTIGUOUS,
+ &mmu->pageTableSize,
+ &mmu->pageTablePhysical,
+ &mmu->pageTableLogical);
+
+ if (status < 0)
+ {
+ /* Roll back. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(os, mmu->mutex));
+
+ mmu->object.type = gcvOBJ_UNKNOWN;
+ gcmkVERIFY_OK(gckOS_Free(os, mmu));
+
+ /* Error. */
+ gcmkFATAL(
+ "%s(%d): could not allocate page table.",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkFOOTER();
+ return status;
+ }
+
+ /* Compute number of entries in page table. */
+ mmu->entryCount = (gctUINT32)mmu->pageTableSize / sizeof(gctUINT32);
+ mmu->entry = 0;
+
+ /* Mark the entire page table as available. */
+ pageTable = (gctUINT32 *) mmu->pageTableLogical;
+ for (i = 0; i < mmu->entryCount; i++)
+ {
+ pageTable[i] = (gctUINT32)~0;
+ }
+
+ /* Set page table address. */
+ status = gckVGHARDWARE_SetMMU(hardware, mmu->pageTableLogical);
+
+ if (status < 0)
+ {
+ /* Free the page table. */
+ gcmkVERIFY_OK(gckOS_FreeNonPagedMemory(mmu->os,
+ mmu->pageTablePhysical,
+ mmu->pageTableLogical,
+ mmu->pageTableSize));
+
+ /* Roll back. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(os, mmu->mutex));
+
+ mmu->object.type = gcvOBJ_UNKNOWN;
+ gcmkVERIFY_OK(gckOS_Free(os, mmu));
+
+ /* Error. */
+ gcmkFATAL(
+ "%s(%d): could not program page table.",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkFOOTER();
+ return status;
+ }
+
+ /* Return the gckVGMMU object pointer. */
+ *Mmu = mmu;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_MMU,
+ "%s(%d): %u entries at %p.(0x%08X)\n",
+ __FUNCTION__, __LINE__,
+ mmu->entryCount,
+ mmu->pageTableLogical,
+ mmu->pageTablePhysical
+ );
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGMMU_Destroy
+**
+** Destroy a nAQMMU object.
+**
+** INPUT:
+**
+** gckVGMMU Mmu
+** Pointer to an gckVGMMU object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS gckVGMMU_Destroy(
+ IN gckVGMMU Mmu
+ )
+{
+ gcmkHEADER_ARG("Mmu=0x%x", Mmu);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Mmu, gcvOBJ_MMU);
+
+ /* Free the page table. */
+ gcmkVERIFY_OK(gckOS_FreeNonPagedMemory(Mmu->os,
+ Mmu->pageTablePhysical,
+ Mmu->pageTableLogical,
+ Mmu->pageTableSize));
+
+ /* Roll back. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Mmu->os, Mmu->mutex));
+
+ /* Mark the gckVGMMU object as unknown. */
+ Mmu->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the gckVGMMU object. */
+ gcmkVERIFY_OK(gckOS_Free(Mmu->os, Mmu));
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVGMMU_AllocatePages
+**
+** Allocate pages inside the page table.
+**
+** INPUT:
+**
+** gckVGMMU Mmu
+** Pointer to an gckVGMMU object.
+**
+** gctSIZE_T PageCount
+** Number of pages to allocate.
+**
+** OUTPUT:
+**
+** gctPOINTER * PageTable
+** Pointer to a variable that receives the base address of the page
+** table.
+**
+** gctUINT32 * Address
+** Pointer to a variable that receives the hardware specific address.
+*/
+gceSTATUS gckVGMMU_AllocatePages(
+ IN gckVGMMU Mmu,
+ IN gctSIZE_T PageCount,
+ OUT gctPOINTER * PageTable,
+ OUT gctUINT32 * Address
+ )
+{
+ gceSTATUS status;
+ gctUINT32 tail, index, i;
+ gctUINT32 * table;
+ gctBOOL allocated = gcvFALSE;
+
+ gcmkHEADER_ARG("Mmu=0x%x PageCount=0x%x PageTable=0x%x Address=0x%x",
+ Mmu, PageCount, PageTable, Address);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Mmu, gcvOBJ_MMU);
+ gcmkVERIFY_ARGUMENT(PageCount > 0);
+ gcmkVERIFY_ARGUMENT(PageTable != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Address != gcvNULL);
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_MMU,
+ "%s(%d): %u pages.\n",
+ __FUNCTION__, __LINE__,
+ PageCount
+ );
+
+ if (PageCount > Mmu->entryCount)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_MMU,
+ "%s(%d): page table too small for %u pages.\n",
+ __FUNCTION__, __LINE__,
+ PageCount
+ );
+
+ gcmkFOOTER_NO();
+ /* Not enough pages avaiable. */
+ return gcvSTATUS_OUT_OF_RESOURCES;
+ }
+
+ /* Grab the mutex. */
+ status = gckOS_AcquireMutex(Mmu->os, Mmu->mutex, gcvINFINITE);
+
+ if (status < 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_MMU,
+ "%s(%d): could not acquire mutex.\n"
+ ,__FUNCTION__, __LINE__
+ );
+
+ gcmkFOOTER();
+ /* Error. */
+ return status;
+ }
+
+ /* Compute the tail for this allocation. */
+ tail = Mmu->entryCount - (gctUINT32)PageCount;
+
+ /* Walk all entries until we find enough slots. */
+ for (index = Mmu->entry; index <= tail;)
+ {
+ /* Access page table. */
+ table = (gctUINT32 *) Mmu->pageTableLogical + index;
+
+ /* See if all slots are available. */
+ for (i = 0; i < PageCount; i++, table++)
+ {
+ if (*table != ~0)
+ {
+ /* Start from next slot. */
+ index += i + 1;
+ break;
+ }
+ }
+
+ if (i == PageCount)
+ {
+ /* Bail out if we have enough page entries. */
+ allocated = gcvTRUE;
+ break;
+ }
+ }
+
+ if (!allocated)
+ {
+ if (status >= 0)
+ {
+ /* Walk all entries until we find enough slots. */
+ for (index = 0; index <= tail;)
+ {
+ /* Access page table. */
+ table = (gctUINT32 *) Mmu->pageTableLogical + index;
+
+ /* See if all slots are available. */
+ for (i = 0; i < PageCount; i++, table++)
+ {
+ if (*table != ~0)
+ {
+ /* Start from next slot. */
+ index += i + 1;
+ break;
+ }
+ }
+
+ if (i == PageCount)
+ {
+ /* Bail out if we have enough page entries. */
+ allocated = gcvTRUE;
+ break;
+ }
+ }
+ }
+ }
+
+ if (!allocated && (status >= 0))
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_MMU,
+ "%s(%d): not enough free pages for %u pages.\n",
+ __FUNCTION__, __LINE__,
+ PageCount
+ );
+
+ /* Not enough empty slots available. */
+ status = gcvSTATUS_OUT_OF_RESOURCES;
+ }
+
+ if (status >= 0)
+ {
+ /* Build virtual address. */
+ status = gckVGHARDWARE_BuildVirtualAddress(Mmu->hardware,
+ index,
+ 0,
+ Address);
+
+ if (status >= 0)
+ {
+ /* Update current entry into page table. */
+ Mmu->entry = index + (gctUINT32)PageCount;
+
+ /* Return pointer to page table. */
+ *PageTable = (gctUINT32 *) Mmu->pageTableLogical + index;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_MMU,
+ "%s(%d): allocated %u pages at index %u (0x%08X) @ %p.\n",
+ __FUNCTION__, __LINE__,
+ PageCount,
+ index,
+ *Address,
+ *PageTable
+ );
+ }
+ }
+
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Mmu->os, Mmu->mutex));
+ gcmkFOOTER();
+
+ /* Return status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVGMMU_FreePages
+**
+** Free pages inside the page table.
+**
+** INPUT:
+**
+** gckVGMMU Mmu
+** Pointer to an gckVGMMU object.
+**
+** gctPOINTER PageTable
+** Base address of the page table to free.
+**
+** gctSIZE_T PageCount
+** Number of pages to free.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS gckVGMMU_FreePages(
+ IN gckVGMMU Mmu,
+ IN gctPOINTER PageTable,
+ IN gctSIZE_T PageCount
+ )
+{
+ gctUINT32 * table;
+
+ gcmkHEADER_ARG("Mmu=0x%x PageTable=0x%x PageCount=0x%x",
+ Mmu, PageTable, PageCount);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Mmu, gcvOBJ_MMU);
+ gcmkVERIFY_ARGUMENT(PageTable != gcvNULL);
+ gcmkVERIFY_ARGUMENT(PageCount > 0);
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_MMU,
+ "%s(%d): freeing %u pages at index %u @ %p.\n",
+ __FUNCTION__, __LINE__,
+ PageCount,
+ ((gctUINT32 *) PageTable - (gctUINT32 *) Mmu->pageTableLogical),
+ PageTable
+ );
+
+ /* Convert pointer. */
+ table = (gctUINT32 *) PageTable;
+
+ /* Mark the page table entries as available. */
+ while (PageCount-- > 0)
+ {
+ *table++ = (gctUINT32)~0;
+ }
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVGMMU_SetPage(
+ IN gckVGMMU Mmu,
+ IN gctUINT32 PageAddress,
+ IN gctUINT32 *PageEntry
+ )
+{
+ gcmkHEADER_ARG("Mmu=0x%x", Mmu);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Mmu, gcvOBJ_MMU);
+ gcmkVERIFY_ARGUMENT(PageEntry != gcvNULL);
+ gcmkVERIFY_ARGUMENT(!(PageAddress & 0xFFF));
+
+ *PageEntry = PageAddress;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVGMMU_Flush(
+ IN gckVGMMU Mmu
+ )
+{
+ gckVGHARDWARE hardware;
+
+ gcmkHEADER_ARG("Mmu=0x%x", Mmu);
+
+ hardware = Mmu->hardware;
+ gcmkVERIFY_OK(
+ gckOS_AtomSet(hardware->os, hardware->pageTableDirty, 1));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+#endif /* gcdENABLE_VG */
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_power.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_power.c
new file mode 100644
index 000000000000..4eb3ecbc5e1b
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_power.c
@@ -0,0 +1,381 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+#define _GC_OBJ_ZONE gcvZONE_POWER
+
+/******************************************************************************\
+************************ Dynamic Voltage Frequency Setting *********************
+\******************************************************************************/
+#if gcdDVFS
+static gctUINT32
+_GetLoadHistory(
+ IN gckDVFS Dvfs,
+ IN gctUINT32 Select,
+ IN gctUINT32 Index
+)
+{
+ return Dvfs->loads[Index];
+}
+
+static void
+_IncreaseScale(
+ IN gckDVFS Dvfs,
+ IN gctUINT32 Load,
+ OUT gctUINT8 *Scale
+ )
+{
+ if (Dvfs->currentScale < 32)
+ {
+ *Scale = Dvfs->currentScale + 8;
+ }
+ else
+ {
+ *Scale = Dvfs->currentScale + 8;
+ *Scale = gcmMIN(64, *Scale);
+ }
+}
+
+static void
+_RecordFrequencyHistory(
+ gckDVFS Dvfs,
+ gctUINT32 Frequency
+ )
+{
+ gctUINT32 i = 0;
+
+ struct _FrequencyHistory *history = Dvfs->frequencyHistory;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (history->frequency == Frequency)
+ {
+ break;
+ }
+
+ if (history->frequency == 0)
+ {
+ history->frequency = Frequency;
+ break;
+ }
+
+ history++;
+ }
+
+ if (i < 16)
+ {
+ history->count++;
+ }
+}
+
+static gctUINT32
+_GetFrequencyHistory(
+ gckDVFS Dvfs,
+ gctUINT32 Frequency
+ )
+{
+ gctUINT32 i = 0;
+
+ struct _FrequencyHistory * history = Dvfs->frequencyHistory;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (history->frequency == Frequency)
+ {
+ break;
+ }
+
+ history++;
+ }
+
+ if (i < 16)
+ {
+ return history->count;
+ }
+
+ return 0;
+}
+
+static void
+_Policy(
+ IN gckDVFS Dvfs,
+ IN gctUINT32 Load,
+ OUT gctUINT8 *Scale
+ )
+{
+ gctUINT8 load[4], nextLoad;
+ gctUINT8 scale;
+
+ /* Last 4 history. */
+ load[0] = (Load & 0xFF);
+ load[1] = (Load & 0xFF00) >> 8;
+ load[2] = (Load & 0xFF0000) >> 16;
+ load[3] = (Load & 0xFF000000) >> 24;
+
+ /* Determine target scale. */
+ if (load[0] > 54)
+ {
+ _IncreaseScale(Dvfs, Load, &scale);
+ }
+ else
+ {
+ nextLoad = (load[0] + load[1] + load[2] + load[3])/4;
+
+ scale = Dvfs->currentScale * (nextLoad) / 54;
+
+ scale = gcmMAX(1, scale);
+ scale = gcmMIN(64, scale);
+ }
+
+ Dvfs->totalConfig++;
+
+ Dvfs->loads[(load[0]-1)/8]++;
+
+ *Scale = scale;
+
+
+ if (Dvfs->totalConfig % 100 == 0)
+ {
+ gcmkPRINT("=======================================================");
+ gcmkPRINT("GPU Load: %-8d %-8d %-8d %-8d %-8d %-8d %-8d %-8d",
+ 8, 16, 24, 32, 40, 48, 56, 64);
+ gcmkPRINT(" %-8d %-8d %-8d %-8d %-8d %-8d %-8d %-8d",
+ _GetLoadHistory(Dvfs,2, 0),
+ _GetLoadHistory(Dvfs,2, 1),
+ _GetLoadHistory(Dvfs,2, 2),
+ _GetLoadHistory(Dvfs,2, 3),
+ _GetLoadHistory(Dvfs,2, 4),
+ _GetLoadHistory(Dvfs,2, 5),
+ _GetLoadHistory(Dvfs,2, 6),
+ _GetLoadHistory(Dvfs,2, 7)
+ );
+
+ gcmkPRINT("Frequency(MHz) %-8d %-8d %-8d %-8d %-8d",
+ 58, 120, 240, 360, 480);
+ gcmkPRINT(" %-8d %-8d %-8d %-8d %-8d",
+ _GetFrequencyHistory(Dvfs, 58),
+ _GetFrequencyHistory(Dvfs,120),
+ _GetFrequencyHistory(Dvfs,240),
+ _GetFrequencyHistory(Dvfs,360),
+ _GetFrequencyHistory(Dvfs,480)
+ );
+ }
+}
+
+static void
+_TimerFunction(
+ gctPOINTER Data
+ )
+{
+ gceSTATUS status;
+ gckDVFS dvfs = (gckDVFS) Data;
+ gckHARDWARE hardware = dvfs->hardware;
+ gctUINT32 value;
+ gctUINT32 frequency;
+ gctUINT8 scale;
+ gctUINT32 t1, t2, consumed;
+
+ gckOS_GetTicks(&t1);
+
+ gcmkONERROR(gckHARDWARE_QueryLoad(hardware, &value));
+
+ /* determine target sacle. */
+ _Policy(dvfs, value, &scale);
+
+ /* Set frequency and voltage. */
+ gcmkONERROR(gckOS_SetGPUFrequency(hardware->os, hardware->core, scale));
+
+ /* Query real frequency. */
+ gcmkONERROR(
+ gckOS_QueryGPUFrequency(hardware->os,
+ hardware->core,
+ &frequency,
+ &dvfs->currentScale));
+
+ _RecordFrequencyHistory(dvfs, frequency);
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_POWER,
+ "Current frequency = %d",
+ frequency);
+
+ /* Set period. */
+ gcmkONERROR(gckHARDWARE_SetDVFSPeroid(hardware, frequency));
+
+OnError:
+ /* Determine next querying time. */
+ gckOS_GetTicks(&t2);
+
+ consumed = gcmMIN(((long)t2 - (long)t1), 5);
+
+ if (dvfs->stop == gcvFALSE)
+ {
+ gcmkVERIFY_OK(gckOS_StartTimer(hardware->os,
+ dvfs->timer,
+ dvfs->pollingTime - consumed));
+ }
+
+ return;
+}
+
+gceSTATUS
+gckDVFS_Construct(
+ IN gckHARDWARE Hardware,
+ OUT gckDVFS * Dvfs
+ )
+{
+ gceSTATUS status;
+ gctPOINTER pointer;
+ gckDVFS dvfs = gcvNULL;
+ gckOS os = Hardware->os;
+
+ gcmkHEADER_ARG("Hardware=0x%X", Hardware);
+
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+ gcmkVERIFY_ARGUMENT(Dvfs != gcvNULL);
+
+ /* Allocate a gckDVFS manager. */
+ gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(struct _gckDVFS), &pointer));
+
+ gckOS_ZeroMemory(pointer, gcmSIZEOF(struct _gckDVFS));
+
+ dvfs = pointer;
+
+ /* Initialization. */
+ dvfs->hardware = Hardware;
+ dvfs->pollingTime = gcdDVFS_POLLING_TIME;
+ dvfs->os = Hardware->os;
+ dvfs->currentScale = 64;
+
+ /* Create a polling timer. */
+ gcmkONERROR(gckOS_CreateTimer(os, _TimerFunction, pointer, &dvfs->timer));
+
+ /* Initialize frequency and voltage adjustment helper. */
+ gcmkONERROR(gckOS_PrepareGPUFrequency(os, Hardware->core));
+
+ /* Return result. */
+ *Dvfs = dvfs;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (dvfs)
+ {
+ if (dvfs->timer)
+ {
+ gcmkVERIFY_OK(gckOS_DestroyTimer(os, dvfs->timer));
+ }
+
+ gcmkOS_SAFE_FREE(os, dvfs);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckDVFS_Destroy(
+ IN gckDVFS Dvfs
+ )
+{
+ gcmkHEADER_ARG("Dvfs=0x%X", Dvfs);
+ gcmkVERIFY_ARGUMENT(Dvfs != gcvNULL);
+
+ /* Deinitialize helper fuunction. */
+ gcmkVERIFY_OK(gckOS_FinishGPUFrequency(Dvfs->os, Dvfs->hardware->core));
+
+ /* DestroyTimer. */
+ gcmkVERIFY_OK(gckOS_DestroyTimer(Dvfs->os, Dvfs->timer));
+
+ gcmkOS_SAFE_FREE(Dvfs->os, Dvfs);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckDVFS_Start(
+ IN gckDVFS Dvfs
+ )
+{
+ gcmkHEADER_ARG("Dvfs=0x%X", Dvfs);
+ gcmkVERIFY_ARGUMENT(Dvfs != gcvNULL);
+
+ gckHARDWARE_InitDVFS(Dvfs->hardware);
+
+ Dvfs->stop = gcvFALSE;
+
+ gckOS_StartTimer(Dvfs->os, Dvfs->timer, Dvfs->pollingTime);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckDVFS_Stop(
+ IN gckDVFS Dvfs
+ )
+{
+ gcmkHEADER_ARG("Dvfs=0x%X", Dvfs);
+ gcmkVERIFY_ARGUMENT(Dvfs != gcvNULL);
+
+ Dvfs->stop = gcvTRUE;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+#endif
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_precomp.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_precomp.h
new file mode 100644
index 000000000000..55b5fc78c3fd
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_precomp.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_precomp_h_
+#define __gc_hal_kernel_precomp_h_
+
+#include "gc_hal.h"
+#include "gc_hal_driver.h"
+#include "gc_hal_kernel.h"
+
+#endif /* __gc_hal_kernel_precomp_h_ */
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security.c
new file mode 100644
index 000000000000..683964d59566
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security.c
@@ -0,0 +1,286 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+
+
+
+#define _GC_OBJ_ZONE gcvZONE_KERNEL
+
+#if gcdSECURITY
+
+/*
+** Open a security service channel.
+*/
+gceSTATUS
+gckKERNEL_SecurityOpen(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 GPU,
+ OUT gctUINT32 *Channel
+ )
+{
+ gceSTATUS status;
+
+ gcmkONERROR(gckOS_OpenSecurityChannel(Kernel->os, Kernel->core, Channel));
+ gcmkONERROR(gckOS_InitSecurityChannel(*Channel));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+/*
+** Close a security service channel
+*/
+gceSTATUS
+gckKERNEL_SecurityClose(
+ IN gctUINT32 Channel
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+/*
+** Security service interface.
+*/
+gceSTATUS
+gckKERNEL_SecurityCallService(
+ IN gctUINT32 Channel,
+ IN OUT gcsTA_INTERFACE * Interface
+)
+{
+ gceSTATUS status;
+ gcmkHEADER();
+
+ gcmkVERIFY_ARGUMENT(Interface != gcvNULL);
+
+ gckOS_CallSecurityService(Channel, Interface);
+
+ status = Interface->result;
+
+ gcmkONERROR(status);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_SecurityStartCommand(
+ IN gckKERNEL Kernel
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_START_COMMAND;
+ iface.u.StartCommand.gpu = Kernel->core;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_SecurityAllocateSecurityMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Bytes,
+ OUT gctUINT32 * Handle
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_ALLOCATE_SECRUE_MEMORY;
+ iface.u.AllocateSecurityMemory.bytes = Bytes;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ *Handle = iface.u.AllocateSecurityMemory.memory_handle;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_SecurityExecute(
+ IN gckKERNEL Kernel,
+ IN gctPOINTER Buffer,
+ IN gctUINT32 Bytes
+ )
+{
+ gceSTATUS status;
+#if defined(LINUX)
+ gctPHYS_ADDR_T physical;
+ gctUINT32 address;
+#endif
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_EXECUTE;
+ iface.u.Execute.command_buffer = (gctUINT32 *)Buffer;
+ iface.u.Execute.gpu = Kernel->core;
+ iface.u.Execute.command_buffer_length = Bytes;
+
+#if defined(LINUX)
+ gcmkONERROR(gckOS_GetPhysicalAddress(Kernel->os, Buffer, &physical));
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, physical, &physical));
+ gcmkSAFECASTPHYSADDRT(address, physical);
+
+ iface.u.Execute.command_buffer = (gctUINT32 *)address;
+#endif
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ /* Update queue tail pointer. */
+ gcmkONERROR(gckHARDWARE_UpdateQueueTail(
+ Kernel->hardware, 0, 0
+ ));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_SecurityMapMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 *PhysicalArray,
+ IN gctUINT32 PageCount,
+ OUT gctUINT32 * GPUAddress
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+#if defined(LINUX)
+ gctPHYS_ADDR_T physical;
+ gctUINT32 address;
+#endif
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_MAP_MEMORY;
+
+#if defined(LINUX)
+ gcmkONERROR(gckOS_GetPhysicalAddress(Kernel->os, PhysicalArray, &physical));
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Kernel->os, physical, &physical));
+ gcmkSAFECASTPHYSADDRT(address, physical);
+ iface.u.MapMemory.physicals = (gctUINT32 *)address;
+#endif
+
+ iface.u.MapMemory.pageCount = PageCount;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ *GPUAddress = iface.u.MapMemory.gpuAddress;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_SecurityUnmapMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 GPUAddress,
+ IN gctUINT32 PageCount
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_UNMAP_MEMORY;
+
+ iface.u.UnmapMemory.gpuAddress = GPUAddress;
+ iface.u.UnmapMemory.pageCount = PageCount;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+#endif
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security_v1.c b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security_v1.c
new file mode 100644
index 000000000000..8167b7cd55d0
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_security_v1.c
@@ -0,0 +1,320 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+
+
+
+#define _GC_OBJ_ZONE gcvZONE_KERNEL
+
+#if gcdENABLE_TRUST_APPLICATION
+
+/*
+** Open a security service channel.
+*/
+gceSTATUS
+gckKERNEL_SecurityOpen(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 GPU,
+ OUT gctUINT32 *Channel
+ )
+{
+ gceSTATUS status;
+
+ gcmkONERROR(gckOS_OpenSecurityChannel(Kernel->os, Kernel->core, Channel));
+ gcmkONERROR(gckOS_InitSecurityChannel(*Channel));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+/*
+** Close a security service channel
+*/
+gceSTATUS
+gckKERNEL_SecurityClose(
+ IN gctUINT32 Channel
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+/*
+** Security service interface.
+*/
+gceSTATUS
+gckKERNEL_SecurityCallService(
+ IN gctUINT32 Channel,
+ IN OUT gcsTA_INTERFACE * Interface
+)
+{
+ gceSTATUS status;
+ gcmkHEADER();
+
+ gcmkVERIFY_ARGUMENT(Interface != gcvNULL);
+
+ gckOS_CallSecurityService(Channel, Interface);
+
+ status = Interface->result;
+
+ gcmkONERROR(status);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_SecurityStartCommand(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_START_COMMAND;
+ iface.u.StartCommand.gpu = Kernel->core;
+ iface.u.StartCommand.address = Address;
+ iface.u.StartCommand.bytes = Bytes;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_SecurityAllocateSecurityMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Bytes,
+ OUT gctUINT32 * Handle
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_ALLOCATE_SECRUE_MEMORY;
+ iface.u.AllocateSecurityMemory.bytes = Bytes;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ *Handle = iface.u.AllocateSecurityMemory.memory_handle;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_SecurityMapMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 *PhysicalArray,
+ IN gctPHYS_ADDR_T Physical,
+ IN gctUINT32 PageCount,
+ OUT gctUINT32 * GPUAddress
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_MAP_MEMORY;
+
+ iface.u.MapMemory.physicals = PhysicalArray;
+ iface.u.MapMemory.physical = Physical;
+ iface.u.MapMemory.pageCount = PageCount;
+ iface.u.MapMemory.gpuAddress = *GPUAddress;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_SecurityDumpMMUException(
+ IN gckKERNEL Kernel
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_DUMP_MMU_EXCEPTION;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+
+
+gceSTATUS
+gckKERNEL_SecurityUnmapMemory(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 GPUAddress,
+ IN gctUINT32 PageCount
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_UNMAP_MEMORY;
+
+ iface.u.UnmapMemory.gpuAddress = GPUAddress;
+ iface.u.UnmapMemory.pageCount = PageCount;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_ReadMMUException(
+ IN gckKERNEL Kernel,
+ IN gctUINT32_PTR MMUStatus,
+ IN gctUINT32_PTR MMUException
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_READ_MMU_EXCEPTION;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ *MMUStatus = iface.u.ReadMMUException.mmuStatus;
+ *MMUException = iface.u.ReadMMUException.mmuException;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckKERNEL_HandleMMUException(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 MMUStatus,
+ IN gctPHYS_ADDR_T Physical,
+ IN gctUINT32 GPUAddress
+ )
+{
+ gceSTATUS status;
+ gcsTA_INTERFACE iface;
+
+ gcmkHEADER();
+
+ iface.command = KERNEL_HANDLE_MMU_EXCEPTION;
+
+ iface.u.HandleMMUException.mmuStatus = MMUStatus;
+ iface.u.HandleMMUException.physical = Physical;
+ iface.u.HandleMMUException.gpuAddress = GPUAddress;
+
+ gcmkONERROR(gckKERNEL_SecurityCallService(Kernel->securityChannel, &iface));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+
+
+
+#endif
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
new file mode 100644
index 000000000000..730f7e0d313e
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.c
@@ -0,0 +1,514 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+#if gcdENABLE_VG
+
+#define _GC_OBJ_ZONE gcdZONE_VG
+
+/******************************************************************************\
+******************************* gckKERNEL API Code ******************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** gckKERNEL_Construct
+**
+** Construct a new gckKERNEL object.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** IN gctPOINTER Context
+** Pointer to a driver defined context.
+**
+** OUTPUT:
+**
+** gckKERNEL * Kernel
+** Pointer to a variable that will hold the pointer to the gckKERNEL
+** object.
+*/
+gceSTATUS gckVGKERNEL_Construct(
+ IN gckOS Os,
+ IN gctPOINTER Context,
+ IN gckKERNEL inKernel,
+ OUT gckVGKERNEL * Kernel
+ )
+{
+ gceSTATUS status;
+ gckVGKERNEL kernel = gcvNULL;
+
+ gcmkHEADER_ARG("Os=0x%x Context=0x%x", Os, Context);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Kernel != gcvNULL);
+
+ do
+ {
+ /* Allocate the gckKERNEL object. */
+ gcmkERR_BREAK(gckOS_Allocate(
+ Os,
+ sizeof(struct _gckVGKERNEL),
+ (gctPOINTER *) &kernel
+ ));
+
+ /* Initialize the gckKERNEL object. */
+ kernel->object.type = gcvOBJ_KERNEL;
+ kernel->os = Os;
+ kernel->context = Context;
+ kernel->hardware = gcvNULL;
+ kernel->interrupt = gcvNULL;
+ kernel->command = gcvNULL;
+ kernel->mmu = gcvNULL;
+ kernel->kernel = inKernel;
+
+ /* Construct the gckVGHARDWARE object. */
+ gcmkERR_BREAK(gckVGHARDWARE_Construct(
+ Os, &kernel->hardware
+ ));
+
+ /* Set pointer to gckKERNEL object in gckVGHARDWARE object. */
+ kernel->hardware->kernel = kernel;
+
+ /* Construct the gckVGINTERRUPT object. */
+ gcmkERR_BREAK(gckVGINTERRUPT_Construct(
+ kernel, &kernel->interrupt
+ ));
+
+ /* Construct the gckVGCOMMAND object. */
+ gcmkERR_BREAK(gckVGCOMMAND_Construct(
+ kernel, gcmKB2BYTES(8), gcmKB2BYTES(2), &kernel->command
+ ));
+
+ /* Construct the gckVGMMU object. */
+ gcmkERR_BREAK(gckVGMMU_Construct(
+ kernel, gcmKB2BYTES(gcdGC355_VGMMU_MEMORY_SIZE_KB), &kernel->mmu
+ ));
+
+ /* Return pointer to the gckKERNEL object. */
+ *Kernel = kernel;
+
+ gcmkFOOTER_ARG("*Kernel=0x%x", *Kernel);
+ /* Success. */
+ return gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ /* Roll back. */
+ if (kernel != gcvNULL)
+ {
+ if (kernel->mmu != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckVGMMU_Destroy(kernel->mmu));
+ }
+
+ if (kernel->command != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckVGCOMMAND_Destroy(kernel->command));
+ }
+
+ if (kernel->interrupt != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckVGINTERRUPT_Destroy(kernel->interrupt));
+ }
+
+ if (kernel->hardware != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckVGHARDWARE_Destroy(kernel->hardware));
+ }
+
+ gcmkVERIFY_OK(gckOS_Free(Os, kernel));
+ }
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_Destroy
+**
+** Destroy an gckKERNEL object.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object to destroy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS gckVGKERNEL_Destroy(
+ IN gckVGKERNEL Kernel
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Kernel=0x%x", Kernel);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ do
+ {
+ /* Destroy the gckVGMMU object. */
+ if (Kernel->mmu != gcvNULL)
+ {
+ gcmkERR_BREAK(gckVGMMU_Destroy(Kernel->mmu));
+ Kernel->mmu = gcvNULL;
+ }
+
+ /* Destroy the gckVGCOMMAND object. */
+ if (Kernel->command != gcvNULL)
+ {
+ gcmkERR_BREAK(gckVGCOMMAND_Destroy(Kernel->command));
+ Kernel->command = gcvNULL;
+ }
+
+ /* Destroy the gckVGINTERRUPT object. */
+ if (Kernel->interrupt != gcvNULL)
+ {
+ gcmkERR_BREAK(gckVGINTERRUPT_Destroy(Kernel->interrupt));
+ Kernel->interrupt = gcvNULL;
+ }
+
+ /* Destroy the gckVGHARDWARE object. */
+ if (Kernel->hardware != gcvNULL)
+ {
+ gcmkERR_BREAK(gckVGHARDWARE_Destroy(Kernel->hardware));
+ Kernel->hardware = gcvNULL;
+ }
+
+ /* Mark the gckKERNEL object as unknown. */
+ Kernel->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the gckKERNEL object. */
+ gcmkERR_BREAK(gckOS_Free(Kernel->os, Kernel));
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+
+ /* Return status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVGKERNEL_Dispatch
+**
+** Dispatch a command received from the user HAL layer.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gcsHAL_INTERFACE * Interface
+** Pointer to a gcsHAL_INTERFACE structure that defines the command to
+** be dispatched.
+**
+** OUTPUT:
+**
+** gcsHAL_INTERFACE * Interface
+** Pointer to a gcsHAL_INTERFACE structure that receives any data to be
+** returned.
+*/
+gceSTATUS gckVGKERNEL_Dispatch(
+ IN gckKERNEL Kernel,
+ IN OUT gcsHAL_INTERFACE * Interface
+ )
+{
+ gceSTATUS status;
+ gcsHAL_INTERFACE * kernelInterface = Interface;
+ gctUINT32 processID;
+ gctBOOL powerMutexAcquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Kernel=0x%x Interface=0x%x ", Kernel, Interface);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Interface != gcvNULL);
+
+ gcmkONERROR(gckOS_GetProcessID(&processID));
+
+ /* Dispatch on command. */
+ switch (Interface->command)
+ {
+ case gcvHAL_QUERY_CHIP_IDENTITY:
+ /* Query chip identity. */
+ gcmkERR_BREAK(gckVGHARDWARE_QueryChipIdentity(
+ Kernel->vg->hardware,
+ &kernelInterface->u.QueryChipIdentity.chipModel,
+ &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
+ ));
+ break;
+
+ case gcvHAL_QUERY_COMMAND_BUFFER:
+ /* Query command buffer information. */
+ gcmkERR_BREAK(gckKERNEL_QueryCommandBuffer(
+ Kernel,
+ &kernelInterface->u.QueryCommandBuffer.information
+ ));
+ break;
+
+ case gcvHAL_USER_SIGNAL:
+#if !USE_NEW_LINUX_SIGNAL
+ /* Dispatch depends on the user signal subcommands. */
+ switch(Interface->u.UserSignal.command)
+ {
+ case gcvUSER_SIGNAL_CREATE:
+ /* Create a signal used in the user space. */
+ gcmkERR_BREAK(
+ gckOS_CreateUserSignal(Kernel->os,
+ Interface->u.UserSignal.manualReset,
+ &Interface->u.UserSignal.id));
+
+ gcmkVERIFY_OK(
+ gckKERNEL_AddProcessDB(Kernel,
+ processID, gcvDB_SIGNAL,
+ gcmINT2PTR(Interface->u.UserSignal.id),
+ gcvNULL,
+ 0));
+ break;
+
+ case gcvUSER_SIGNAL_DESTROY:
+ gcmkVERIFY_OK(gckKERNEL_RemoveProcessDB(
+ Kernel,
+ processID, gcvDB_SIGNAL,
+ gcmINT2PTR(Interface->u.UserSignal.id)));
+
+ /* Destroy the signal. */
+ gcmkERR_BREAK(
+ gckOS_DestroyUserSignal(Kernel->os,
+ Interface->u.UserSignal.id));
+
+ break;
+
+ case gcvUSER_SIGNAL_SIGNAL:
+ /* Signal the signal. */
+ gcmkERR_BREAK(
+ gckOS_SignalUserSignal(Kernel->os,
+ Interface->u.UserSignal.id,
+ Interface->u.UserSignal.state));
+ break;
+
+ case gcvUSER_SIGNAL_WAIT:
+ /* Wait on the signal. */
+ status = gckOS_WaitUserSignal(Kernel->os,
+ Interface->u.UserSignal.id,
+ Interface->u.UserSignal.wait);
+ break;
+
+ default:
+ /* Invalid user signal command. */
+ gcmkERR_BREAK(gcvSTATUS_INVALID_ARGUMENT);
+ }
+#endif
+ break;
+
+ case gcvHAL_READ_REGISTER:
+#if gcdREGISTER_READ_FROM_USER
+ {
+ gceCHIPPOWERSTATE power;
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->vg->hardware->powerMutex, gcvINFINITE));
+ powerMutexAcquired = gcvTRUE;
+ gcmkONERROR(gckVGHARDWARE_QueryPowerManagementState(Kernel->vg->hardware,
+ &power));
+ if (power == gcvPOWER_ON)
+ {
+ /* Read a register. */
+ gcmkONERROR(gckOS_ReadRegisterEx(
+ Kernel->os,
+ Kernel->core,
+ Interface->u.ReadRegisterData.address,
+ &Interface->u.ReadRegisterData.data));
+ }
+ else
+ {
+ /* Chip is in power-state. */
+ Interface->u.ReadRegisterData.data = 0;
+ status = gcvSTATUS_CHIP_NOT_READY;
+ }
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->vg->hardware->powerMutex));
+ powerMutexAcquired = gcvFALSE;
+ }
+#else
+ /* No access from user land to read registers. */
+ Interface->u.ReadRegisterData.data = 0;
+ status = gcvSTATUS_NOT_SUPPORTED;
+#endif
+ break;
+ case gcvHAL_WRITE_REGISTER:
+#if gcdREGISTER_WRITE_FROM_USER
+ {
+ gceCHIPPOWERSTATE power;
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->vg->hardware->powerMutex, gcvINFINITE));
+ powerMutexAcquired = gcvTRUE;
+ gcmkONERROR(gckVGHARDWARE_QueryPowerManagementState(Kernel->vg->hardware,
+ &power));
+ if (power == gcvPOWER_ON)
+ {
+ /* Write a register. */
+ gcmkONERROR(
+ gckOS_WriteRegisterEx(Kernel->os,
+ Kernel->core,
+ Interface->u.WriteRegisterData.address,
+ Interface->u.WriteRegisterData.data));
+ }
+ else
+ {
+ /* Chip is in power-state. */
+ Interface->u.WriteRegisterData.data = 0;
+ status = gcvSTATUS_CHIP_NOT_READY;
+ }
+ gcmkONERROR(gckOS_ReleaseMutex(Kernel->os, Kernel->vg->hardware->powerMutex));
+ powerMutexAcquired = gcvFALSE;
+ }
+#else
+ /* No access from user land to write registers. */
+ status = gcvSTATUS_NOT_SUPPORTED;
+#endif
+ break;
+
+ case gcvHAL_COMMIT:
+ /* Commit a command and context buffer. */
+ gcmkERR_BREAK(gckVGCOMMAND_Commit(
+ Kernel->vg->command,
+ gcmUINT64_TO_PTR(kernelInterface->u.VGCommit.context),
+ gcmUINT64_TO_PTR(kernelInterface->u.VGCommit.queue),
+ kernelInterface->u.VGCommit.entryCount,
+ gcmUINT64_TO_PTR(kernelInterface->u.VGCommit.taskTable)
+ ));
+ break;
+
+ case gcvHAL_GET_BASE_ADDRESS:
+ /* Get base address. */
+ gcmkONERROR(
+ gckOS_GetBaseAddress(Kernel->os,
+ &Interface->u.GetBaseAddress.baseAddress));
+ break;
+
+ case gcvHAL_EVENT_COMMIT:
+ gcmkERR_BREAK(gcvSTATUS_NOT_SUPPORTED);
+ break;
+
+ default:
+ /* Invalid command, try gckKERNEL_Dispatch */
+ status = gckKERNEL_Dispatch(Kernel, gcvNULL, Interface);
+ }
+
+OnError:
+ /* Save status. */
+ kernelInterface->status = status;
+ if (powerMutexAcquired == gcvTRUE)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vg->hardware->powerMutex));
+ }
+ gcmkFOOTER();
+
+ /* Return the status. */
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_QueryCommandBuffer
+**
+** Query command buffer attributes.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckVGHARDWARE object.
+**
+** OUTPUT:
+**
+** gcsCOMMAND_BUFFER_INFO_PTR Information
+** Pointer to the information structure to receive buffer attributes.
+*/
+gceSTATUS
+gckKERNEL_QueryCommandBuffer(
+ IN gckKERNEL Kernel,
+ OUT gcsCOMMAND_BUFFER_INFO_PTR Information
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Kernel=0x%x *Pool=0x%x",
+ Kernel, Information);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ /* Get the information. */
+ status = gckVGCOMMAND_QueryCommandBuffer(Kernel->vg->command, Information);
+
+ gcmkFOOTER();
+ /* Return status. */
+ return status;
+}
+
+#endif /* gcdENABLE_VG */
diff --git a/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.h b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.h
new file mode 100644
index 000000000000..2e5836874cd0
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_vg.h
@@ -0,0 +1,119 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_vg_h_
+#define __gc_hal_kernel_vg_h_
+
+#include "gc_hal.h"
+#include "gc_hal_driver.h"
+#include "gc_hal_kernel_hardware.h"
+
+/******************************************************************************\
+********************************** Structures **********************************
+\******************************************************************************/
+
+/* gckKERNEL object. */
+struct _gckVGKERNEL
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* Pointer to gckOS object. */
+ gckOS os;
+
+ /* Pointer to gckHARDWARE object. */
+ gckVGHARDWARE hardware;
+
+ /* Pointer to gckINTERRUPT object. */
+ gckVGINTERRUPT interrupt;
+
+ /* Pointer to gckCOMMAND object. */
+ gckVGCOMMAND command;
+
+ /* Pointer to context. */
+ gctPOINTER context;
+
+ /* Pointer to gckMMU object. */
+ gckVGMMU mmu;
+
+ gckKERNEL kernel;
+};
+
+/* gckMMU object. */
+struct _gckVGMMU
+{
+ /* The object. */
+ gcsOBJECT object;
+
+ /* Pointer to gckOS object. */
+ gckOS os;
+
+ /* Pointer to gckHARDWARE object. */
+ gckVGHARDWARE hardware;
+
+ /* The page table mutex. */
+ gctPOINTER mutex;
+
+ /* Page table information. */
+ gctSIZE_T pageTableSize;
+ gctPHYS_ADDR pageTablePhysical;
+ gctPOINTER pageTableLogical;
+
+ /* Allocation index. */
+ gctUINT32 entryCount;
+ gctUINT32 entry;
+};
+
+#endif /* __gc_hal_kernel_h_ */
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
new file mode 100644
index 000000000000..3abb92ef6aeb
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/gc_hal_kernel_video_memory.c
@@ -0,0 +1,4743 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_precomp.h"
+
+#if defined(__QNXNTO__)
+#include <stdlib.h>
+#include <sys/slogcodes.h>
+#include <time.h>
+
+extern unsigned int slogUsageInterval;
+#endif
+
+#define _GC_OBJ_ZONE gcvZONE_VIDMEM
+
+/******************************************************************************\
+******************************* Private Functions ******************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** _Split
+**
+** Split a node on the required byte boundary.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gcuVIDMEM_NODE_PTR Node
+** Pointer to the node to split.
+**
+** gctSIZE_T Bytes
+** Number of bytes to keep in the node.
+**
+** OUTPUT:
+**
+** Nothing.
+**
+** RETURNS:
+**
+** gctBOOL
+** gcvTRUE if the node was split successfully, or gcvFALSE if there is an
+** error.
+**
+*/
+static gctBOOL
+_Split(
+ IN gckOS Os,
+ IN gcuVIDMEM_NODE_PTR Node,
+ IN gctSIZE_T Bytes
+ )
+{
+ gcuVIDMEM_NODE_PTR node;
+ gctPOINTER pointer = gcvNULL;
+
+ /* Make sure the byte boundary makes sense. */
+ if ((Bytes <= 0) || (Bytes > Node->VidMem.bytes))
+ {
+ return gcvFALSE;
+ }
+
+ /* Allocate a new gcuVIDMEM_NODE object. */
+ if (gcmIS_ERROR(gckOS_Allocate(Os,
+ gcmSIZEOF(gcuVIDMEM_NODE),
+ &pointer)))
+ {
+ /* Error. */
+ return gcvFALSE;
+ }
+
+ node = pointer;
+
+ /* Initialize gcuVIDMEM_NODE structure. */
+ node->VidMem.offset = Node->VidMem.offset + Bytes;
+ node->VidMem.bytes = Node->VidMem.bytes - Bytes;
+ node->VidMem.alignment = 0;
+ node->VidMem.locked = 0;
+ node->VidMem.parent = Node->VidMem.parent;
+ node->VidMem.pool = Node->VidMem.pool;
+ node->VidMem.processID = 0;
+ node->VidMem.logical = gcvNULL;
+ node->VidMem.kvaddr = gcvNULL;
+
+ /* Insert node behind specified node. */
+ node->VidMem.next = Node->VidMem.next;
+ node->VidMem.prev = Node;
+ Node->VidMem.next = node->VidMem.next->VidMem.prev = node;
+
+ /* Insert free node behind specified node. */
+ node->VidMem.nextFree = Node->VidMem.nextFree;
+ node->VidMem.prevFree = Node;
+ Node->VidMem.nextFree = node->VidMem.nextFree->VidMem.prevFree = node;
+
+ /* Adjust size of specified node. */
+ Node->VidMem.bytes = Bytes;
+
+ /* Success. */
+ return gcvTRUE;
+}
+
+/*******************************************************************************
+**
+** _Merge
+**
+** Merge two adjacent nodes together.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gcuVIDMEM_NODE_PTR Node
+** Pointer to the first of the two nodes to merge.
+**
+** OUTPUT:
+**
+** Nothing.
+**
+*/
+static gceSTATUS
+_Merge(
+ IN gckOS Os,
+ IN gcuVIDMEM_NODE_PTR Node
+ )
+{
+ gcuVIDMEM_NODE_PTR node;
+ gceSTATUS status;
+
+ /* Save pointer to next node. */
+ node = Node->VidMem.next;
+
+ /* This is a good time to make sure the heap is not corrupted. */
+ if (Node->VidMem.offset + Node->VidMem.bytes != node->VidMem.offset)
+ {
+ /* Corrupted heap. */
+ gcmkASSERT(
+ Node->VidMem.offset + Node->VidMem.bytes == node->VidMem.offset);
+ return gcvSTATUS_HEAP_CORRUPTED;
+ }
+
+ /* Adjust byte count. */
+ Node->VidMem.bytes += node->VidMem.bytes;
+
+ /* Unlink next node from linked list. */
+ Node->VidMem.next = node->VidMem.next;
+ Node->VidMem.nextFree = node->VidMem.nextFree;
+
+ Node->VidMem.next->VidMem.prev =
+ Node->VidMem.nextFree->VidMem.prevFree = Node;
+
+ /* Free next node. */
+ status = gcmkOS_SAFE_FREE(Os, node);
+ return status;
+}
+
+/******************************************************************************\
+******************************* gckVIDMEM API Code ******************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** gckVIDMEM_Construct
+**
+** Construct a new gckVIDMEM object.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPHYS_ADDR_T PhysicalBase
+** Base physical address for the video memory heap.
+**
+** gctSIZE_T Bytes
+** Number of bytes in the video memory heap.
+**
+** gctSIZE_T Threshold
+** Minimum number of bytes beyond am allocation before the node is
+** split. Can be used as a minimum alignment requirement.
+**
+** gctSIZE_T BankSize
+** Number of bytes per physical memory bank. Used by bank
+** optimization.
+**
+** OUTPUT:
+**
+** gckVIDMEM * Memory
+** Pointer to a variable that will hold the pointer to the gckVIDMEM
+** object.
+*/
+gceSTATUS
+gckVIDMEM_Construct(
+ IN gckOS Os,
+ IN gctPHYS_ADDR_T PhysicalBase,
+ IN gctSIZE_T Bytes,
+ IN gctSIZE_T Threshold,
+ IN gctSIZE_T BankSize,
+ OUT gckVIDMEM * Memory
+ )
+{
+ gckVIDMEM memory = gcvNULL;
+ gceSTATUS status;
+ gcuVIDMEM_NODE_PTR node;
+ gctINT i, banks = 0;
+ gctPOINTER pointer = gcvNULL;
+ gctUINT32 heapBytes;
+ gctUINT32 bankSize;
+ gctUINT32 base = 0;
+
+ gcmkHEADER_ARG("Os=0x%x PhysicalBase=%12llx Bytes=%lu Threshold=%lu "
+ "BankSize=%lu",
+ Os, PhysicalBase, Bytes, Threshold, BankSize);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Memory != gcvNULL);
+
+ gcmkSAFECASTSIZET(heapBytes, Bytes);
+ gcmkSAFECASTSIZET(bankSize, BankSize);
+
+ /* Allocate the gckVIDMEM object. */
+ gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(struct _gckVIDMEM), &pointer));
+ gckOS_ZeroMemory(pointer, gcmSIZEOF(struct _gckVIDMEM));
+
+ memory = pointer;
+
+ /* Initialize the gckVIDMEM object. */
+ memory->object.type = gcvOBJ_VIDMEM;
+ memory->os = Os;
+
+ /* Set video memory heap information. */
+ memory->physicalBase = PhysicalBase;
+ memory->bytes = heapBytes;
+ memory->freeBytes = heapBytes;
+ memory->minFreeBytes = heapBytes;
+ memory->capability = ~0u;
+ memory->threshold = Threshold;
+ memory->mutex = gcvNULL;
+
+ /* Walk all possible banks. */
+ for (i = 0; i < gcmCOUNTOF(memory->sentinel); ++i)
+ {
+ gctUINT32 bytes;
+
+ if (BankSize == 0)
+ {
+ /* Use all bytes for the first bank. */
+ bytes = heapBytes;
+ }
+ else
+ {
+ /* Compute number of bytes for this bank. */
+ bytes = gcmALIGN(base + 1, bankSize) - base;
+
+ if (bytes > heapBytes)
+ {
+ /* Make sure we don't exceed the total number of bytes. */
+ bytes = heapBytes;
+ }
+ }
+
+ if (bytes == 0)
+ {
+ /* Mark heap is not used. */
+ memory->sentinel[i].VidMem.next =
+ memory->sentinel[i].VidMem.prev =
+ memory->sentinel[i].VidMem.nextFree =
+ memory->sentinel[i].VidMem.prevFree = gcvNULL;
+ continue;
+ }
+
+ /* Allocate one gcuVIDMEM_NODE union. */
+ gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(gcuVIDMEM_NODE), &pointer));
+
+ node = pointer;
+
+ /* Initialize gcuVIDMEM_NODE union. */
+ node->VidMem.parent = memory;
+
+ node->VidMem.next =
+ node->VidMem.prev =
+ node->VidMem.nextFree =
+ node->VidMem.prevFree = &memory->sentinel[i];
+
+ node->VidMem.offset = base;
+ node->VidMem.bytes = bytes;
+ node->VidMem.alignment = 0;
+ node->VidMem.pool = gcvPOOL_UNKNOWN;
+
+ node->VidMem.locked = 0;
+
+ node->VidMem.processID = 0;
+ node->VidMem.logical = gcvNULL;
+
+#if gcdENABLE_VG
+ node->VidMem.kernelVirtual = gcvNULL;
+#endif
+ node->VidMem.kvaddr = gcvNULL;
+
+ /* Initialize the linked list of nodes. */
+ memory->sentinel[i].VidMem.next =
+ memory->sentinel[i].VidMem.prev =
+ memory->sentinel[i].VidMem.nextFree =
+ memory->sentinel[i].VidMem.prevFree = node;
+
+ /* Mark sentinel. */
+ memory->sentinel[i].VidMem.bytes = 0;
+
+ /* Adjust address for next bank. */
+ base += bytes;
+ heapBytes -= bytes;
+ banks ++;
+ }
+
+ /* Assign all the bank mappings. */
+ memory->mapping[gcvVIDMEM_TYPE_COLOR_BUFFER] = banks - 1;
+ memory->mapping[gcvVIDMEM_TYPE_BITMAP] = banks - 1;
+
+ if (banks > 1) --banks;
+ memory->mapping[gcvVIDMEM_TYPE_DEPTH_BUFFER] = banks - 1;
+ memory->mapping[gcvVIDMEM_TYPE_HZ_BUFFER] = banks - 1;
+
+ if (banks > 1) --banks;
+ memory->mapping[gcvVIDMEM_TYPE_TEXTURE] = banks - 1;
+
+ if (banks > 1) --banks;
+ memory->mapping[gcvVIDMEM_TYPE_VERTEX_BUFFER] = banks - 1;
+
+ if (banks > 1) --banks;
+ memory->mapping[gcvVIDMEM_TYPE_INDEX_BUFFER] = banks - 1;
+
+ if (banks > 1) --banks;
+ memory->mapping[gcvVIDMEM_TYPE_TILE_STATUS] = banks - 1;
+
+ if (banks > 1) --banks;
+ memory->mapping[gcvVIDMEM_TYPE_COMMAND] = banks - 1;
+
+ if (banks > 1) --banks;
+ memory->mapping[gcvVIDMEM_TYPE_GENERIC] = 0;
+
+#if gcdENABLE_VG
+ memory->mapping[gcvVIDMEM_TYPE_IMAGE] = 0;
+ memory->mapping[gcvVIDMEM_TYPE_MASK] = 0;
+ memory->mapping[gcvVIDMEM_TYPE_SCISSOR] = 0;
+#endif
+ memory->mapping[gcvVIDMEM_TYPE_ICACHE] = 0;
+ memory->mapping[gcvVIDMEM_TYPE_TXDESC] = 0;
+ memory->mapping[gcvVIDMEM_TYPE_FENCE] = 0;
+ memory->mapping[gcvVIDMEM_TYPE_TFBHEADER] = 0;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "[GALCORE] INDEX: bank %d",
+ memory->mapping[gcvVIDMEM_TYPE_INDEX_BUFFER]);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "[GALCORE] VERTEX: bank %d",
+ memory->mapping[gcvVIDMEM_TYPE_VERTEX_BUFFER]);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "[GALCORE] TEXTURE: bank %d",
+ memory->mapping[gcvVIDMEM_TYPE_TEXTURE]);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "[GALCORE] RENDER_TARGET: bank %d",
+ memory->mapping[gcvVIDMEM_TYPE_COLOR_BUFFER]);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "[GALCORE] DEPTH: bank %d",
+ memory->mapping[gcvVIDMEM_TYPE_DEPTH_BUFFER]);
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "[GALCORE] TILE_STATUS: bank %d",
+ memory->mapping[gcvVIDMEM_TYPE_TILE_STATUS]);
+
+ /* Allocate the mutex. */
+ gcmkONERROR(gckOS_CreateMutex(Os, &memory->mutex));
+
+ /* Return pointer to the gckVIDMEM object. */
+ *Memory = memory;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Memory=0x%x", *Memory);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (memory != gcvNULL)
+ {
+ if (memory->mutex != gcvNULL)
+ {
+ /* Delete the mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Os, memory->mutex));
+ }
+
+ for (i = 0; i < banks; ++i)
+ {
+ /* Free the heap. */
+ gcmkASSERT(memory->sentinel[i].VidMem.next != gcvNULL);
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Os, memory->sentinel[i].VidMem.next));
+ }
+
+ /* Free the object. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Os, memory));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVIDMEM_Destroy
+**
+** Destroy an gckVIDMEM object.
+**
+** INPUT:
+**
+** gckVIDMEM Memory
+** Pointer to an gckVIDMEM object to destroy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckVIDMEM_Destroy(
+ IN gckVIDMEM Memory
+ )
+{
+ gcuVIDMEM_NODE_PTR node, next;
+ gctINT i;
+
+ gcmkHEADER_ARG("Memory=0x%x", Memory);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Memory, gcvOBJ_VIDMEM);
+
+ /* Walk all sentinels. */
+ for (i = 0; i < gcmCOUNTOF(Memory->sentinel); ++i)
+ {
+ /* Bail out of the heap is not used. */
+ if (Memory->sentinel[i].VidMem.next == gcvNULL)
+ {
+ break;
+ }
+
+ /* Walk all the nodes until we reach the sentinel. */
+ for (node = Memory->sentinel[i].VidMem.next;
+ node->VidMem.bytes != 0;
+ node = next)
+ {
+ /* Save pointer to the next node. */
+ next = node->VidMem.next;
+
+ /* Free the node. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Memory->os, node));
+ }
+ }
+
+ /* Free the mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Memory->os, Memory->mutex));
+
+ /* Mark the object as unknown. */
+ Memory->object.type = gcvOBJ_UNKNOWN;
+
+ /* Free the gckVIDMEM object. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Memory->os, Memory));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+#if gcdENABLE_BANK_ALIGNMENT
+
+#if !gcdBANK_BIT_START
+#error gcdBANK_BIT_START not defined.
+#endif
+
+#if !gcdBANK_BIT_END
+#error gcdBANK_BIT_END not defined.
+#endif
+/*******************************************************************************
+** _GetSurfaceBankAlignment
+**
+** Return the required offset alignment required to the make BaseAddress
+** aligned properly.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to gcoOS object.
+**
+** gceVIDMEM_TYPE Type
+** Type of allocation.
+**
+** gctUINT32 BaseAddress
+** Base address of current video memory node.
+**
+** OUTPUT:
+**
+** gctUINT32_PTR AlignmentOffset
+** Pointer to a variable that will hold the number of bytes to skip in
+** the current video memory node in order to make the alignment bank
+** aligned.
+*/
+static gceSTATUS
+_GetSurfaceBankAlignment(
+ IN gckKERNEL Kernel,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 BaseAddress,
+ OUT gctUINT32_PTR AlignmentOffset
+ )
+{
+ gctUINT32 bank;
+ /* To retrieve the bank. */
+ static const gctUINT32 bankMask = (0xFFFFFFFF << gcdBANK_BIT_START)
+ ^ (0xFFFFFFFF << (gcdBANK_BIT_END + 1));
+
+ /* To retrieve the bank and all the lower bytes. */
+ static const gctUINT32 byteMask = ~(0xFFFFFFFF << (gcdBANK_BIT_END + 1));
+
+ gcmkHEADER_ARG("Type=%d BaseAddress=0x%x ", Type, BaseAddress);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(AlignmentOffset != gcvNULL);
+
+ switch (Type)
+ {
+ case gcvVIDMEM_TYPE_COLOR_BUFFER:
+ bank = (BaseAddress & bankMask) >> (gcdBANK_BIT_START);
+
+ /* Align to the first bank. */
+ *AlignmentOffset = (bank == 0) ?
+ 0 :
+ ((1 << (gcdBANK_BIT_END + 1)) + 0) - (BaseAddress & byteMask);
+ break;
+
+ case gcvVIDMEM_TYPE_DEPTH_BUFFER:
+ bank = (BaseAddress & bankMask) >> (gcdBANK_BIT_START);
+
+ /* Align to the third bank. */
+ *AlignmentOffset = (bank == 2) ?
+ 0 :
+ ((1 << (gcdBANK_BIT_END + 1)) + (2 << gcdBANK_BIT_START)) - (BaseAddress & byteMask);
+
+ /* Minimum 256 byte alignment needed for fast_msaa. */
+ if ((gcdBANK_CHANNEL_BIT > 7) ||
+ ((gckHARDWARE_IsFeatureAvailable(Kernel->hardware, gcvFEATURE_FAST_MSAA) != gcvSTATUS_TRUE) &&
+ (gckHARDWARE_IsFeatureAvailable(Kernel->hardware, gcvFEATURE_SMALL_MSAA) != gcvSTATUS_TRUE)))
+ {
+ /* Add a channel offset at the channel bit. */
+ *AlignmentOffset += (1 << gcdBANK_CHANNEL_BIT);
+ }
+ break;
+
+ default:
+ /* no alignment needed. */
+ *AlignmentOffset = 0;
+ }
+
+ /* Return the status. */
+ gcmkFOOTER_ARG("*AlignmentOffset=%u", *AlignmentOffset);
+ return gcvSTATUS_OK;
+}
+#endif
+
+static gcuVIDMEM_NODE_PTR
+_FindNode(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM Memory,
+ IN gctINT Bank,
+ IN gctSIZE_T Bytes,
+ IN gceVIDMEM_TYPE Type,
+ IN OUT gctUINT32_PTR Alignment
+ )
+{
+ gcuVIDMEM_NODE_PTR node;
+ gctUINT32 alignment;
+
+#if gcdENABLE_BANK_ALIGNMENT
+ gctUINT32 bankAlignment;
+ gceSTATUS status;
+#endif
+
+ if (Memory->sentinel[Bank].VidMem.nextFree == gcvNULL)
+ {
+ /* No free nodes left. */
+ return gcvNULL;
+ }
+
+#if gcdENABLE_BANK_ALIGNMENT
+ /* Walk all free nodes until we have one that is big enough or we have
+ ** reached the sentinel. */
+ for (node = Memory->sentinel[Bank].VidMem.nextFree;
+ node->VidMem.bytes != 0;
+ node = node->VidMem.nextFree)
+ {
+ if (node->VidMem.bytes < Bytes)
+ {
+ continue;
+ }
+
+ gcmkONERROR(_GetSurfaceBankAlignment(
+ Kernel,
+ Type,
+ (gctUINT32)(node->VidMem.parent->physicalBase + node->VidMem.offset),
+ &bankAlignment));
+
+ bankAlignment = gcmALIGN(bankAlignment, *Alignment);
+
+ /* Compute number of bytes to skip for alignment. */
+ alignment = (*Alignment == 0)
+ ? 0
+ : (*Alignment - (node->VidMem.offset % *Alignment));
+
+ if (alignment == *Alignment)
+ {
+ /* Node is already aligned. */
+ alignment = 0;
+ }
+
+ if (node->VidMem.bytes >= Bytes + alignment + bankAlignment)
+ {
+ /* This node is big enough. */
+ *Alignment = alignment + bankAlignment;
+ return node;
+ }
+ }
+#endif
+
+ /* Walk all free nodes until we have one that is big enough or we have
+ reached the sentinel. */
+ for (node = Memory->sentinel[Bank].VidMem.nextFree;
+ node->VidMem.bytes != 0;
+ node = node->VidMem.nextFree)
+ {
+ gctUINT offset;
+
+ gctINT modulo;
+
+ gcmkSAFECASTSIZET(offset, node->VidMem.offset);
+
+ modulo = gckMATH_ModuloInt(offset, *Alignment);
+
+ /* Compute number of bytes to skip for alignment. */
+ alignment = (*Alignment == 0) ? 0 : (*Alignment - modulo);
+
+ if (alignment == *Alignment)
+ {
+ /* Node is already aligned. */
+ alignment = 0;
+ }
+
+ if (node->VidMem.bytes >= Bytes + alignment)
+ {
+ /* This node is big enough. */
+ *Alignment = alignment;
+ return node;
+ }
+ }
+
+#if gcdENABLE_BANK_ALIGNMENT
+OnError:
+#endif
+ /* Not enough memory. */
+ return gcvNULL;
+}
+
+/*******************************************************************************
+**
+** gckVIDMEM_AllocateLinear
+**
+** Allocate linear memory from the gckVIDMEM object.
+**
+** INPUT:
+**
+** gckVIDMEM Memory
+** Pointer to an gckVIDMEM object.
+**
+** gctSIZE_T Bytes
+** Number of bytes to allocate.
+**
+** gctUINT32 Alignment
+** Byte alignment for allocation.
+**
+** gceVIDMEM_TYPE Type
+** Type of surface to allocate (use by bank optimization).
+**
+** gctUINT32 Flag
+** Flag of allocatetion.
+**
+** gctBOOL Specified
+** If user must use this pool, it should set Specified to gcvTRUE,
+** otherwise allocator may reserve some memory for other usage, such
+** as small block size allocation request.
+**
+** OUTPUT:
+**
+** gcuVIDMEM_NODE_PTR * Node
+** Pointer to a variable that will hold the allocated memory node.
+*/
+static gceSTATUS
+gckVIDMEM_AllocateLinear(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM Memory,
+ IN gctSIZE_T Bytes,
+ IN gctUINT32 Alignment,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN gctBOOL Specified,
+ OUT gcuVIDMEM_NODE_PTR * Node
+ )
+{
+ gceSTATUS status;
+ gcuVIDMEM_NODE_PTR node;
+ gctUINT32 alignment;
+ gctINT bank, i;
+ gctBOOL acquired = gcvFALSE;
+ gctUINT64 mappingInOne = 1;
+
+ gcmkHEADER_ARG("Memory=0x%x Bytes=%lu Alignment=%u Type=%d",
+ Memory, Bytes, Alignment, Type);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Memory, gcvOBJ_VIDMEM);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Node != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Type < gcvVIDMEM_TYPE_COUNT);
+
+ /* Acquire the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(Memory->os, Memory->mutex, gcvINFINITE));
+
+ acquired = gcvTRUE;
+#if defined(__QNXNTO__)
+ if (slogUsageInterval > 0) {
+ static gctSIZE_T lowwaterFPC = ~0;
+ static time_t last_slog_time;
+ int do_slog_now = 0;
+ time_t this_slog_time = time(NULL);
+
+ if (Memory->freeBytes < lowwaterFPC) {
+ do_slog_now = 1;
+ lowwaterFPC = Memory->freeBytes;
+ }
+
+ if (abs(this_slog_time - last_slog_time) > slogUsageInterval) {
+ do_slog_now = 1;
+ }
+
+ if (do_slog_now) {
+ last_slog_time = this_slog_time;
+ slogf(_SLOGC_GRAPHICS_GL, _SLOG_INFO, "%s: Memory->freeBytes = %u, lowest Memory->freeBytes = %u",
+ __FUNCTION__, (unsigned) Memory->freeBytes, (unsigned) lowwaterFPC);
+ }
+ }
+#endif
+ if (Bytes > Memory->freeBytes)
+ {
+ /* Not enough memory. */
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ goto OnError;
+ }
+
+#if gcdSMALL_BLOCK_SIZE
+ if ((Memory->freeBytes < (Memory->bytes/gcdRATIO_FOR_SMALL_MEMORY))
+ && (Bytes >= gcdSMALL_BLOCK_SIZE)
+ && (Specified == gcvFALSE)
+ )
+ {
+ /* The left memory is for small memory.*/
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ goto OnError;
+ }
+#endif
+
+ /* Find the default bank for this surface type. */
+ gcmkASSERT((gctINT) Type < gcmCOUNTOF(Memory->mapping));
+ bank = Memory->mapping[Type];
+ alignment = Alignment;
+
+ /* Find a free node in the default bank. */
+ node = _FindNode(Kernel, Memory, bank, Bytes, Type, &alignment);
+
+ /* Out of memory? */
+ if (node == gcvNULL)
+ {
+ /* Walk all lower banks. */
+ for (i = bank - 1; i >= 0; --i)
+ {
+ /* Find a free node inside the current bank. */
+ node = _FindNode(Kernel, Memory, i, Bytes, Type, &alignment);
+ if (node != gcvNULL)
+ {
+ break;
+ }
+ }
+ }
+
+ if (node == gcvNULL)
+ {
+ /* Walk all upper banks. */
+ for (i = bank + 1; i < gcmCOUNTOF(Memory->sentinel); ++i)
+ {
+ if (Memory->sentinel[i].VidMem.nextFree == gcvNULL)
+ {
+ /* Abort when we reach unused banks. */
+ break;
+ }
+
+ /* Find a free node inside the current bank. */
+ node = _FindNode(Kernel, Memory, i, Bytes, Type, &alignment);
+ if (node != gcvNULL)
+ {
+ break;
+ }
+ }
+ }
+
+ if (node == gcvNULL)
+ {
+ /* Out of memory. */
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ goto OnError;
+ }
+
+ /* Do we have an alignment? */
+ if (alignment > 0)
+ {
+ /* Split the node so it is aligned. */
+ if (_Split(Memory->os, node, alignment))
+ {
+ /* Successful split, move to aligned node. */
+ node = node->VidMem.next;
+
+ /* Remove alignment. */
+ alignment = 0;
+ }
+ }
+
+ /* Do we have enough memory after the allocation to split it? */
+ if (node->VidMem.bytes - Bytes > Memory->threshold)
+ {
+ /* Adjust the node size. */
+ _Split(Memory->os, node, Bytes);
+ }
+
+ /* Remove the node from the free list. */
+ node->VidMem.prevFree->VidMem.nextFree = node->VidMem.nextFree;
+ node->VidMem.nextFree->VidMem.prevFree = node->VidMem.prevFree;
+ node->VidMem.nextFree =
+ node->VidMem.prevFree = gcvNULL;
+
+ /* Fill in the information. */
+ node->VidMem.alignment = alignment;
+ node->VidMem.parent = Memory;
+ node->VidMem.logical = gcvNULL;
+ gcmkONERROR(gckOS_GetProcessID(&node->VidMem.processID));
+
+ /* Adjust the number of free bytes. */
+ Memory->freeBytes -= node->VidMem.bytes;
+
+ if (Memory->freeBytes < Memory->minFreeBytes)
+ {
+ Memory->minFreeBytes = Memory->freeBytes;
+ }
+
+#if gcdENABLE_VG
+ node->VidMem.kernelVirtual = gcvNULL;
+#endif
+ gckOS_QueryOption(Memory->os, "allMapInOne", &mappingInOne);
+ if (!mappingInOne)
+ {
+ gcmkONERROR(gckOS_RequestReservedMemory(
+ Memory->os,
+ Memory->physicalBase + node->VidMem.offset,
+ node->VidMem.bytes,
+ "gal reserved memory",
+ gcvTRUE,
+ &node->VidMem.physical
+ ));
+ }
+
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Memory->os, Memory->mutex));
+
+ /* Return the pointer to the node. */
+ *Node = node;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "Allocated %u bytes @ 0x%x [0x%08X]",
+ node->VidMem.bytes, node, node->VidMem.offset);
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Node=0x%x", *Node);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Memory->os, Memory->mutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVIDMEM_AllocateVirtual
+**
+** Construct a new gcuVIDMEM_NODE union for virtual memory.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctSIZE_T Bytes
+** Number of byte to allocate.
+**
+** OUTPUT:
+**
+** gcuVIDMEM_NODE_PTR * Node
+** Pointer to a variable that receives the gcuVIDMEM_NODE union pointer.
+*/
+static gceSTATUS
+gckVIDMEM_AllocateVirtual(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Flag,
+ IN gctSIZE_T Bytes,
+ OUT gcuVIDMEM_NODE_PTR * Node
+ )
+{
+ gckOS os;
+ gceSTATUS status;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+ gctPOINTER pointer = gcvNULL;
+ gctINT i;
+
+ gcmkHEADER_ARG("Kernel=0x%x Flag=%x Bytes=%lu", Kernel, Flag, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Node != gcvNULL);
+
+ /* 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));
+
+ node = pointer;
+
+ /* Initialize gcuVIDMEM_NODE union for virtual memory. */
+ node->Virtual.kernel = Kernel;
+ node->Virtual.contiguous = Flag & gcvALLOC_FLAG_CONTIGUOUS;
+ node->Virtual.logical = gcvNULL;
+ node->Virtual.kvaddr = gcvNULL;
+ node->Virtual.bytes = Bytes;
+#if gcdENABLE_VG
+ node->Virtual.kernelVirtual = gcvNULL;
+#endif
+ node->Virtual.secure = (Flag & gcvALLOC_FLAG_SECURITY) != 0;
+ node->Virtual.onFault = (Flag & gcvALLOC_FLAG_ALLOC_ON_FAULT) != 0;
+
+ for (i = 0; i < gcvHARDWARE_NUM_TYPES; i++)
+ {
+ node->Virtual.lockeds[i] = 0;
+ node->Virtual.pageTables[i] = gcvNULL;
+ }
+
+ /* Allocate the virtual memory. */
+ gcmkONERROR(
+ gckOS_AllocatePagedMemory(os,
+ Flag,
+ &node->Virtual.bytes,
+ &node->Virtual.gid,
+ &node->Virtual.physical));
+
+ /* Calculate required GPU page (4096) count. */
+ /* Assume start address is 4096 aligned. */
+ node->Virtual.pageCount = (gctSIZE_T)(((gctUINT64)node->Virtual.bytes + (4096 - 1)) >> 12);
+
+ /* Return pointer to the gcuVIDMEM_NODE union. */
+ *Node = node;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "Created virtual node 0x%x for %u bytes @ 0x%x",
+ node, Bytes, node->Virtual.physical);
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Node=0x%x", *Node);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Roll back. */
+ if (node != gcvNULL)
+ {
+ /* Free the structure. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, node));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_AddToBlockList(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_BLOCK VidMemBlock
+ )
+{
+ VidMemBlock->next = Kernel->vidMemBlock;
+ Kernel->vidMemBlock = VidMemBlock;
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_RemoveFromBlockList(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_BLOCK VidMemBlock
+ )
+{
+ gckVIDMEM_BLOCK vidMemBlock;
+ gckVIDMEM_BLOCK previous = gcvNULL;
+ gceHARDWARE_TYPE hwType;
+
+ gcmkVERIFY_OK(
+ gckKERNEL_GetHardwareType(Kernel,
+ &hwType));
+
+ for (vidMemBlock = Kernel->vidMemBlock; vidMemBlock != gcvNULL; vidMemBlock = vidMemBlock->next)
+ {
+ if (vidMemBlock->addresses[hwType] == VidMemBlock->addresses[hwType])
+ {
+ if (previous)
+ {
+ previous->next = vidMemBlock->next;
+ }
+ else
+ {
+ Kernel->vidMemBlock = vidMemBlock->next;
+ }
+ vidMemBlock->next = gcvNULL;
+
+ break;
+ }
+ previous = vidMemBlock;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static gckVIDMEM_BLOCK
+_FindFreeBlock(
+ IN gckKERNEL Kernel,
+ IN gctBOOL Contiguous,
+ IN gctSIZE_T Bytes
+ )
+{
+ gckVIDMEM_BLOCK vidMemBlock;
+
+ for (vidMemBlock = Kernel->vidMemBlock; vidMemBlock != gcvNULL; vidMemBlock = vidMemBlock->next)
+ {
+ if ((vidMemBlock->freeBytes >= Bytes) && (Contiguous == vidMemBlock->contiguous))
+ {
+ /* Found the block */
+ break;
+ }
+ }
+
+ return vidMemBlock;
+}
+
+static gceSTATUS
+_SplitVirtualChunk(
+ IN gckOS Os,
+ IN gcuVIDMEM_NODE_PTR Node,
+ IN gctSIZE_T Bytes
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+ gctPOINTER pointer;
+ gctINT i;
+
+ if ((Bytes <= 0) || (Bytes > Node->VirtualChunk.bytes))
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ /* Allocate a new gcuVIDMEM_NODE object. */
+ gcmkONERROR(gckOS_Allocate(Os,
+ gcmSIZEOF(gcuVIDMEM_NODE),
+ &pointer));
+
+ node = pointer;
+
+ /* Intialize the new gcuVIDMEM_NODE. */
+ node->VirtualChunk.offset = Node->VirtualChunk.offset + Bytes;
+ node->VirtualChunk.bytes = Node->VirtualChunk.bytes - Bytes;
+ node->VirtualChunk.parent = Node->VirtualChunk.parent;
+ node->VirtualChunk.kernel = Node->VirtualChunk.kernel;
+ node->VirtualChunk.kvaddr = gcvNULL;
+
+ for (i = 0; i < gcvHARDWARE_NUM_TYPES; i++)
+ {
+ node->VirtualChunk.lockeds[i] = 0;
+ }
+
+ /* Insert chunk behind specified chunk. */
+ node->VirtualChunk.next = Node->VirtualChunk.next;
+ node->VirtualChunk.prev = Node;
+ Node->VirtualChunk.next = node->VirtualChunk.next->VirtualChunk.prev = node;
+
+ /* Insert free chunk behind specified chunk. */
+ node->VirtualChunk.nextFree = Node->VirtualChunk.nextFree;
+ node->VirtualChunk.prevFree = Node;
+ Node->VirtualChunk.nextFree = node->VirtualChunk.nextFree->VirtualChunk.prevFree = node;
+
+ /* Adjust size of specified chunk. */
+ Node->VirtualChunk.bytes = Bytes;
+
+OnError:
+ return status;
+}
+
+static gceSTATUS
+_MergeVirtualChunk(
+ IN gckOS Os,
+ IN gcuVIDMEM_NODE_PTR Node
+ )
+{
+ gcuVIDMEM_NODE_PTR node;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ node = Node->VirtualChunk.next;
+
+ if (Node->VirtualChunk.offset + Node->VirtualChunk.bytes != node->VirtualChunk.offset)
+ {
+ /* Corrupted heap. */
+ gcmkASSERT(
+ Node->VirtualChunk.offset + Node->VirtualChunk.bytes == node->VirtualChunk.offset);
+
+ return gcvSTATUS_HEAP_CORRUPTED;
+ }
+
+ /* Merge. */
+ Node->VirtualChunk.bytes += node->VirtualChunk.bytes;
+
+ /* Unlink next node from linked list. */
+ Node->VirtualChunk.next = node->VirtualChunk.next;
+ Node->VirtualChunk.nextFree = node->VirtualChunk.nextFree;
+
+ Node->VirtualChunk.next->VirtualChunk.prev =
+ Node->VirtualChunk.nextFree->VirtualChunk.prevFree = Node;
+
+ /* Free the next node. */
+ status = gcmkOS_SAFE_FREE(Os, node);
+ return status;
+}
+
+static gctBOOL
+_IsVidMemBlockFree(
+ IN gckVIDMEM_BLOCK VidMemBlock
+ )
+{
+ return (VidMemBlock->freeBytes == VidMemBlock->bytes);
+}
+
+static gcuVIDMEM_NODE_PTR
+_FindVirtualChunkNode(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_BLOCK VidMemBlock,
+ IN gctSIZE_T Bytes
+ )
+{
+ gcuVIDMEM_NODE_PTR node;
+
+ if (VidMemBlock->node.VirtualChunk.nextFree == gcvNULL)
+ {
+ /* No free chunk left. */
+ return gcvNULL;
+ }
+
+ for (node = VidMemBlock->node.VirtualChunk.nextFree;
+ node->VirtualChunk.bytes != 0;
+ node = node->VirtualChunk.nextFree)
+ {
+ if (node->VirtualChunk.bytes >= Bytes)
+ {
+ /* Got it. */
+ return node;
+ }
+ }
+
+ return gcvNULL;
+}
+
+/*******************************************************************************
+**
+** _ConvertPhysical
+**
+** Convert CPU physical to GPU address for video node.
+**
+** INPUT:
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gcuVIDMEM_NODE_PTR Node
+** Pointer to a gcuVIDMEM_NODE union.
+**
+** gceCORE Core
+** Id of current GPU.
+**
+** gctPHYS_ADDR_T PhysicalAddress
+** CPU physical address
+**
+** OUTPUT:
+** gctUINT32 * Address
+** A pointer hold the GPU address.
+*/
+static gceSTATUS
+_ConvertPhysical(
+ IN gckKERNEL Kernel,
+ IN gceCORE Core,
+ IN gcuVIDMEM_NODE_PTR Node,
+ IN gckVIDMEM_BLOCK VidMemBlock,
+ IN gctPHYS_ADDR_T PhysicalAddress,
+ OUT gctUINT32 * Address
+ )
+{
+ gceSTATUS status;
+ gctUINT64 physical = 0;
+
+ gcmkHEADER_ARG("Node=0x%X", Node);
+
+ if ((Node && !Node->Virtual.contiguous) ||
+ (VidMemBlock && !VidMemBlock->contiguous))
+ {
+ /* non-contiguous, mapping is required. */
+ status = gcvSTATUS_NOT_SUPPORTED;
+ goto OnError;
+ }
+
+ if ((Node && Node->Virtual.secure) ||
+ (VidMemBlock && VidMemBlock->secure))
+ {
+ /* Secure, mapping is forced. */
+ status = gcvSTATUS_NOT_SUPPORTED;
+ goto OnError;
+ }
+
+ /* Convert to GPU physical address. */
+ gckOS_CPUPhysicalToGPUPhysical(Kernel->os, PhysicalAddress, &physical);
+
+#if gcdENABLE_VG
+ if (Core == gcvCORE_VG)
+ {
+ /* VG MMU can always support contiguous. */
+ *Address = (gctUINT32)physical;
+ gcmkFOOTER_ARG("*Address=0x%X", *Address);
+ return gcvSTATUS_OK;
+ }
+#endif
+
+ if ((physical > gcvMAXUINT32) ||
+ (Node && (physical + Node->Virtual.bytes - 1 > gcvMAXUINT32)) ||
+ (VidMemBlock && (physical + VidMemBlock->bytes - 1 > gcvMAXUINT32)))
+ {
+ /* Above 4G (32bit), mapping is required currently. */
+ status = gcvSTATUS_NOT_SUPPORTED;
+ goto OnError;
+ }
+
+ if (!gckHARDWARE_IsFeatureAvailable(Kernel->hardware, gcvFEATURE_MMU))
+ {
+ if (physical < Kernel->hardware->baseAddress)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ /* Subtract baseAddress to get a GPU address used for programming. */
+ physical -= Kernel->hardware->baseAddress;
+
+ /* 2G upper is virtual space, better to move to gckHARDWARE section. */
+ if (physical + Node->Virtual.bytes > 0x80000000)
+ {
+ /* End is above 2G, ie virtual space. */
+ status = gcvSTATUS_NOT_SUPPORTED;
+ goto OnError;
+ }
+
+ *Address = (gctUINT32)physical;
+
+ gcmkFOOTER_ARG("*Address=0x%X", *Address);
+ return gcvSTATUS_OK;
+ }
+ else
+ {
+ gctBOOL flatMapped;
+
+ gcmkONERROR(gckMMU_IsFlatMapped(Kernel->mmu, physical, gcvINVALID_ADDRESS, &flatMapped));
+
+ if (!flatMapped)
+ {
+ status = gcvSTATUS_NOT_SUPPORTED;
+ goto OnError;
+ }
+
+ *Address = (gctUINT32)physical;
+
+ gcmkFOOTER_ARG("*Address=0x%X", *Address);
+ return gcvSTATUS_OK;
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+gckVIDMEM_MapVidMemBlock(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_BLOCK VidMemBlock
+ )
+{
+ gceSTATUS status;
+ gckOS os = Kernel->os;
+ gctPHYS_ADDR_T physAddr;
+ gceHARDWARE_TYPE hwType;
+
+ gcmkHEADER_ARG("Kernel=%p VidMemBlock=%p", Kernel, VidMemBlock);
+
+ gcmkVERIFY_OK(
+ gckKERNEL_GetHardwareType(Kernel,
+ &hwType));
+
+ gcmkVERIFY_ARGUMENT(VidMemBlock != gcvNULL);
+ gcmkASSERT(VidMemBlock->pageCount > 0);
+
+ gcmkONERROR(
+ gckOS_GetPhysicalFromHandle(os,
+ VidMemBlock->physical,
+ 0,
+ &physAddr));
+
+ status = _ConvertPhysical(Kernel,
+ Kernel->core,
+ gcvNULL,
+ VidMemBlock,
+ physAddr,
+ &VidMemBlock->addresses[hwType]);
+ if (gcmIS_ERROR(status))
+ {
+ /* Allocate pages inside the MMU. */
+ gcmkONERROR(
+ gckMMU_AllocatePagesEx(Kernel->mmu,
+ VidMemBlock->pageCount,
+ VidMemBlock->type,
+ gcvPAGE_TYPE_1M,
+ VidMemBlock->secure,
+ &VidMemBlock->pageTables[hwType],
+ &VidMemBlock->addresses[hwType]));
+
+ if (VidMemBlock->onFault != gcvTRUE)
+ {
+ /* Map the pages. */
+ gcmkONERROR(
+ gckOS_Map1MPages(os,
+ Kernel->core,
+ VidMemBlock->physical,
+ VidMemBlock->pageCount,
+ VidMemBlock->addresses[hwType],
+ VidMemBlock->pageTables[hwType],
+ gcvTRUE,
+ VidMemBlock->type));
+ }
+
+ gcmkONERROR(gckMMU_Flush(Kernel->mmu, VidMemBlock->type));
+
+ /* Calculate the GPU virtual address. */
+ VidMemBlock->addresses[hwType] |= (gctUINT32) (physAddr & ((1 << 20) - 1));
+ }
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "Mapped video memory block 0x%x to 0x%08X",
+ VidMemBlock,
+ VidMemBlock->addresses[hwType]);
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (VidMemBlock->pageTables[hwType] != gcvNULL)
+ {
+ /* Free the pages from the MMU. */
+ gcmkVERIFY_OK(
+ gckMMU_FreePages(Kernel->mmu,
+ VidMemBlock->secure,
+ gcvPAGE_TYPE_1M,
+ VidMemBlock->addresses[hwType],
+ VidMemBlock->pageTables[hwType],
+ VidMemBlock->pageCount));
+
+ VidMemBlock->pageTables[hwType] = gcvNULL;
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_UnmapVidMemBlock(
+ IN gckMMU Mmu,
+ IN gceHARDWARE_TYPE HwType,
+ IN gckVIDMEM_BLOCK VidMemBlock
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Mmu=%p VidMemBlock=%p", Mmu, VidMemBlock);
+
+ gcmkVERIFY_ARGUMENT(VidMemBlock != gcvNULL);
+
+ if (VidMemBlock->pageTables[HwType] != gcvNULL)
+ {
+ /* Free the pages from the MMU. */
+ gcmkONERROR(
+ gckMMU_FreePages(Mmu,
+ VidMemBlock->secure,
+ gcvPAGE_TYPE_1M,
+ VidMemBlock->addresses[HwType],
+ VidMemBlock->pageTables[HwType],
+ VidMemBlock->pageCount));
+
+ VidMemBlock->pageTables[HwType] = gcvNULL;
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+gckVIDMEM_BLOCK_Construct(
+ IN gckKERNEL Kernel,
+ IN gctSIZE_T BlockSize,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ OUT gckVIDMEM_BLOCK * VidMemBlock
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_BLOCK vidMemBlock = gcvNULL;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+ gckOS os = Kernel->os;
+ gctPOINTER pointer;
+ gctINT i;
+
+ gcmkHEADER_ARG("Kernel=0x%x BlockSize=%lu Type=%x Flag=%x", Kernel, BlockSize, Type);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(BlockSize > 0);
+ gcmkVERIFY_ARGUMENT(VidMemBlock != gcvNULL);
+
+ /* Allocate an gckVIDMEM_BLOCK object. */
+ gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(gcsVIDMEM_BLOCK), &pointer));
+
+ vidMemBlock = pointer;
+
+ /* Initialize the gckVIDMEM_BLOCK object. */
+ vidMemBlock->object.type = gcvOBJ_VIDMEM_BLOCK;
+ vidMemBlock->os = os;
+ vidMemBlock->bytes = BlockSize;
+ vidMemBlock->freeBytes = BlockSize;
+ /* 1M page count. */
+ vidMemBlock->pageCount = (gctUINT32)(BlockSize >> 20);
+ vidMemBlock->type = Type;
+ vidMemBlock->contiguous = Flag & gcvALLOC_FLAG_CONTIGUOUS;
+ vidMemBlock->secure = (Flag & gcvALLOC_FLAG_SECURITY) != 0;
+ vidMemBlock->onFault = (Flag & gcvALLOC_FLAG_ALLOC_ON_FAULT) != 0;
+ vidMemBlock->mutex = gcvNULL;
+ vidMemBlock->physical = gcvNULL;
+
+ for (i = 0; i < gcvHARDWARE_NUM_TYPES; i++)
+ {
+ vidMemBlock->pageTables[i] = gcvNULL;
+ }
+
+ /* Allocate the mutex. */
+ gcmkONERROR(gckOS_CreateMutex(os, &vidMemBlock->mutex));
+
+ /* Allocate one gcuVIDMEM_NODE union. */
+ gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(gcuVIDMEM_NODE), &pointer));
+
+ node = pointer;
+
+ if (!vidMemBlock->contiguous)
+ {
+ Flag |= gcvALLOC_FLAG_1M_PAGES;
+ }
+
+ /* Alloc 1M page size aligned memory block. */
+ gcmkONERROR(
+ gckOS_AllocatePagedMemory(os,
+ Flag,
+ &BlockSize,
+ &vidMemBlock->gid,
+ &vidMemBlock->physical));
+
+ /* Map current hardware mmu table with 1M pages for this video memory block. */
+ gcmkONERROR(gckVIDMEM_MapVidMemBlock(Kernel, vidMemBlock));
+
+ /* Initialize gcuVIDMEM_NODE union for virtual memory. */
+ node->VirtualChunk.kernel = Kernel;
+ node->VirtualChunk.offset = 0;
+ node->VirtualChunk.bytes = BlockSize;
+ node->VirtualChunk.kvaddr = gcvNULL;
+ node->VirtualChunk.logical = gcvNULL;
+ node->VirtualChunk.parent = vidMemBlock;
+
+ for (i = 0; i < gcvHARDWARE_NUM_TYPES; i++)
+ {
+ node->VirtualChunk.lockeds[i] = 0;
+ }
+
+ /* Initialize the virtual chunk linked-list. */
+ node->VirtualChunk.next =
+ node->VirtualChunk.prev =
+ node->VirtualChunk.nextFree =
+ node->VirtualChunk.prevFree = &vidMemBlock->node;
+
+ vidMemBlock->node.VirtualChunk.next =
+ vidMemBlock->node.VirtualChunk.prev =
+ vidMemBlock->node.VirtualChunk.nextFree =
+ vidMemBlock->node.VirtualChunk.prevFree = node;
+
+ vidMemBlock->node.VirtualChunk.bytes = 0;
+
+ *VidMemBlock = vidMemBlock;
+
+ gcmkFOOTER_ARG("*VidMemBlock=0x%x", *VidMemBlock);
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (vidMemBlock != gcvNULL)
+ {
+ if (vidMemBlock->mutex)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(os, vidMemBlock->mutex));
+ }
+
+ if (vidMemBlock->physical)
+ {
+ gcmkVERIFY_OK(gckOS_FreePagedMemory(os,
+ vidMemBlock->physical,
+ vidMemBlock->bytes));
+ }
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, vidMemBlock));
+ }
+
+ if (node != gcvNULL)
+ {
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, node));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+gckVIDMEM_BLOCK_Destroy(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_BLOCK VidMemBlock
+ )
+{
+ gckDEVICE device = Kernel->device;
+ gctINT i;
+
+ gcmkHEADER_ARG("Kernel=%p VidMemBlock=%p", Kernel, VidMemBlock);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(Kernel != gcvNULL);
+ gcmkVERIFY_ARGUMENT(VidMemBlock != gcvNULL);
+
+ if (VidMemBlock->physical)
+ {
+ gcmkVERIFY_OK(gckOS_FreePagedMemory(Kernel->os,
+ VidMemBlock->physical,
+ VidMemBlock->bytes));
+ }
+
+ for (i = 0; i < gcvHARDWARE_NUM_TYPES; i++)
+ {
+ if (VidMemBlock->pageTables[i])
+ {
+ gcmkVERIFY_OK(_UnmapVidMemBlock(device->mmus[i], i, VidMemBlock));
+ }
+ }
+
+ /* Free the mutex. */
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, VidMemBlock->mutex));
+
+ /* Free the virtual chunk. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, VidMemBlock->node.VirtualChunk.next));
+
+ /* Free the video memory block. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, VidMemBlock));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_AllocateVirtualChunk(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_BLOCK VidMemBlock,
+ IN gceVIDMEM_TYPE Type,
+ INOUT gctSIZE_T *Bytes,
+ OUT gcuVIDMEM_NODE_PTR *Node
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctBOOL acquired = gcvFALSE;
+ gcuVIDMEM_NODE_PTR node;
+ gctSIZE_T bytes;
+
+ gcmkHEADER_ARG("Kernel=%p VidMemBlock=%p Type=%x Bytes=%zx",
+ Kernel, VidMemBlock, Type, *Bytes);
+
+ gcmkVERIFY_ARGUMENT(Node != gcvNULL);
+ gcmkVERIFY_ARGUMENT(VidMemBlock != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Type < gcvVIDMEM_TYPE_COUNT);
+
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, VidMemBlock->mutex, gcvINFINITE));
+
+ acquired = gcvTRUE;
+
+ bytes = gcmALIGN(*Bytes, 4096);
+
+ if (bytes > VidMemBlock->freeBytes)
+ {
+ /* No enough memory. */
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ goto OnError;
+ }
+
+ node = _FindVirtualChunkNode(Kernel, VidMemBlock, bytes);
+ if (node == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ if (node->VirtualChunk.bytes > bytes)
+ {
+ /* Split the chunk. */
+ _SplitVirtualChunk(Kernel->os, node, bytes);
+ }
+
+ /* Remove the chunk from the free list. */
+ node->VirtualChunk.prevFree->VirtualChunk.nextFree = node->VirtualChunk.nextFree;
+ node->VirtualChunk.nextFree->VirtualChunk.prevFree = node->VirtualChunk.prevFree;
+ node->VirtualChunk.nextFree = node->VirtualChunk.prevFree = gcvNULL;
+
+ /* Fill in the information. */
+ node->VirtualChunk.parent = VidMemBlock;
+
+ VidMemBlock->freeBytes -= node->VirtualChunk.bytes;
+
+ *Bytes = bytes;
+ *Node = node;
+
+OnError:
+ if (acquired)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, VidMemBlock->mutex));
+ }
+
+ return status;
+}
+
+static gceSTATUS
+gckVIDMEM_AllocateVirtualChunk(
+ IN gckKERNEL Kernel,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN gctSIZE_T Bytes,
+ OUT gcuVIDMEM_NODE_PTR * Node
+ )
+{
+ gckOS os;
+ gceSTATUS status;
+ gcuVIDMEM_NODE_PTR node;
+ gckVIDMEM_BLOCK vidMemBlock = gcvNULL;
+ gctSIZE_T blockSize;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Kernel=0x%x Flag=%x Bytes=%lu", Kernel, Flag, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Node != gcvNULL);
+
+ /* Extract the gckOS object pointer. */
+ os = Kernel->os;
+ gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
+
+ /* Acquire the vidMem block mutex */
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, Kernel->vidMemBlockMutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Find the free vidmem block. */
+ vidMemBlock = _FindFreeBlock(Kernel, Bytes, Flag & gcvALLOC_FLAG_CONTIGUOUS);
+ if (!vidMemBlock)
+ {
+ /* Not found, construct new block. */
+ blockSize = gcmALIGN(Bytes, gcd1M_PAGE_SIZE);
+
+ gcmkONERROR(
+ gckVIDMEM_BLOCK_Construct(Kernel,
+ blockSize,
+ Type,
+ Flag,
+ &vidMemBlock));
+
+ gcmkONERROR(_AddToBlockList(Kernel, vidMemBlock));
+ }
+
+ /* Allocate virtual chunk node in the found block. */
+ gcmkONERROR(
+ _AllocateVirtualChunk(Kernel,
+ vidMemBlock,
+ Type,
+ &Bytes,
+ &node));
+
+ /* Return pointer to the gcuVIDMEM_NODE union. */
+ *Node = node;
+
+ /* Release the vidMem block mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidMemBlockMutex));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "Created virtual node 0x%x for %u bytes @ 0x%x",
+ node, Bytes, node->Virtual.physical);
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Node=0x%x", *Node);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Release the vidMem block mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, Kernel->vidMemBlockMutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVIDMEM_Free
+**
+** Free an allocated video memory node.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gcuVIDMEM_NODE_PTR Node
+** Pointer to a gcuVIDMEM_NODE object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+static gceSTATUS
+gckVIDMEM_Free(
+ IN gckKERNEL Kernel,
+ IN gcuVIDMEM_NODE_PTR Node
+ )
+{
+ gceSTATUS status;
+ gckKERNEL kernel = gcvNULL;
+ gckVIDMEM memory = gcvNULL;
+ gckVIDMEM_BLOCK vidMemBlock = gcvNULL;
+ gcuVIDMEM_NODE_PTR node;
+ gctBOOL mutexAcquired = gcvFALSE;
+ gctBOOL vbMutexAcquired = gcvFALSE;
+ gctBOOL vbListMutexAcquired = gcvFALSE;
+ gctUINT64 mappingInOne = 1;
+
+ gcmkHEADER_ARG("Node=0x%x", Node);
+
+ /* Verify the arguments. */
+ if ((Node == gcvNULL)
+ || (Node->VidMem.parent == gcvNULL)
+ )
+ {
+ /* Invalid object. */
+ gcmkONERROR(gcvSTATUS_INVALID_OBJECT);
+ }
+
+ vidMemBlock = Node->VirtualChunk.parent;
+
+ /**************************** Video Memory ********************************/
+
+ if (Node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ /* Extract pointer to gckVIDMEM object owning the node. */
+ memory = Node->VidMem.parent;
+
+ /* Acquire the mutex. */
+ gcmkONERROR(
+ gckOS_AcquireMutex(memory->os, memory->mutex, gcvINFINITE));
+
+ mutexAcquired = gcvTRUE;
+
+ if (Node->VidMem.kvaddr)
+ {
+ gcmkONERROR(
+ gckOS_DestroyKernelMapping(Kernel->os,
+ Node->VidMem.parent->physical,
+ Node->VidMem.kvaddr));
+
+ Node->VidMem.kvaddr = gcvNULL;
+ }
+
+#ifdef __QNXNTO__
+ /* Unmap the video memory. */
+ if (Node->VidMem.logical != gcvNULL)
+ {
+ gckKERNEL_UnmapVideoMemory(
+ Kernel,
+ Node->VidMem.pool,
+ Node->VidMem.physical,
+ Node->VidMem.logical,
+ Node->VidMem.processID,
+ Node->VidMem.bytes
+ );
+
+ Node->VidMem.logical = gcvNULL;
+ }
+
+ /* Reset. */
+ Node->VidMem.processID = 0;
+
+ /* Don't try to re-free an already freed node. */
+ if ((Node->VidMem.nextFree == gcvNULL)
+ && (Node->VidMem.prevFree == gcvNULL)
+ )
+#endif
+ {
+#if gcdENABLE_VG
+ if (Node->VidMem.kernelVirtual)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "%s(%d) Unmap %x from kernel space.",
+ __FUNCTION__, __LINE__,
+ Node->VidMem.kernelVirtual);
+
+ gcmkVERIFY_OK(
+ gckOS_UnmapPhysical(memory->os,
+ Node->VidMem.kernelVirtual,
+ Node->VidMem.bytes));
+
+ Node->VidMem.kernelVirtual = gcvNULL;
+ }
+#endif
+
+ /* Check if Node is already freed. */
+ if (Node->VidMem.nextFree)
+ {
+ /* Node is alread freed. */
+ gcmkONERROR(gcvSTATUS_INVALID_DATA);
+ }
+
+ /* Update the number of free bytes. */
+ memory->freeBytes += Node->VidMem.bytes;
+
+ /* Find the next free node. */
+ for (node = Node->VidMem.next;
+ node != gcvNULL && node->VidMem.nextFree == gcvNULL;
+ node = node->VidMem.next) ;
+
+ if (node == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_DATA);
+ }
+
+ /* Insert this node in the free list. */
+ Node->VidMem.nextFree = node;
+ Node->VidMem.prevFree = node->VidMem.prevFree;
+
+ Node->VidMem.prevFree->VidMem.nextFree =
+ node->VidMem.prevFree = Node;
+
+ /* Is the next node a free node and not the sentinel? */
+ if ((Node->VidMem.next == Node->VidMem.nextFree)
+ && (Node->VidMem.next->VidMem.bytes != 0)
+ )
+ {
+ /* Merge this node with the next node. */
+ gcmkONERROR(_Merge(memory->os, node = Node));
+ gcmkASSERT(node->VidMem.nextFree != node);
+ gcmkASSERT(node->VidMem.prevFree != node);
+ }
+
+ /* Is the previous node a free node and not the sentinel? */
+ if ((Node->VidMem.prev == Node->VidMem.prevFree)
+ && (Node->VidMem.prev->VidMem.bytes != 0)
+ )
+ {
+ /* Merge this node with the previous node. */
+ gcmkONERROR(_Merge(memory->os, node = Node->VidMem.prev));
+ gcmkASSERT(node->VidMem.nextFree != node);
+ gcmkASSERT(node->VidMem.prevFree != node);
+ }
+ }
+
+ gckOS_QueryOption(memory->os, "allMapInOne", &mappingInOne);
+ if (!mappingInOne)
+ {
+ gckOS_ReleaseReservedMemory(memory->os, Node->VidMem.physical);
+ Node->VidMem.physical = gcvNULL;
+ }
+
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(memory->os, memory->mutex));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "Node 0x%x is freed.",
+ Node);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ gckOS os = vidMemBlock->os;
+
+ gcmkONERROR(gckOS_AcquireMutex(os, vidMemBlock->mutex, gcvINFINITE));
+ vbMutexAcquired = gcvTRUE;
+ kernel = Node->VirtualChunk.kernel;
+
+ if (Node->VirtualChunk.kvaddr)
+ {
+ gcmkONERROR(
+ gckOS_DestroyKernelMapping(kernel->os,
+ vidMemBlock->physical,
+ Node->VirtualChunk.kvaddr));
+
+ Node->VirtualChunk.kvaddr = gcvNULL;
+ }
+
+ /* Handle the free chunk in the linked-list */
+ {
+ /* Check if chunk is in free list. */
+ if (Node->VirtualChunk.nextFree)
+ {
+ /* Chunk is already freed. */
+ gcmkONERROR(gcvSTATUS_INVALID_DATA);
+ }
+
+ vidMemBlock->freeBytes += Node->VirtualChunk.bytes;
+
+ /* Find the next free chunk. */
+ for (node = Node->VirtualChunk.next;
+ node != gcvNULL && node->VirtualChunk.nextFree == gcvNULL;
+ node = node->VirtualChunk.next);
+
+ if (node == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_DATA);
+ }
+
+ /* Insert this chunk in the free list. */
+ Node->VirtualChunk.nextFree = node;
+ Node->VirtualChunk.prevFree = node->VirtualChunk.prevFree;
+
+ Node->VirtualChunk.prevFree->VirtualChunk.nextFree =
+ node->VirtualChunk.prevFree = Node;
+
+ /* Is the next chunk a free chunk. */
+ if ((Node->VirtualChunk.next == Node->VirtualChunk.nextFree)
+ && (Node->VirtualChunk.next->VirtualChunk.bytes != 0)
+ )
+ {
+ /* Merge this chunk with the next chunk. */
+ gcmkONERROR(_MergeVirtualChunk(os, node = Node));
+ gcmkASSERT(node->VirtualChunk.nextFree != node);
+ gcmkASSERT(node->VirtualChunk.prevFree != node);
+ }
+
+ /* Is the previous chunk a free chunk. */
+ if ((Node->VirtualChunk.prev == Node->VirtualChunk.prevFree)
+ && (Node->VirtualChunk.prev->VirtualChunk.bytes != 0)
+ )
+ {
+ /* Merge this chunk with the previous chunk. */
+ gcmkONERROR(_MergeVirtualChunk(os, node = Node->VirtualChunk.prev));
+ gcmkASSERT(node->VirtualChunk.nextFree != node);
+ gcmkASSERT(node->VirtualChunk.prevFree != node);
+ }
+ }
+
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, vidMemBlock->mutex));
+
+ /* Acquire the vidMem block mutex */
+ gcmkONERROR(gckOS_AcquireMutex(os, kernel->vidMemBlockMutex, gcvINFINITE));
+ vbListMutexAcquired = gcvTRUE;
+
+ /* Only free the vidmem block when all the chunks are freed. */
+ if (_IsVidMemBlockFree(vidMemBlock))
+ {
+ gcmkONERROR(_RemoveFromBlockList(kernel, vidMemBlock));
+
+ gcmkONERROR(gckVIDMEM_BLOCK_Destroy(kernel, vidMemBlock));
+ }
+
+ /* Release the vidMem block mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, kernel->vidMemBlockMutex));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ /*************************** Virtual Memory *******************************/
+
+ /* Get gckKERNEL object. */
+ kernel = Node->Virtual.kernel;
+
+ /* Verify the gckKERNEL object pointer. */
+ gcmkVERIFY_OBJECT(kernel, gcvOBJ_KERNEL);
+
+#if gcdENABLE_VG
+ if (Node->Virtual.kernelVirtual)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "%s(%d) Unmap %x from kernel space.",
+ __FUNCTION__, __LINE__,
+ Node->Virtual.kernelVirtual);
+
+ gcmkVERIFY_OK(
+ gckOS_UnmapPhysical(kernel->os,
+ Node->Virtual.kernelVirtual,
+ Node->Virtual.bytes));
+
+ Node->Virtual.kernelVirtual = gcvNULL;
+ }
+#endif
+
+ if (Node->Virtual.kvaddr)
+ {
+ gcmkVERIFY_OK(
+ gckOS_DestroyKernelMapping(kernel->os,
+ Node->Virtual.physical,
+ Node->Virtual.kvaddr));
+ }
+
+ /* Free the virtual memory. */
+ gcmkVERIFY_OK(gckOS_FreePagedMemory(kernel->os,
+ Node->Virtual.physical,
+ Node->Virtual.bytes));
+
+ /* Delete the gcuVIDMEM_NODE union. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(kernel->os, Node));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (mutexAcquired)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(
+ memory->os, memory->mutex
+ ));
+ }
+
+ if (vbMutexAcquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(
+ vidMemBlock->os, vidMemBlock->mutex
+ ));
+ }
+
+ if (vbListMutexAcquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(
+ vidMemBlock->os, Kernel->vidMemBlockMutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVIDMEM_Lock
+**
+** Lock a video memory node and return its hardware specific address.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gcuVIDMEM_NODE_PTR Node
+** Pointer to a gcuVIDMEM_NODE union.
+**
+** OUTPUT:
+**
+** gctUINT32 * Address
+** Pointer to a variable that will hold the hardware specific address.
+**
+** gctUINT32 * PhysicalAddress
+** Pointer to a variable that will hold the bus address of a contiguous
+** video node.
+*/
+static gceSTATUS
+gckVIDMEM_Lock(
+ IN gckKERNEL Kernel,
+ IN gcuVIDMEM_NODE_PTR Node,
+ OUT gctUINT32 * Address
+ )
+{
+ gckOS os;
+
+ gcmkHEADER_ARG("Kernel=%p Node=%p", Kernel, Node);
+
+ /* Extract the gckOS object pointer. */
+ os = Kernel->os;
+
+ /* Increment the lock count. */
+ if (Node->VidMem.locked++ == 0)
+ {
+ gctUINT32 address;
+ gctUINT32 offset = (gctUINT32)Node->VidMem.offset;
+
+ switch (Node->VidMem.pool)
+ {
+ case gcvPOOL_LOCAL_EXTERNAL:
+ address = Kernel->externalBaseAddress + offset;
+ break;
+ case gcvPOOL_LOCAL_INTERNAL:
+ address = Kernel->internalBaseAddress + offset;
+ break;
+ case gcvPOOL_INTERNAL_SRAM:
+ address = Kernel->sRAMBaseAddresses[Kernel->sRAMIndex] + offset;
+ break;
+ case gcvPOOL_EXTERNAL_SRAM:
+ address = Kernel->extSRAMBaseAddresses[Kernel->extSRAMIndex] + offset;
+ break;
+ default:
+ gcmkASSERT(Node->VidMem.pool == gcvPOOL_SYSTEM);
+ case gcvPOOL_SYSTEM:
+ address = Kernel->contiguousBaseAddress + offset;
+ break;
+ }
+
+ /* Save address. */
+ Node->VidMem.address = address;
+ }
+
+ *Address = Node->VidMem.address;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "Locked node 0x%x (%d) @ 0x%08X",
+ Node,
+ Node->VidMem.locked,
+ *Address);
+
+ gcmkFOOTER_ARG("*Address=0x%08X", *Address);
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+gckVIDMEM_LockVirtual(
+ IN gckKERNEL Kernel,
+ IN gcuVIDMEM_NODE_PTR Node,
+ OUT gctUINT32 * Address
+ )
+{
+ gceSTATUS status;
+ gctPHYS_ADDR_T physicalAddress;
+ gctBOOL locked = gcvFALSE;
+ gckOS os = Kernel->os;
+ gceHARDWARE_TYPE hwType;
+
+ gcmkHEADER_ARG("Kernel=%p Node=%p", Kernel, Node);
+
+ gcmkVERIFY_OK(
+ gckKERNEL_GetHardwareType(Kernel,
+ &hwType));
+
+ gcmkONERROR(
+ gckOS_GetPhysicalFromHandle(os,
+ Node->Virtual.physical,
+ 0,
+ &physicalAddress));
+
+ /* Expect 4096 aligned. */
+ gcmkASSERT((physicalAddress & 0xFFF) == 0);
+
+#if gcdENABLE_VG
+ Node->Virtual.physicalAddress = physicalAddress;
+#endif
+
+ /* Increment the lock count. */
+ if (Node->Virtual.lockeds[hwType]++ == 0)
+ {
+ locked = gcvTRUE;
+
+ status = _ConvertPhysical(
+ Kernel,
+ Kernel->core,
+ Node,
+ gcvNULL,
+ physicalAddress,
+ &Node->Virtual.addresses[hwType]
+ );
+
+ if (gcmIS_ERROR(status))
+ {
+ /* Do GPU address mapping. */
+#if gcdSECURITY
+ gctPHYS_ADDR physicalArrayPhysical;
+ gctPOINTER physicalArrayLogical;
+
+ gcmkONERROR(gckOS_AllocatePageArray(
+ os,
+ Node->Virtual.physical,
+ Node->Virtual.pageCount,
+ &physicalArrayLogical,
+ &physicalArrayPhysical
+ ));
+
+ gcmkONERROR(gckKERNEL_SecurityMapMemory(
+ Kernel,
+ physicalArrayLogical,
+ Node->Virtual.pageCount,
+ &Node->Virtual.addresses[hwType]
+ ));
+
+ gcmkONERROR(gckOS_FreeNonPagedMemory(
+ os,
+ physicalArrayPhysical,
+ physicalArrayLogical,
+ 1
+ ));
+#else
+#if gcdENABLE_VG
+ if (Kernel->vg != gcvNULL)
+ {
+ /* Allocate pages inside the MMU. */
+ gcmkONERROR(
+ gckVGMMU_AllocatePages(Kernel->vg->mmu,
+ Node->Virtual.pageCount,
+ &Node->Virtual.pageTables[hwType],
+ &Node->Virtual.addresses[hwType]));
+ }
+ else
+#endif
+ {
+ /* Allocate pages inside the MMU. */
+ gcmkONERROR(
+ gckMMU_AllocatePagesEx(Kernel->mmu,
+ Node->Virtual.pageCount,
+ Node->Virtual.type,
+ gcvPAGE_TYPE_4K,
+ Node->Virtual.secure,
+ &Node->Virtual.pageTables[hwType],
+ &Node->Virtual.addresses[hwType]));
+ }
+
+ if (Node->Virtual.onFault != gcvTRUE)
+ {
+#if gcdENABLE_TRUST_APPLICATION
+#if gcdENABLE_VG
+ if (Kernel->core != gcvCORE_VG && Kernel->hardware->options.secureMode == gcvSECURE_IN_TA)
+#else
+ if (Kernel->hardware->options.secureMode == gcvSECURE_IN_TA)
+#endif
+ {
+ gcmkONERROR(gckKERNEL_MapInTrustApplicaiton(
+ Kernel,
+ Node->Virtual.logical,
+ Node->Virtual.physical,
+ Node->Virtual.addresses[hwType],
+ Node->Virtual.pageCount
+ ));
+ }
+ else
+#endif
+ {
+ gcmkDUMP(os, "#[mmu: dynamic mapping: address=0x%08X pageCount=%lu]",
+ Node->Virtual.addresses[hwType],
+ (unsigned long)Node->Virtual.pageCount);
+
+ /* Map the pages. */
+ gcmkONERROR(gckOS_MapPagesEx(os,
+ Kernel->core,
+ Node->Virtual.physical,
+ Node->Virtual.pageCount,
+ Node->Virtual.addresses[hwType],
+ Node->Virtual.pageTables[hwType],
+ gcvTRUE,
+ Node->Virtual.type));
+ }
+ }
+
+#if gcdENABLE_VG
+ if (Kernel->core == gcvCORE_VG)
+ {
+ gcmkONERROR(gckVGMMU_Flush(Kernel->vg->mmu));
+ }
+ else
+#endif
+ {
+ gcmkONERROR(gckMMU_Flush(Kernel->mmu, Node->Virtual.type));
+ }
+#endif
+
+ /* GPU MMU page size is fixed at 4096 now. */
+ Node->Virtual.addresses[hwType] |= (gctUINT32)physicalAddress & (4096 - 1);
+ }
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "Mapped virtual node 0x%x to 0x%08X",
+ Node,
+ Node->Virtual.addresses[hwType]);
+ }
+
+ /* Return hardware address. */
+ *Address = Node->Virtual.addresses[hwType];
+
+ gcmkFOOTER_ARG("*Address=0x%08X", *Address);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (locked)
+ {
+ if (Node->Virtual.pageTables[hwType] != gcvNULL)
+ {
+#if gcdENABLE_VG
+ if (Kernel->vg != gcvNULL)
+ {
+ /* Free the pages from the MMU. */
+ gcmkVERIFY_OK(
+ gckVGMMU_FreePages(Kernel->vg->mmu,
+ Node->Virtual.pageTables[hwType],
+ Node->Virtual.pageCount));
+ }
+ else
+#endif
+ {
+ /* Free the pages from the MMU. */
+ gcmkVERIFY_OK(
+ gckMMU_FreePages(Kernel->mmu,
+ Node->Virtual.secure,
+ gcvPAGE_TYPE_4K,
+ Node->Virtual.addresses[hwType],
+ Node->Virtual.pageTables[hwType],
+ Node->Virtual.pageCount));
+ }
+
+ Node->Virtual.pageTables[hwType] = gcvNULL;
+ }
+
+ Node->Virtual.lockeds[hwType]--;
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+gckVIDMEM_LockVirtualChunk(
+ IN gckKERNEL Kernel,
+ IN gcuVIDMEM_NODE_PTR Node,
+ OUT gctUINT32 * Address
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gckVIDMEM_BLOCK vidMemBlock = Node->VirtualChunk.parent;
+ gceHARDWARE_TYPE hwType;
+
+ gcmkHEADER_ARG("Kernel=%p Node=%p", Kernel, Node);
+
+ gcmkVERIFY_OK(
+ gckKERNEL_GetHardwareType(Kernel,
+ &hwType));
+
+ gcmkASSERT(vidMemBlock != gcvNULL);
+
+ /* Increment the lock count. */
+ if (Node->VirtualChunk.lockeds[hwType]++ == 0)
+ {
+ if (!vidMemBlock->pageTables[hwType])
+ {
+ /* Map current hardware mmu table with 1M pages for this video memory block. */
+ gcmkONERROR(gckVIDMEM_MapVidMemBlock(Kernel, vidMemBlock));
+ }
+
+ Node->VirtualChunk.addresses[hwType] = vidMemBlock->addresses[hwType]
+ + (gctUINT32)Node->VirtualChunk.offset;
+ }
+
+ /* Return hardware address. */
+ *Address = Node->VirtualChunk.addresses[hwType];
+
+ gcmkFOOTER_ARG("*Address=0x%08X", *Address);
+
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckVIDMEM_Unlock
+**
+** Unlock a video memory node.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gcuVIDMEM_NODE_PTR Node
+** Pointer to a locked gcuVIDMEM_NODE union.
+**
+** gctBOOL * Asynchroneous
+** Pointer to a variable specifying whether the surface should be
+** unlocked asynchroneously or not.
+**
+** OUTPUT:
+**
+** gctBOOL * Asynchroneous
+** Pointer to a variable receiving the number of bytes used in the
+** command buffer specified by 'Commands'. If gcvNULL, there is no
+** command buffer.
+*/
+static gceSTATUS
+gckVIDMEM_Unlock(
+ IN gckKERNEL Kernel,
+ IN gcuVIDMEM_NODE_PTR Node,
+ IN OUT gctBOOL * Asynchroneous
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Node=0x%x *Asynchroneous=%d",
+ Node, gcmOPT_VALUE(Asynchroneous));
+
+ if (Node->VidMem.locked <= 0)
+ {
+ /* The surface was not locked. */
+ gcmkONERROR(gcvSTATUS_MEMORY_UNLOCKED);
+ }
+
+ if (Asynchroneous != gcvNULL)
+ {
+ /* Schedule an event to sync with GPU. */
+ *Asynchroneous = gcvTRUE;
+ }
+ else
+ {
+ /* Decrement the lock count. */
+ Node->VidMem.locked--;
+ }
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "Unlocked node %p (%d)",
+ Node,
+ Node->VidMem.locked);
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Asynchroneous=%d", gcmOPT_VALUE(Asynchroneous));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+gckVIDMEM_UnlockVirtual(
+ IN gckKERNEL Kernel,
+ IN gcuVIDMEM_NODE_PTR Node,
+ IN OUT gctBOOL * Asynchroneous
+ )
+{
+ gceSTATUS status;
+ gceHARDWARE_TYPE hwType;
+
+ gcmkHEADER_ARG("Node=0x%x *Asynchroneous=%d",
+ Node, gcmOPT_VALUE(Asynchroneous));
+
+ gcmkVERIFY_OK(
+ gckKERNEL_GetHardwareType(Kernel,
+ &hwType));
+
+ if (Asynchroneous != gcvNULL)
+ {
+ /* Schedule the surface to be unlocked. */
+ *Asynchroneous = gcvTRUE;
+ }
+ else
+ {
+ if (Node->Virtual.lockeds[hwType] == 0)
+ {
+ gcmkONERROR(gcvSTATUS_MEMORY_UNLOCKED);
+ }
+
+ /* Decrement lock count. */
+ --Node->Virtual.lockeds[hwType];
+
+ /* See if we can unlock the resources. */
+ if (Node->Virtual.lockeds[hwType] == 0)
+ {
+ gctUINT32 address;
+
+ /* Adjust address to page aligned for underlying functions. */
+ address = Node->Virtual.addresses[hwType] & ~(4096 - 1);
+
+#if gcdSECURITY
+ if (Node->Virtual.addresses[hwType] > 0x80000000)
+ {
+ gcmkONERROR(gckKERNEL_SecurityUnmapMemory(
+ Kernel,
+ address,
+ Node->Virtual.pageCount
+ ));
+ }
+#else
+ /* Free the page table. */
+ if (Node->Virtual.pageTables[hwType] != gcvNULL)
+ {
+#if gcdENABLE_VG
+ if (Kernel->vg != gcvNULL)
+ {
+ gcmkONERROR(
+ gckVGMMU_FreePages(Kernel->vg->mmu,
+ Node->Virtual.pageTables[hwType],
+ Node->Virtual.pageCount));
+ }
+ else
+#endif
+ {
+ gcmkONERROR(
+ gckMMU_FreePages(Kernel->mmu,
+ Node->Virtual.secure,
+ gcvPAGE_TYPE_4K,
+ address,
+ Node->Virtual.pageTables[hwType],
+ Node->Virtual.pageCount));
+ }
+
+ gcmkONERROR(gckOS_UnmapPages(
+ Kernel->os,
+ Node->Virtual.pageCount,
+ address
+ ));
+
+ /* Mark page table as freed. */
+ Node->Virtual.pageTables[hwType] = gcvNULL;
+ }
+#endif
+ }
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "Unmapped virtual node %p from 0x%08X",
+ Node, Node->Virtual.addresses[hwType]);
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Asynchroneous=%d", gcmOPT_VALUE(Asynchroneous));
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+gckVIDMEM_UnlockVirtualChunk(
+ IN gckKERNEL Kernel,
+ IN gcuVIDMEM_NODE_PTR Node,
+ IN OUT gctBOOL * Asynchroneous
+ )
+{
+ gceSTATUS status;
+ gceHARDWARE_TYPE hwType;
+
+ gcmkHEADER_ARG("Node=0x%x *Asynchroneous=%d",
+ Node, gcmOPT_VALUE(Asynchroneous));
+
+ gcmkVERIFY_OK(
+ gckKERNEL_GetHardwareType(Kernel,
+ &hwType));
+
+ if (Asynchroneous != gcvNULL)
+ {
+ /* Schedule an event to sync with GPU. */
+ *Asynchroneous = gcvTRUE;
+ }
+ else
+ {
+ if (Node->VirtualChunk.lockeds[hwType] == 0)
+ {
+ /* The surface was not locked. */
+ gcmkONERROR(gcvSTATUS_MEMORY_UNLOCKED);
+ }
+
+ /* Unmap and free pages when video memory free. */
+
+ /* Decrement the lock count. */
+ --Node->VirtualChunk.lockeds[hwType];
+ }
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_VIDMEM,
+ "Unlocked node %p (%d)",
+ Node,
+ Node->VirtualChunk.lockeds[hwType]);
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Asynchroneous=%d", gcmOPT_VALUE(Asynchroneous));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+/*******************************************************************************
+**
+** gckVIDMEM_HANDLE_Allocate
+**
+** Allocate a handle for a gckVIDMEM_NODE object.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gckVIDMEM_NODE Node
+** Pointer to a gckVIDMEM_NODE object.
+**
+** OUTPUT:
+**
+** gctUINT32 * Handle
+** Pointer to a variable receiving a handle represent this
+** gckVIDMEM_NODE in userspace.
+*/
+gceSTATUS
+gckVIDMEM_HANDLE_Allocate(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE Node,
+ OUT gctUINT32 * Handle
+ )
+{
+ gceSTATUS status;
+ gctUINT32 processID = 0;
+ gctPOINTER pointer = gcvNULL;
+ gctPOINTER handleDatabase = gcvNULL;
+ gctPOINTER mutex = gcvNULL;
+ gctUINT32 handle = 0;
+ gckVIDMEM_HANDLE handleObject = gcvNULL;
+ gckOS os = Kernel->os;
+
+ gcmkHEADER_ARG("Kernel=0x%X, Node=0x%X", Kernel, Node);
+
+ gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
+
+ /* Allocate a gckVIDMEM_HANDLE object. */
+ gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(gcsVIDMEM_HANDLE), &pointer));
+
+ gcmkVERIFY_OK(gckOS_ZeroMemory(pointer, gcmSIZEOF(gcsVIDMEM_HANDLE)));
+
+ handleObject = pointer;
+
+ gcmkONERROR(gckOS_AtomConstruct(os, &handleObject->reference));
+
+ /* Set default reference count to 1. */
+ gckOS_AtomSet(os, handleObject->reference, 1);
+
+ gcmkVERIFY_OK(gckOS_GetProcessID(&processID));
+
+ gcmkONERROR(
+ gckKERNEL_FindHandleDatbase(Kernel,
+ processID,
+ &handleDatabase,
+ &mutex));
+
+ /* Allocate a handle for this object. */
+ gcmkONERROR(
+ gckKERNEL_AllocateIntegerId(handleDatabase, handleObject, &handle));
+
+ handleObject->node = Node;
+ handleObject->handle = handle;
+
+ *Handle = handle;
+
+ gcmkFOOTER_ARG("*Handle=%d", *Handle);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (handleObject != gcvNULL)
+ {
+ if (handleObject->reference != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(os, handleObject->reference));
+ }
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, handleObject));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_HANDLE_Reference(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 Handle
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_HANDLE handleObject = gcvNULL;
+ gctPOINTER database = gcvNULL;
+ gctPOINTER mutex = gcvNULL;
+ gctINT32 oldValue = 0;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Handle=%d PrcoessID=%d", Handle, ProcessID);
+
+ gcmkONERROR(
+ gckKERNEL_FindHandleDatbase(Kernel, ProcessID, &database, &mutex));
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, mutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Translate handle to gckVIDMEM_HANDLE object. */
+ gcmkONERROR(
+ gckKERNEL_QueryIntegerId(database, Handle, (gctPOINTER *)&handleObject));
+
+ /* Increase the reference count. */
+ gckOS_AtomIncrement(Kernel->os, handleObject->reference, &oldValue);
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ acquired = gcvFALSE;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_HANDLE_Dereference(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 Handle
+ )
+{
+ gceSTATUS status;
+ gctPOINTER handleDatabase = gcvNULL;
+ gctPOINTER mutex = gcvNULL;
+ gctINT32 oldValue = 0;
+ gckVIDMEM_HANDLE handleObject = gcvNULL;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Handle=%d PrcoessID=%d", Handle, ProcessID);
+
+ gcmkONERROR(
+ gckKERNEL_FindHandleDatbase(Kernel,
+ ProcessID,
+ &handleDatabase,
+ &mutex));
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, mutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Translate handle to gckVIDMEM_HANDLE. */
+ gcmkONERROR(
+ gckKERNEL_QueryIntegerId(handleDatabase, Handle, (gctPOINTER *)&handleObject));
+
+ gckOS_AtomDecrement(Kernel->os, handleObject->reference, &oldValue);
+
+ if (oldValue == 1)
+ {
+ /* Remove handle from database if this is the last reference. */
+ gcmkVERIFY_OK(gckKERNEL_FreeIntegerId(handleDatabase, Handle));
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ acquired = gcvFALSE;
+
+ if (oldValue == 1)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Kernel->os, handleObject->reference));
+ gcmkOS_SAFE_FREE(Kernel->os, handleObject);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_HANDLE_Lookup(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN gctUINT32 Handle,
+ OUT gckVIDMEM_NODE * Node
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_HANDLE handleObject = gcvNULL;
+ gckVIDMEM_NODE node = gcvNULL;
+ gctPOINTER database = gcvNULL;
+ gctPOINTER mutex = gcvNULL;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Kernel=0x%X ProcessID=%d Handle=%d",
+ Kernel, ProcessID, Handle);
+
+ gcmkONERROR(
+ gckKERNEL_FindHandleDatbase(Kernel, ProcessID, &database, &mutex));
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, mutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ gcmkONERROR(
+ gckKERNEL_QueryIntegerId(database, Handle, (gctPOINTER *)&handleObject));
+
+ node = handleObject->node;
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ acquired = gcvFALSE;
+
+ *Node = node;
+
+ gcmkFOOTER_ARG("*Node=%d", *Node);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_HANDLE_Lookup2(
+ IN gckKERNEL Kernel,
+ IN gcsDATABASE_PTR Database,
+ IN gctUINT32 Handle,
+ OUT gckVIDMEM_NODE * Node
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_HANDLE handleObject = gcvNULL;
+ gckVIDMEM_NODE node = gcvNULL;
+ gctPOINTER database = gcvNULL;
+ gctPOINTER mutex = gcvNULL;
+ gctBOOL acquired = gcvFALSE;
+
+ gcmkHEADER_ARG("Kernel=0x%X Database=%p Handle=%d",
+ Kernel, Database, Handle);
+
+ database = Database->handleDatabase;
+ mutex = Database->handleDatabaseMutex;
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, mutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ gcmkONERROR(
+ gckKERNEL_QueryIntegerId(database, Handle, (gctPOINTER *)&handleObject));
+
+ node = handleObject->node;
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ acquired = gcvFALSE;
+
+ *Node = node;
+
+ gcmkFOOTER_ARG("*Node=%d", *Node);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+
+static gceSTATUS
+gckVIDMEM_NODE_Construct(
+ IN gckKERNEL Kernel,
+ IN gcuVIDMEM_NODE_PTR VideoNode,
+ IN gceVIDMEM_TYPE Type,
+ IN gcePOOL Pool,
+ OUT gckVIDMEM_NODE * NodeObject
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE node = gcvNULL;
+ gctPOINTER pointer = gcvNULL;
+ gckOS os = Kernel->os;
+ gctUINT i;
+
+ /* Construct a node. */
+ gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(gcsVIDMEM_NODE), &pointer));
+
+ gcmkVERIFY_OK(gckOS_ZeroMemory(pointer, gcmSIZEOF(gcsVIDMEM_NODE)));
+
+ node = pointer;
+
+ node->metadata.magic = VIV_VIDMEM_METADATA_MAGIC;
+ node->metadata.ts_fd = -1;
+#ifdef gcdANDROID
+ node->metadata.ts_address = 0;
+#endif
+
+ node->node = VideoNode;
+ node->kernel = Kernel;
+ node->type = Type;
+ node->pool = Pool;
+
+ gcmkONERROR(gckOS_AtomConstruct(os, &node->reference));
+
+ gcmkONERROR(gckOS_CreateMutex(os, &node->mutex));
+
+ for (i = 0; i < gcvENGINE_GPU_ENGINE_COUNT; i++)
+ {
+ gcmkONERROR(gckOS_CreateSignal(os, gcvFALSE, &node->sync[i].signal));
+ }
+
+ /* Reference is 1 by default . */
+ gckOS_AtomSet(os, node->reference, 1);
+
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(Kernel->os,
+ Kernel->db->videoMemListMutex,
+ gcvINFINITE));
+
+ /* Add into video memory node list. */
+ gcsLIST_Add(&node->link, &Kernel->db->videoMemList);
+
+ gcmkVERIFY_OK(
+ gckOS_ReleaseMutex(Kernel->os, Kernel->db->videoMemListMutex));
+
+ *NodeObject = node;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (node != gcvNULL)
+ {
+ if (node->mutex)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(os, node->mutex));
+ }
+
+ if (node->reference != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_AtomDestroy(os, node->reference));
+ }
+
+ for (i = 0; i < gcvENGINE_GPU_ENGINE_COUNT; i++)
+ {
+ if (node->sync[i].signal != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_DestroySignal(os, node->sync[i].signal));
+ }
+ }
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, node));
+ }
+
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_AllocateLinear(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM VideoMemory,
+ IN gcePOOL Pool,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN gctUINT32 Alignment,
+ IN gctBOOL Specified,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gckVIDMEM_NODE * NodeObject
+ )
+{
+ gceSTATUS status;
+ gctSIZE_T bytes = *Bytes;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=%p VideoMemory=%p Pool=%d Alignment=%d Type=%d *Bytes=%u",
+ Kernel, VideoMemory, Pool, Alignment, Type, bytes);
+
+ gcmkONERROR(
+ gckVIDMEM_AllocateLinear(Kernel,
+ VideoMemory,
+ bytes,
+ Alignment,
+ Type,
+ Flag,
+ Specified,
+ &node));
+
+ /* Update pool. */
+ node->VidMem.pool = Pool;
+ bytes = node->VidMem.bytes;
+
+ /* Construct a node. */
+ gcmkONERROR(
+ gckVIDMEM_NODE_Construct(Kernel, node, Type, Pool, &nodeObject));
+
+ *Bytes = bytes;
+ *NodeObject = nodeObject;
+
+ gcmkFOOTER_ARG("*Bytes=%u *NodeObject=%p", bytes, nodeObject);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (node)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_Free(Kernel, node));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_AllocateVirtual(
+ IN gckKERNEL Kernel,
+ IN gcePOOL Pool,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gckVIDMEM_NODE * NodeObject
+ )
+{
+ gceSTATUS status;
+ gctSIZE_T bytes = *Bytes;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=%p Pool=%d Type=%d Flag=%x *Bytes=%u",
+ Kernel, Pool, Type, Flag, bytes);
+
+ gcmkONERROR(
+ gckVIDMEM_AllocateVirtual(Kernel, Flag, bytes, &node));
+
+ /* Update type. */
+ node->Virtual.type = Type;
+ bytes = node->Virtual.bytes;
+
+ /* Construct a node. */
+ gcmkONERROR(
+ gckVIDMEM_NODE_Construct(Kernel, node, Type, Pool, &nodeObject));
+
+ *Bytes = bytes;
+ *NodeObject = nodeObject;
+
+ gcmkFOOTER_ARG("*Bytes=%u *NodeObject=%p", bytes, nodeObject);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (node)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_Free(Kernel, node));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_AllocateVirtualChunk(
+ IN gckKERNEL Kernel,
+ IN gcePOOL Pool,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gckVIDMEM_NODE * NodeObject
+ )
+{
+ gceSTATUS status;
+ gctSIZE_T bytes = *Bytes;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=%p Pool=%d Type=%d Flag=%x *Bytes=%u",
+ Kernel, Pool, Type, Flag, bytes);
+
+ gcmkONERROR(
+ gckVIDMEM_AllocateVirtualChunk(Kernel, Type, Flag, bytes, &node));
+
+ bytes = node->VirtualChunk.bytes;
+
+ /* Construct a node. */
+ gcmkONERROR(
+ gckVIDMEM_NODE_Construct(Kernel, node, Type, Pool, &nodeObject));
+
+ *Bytes = bytes;
+ *NodeObject = nodeObject;
+
+ gcmkFOOTER_ARG("*Bytes=%u *NodeObject=%p", bytes, nodeObject);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (node)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_Free(Kernel, node));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_Reference(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject
+ )
+{
+ gctINT32 oldValue;
+ gcmkHEADER_ARG("Kernel=0x%X NodeObject=0x%X", Kernel, NodeObject);
+
+ gcmkVERIFY_ARGUMENT(NodeObject != gcvNULL);
+
+ gckOS_AtomIncrement(Kernel->os, NodeObject->reference, &oldValue);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_Dereference(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject
+ )
+{
+ gctINT32 oldValue = 0;
+ gctPOINTER database = Kernel->db->nameDatabase;
+ gctPOINTER mutex = Kernel->db->nameDatabaseMutex;
+ gctUINT i;
+
+ gcmkHEADER_ARG("Kernel=0x%X NodeObject=0x%X", Kernel, NodeObject);
+ gcmkVERIFY_ARGUMENT(NodeObject != gcvNULL);
+
+ gcmkVERIFY_OK(gckOS_AcquireMutex(Kernel->os, mutex, gcvINFINITE));
+
+ gcmkVERIFY_OK(gckOS_AtomDecrement(Kernel->os, NodeObject->reference, &oldValue));
+
+ if (oldValue == 1 && NodeObject->name)
+ {
+ /* Free name if exists. */
+ gcmkVERIFY_OK(gckKERNEL_FreeIntegerId(database, NodeObject->name));
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+
+ if (oldValue == 1)
+ {
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(Kernel->os,
+ Kernel->db->videoMemListMutex,
+ gcvINFINITE));
+
+ /* Remove from video memory node list. */
+ gcsLIST_Del(&NodeObject->link);
+
+ gcmkVERIFY_OK(
+ gckOS_ReleaseMutex(Kernel->os, Kernel->db->videoMemListMutex));
+
+ /* Free gcuVIDMEM_NODE. */
+ gcmkVERIFY_OK(gckVIDMEM_Free(Kernel, NodeObject->node));
+
+ gcmkVERIFY_OK(gckOS_AtomDestroy(Kernel->os, NodeObject->reference));
+
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Kernel->os, NodeObject->mutex));
+
+ for (i = 0; i < gcvENGINE_GPU_ENGINE_COUNT; i++)
+ {
+ if (NodeObject->sync[i].signal != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_DestroySignal(Kernel->os, NodeObject->sync[i].signal));
+ }
+ }
+
+ /* Should not cause recursive call since tsNode->tsNode should be NULL */
+ if (NodeObject->tsNode)
+ {
+ gcmkASSERT(!NodeObject->tsNode->tsNode);
+ gckVIDMEM_NODE_Dereference(Kernel, NodeObject->tsNode);
+ }
+
+ gcmkOS_SAFE_FREE(Kernel->os, NodeObject);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_GetReference(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctINT32 * ReferenceCount
+ )
+{
+ gctINT32 value;
+
+ gckOS_AtomGet(Kernel->os, NodeObject->reference, &value);
+
+ *ReferenceCount = value;
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_Lock(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctUINT32 * Address
+ )
+{
+ gceSTATUS status;
+ gckOS os = Kernel->os;
+ gctBOOL acquired = gcvFALSE;
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+
+ gcmkHEADER_ARG("NodeObject=%p", NodeObject);
+
+ /* Grab the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(os, NodeObject->mutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ gcmkONERROR(gckVIDMEM_Lock(Kernel, node, Address));
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ gcmkONERROR(gckVIDMEM_LockVirtualChunk(Kernel, node, Address));
+ }
+ else
+ {
+ gcmkONERROR(gckVIDMEM_LockVirtual(Kernel, node, Address));
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, NodeObject->mutex));
+
+ gcmkFOOTER_ARG("*Address=0x%08X", *Address);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, NodeObject->mutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_Unlock(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctUINT32 ProcessID,
+ IN OUT gctBOOL * Asynchroneous
+ )
+{
+ gceSTATUS status;
+ gckOS os = Kernel->os;
+ gctBOOL acquired = gcvFALSE;
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+
+ gcmkHEADER_ARG("NodeObject=%p Asynchroneous=%p", NodeObject, Asynchroneous);
+
+ /* Grab the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(os, NodeObject->mutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ gcmkONERROR(gckVIDMEM_Unlock(Kernel, node, Asynchroneous));
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ gcmkONERROR(gckVIDMEM_UnlockVirtualChunk(Kernel, node, Asynchroneous));
+ }
+ else
+ {
+ gcmkONERROR(gckVIDMEM_UnlockVirtual(Kernel, node, Asynchroneous));
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, NodeObject->mutex));
+
+ gcmkFOOTER_ARG("*Asynchroneous=0x%08X", gcmOPT_VALUE(Asynchroneous));
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, NodeObject->mutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_CleanCache(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ )
+{
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gctPHYS_ADDR physHandle = gcvNULL;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Kernel=%p NodeObject=%d Offset=0x%llx Logical=%p Bytes=0x%llx",
+ Kernel, NodeObject, Offset, Logical, Bytes);
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ gcmkONERROR(gckOS_MemoryBarrier(Kernel->os, Logical));
+
+ /* Reserved pool can't be cacheable */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ physHandle = vidMemBlock->physical;
+ }
+ else
+ {
+ physHandle = node->Virtual.physical;
+ }
+
+ gcmkONERROR(gckOS_CacheFlush(
+ Kernel->os,
+ 0,
+ physHandle,
+ Offset,
+ Logical,
+ Bytes
+ ));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_InvalidateCache(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ )
+{
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gctPHYS_ADDR physHandle = gcvNULL;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Kernel=%p NodeObject=%d Offset=0x%llx Logical=%p Bytes=0x%llx",
+ Kernel, NodeObject, Offset, Logical, Bytes);
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ /* Reserved pool can't be cacheable */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ physHandle = vidMemBlock->physical;
+ }
+ else
+ {
+ physHandle = node->Virtual.physical;
+ }
+
+ gcmkONERROR(gckOS_CacheInvalidate(
+ Kernel->os,
+ 0,
+ physHandle,
+ Offset,
+ Logical,
+ Bytes
+ ));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_GetLockCount(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctINT32 * LockCount
+ )
+{
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+ gctINT32 lockCount = 0;
+ gctINT i = 0;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ lockCount = node->VidMem.locked;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ for (; i < gcvHARDWARE_NUM_TYPES; i++)
+ {
+ lockCount += node->VirtualChunk.lockeds[i];
+ }
+ }
+ else
+ {
+
+ for (; i < gcvHARDWARE_NUM_TYPES; i++)
+ {
+ lockCount += node->Virtual.lockeds[i];
+ }
+ }
+
+ *LockCount = lockCount;
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_LockCPU(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctBOOL Cacheable,
+ IN gctBOOL FromUser,
+ OUT gctPOINTER * Logical
+ )
+{
+ gceSTATUS status;
+ gckOS os = Kernel->os;
+ gctBOOL acquired = gcvFALSE;
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+ gctPOINTER logical = gcvNULL;
+
+ gcmkHEADER_ARG("NodeObject=%p", NodeObject);
+
+ /* Grab the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(os, NodeObject->mutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ if (Cacheable == gcvTRUE)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_REQUEST);
+ }
+
+ if (FromUser)
+ {
+ /* Map video memory pool to user space. */
+ gcmkONERROR(
+ gckKERNEL_MapVideoMemory(Kernel,
+ gcvTRUE,
+ node->VidMem.pool,
+ node->VidMem.physical,
+ (gctUINT32)node->VidMem.offset,
+ (gctUINT32)node->VidMem.bytes,
+ &node->VidMem.logical));
+
+ logical = node->VidMem.logical;
+ }
+ else
+ {
+ /* Map video memory pool to kernel space. */
+ if (!node->VidMem.kvaddr)
+ {
+ gcmkONERROR(
+ gckOS_CreateKernelMapping(os,
+ node->VidMem.parent->physical,
+ node->VidMem.offset,
+ node->VidMem.bytes,
+ &node->VidMem.kvaddr));
+ }
+
+ logical = node->VidMem.kvaddr;
+ }
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ if (FromUser)
+ {
+ /* Lock the entire vidmem block. */
+ gcmkONERROR(
+ gckOS_LockPages(os,
+ vidMemBlock->physical,
+ vidMemBlock->bytes,
+ Cacheable,
+ &logical));
+
+ /* Get the logical with offset in block. */
+ logical = (uint8_t *)logical + node->VirtualChunk.offset;
+ node->VirtualChunk.logical = logical;
+ }
+ else
+ {
+ /* Map once and will cancel map when free. */
+ if (!node->VirtualChunk.kvaddr)
+ {
+ gcmkONERROR(
+ gckOS_CreateKernelMapping(os,
+ vidMemBlock->physical,
+ node->VirtualChunk.offset,
+ node->VirtualChunk.bytes,
+ &node->VirtualChunk.kvaddr));
+ }
+
+ logical = node->VirtualChunk.kvaddr;
+ }
+ }
+ else
+ {
+ if (FromUser)
+ {
+ gcmkONERROR(
+ gckOS_LockPages(os,
+ node->Virtual.physical,
+ node->Virtual.bytes,
+ Cacheable,
+ &logical));
+
+ node->Virtual.logical = logical;
+ }
+ else
+ {
+ /* Map once and will cancel map when free. */
+ if (!node->Virtual.kvaddr)
+ {
+ gcmkONERROR(
+ gckOS_CreateKernelMapping(os,
+ node->Virtual.physical,
+ 0,
+ node->Virtual.bytes,
+ &node->Virtual.kvaddr));
+ }
+
+ logical = node->Virtual.kvaddr;
+ }
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, NodeObject->mutex));
+
+ *Logical = logical;
+
+ gcmkFOOTER_ARG("*Logical=%p", logical);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, NodeObject->mutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_UnlockCPU(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctUINT32 ProcessID,
+ IN gctBOOL FromUser,
+ IN gctBOOL Defer
+ )
+{
+ gceSTATUS status;
+ gckOS os = Kernel->os;
+ gctBOOL acquired = gcvFALSE;
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+
+ gcmkHEADER_ARG("NodeObject=%p", NodeObject);
+
+ /* Grab the mutex. */
+ gcmkONERROR(gckOS_AcquireMutex(os, NodeObject->mutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ if (FromUser)
+ {
+#ifdef __QNXNTO__
+ /* Do nothing here. */
+#else
+ if (!Defer)
+ {
+ /* Unmap the video memory. */
+ if (node->VidMem.logical != gcvNULL)
+ {
+ gckKERNEL_UnmapVideoMemory(
+ Kernel,
+ node->VidMem.pool,
+ node->VidMem.physical,
+ node->VidMem.logical,
+ node->VidMem.processID,
+ node->VidMem.bytes
+ );
+
+ node->VidMem.logical = gcvNULL;
+ }
+ /* Reset. */
+ node->VidMem.processID = 0;
+ }
+#endif
+ }
+ else
+ {
+ /*
+ * Kernel side may lock for CPU access for multiple times. Since
+ * we don't have lock counts currently, we don't cancel CPU
+ * mapping here, and will cancel at 'free' instead.
+ */
+ /*
+ gcmkONERROR(
+ gckOS_DestroyKernelMapping(os,
+ node->VidMem.parent->physical,
+ node->VidMem.kvaddr));
+
+ node->VidMem.kvaddr = gcvNULL;
+ */
+ }
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ if (FromUser)
+ {
+ gcmkONERROR(
+ gckOS_UnlockPages(os,
+ vidMemBlock->physical,
+ vidMemBlock->bytes,
+ node->VirtualChunk.logical));
+ }
+ else
+ {
+ /* Nothing to do. */
+ }
+ }
+ else
+ {
+ if (FromUser)
+ {
+ gcmkONERROR(
+ gckOS_UnlockPages(os,
+ node->Virtual.physical,
+ node->Virtual.bytes,
+ node->Virtual.logical));
+ }
+ else
+ {
+ /*
+ * Kernel side may lock for CPU access for multiple times. Since
+ * we don't have lock counts currently, we don't cancel CPU
+ * mapping here, and will cancel at 'free' instead.
+ */
+ /*
+ gcmkONERROR(
+ gckOS_DestroyKernelMapping(os,
+ node->Virtual.physical,
+ node->Virtual.kvaddr));
+
+ node->Virtual.kvaddr = gcvNULL;
+ */
+ }
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, NodeObject->mutex));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (acquired)
+ {
+ /* Release the mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(os, NodeObject->mutex));
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_GetPhysical(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * PhysicalAddress
+ )
+{
+ gceSTATUS status;
+ gckOS os = Kernel->os;
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+
+ gcmkHEADER_ARG("NodeObject=%p", NodeObject);
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ if (Offset >= node->VidMem.bytes)
+ {
+ /* Exceeds node size. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ *PhysicalAddress = node->VidMem.parent->physicalBase
+ + node->VidMem.offset
+ + Offset;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ if (Offset >= node->VirtualChunk.bytes)
+ {
+ /* Exceeds node size. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ gcmkONERROR(
+ gckOS_GetPhysicalFromHandle(os,
+ vidMemBlock->physical,
+ (gctUINT32)node->VirtualChunk.offset + Offset,
+ PhysicalAddress));
+ }
+ else
+ {
+ if (Offset >= node->Virtual.bytes)
+ {
+ /* Exceeds node size. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ gcmkONERROR(
+ gckOS_GetPhysicalFromHandle(os,
+ node->Virtual.physical,
+ Offset,
+ PhysicalAddress));
+ }
+
+ gcmkFOOTER_ARG("*PhysicalAddress=0x%llx", *PhysicalAddress);
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_GetGid(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctUINT32 * Gid
+ )
+{
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ *Gid = 0;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ *Gid = vidMemBlock->gid;
+ }
+ else
+ {
+ *Gid = node->Virtual.gid;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_GetSize(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctSIZE_T * Size
+ )
+{
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ *Size = node->VidMem.bytes;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ *Size = node->VirtualChunk.bytes;
+ }
+ else
+ {
+ *Size = node->Virtual.bytes;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_GetType(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gceVIDMEM_TYPE * Type,
+ OUT gcePOOL * Pool
+ )
+{
+ if (Type)
+ {
+ *Type = NodeObject->type;
+ }
+
+ if (Pool)
+ {
+ *Pool = NodeObject->pool;
+ }
+
+ 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;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+ gctPHYS_ADDR physical = gcvNULL;
+ gctSIZE_T offset = 0;
+ gctSIZE_T bytes = 0;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ physical = node->VidMem.parent->physical;
+ offset = node->VidMem.offset;
+ bytes = node->VidMem.bytes;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ physical = vidMemBlock->physical;
+ offset = node->VirtualChunk.offset;
+ bytes = node->VirtualChunk.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;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+ 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.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ physical = node->VidMem.parent->physical;
+ skipPages += (node->VidMem.offset >> PAGE_SHIFT);
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ physical = vidMemBlock->physical;
+ skipPages += (node->VirtualChunk.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_Dereference(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;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+ gctINT8_PTR kvaddr = gcvNULL;
+ gctPHYS_ADDR physical = gcvNULL;
+ gctSIZE_T bytes = 0;
+
+ offset = (offset << PAGE_SHIFT);
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ physical = node->VidMem.parent->physical;
+ offset += node->VidMem.offset;
+ bytes = node->VidMem.bytes;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ physical = vidMemBlock->physical;
+ offset += node->VirtualChunk.offset;
+ bytes = node->VirtualChunk.bytes;
+ }
+ else
+ {
+ physical = node->Virtual.physical;
+ bytes = node->Virtual.bytes;
+ }
+
+ if (gcmIS_SUCCESS(gckOS_CreateKernelMapping(
+ nodeObject->kernel->os, physical, 0, bytes, (gctPOINTER*)&kvaddr)))
+ {
+ 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;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+ gctINT8_PTR kvaddr = (gctINT8_PTR)ptr - (offset << PAGE_SHIFT);
+ gctPHYS_ADDR physical = gcvNULL;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ physical = node->VidMem.parent->physical;
+ kvaddr -= node->VidMem.offset;
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ physical = vidMemBlock->physical;
+ kvaddr -= node->VirtualChunk.offset;
+ }
+ else
+ {
+ physical = node->Virtual.physical;
+ }
+
+ gcmkVERIFY_OK(gckOS_DestroyKernelMapping(
+ nodeObject->kernel->os, physical, (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,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0)
+ .map = _dmabuf_kmap,
+ .unmap = _dmabuf_kunmap,
+# elif LINUX_VERSION_CODE >= KERNEL_VERSION(4,12,0)
+ .map_atomic = _dmabuf_kmap,
+ .unmap_atomic = _dmabuf_kunmap,
+ .map = _dmabuf_kmap,
+ .unmap = _dmabuf_kunmap,
+# else
+ .kmap_atomic = _dmabuf_kmap,
+ .kunmap_atomic = _dmabuf_kunmap,
+ .kmap = _dmabuf_kmap,
+ .kunmap = _dmabuf_kunmap,
+# endif
+};
+#endif
+
+gceSTATUS
+gckVIDMEM_NODE_Export(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctINT32 Flags,
+ OUT gctPOINTER *DmaBuf,
+ OUT gctINT32 *FD
+ )
+{
+#if defined(CONFIG_DMA_SHARED_BUFFER)
+ gceSTATUS status = gcvSTATUS_OK;
+ struct dma_buf *dmabuf = gcvNULL;
+
+ gcmkHEADER_ARG("Kernel=%p NodeObject=0x%x", Kernel, NodeObject);
+
+ dmabuf = NodeObject->dmabuf;
+ if (!dmabuf)
+ {
+ gctSIZE_T bytes = 0;
+ gctPHYS_ADDR physical = gcvNULL;
+ gcuVIDMEM_NODE_PTR node = NodeObject->node;
+ gckVIDMEM_BLOCK vidMemBlock = node->VirtualChunk.parent;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ physical = node->VidMem.parent->physical;
+ bytes = node->VidMem.bytes;
+ /* Align export size. when allocate memory from VIDMEM, the actual node size may not same with aligned size. */
+ bytes = bytes & ~(PAGE_SIZE - 1);
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ physical = vidMemBlock->physical;
+ bytes = node->VirtualChunk.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
+}
+
+gceSTATUS
+gckVIDMEM_NODE_Name(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctUINT32 * Name
+ )
+{
+ gceSTATUS status;
+ gctUINT32 name = 0;
+ gctPOINTER database = Kernel->db->nameDatabase;
+ gctPOINTER mutex = Kernel->db->nameDatabaseMutex;
+ gctBOOL acquired = gcvFALSE;
+ gctBOOL referenced = gcvFALSE;
+ gcmkHEADER_ARG("Kernel=0x%X NodeObject=%p", Kernel, NodeObject);
+
+ gcmkVERIFY_ARGUMENT(Name != gcvNULL);
+
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, mutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ gcmkONERROR(gckVIDMEM_NODE_Reference(Kernel, NodeObject));
+ referenced = gcvTRUE;
+
+ if (NodeObject->name == 0)
+ {
+ /* Name this node. */
+ gcmkONERROR(gckKERNEL_AllocateIntegerId(database, NodeObject, &name));
+ NodeObject->name = name;
+ }
+ else
+ {
+ name = NodeObject->name;
+ }
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ acquired = gcvFALSE;
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(Kernel, NodeObject));
+
+ *Name = name;
+
+ gcmkFOOTER_ARG("*Name=%d", *Name);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (referenced)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(Kernel, NodeObject));
+ }
+
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_Import(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Name,
+ OUT gckVIDMEM_NODE * NodeObject
+ )
+{
+ gceSTATUS status;
+ gckVIDMEM_NODE node = gcvNULL;
+ gctPOINTER database = Kernel->db->nameDatabase;
+ gctPOINTER mutex = Kernel->db->nameDatabaseMutex;
+ gctBOOL acquired = gcvFALSE;
+ gctBOOL referenced = gcvFALSE;
+
+ gcmkHEADER_ARG("Kernel=0x%X Name=%d", Kernel, Name);
+
+ gcmkONERROR(gckOS_AcquireMutex(Kernel->os, mutex, gcvINFINITE));
+ acquired = gcvTRUE;
+
+ /* Lookup in database to get the node. */
+ gcmkONERROR(gckKERNEL_QueryIntegerId(database, Name, (gctPOINTER *)&node));
+
+ /* Reference the node. */
+ gcmkONERROR(gckVIDMEM_NODE_Reference(Kernel, node));
+ referenced = gcvTRUE;
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ acquired = gcvFALSE;
+
+ *NodeObject = node;
+ gcmkFOOTER_ARG("*NodeObject=%p", node);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (referenced)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(Kernel, node));
+ }
+
+ if (acquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(Kernel->os, mutex));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+typedef struct _gcsVIDMEM_NODE_FDPRIVATE
+{
+ gcsFDPRIVATE base;
+ gckKERNEL kernel;
+ gckVIDMEM_NODE node;
+}
+gcsVIDMEM_NODE_FDPRIVATE;
+
+
+static gctINT
+_ReleaseFdPrivate(
+ gcsFDPRIVATE_PTR FdPrivate
+ )
+{
+ /* Cast private info. */
+ gcsVIDMEM_NODE_FDPRIVATE * private = (gcsVIDMEM_NODE_FDPRIVATE *) FdPrivate;
+
+ gckVIDMEM_NODE_Dereference(private->kernel, private->node);
+ gckOS_Free(private->kernel->os, private);
+
+ return 0;
+}
+
+
+/*******************************************************************************
+**
+** gckVIDMEM_NODE_GetFd
+**
+** Attach a gckVIDMEM_NODE object to a native fd.
+**
+** OUTPUT:
+**
+** gctUINT32 * Fd
+** Pointer to a variable receiving a native fd from os.
+*/
+gceSTATUS
+gckVIDMEM_NODE_GetFd(
+ IN gckKERNEL Kernel,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctINT * Fd
+ )
+{
+ gceSTATUS status;
+ gctBOOL referenced = gcvFALSE;
+ gcsVIDMEM_NODE_FDPRIVATE * fdPrivate = gcvNULL;
+ gcmkHEADER_ARG("Kernel=0x%X NodeObject=%d", Kernel, NodeObject);
+
+ /* Reference node object. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Reference(Kernel, NodeObject));
+ referenced = gcvTRUE;
+
+ /* Allocated fd owns a reference. */
+ gcmkONERROR(gckOS_Allocate(
+ Kernel->os,
+ gcmSIZEOF(gcsVIDMEM_NODE_FDPRIVATE),
+ (gctPOINTER *)&fdPrivate
+ ));
+
+ fdPrivate->base.release = _ReleaseFdPrivate;
+ fdPrivate->kernel = Kernel;
+ fdPrivate->node = NodeObject;
+
+ /* Allocated fd owns a reference. */
+ gcmkONERROR(gckOS_GetFd("vidmem", &fdPrivate->base, Fd));
+
+ gcmkFOOTER_ARG("*Fd=%d", *Fd);
+ return gcvSTATUS_OK;
+
+OnError:
+ if (referenced)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(Kernel, NodeObject));
+ }
+
+ if (fdPrivate)
+ {
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Kernel->os, fdPrivate));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_WrapUserMemory(
+ IN gckKERNEL Kernel,
+ IN gcsUSER_MEMORY_DESC_PTR Desc,
+ IN gceVIDMEM_TYPE Type,
+ OUT gckVIDMEM_NODE * NodeObject,
+ OUT gctUINT64 * Bytes
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gctBOOL found = gcvFALSE;
+
+ gcmkHEADER_ARG("Kernel=0x%x", Kernel);
+
+ gcmkVERIFY_ARGUMENT(Desc != gcvNULL);
+
+#if defined(CONFIG_DMA_SHARED_BUFFER)
+ if (Desc->flag & gcvALLOC_FLAG_DMABUF)
+ {
+ struct dma_buf *dmabuf;
+ int fd = (int)Desc->handle;
+
+ if (fd >= 0)
+ {
+ /* Import dma buf handle. */
+ dmabuf = dma_buf_get(fd);
+
+ if (IS_ERR(dmabuf))
+ return PTR_ERR(dmabuf);
+
+ Desc->handle = -1;
+ Desc->dmabuf = gcmPTR_TO_UINT64(dmabuf);
+
+ dma_buf_put(dmabuf);
+ }
+ else
+ {
+ if (!Desc->dmabuf)
+ {
+ gcmkPRINT("Wrap user memory: invalid dmabuf from user.\n");
+
+ gcmkFOOTER();
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ dmabuf = gcmUINT64_TO_PTR(Desc->dmabuf);
+ }
+
+ if (dmabuf->ops == &_dmabuf_ops)
+ {
+ gctBOOL referenced = gcvFALSE;
+ nodeObject = dmabuf->priv;
+
+ do
+ {
+ /* Reference the node. */
+ gcmkERR_BREAK(gckVIDMEM_NODE_Reference(Kernel, nodeObject));
+ referenced = gcvTRUE;
+ found = gcvTRUE;
+
+ *NodeObject = nodeObject;
+ *Bytes = (gctUINT64)dmabuf->size;
+ }
+ while (gcvFALSE);
+
+ if (gcmIS_ERROR(status) && referenced)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_NODE_Dereference(Kernel, nodeObject));
+ }
+ }
+ }
+#endif
+
+ if (!found)
+ {
+ gckOS os = Kernel->os;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+
+ do
+ {
+ gctSIZE_T pageCountCpu = 0;
+ gctSIZE_T pageSizeCpu = 0;
+ gctPHYS_ADDR_T physicalAddress = 0;
+
+ gcmkVERIFY_OK(gckOS_GetPageSize(os, &pageSizeCpu));
+
+ /* 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,
+ &pageCountCpu));
+
+ /* Get base physical address. */
+ gcmkERR_BREAK(
+ gckOS_GetPhysicalFromHandle(os,
+ node->Virtual.physical,
+ 0,
+ &physicalAddress));
+
+ /* Allocate handle for this video memory. */
+ gcmkERR_BREAK(gckVIDMEM_NODE_Construct(
+ Kernel,
+ node,
+ Type,
+ gcvPOOL_VIRTUAL,
+ &nodeObject
+ ));
+
+ node->Virtual.pageCount = (pageCountCpu * pageSizeCpu -
+ (physicalAddress & (pageSizeCpu - 1) & ~(4096 - 1))) >> 12;
+
+ *NodeObject = nodeObject;
+ *Bytes = (gctUINT64)node->Virtual.bytes;
+ }
+ while (gcvFALSE);
+
+ if (gcmIS_ERROR(status) && node)
+ {
+ /* Free the structure. */
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(os, node));
+ }
+ }
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_SetCommitStamp(
+ IN gckKERNEL Kernel,
+ IN gceENGINE Engine,
+ IN gckVIDMEM_NODE NodeObject,
+ IN gctUINT64 CommitStamp
+ )
+{
+ NodeObject->sync[Engine].commitStamp = CommitStamp;
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckVIDMEM_NODE_GetCommitStamp(
+ IN gckKERNEL Kernel,
+ IN gceENGINE Engine,
+ IN gckVIDMEM_NODE NodeObject,
+ OUT gctUINT64_PTR CommitStamp
+ )
+{
+ *CommitStamp = NodeObject->sync[Engine].commitStamp;
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckVIDMEM_NODE_Find
+**
+** Find gckVIDMEM_NODE object according to GPU address of specified core.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Kernel object, specifies core.
+**
+** gctUINT32 Address
+** GPU address to search.
+**
+** OUTPUT:
+**
+** gckVIDMEM_NODE * NodeObject
+** Pointer to a variable hold found video memory node.
+**
+** gctUINT32 * Offset
+** The offset of specified GPU address in found video memory node.
+*/
+gceSTATUS
+gckVIDMEM_NODE_Find(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 Address,
+ OUT gckVIDMEM_NODE * NodeObject,
+ OUT gctUINT32 * Offset
+ )
+{
+ gceSTATUS status = gcvSTATUS_NOT_FOUND;
+ gckVIDMEM_NODE nodeObject = gcvNULL;
+ gcuVIDMEM_NODE_PTR node = gcvNULL;
+ gckVIDMEM_BLOCK vidMemBlock = gcvNULL;
+ gcsLISTHEAD_PTR pos;
+ gceHARDWARE_TYPE hwType;
+
+ gcmkVERIFY_OK(
+ gckKERNEL_GetHardwareType(Kernel,
+ &hwType));
+
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(Kernel->os,
+ Kernel->db->videoMemListMutex,
+ gcvINFINITE));
+
+ gcmkLIST_FOR_EACH(pos, &Kernel->db->videoMemList)
+ {
+ nodeObject = (gckVIDMEM_NODE)gcmCONTAINEROF(pos, struct _gcsVIDMEM_NODE, link);
+ node = nodeObject->node;
+ vidMemBlock = node->VirtualChunk.parent;
+
+ if (node->VidMem.parent->object.type == gcvOBJ_VIDMEM)
+ {
+ if (!node->VidMem.locked)
+ {
+ /* Don't check against unlocked node. */
+ continue;
+ }
+
+ if (Address >= node->VidMem.address &&
+ Address <= node->VidMem.address + node->VidMem.bytes - 1)
+ {
+ *NodeObject = nodeObject;
+
+ if (Offset)
+ {
+ *Offset = Address - node->VidMem.address;
+ }
+
+ status = gcvSTATUS_OK;
+ break;
+ }
+ }
+ else if (vidMemBlock && vidMemBlock->object.type == gcvOBJ_VIDMEM_BLOCK)
+ {
+ if (!node->VirtualChunk.lockeds[hwType])
+ {
+ /* Don't check against unlocked node. */
+ continue;
+ }
+
+ if (Address >= node->VirtualChunk.addresses[hwType] &&
+ Address <= node->VirtualChunk.addresses[hwType] + node->VirtualChunk.bytes - 1)
+ {
+ *NodeObject = nodeObject;
+
+ if (Offset)
+ {
+ *Offset = Address - node->VirtualChunk.addresses[hwType];
+ }
+
+ status = gcvSTATUS_OK;
+ break;
+ }
+ }
+ else
+ {
+ if (!node->Virtual.lockeds[hwType])
+ {
+ /* Don't check against unlocked node. */
+ continue;
+ }
+
+ if (Address >= node->Virtual.addresses[hwType] &&
+ (Address <= node->Virtual.addresses[hwType] + node->Virtual.bytes - 1))
+ {
+ *NodeObject = nodeObject;
+
+ if (Offset)
+ {
+ *Offset = Address - node->Virtual.addresses[hwType];
+ }
+
+ status = gcvSTATUS_OK;
+ break;
+ }
+ }
+ }
+
+ gcmkVERIFY_OK(
+ gckOS_ReleaseMutex(Kernel->os, Kernel->db->videoMemListMutex));
+
+ 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
new file mode 100644
index 000000000000..5e1e8a4855bd
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_feature_database.h
@@ -0,0 +1,141233 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+/*Auto created on 2019-10-25 16:59*/
+#ifndef _gc_feature_database_h_
+#define _gc_feature_database_h_
+
+typedef struct
+{
+ /* Chip ID. */
+ gctUINT32 chipID;
+ gctUINT32 chipVersion;
+ gctUINT32 productID;
+ gctUINT32 ecoID;
+ gctUINT32 customerID;
+ gctUINT32 patchVersion;
+ const char *productName;
+ gctUINT32 formalRelease;
+ gctUINT32 TempRegisters;
+ gctUINT32 ThreadCount;
+ gctUINT32 NumShaderCores;
+ gctUINT32 InstructionCount;
+ gctUINT32 NumberOfConstants;
+ gctUINT32 CoreCount;
+ gctUINT32 LocalStorageSize;
+ gctUINT32 L1CacheSize;
+ gctUINT32 InstructionMemorySize;
+ gctUINT32 ShaderPCLength;
+ gctUINT32 USC_MAX_PAGES;
+ gctUINT32 NumPixelPipes;
+ gctUINT32 USC_CACHE_CONTROLLERS;
+ gctUINT32 USC_BANKS;
+ gctUINT32 Streams;
+ gctUINT32 VaryingCount;
+ gctUINT32 VertexOutputBufferSize;
+ gctUINT32 BufferSize;
+ gctUINT32 VertexCacheSize;
+ gctUINT32 NumResolvePipes;
+ gctUINT32 RESULT_WINDOW_MAX_SIZE;
+ gctUINT32 ClusterAliveMask;
+ gctUINT32 NNMadPerCore;
+ gctUINT32 NNCoreCount;
+ gctUINT32 NNCoreCount_INT8;
+ gctUINT32 NNCoreCount_INT16;
+ gctUINT32 NNCoreCount_FLOAT16;
+ gctUINT32 NNCoreCount_BFLOAT;
+ gctUINT32 NNInputBufferDepth;
+ gctUINT32 NNAccumBufferDepth;
+ gctUINT32 TPEngine_PwlLUTCount;
+ gctUINT32 TPEngine_PwlLUTSize;
+ gctUINT32 VIP_SRAM_SIZE;
+ gctUINT32 TPEngine_CoreCount;
+ gctUINT32 AXI_SRAM_SIZE;
+ gctUINT32 NN_INIMAGE_OFFSET_BITS;
+ gctUINT32 TP_REORDER_INIMAGE_SIZE;
+ gctUINT32 TPLite_CoreCount;
+ gctUINT32 NNFP16_XYDP_X;
+ gctUINT32 NNFP16_XYDP_Y;
+ gctUINT32 NNFP16_ZDP;
+ gctUINT32 NN_LANES_PER_OUT_CYCLE;
+ gctUINT32 MAX_OT_NUMBER;
+ gctUINT32 EQUIVALENT_VIP_SRAM_WIDTH_INBYTE;
+ gctUINT32 TP_ZRL_BITS;
+ gctUINT32 LATENCY_HIDING_AT_FULL_AXI_BW;
+ gctUINT32 AXI_BUS_WIDTH;
+ gctUINT32 REG_FastClear:1;
+ gctUINT32 REG_SpecialAntiAliasing:1;
+ gctUINT32 REG_Pipe3D:1;
+ gctUINT32 REG_DXTTextureCompression:1;
+ gctUINT32 REG_DebugMode:1;
+ gctUINT32 REG_ZCompression:1;
+ gctUINT32 REG_YUV420Filter:1;
+ gctUINT32 REG_MSAA:1;
+ gctUINT32 REG_DC:1;
+ gctUINT32 REG_Pipe2D:1;
+ gctUINT32 REG_ETC1TextureCompression:1;
+ gctUINT32 REG_FastScaler:1;
+ gctUINT32 REG_HighDynamicRange:1;
+ gctUINT32 REG_YUV420Tiler:1;
+ gctUINT32 REG_ModuleCG:1;
+ gctUINT32 REG_MinArea:1;
+ gctUINT32 REG_NoEZ:1;
+ gctUINT32 REG_No422Texture:1;
+ gctUINT32 REG_BufferInterleaving:1;
+ gctUINT32 REG_ByteWrite2D:1;
+ gctUINT32 REG_NoScaler:1;
+ gctUINT32 REG_YUY2Averaging:1;
+ gctUINT32 REG_HalfPECache:1;
+ gctUINT32 REG_HalfTXCache:1;
+ gctUINT32 REG_YUY2RenderTarget:1;
+ gctUINT32 REG_Mem32BitSupport:1;
+ gctUINT32 REG_PipeVG:1;
+ gctUINT32 REG_VGTS:1;
+ gctUINT32 REG_FE20:1;
+ gctUINT32 REG_ByteWrite3D:1;
+ gctUINT32 REG_RsYuvTarget:1;
+ gctUINT32 REG_FE20BitIndex:1;
+ gctUINT32 REG_FlipY:1;
+ gctUINT32 REG_DualReturnBus:1;
+ gctUINT32 REG_EndiannessConfig:1;
+ gctUINT32 REG_Texture8K:1;
+ gctUINT32 REG_CorrectTextureConverter:1;
+ gctUINT32 REG_SpecialMsaaLod:1;
+ gctUINT32 REG_FastClearFlush:1;
+ gctUINT32 REG_2DPE20:1;
+ gctUINT32 REG_CorrectAutoDisable:1;
+ gctUINT32 REG_Render8K:1;
+ gctUINT32 REG_TileStatus2Bits:1;
+ gctUINT32 REG_SeparateTileStatusWhenInterleaved:1;
+ gctUINT32 REG_SuperTiled32x32:1;
+ gctUINT32 REG_VG20:1;
+ gctUINT32 REG_TSExtendedCommands:1;
+ gctUINT32 REG_CompressionFifoFixed:1;
+ gctUINT32 REG_ExtraShaderInstructions0:1;
+ gctUINT32 REG_VGFilter:1;
+ gctUINT32 REG_VG21:1;
+ gctUINT32 REG_ShaderGetsW:1;
+ gctUINT32 REG_ExtraShaderInstructions1:1;
+ gctUINT32 REG_DefaultReg0:1;
+ gctUINT32 REG_MC20:1;
+ gctUINT32 REG_ShaderMSAASideband:1;
+ gctUINT32 REG_BugFixes0:1;
+ gctUINT32 REG_VAA:1;
+ gctUINT32 REG_BypassInMSAA:1;
+ gctUINT32 REG_HierarchicalZ:1;
+ gctUINT32 REG_NewTexture:1;
+ gctUINT32 REG_A8TargetSupport:1;
+ gctUINT32 REG_CorrectStencil:1;
+ gctUINT32 REG_EnhanceVR:1;
+ gctUINT32 REG_RSUVSwizzle:1;
+ gctUINT32 REG_V2Compression:1;
+ gctUINT32 REG_VGDoubleBuffer:1;
+ gctUINT32 REG_BugFixes1:1;
+ gctUINT32 REG_BugFixes2:1;
+ gctUINT32 REG_TextureStride:1;
+ gctUINT32 REG_BugFixes3:1;
+ gctUINT32 REG_CorrectAutoDisable1:1;
+ gctUINT32 REG_AutoRestartTS:1;
+ gctUINT32 REG_BugFixes4:1;
+ gctUINT32 REG_L2Windowing:1;
+ gctUINT32 REG_HalfFloatPipe:1;
+ gctUINT32 REG_PixelDither:1;
+ gctUINT32 REG_TwoStencilReference:1;
+ gctUINT32 REG_ExtendedPixelFormat:1;
+ gctUINT32 REG_CorrectMinMaxDepth:1;
+ gctUINT32 REG_DitherAndFilterPlusAlpha2D:1;
+ gctUINT32 REG_BugFixes5:1;
+ gctUINT32 REG_New2D:1;
+ gctUINT32 REG_NewFloatingPointArithmetic:1;
+ gctUINT32 REG_TextureHorizontalAlignmentSelect:1;
+ gctUINT32 REG_NonPowerOfTwo:1;
+ gctUINT32 REG_LinearTextureSupport:1;
+ gctUINT32 REG_Halti0:1;
+ gctUINT32 REG_CorrectOverflowVG:1;
+ gctUINT32 REG_NegativeLogFix:1;
+ gctUINT32 REG_ResolveOffset:1;
+ gctUINT32 REG_OkToGateAxiClock:1;
+ gctUINT32 REG_MMU:1;
+ gctUINT32 REG_WideLine:1;
+ gctUINT32 REG_BugFixes6:1;
+ gctUINT32 REG_FcFlushStall:1;
+ gctUINT32 REG_LineLoop:1;
+ gctUINT32 REG_LogicOp:1;
+ gctUINT32 REG_SeamlessCubeMap:1;
+ gctUINT32 REG_SuperTiledTexture:1;
+ gctUINT32 REG_LinearPE:1;
+ gctUINT32 REG_RectPrimitive:1;
+ gctUINT32 REG_Composition:1;
+ gctUINT32 REG_CorrectAutoDisableCountWidth:1;
+ gctUINT32 REG_PESwizzle:1;
+ gctUINT32 REG_EndEvent:1;
+ gctUINT32 REG_S1S8:1;
+ gctUINT32 REG_Halti1:1;
+ gctUINT32 REG_RGB888:1;
+ gctUINT32 REG_TX_YUVAssembler:1;
+ gctUINT32 REG_DynamicFrequencyScaling:1;
+ gctUINT32 REG_TXFilter:1;
+ gctUINT32 REG_FullDirectFB:1;
+ gctUINT32 REG_OnePass2DFilter:1;
+ gctUINT32 REG_ThreadWalkerInPS:1;
+ gctUINT32 REG_TileFiller:1;
+ gctUINT32 REG_YUVStandard:1;
+ gctUINT32 REG_MultiSourceBlt:1;
+ gctUINT32 REG_YUVConversion:1;
+ gctUINT32 REG_FlushFixed2D:1;
+ gctUINT32 REG_Interleaver:1;
+ gctUINT32 REG_MixedStreams:1;
+ gctUINT32 REG_L2CacheFor2D420:1;
+ gctUINT32 REG_BugFixes7:1;
+ gctUINT32 REG_NoIndexPattern:1;
+ gctUINT32 REG_TextureTileStatus:1;
+ gctUINT32 REG_DecompressZ16:1;
+ gctUINT32 REG_BugFixes8:1;
+ gctUINT32 REG_DERotationStallFix:1;
+ gctUINT32 REG_OclOnly:1;
+ gctUINT32 REG_NewFeatures0:1;
+ gctUINT32 REG_InstructionCache:1;
+ gctUINT32 REG_GeometryShader:1;
+ gctUINT32 REG_TexCompressionSupertiled:1;
+ gctUINT32 REG_Generics:1;
+ gctUINT32 REG_BugFixes9:1;
+ gctUINT32 REG_FastMSAA:1;
+ gctUINT32 REG_WClip:1;
+ gctUINT32 REG_BugFixes10:1;
+ gctUINT32 REG_UnifiedSamplers:1;
+ gctUINT32 REG_BugFixes11:1;
+ gctUINT32 REG_PerformanceCounters:1;
+ gctUINT32 REG_ExtraShaderInstructions2:1;
+ gctUINT32 REG_BugFixes12:1;
+ gctUINT32 REG_BugFixes13:1;
+ gctUINT32 REG_DEEnhancements1:1;
+ gctUINT32 REG_ACE:1;
+ gctUINT32 REG_TXEnhancements1:1;
+ gctUINT32 REG_SHEnhancements1:1;
+ gctUINT32 REG_SHEnhancements2:1;
+ gctUINT32 REG_PEEnhancements1:1;
+ gctUINT32 REG_DEEnhancements2:1;
+ gctUINT32 REG_BugFixes14:1;
+ gctUINT32 REG_PowerOptimizations0:1;
+ gctUINT32 REG_NewHZ:1;
+ gctUINT32 REG_BugFixes15:1;
+ gctUINT32 REG_DEEnhancements3:1;
+ gctUINT32 REG_SHEnhancements3:1;
+ gctUINT32 REG_SHEnhancements4:1;
+ gctUINT32 REG_TXEnhancements2:1;
+ gctUINT32 REG_FEEnhancements1:1;
+ gctUINT32 REG_PEEnhancements2:1;
+ gctUINT32 REG_PAEnhancements1:1;
+ gctUINT32 REG_DENoGamma:1;
+ gctUINT32 REG_PAEnhancements2:1;
+ gctUINT32 REG_DEEnhancements4:1;
+ gctUINT32 REG_PEEnhancements3:1;
+ gctUINT32 REG_HIEnhancements1:1;
+ gctUINT32 REG_TXEnhancements3:1;
+ gctUINT32 REG_SHEnhancements5:1;
+ gctUINT32 REG_FEEnhancements2:1;
+ gctUINT32 REG_BugFixes16:1;
+ gctUINT32 REG_DEEnhancements5:1;
+ gctUINT32 REG_TXEnhancements4:1;
+ gctUINT32 REG_PEEnhancements4:1;
+ gctUINT32 REG_MCEnhancements1:1;
+ gctUINT32 REG_Halti2:1;
+ gctUINT32 REG_DEMirrorRotate:1;
+ gctUINT32 REG_SmallMSAA:1;
+ gctUINT32 REG_BugFixes17:1;
+ gctUINT32 REG_Rasterizer2:1;
+ gctUINT32 REG_DualPipeOPF:1;
+ gctUINT32 REG_MultiSrcV2:1;
+ gctUINT32 REG_CSCV2:1;
+ gctUINT32 REG_PAEnhancements3:1;
+ gctUINT32 REG_BugFixes18:1;
+ gctUINT32 REG_Compression2D:1;
+ gctUINT32 REG_Probe:1;
+ gctUINT32 REG_MediumPrecision:1;
+ gctUINT32 REG_DESupertile:1;
+ gctUINT32 REG_BugFixes19:1;
+ gctUINT32 REG_SHEnhancements6:1;
+ gctUINT32 REG_SHEnhancements7:1;
+ gctUINT32 REG_BugFixes20:1;
+ gctUINT32 REG_DEAddress40:1;
+ gctUINT32 REG_MiniMMUFix:1;
+ gctUINT32 REG_EEZ:1;
+ gctUINT32 REG_BugFixes21:1;
+ gctUINT32 REG_ExtraVgCaps:1;
+ gctUINT32 REG_MultiSrcV15:1;
+ gctUINT32 REG_BugFixes22:1;
+ gctUINT32 REG_Halti3:1;
+ gctUINT32 REG_TessellationShaders:1;
+ gctUINT32 REG_OPF9Tap:1;
+ gctUINT32 REG_MultiSrcV2StrQuad:1;
+ gctUINT32 REG_SeperateSRCAndDstCache:1;
+ gctUINT32 REG_Halti4:1;
+ gctUINT32 REG_RAWriteDepth:1;
+ gctUINT32 REG_AndroidOnly:1;
+ gctUINT32 REG_HasChipProductReg:1;
+ gctUINT32 REG_TXSupportDEC:1;
+ gctUINT32 REG_S8MSAACompression:1;
+ gctUINT32 REG_BugFixesIn544:1;
+ gctUINT32 REG_L2CacheRemove:1;
+ gctUINT32 REG_FEAllowRndVtxCnt:1;
+ gctUINT32 REG_CubeMapFL28:1;
+ gctUINT32 REG_TX6bitFrac:1;
+ gctUINT32 REG_FEAllowStallPrefetchEng:1;
+ gctUINT32 REG_ThirdPartyCompression:1;
+ gctUINT32 REG_RSS8:1;
+ gctUINT32 REG_MSAACoherencyCheck:1;
+ gctUINT32 REG_Halti5:1;
+ gctUINT32 REG_Evis:1;
+ gctUINT32 REG_BltEngine:1;
+ gctUINT32 REG_BugFixes23:1;
+ gctUINT32 REG_BugFixes24:1;
+ gctUINT32 REG_DEC:1;
+ gctUINT32 REG_VSTileNV12:1;
+ gctUINT32 REG_VSTileNV12_10BIT:1;
+ gctUINT32 RenderTarget8:1;
+ gctUINT32 TxLodFlowCorrection:1;
+ gctUINT32 FaceLod:1;
+ gctUINT32 MultiCoreSemaphoreStallV2:1;
+ gctUINT32 VMSAA:1;
+ gctUINT32 ChipEnableLink:1;
+ gctUINT32 MULTI_SRC_BLT_1_5_ENHANCEMENT:1;
+ gctUINT32 MULTI_SRC_BLT_BILINEAR_FILTER:1;
+ gctUINT32 RA_HZEZ_CLOCK_CONTROL:1;
+ gctUINT32 CACHE128B256BPERLINE:1;
+ gctUINT32 V4Compression:1;
+ gctUINT32 PE2D_MAJOR_SUPER_TILE:1;
+ gctUINT32 PE_32BPC_COLORMASK_FIX:1;
+ gctUINT32 ALPHA_BLENDING_OPT:1;
+ gctUINT32 NEW_GPIPE:1;
+ gctUINT32 PIPELINE_32_ATTRIBUTES:1;
+ gctUINT32 MSAA_SHADING:1;
+ gctUINT32 NO_ANISTRO_FILTER:1;
+ gctUINT32 NO_ASTC:1;
+ gctUINT32 NO_DXT:1;
+ gctUINT32 HWTFB:1;
+ gctUINT32 RA_DEPTH_WRITE_MSAA1X_FIX:1;
+ gctUINT32 EZHZ_CLOCKGATE_FIX:1;
+ gctUINT32 SH_SNAP2PAGE_FIX:1;
+ gctUINT32 SH_HALFDEPENDENCY_FIX:1;
+ gctUINT32 USC_MCFILL_FIX:1;
+ gctUINT32 TPG_TCPERF_FIX:1;
+ gctUINT32 USC_MDFIFO_OVERFLOW_FIX:1;
+ gctUINT32 SH_TEXLD_BARRIER_IN_CS_FIX:1;
+ gctUINT32 RS_NEW_BASEADDR:1;
+ gctUINT32 PE_8bpp_DUALPIPE_FIX:1;
+ gctUINT32 SH_ADVANCED_INSTR:1;
+ gctUINT32 SH_FLAT_INTERPOLATION_DUAL16_FIX:1;
+ gctUINT32 USC_CONTINUOUS_FLUS_FIX:1;
+ gctUINT32 SH_SUPPORT_V4:1;
+ gctUINT32 SH_SUPPORT_ALPHA_KILL:1;
+ gctUINT32 PE_NO_ALPHA_TEST:1;
+ gctUINT32 TX_LOD_NEAREST_SELECT:1;
+ gctUINT32 SH_FIX_LDEXP:1;
+ gctUINT32 SUPPORT_MOVAI:1;
+ gctUINT32 SH_SNAP2PAGE_MAXPAGES_FIX:1;
+ gctUINT32 PE_RGBA16I_FIX:1;
+ gctUINT32 BLT_8bpp_256TILE_FC_FIX:1;
+ gctUINT32 PE_64bit_FENCE_FIX:1;
+ gctUINT32 USC_FULL_CACHE_FIX:1;
+ gctUINT32 TX_YUV_ASSEMBLER_10BIT:1;
+ gctUINT32 FE_32bit_INDEX_FIX:1;
+ gctUINT32 BLT_64bpp_MASKED_CLEAR_FIX:1;
+ gctUINT32 SECURITY:1;
+ gctUINT32 ROBUSTNESS:1;
+ gctUINT32 USC_ATOMIC_FIX:1;
+ gctUINT32 SH_PSO_MSAA1x_FIX:1;
+ gctUINT32 USC_VX_PERF_FIX:1;
+ gctUINT32 USC_GOS_ADDR_FIX:1;
+ gctUINT32 TX_8bit_UVFrac:1;
+ gctUINT32 TX_DESC_CACHE_CLOCKGATE_FIX:1;
+ gctUINT32 RSBLT_MSAA_DECOMPRESSION:1;
+ gctUINT32 TX_INTEGER_COORDINATE:1;
+ gctUINT32 DRAWID:1;
+ gctUINT32 PSIO_SAMPLEMASK_IN_R0ZW_FIX:1;
+ gctUINT32 TX_INTEGER_COORDINATE_V2:1;
+ gctUINT32 MULTI_CORE_BLOCK_SET_CONFIG:1;
+ gctUINT32 SNAPPAGE_CMD:1;
+ gctUINT32 SH_NO_INDEX_CONST_ON_A0:1;
+ gctUINT32 SH_NO_ONECONST_LIMIT:1;
+ gctUINT32 SH_IMG_LDST_ON_TEMP:1;
+ gctUINT32 COMPUTE_ONLY:1;
+ gctUINT32 SH_IMG_LDST_CLAMP:1;
+ gctUINT32 SH_ICACHE_ALLOC_COUNT_FIX:1;
+ gctUINT32 SH_ICACHE_PREFETCH:1;
+ gctUINT32 PE2D_SEPARATE_CACHE:1;
+ gctUINT32 PE_MSAA_OQ_FIX:1;
+ gctUINT32 PSIO_MSAA_CL_FIX:1;
+ gctUINT32 USC_DEFER_FILL_FIX:1;
+ gctUINT32 SH_CLOCK_GATE_FIX:1;
+ gctUINT32 FE_NEED_DUMMYDRAW:1;
+ gctUINT32 PE2D_LINEAR_YUV420_OUTPUT:1;
+ gctUINT32 PE2D_LINEAR_YUV420_10BIT:1;
+ gctUINT32 MULTI_CLUSTER:1;
+ gctUINT32 SH_MULTI_WG_PACK:1;
+ gctUINT32 SH_DUAL16_SAMPLEMASK_ZW:1;
+ gctUINT32 TPG_TRIVIAL_MODE_FIX:1;
+ gctUINT32 TX_ASTC_MULTISLICE_FIX:1;
+ gctUINT32 FE_ROBUST_FIX:1;
+ gctUINT32 SH_GPIPE_ACCESS_FULLTEMPS:1;
+ gctUINT32 PSIO_INTERLOCK:1;
+ gctUINT32 PA_WIDELINE_FIX:1;
+ gctUINT32 WIDELINE_HELPER_FIX:1;
+ gctUINT32 G2D_3rd_PARTY_COMPRESSION_1_1:1;
+ gctUINT32 TX_FLUSH_L1CACHE:1;
+ gctUINT32 PE_DITHER_FIX2:1;
+ gctUINT32 SH_TEXLD_U_FIX:1;
+ gctUINT32 MC_FCCACHE_BYTEMASK:1;
+ gctUINT32 SH_MULTI_WG_PACK_FIX:1;
+ gctUINT32 PE_ADVANCE_BLEND_PART0:1;
+ gctUINT32 FE_PATCHLIST_FETCH_FIX:1;
+ gctUINT32 RA_CG_FIX:1;
+ gctUINT32 DEC400:1;
+ gctUINT32 LS_SUPPORT_PERCOMP_DEPENDENCY:1;
+ gctUINT32 MULTI_CORE_BLOCK_SET_CONFIG2:1;
+ gctUINT32 PE_VMSAA_COVERAGE_CACHE_FIX:1;
+ gctUINT32 SECURITY_AHB:1;
+ gctUINT32 MULTICORE_SEMAPHORESTALL_V3:1;
+ gctUINT32 SMALLBATCH:1;
+ gctUINT32 SH_CMPLX:1;
+ gctUINT32 SH_IDIV0_SWZL_EHS:1;
+ gctUINT32 TX_LERP_LESS_BIT:1;
+ gctUINT32 SH_GM_ENDIAN:1;
+ gctUINT32 SH_GM_USC_UNALLOC:1;
+ gctUINT32 SH_END_OF_BB:1;
+ gctUINT32 TX_BORDER_CLAMP_FIX:1;
+ gctUINT32 SH_IMG_LD_LASTPIXEL_FIX:1;
+ gctUINT32 ASYNC_BLT:1;
+ gctUINT32 ASYNC_FE_FENCE_FIX:1;
+ gctUINT32 PSCS_THROTTLE:1;
+ gctUINT32 SEPARATE_LS:1;
+ gctUINT32 WIDELINE_TRIANGLE_EMU:1;
+ gctUINT32 FENCE_32BIT:1;
+ gctUINT32 FENCE_64BIT:1;
+ gctUINT32 PE_DEPTH_ONLY_OQFIX:1;
+ gctUINT32 TX_SEAMLESS_CUBE:1;
+ gctUINT32 TX_SNORM_SUPPORT:1;
+ gctUINT32 SH_SCATTER_GATHER:1;
+ gctUINT32 HWMANAGED_LS:1;
+ gctUINT32 SH_IMAGE_ENABLE_FIX:1;
+ gctUINT32 MSAA_FRAGMENT_OPERATION:1;
+ gctUINT32 PE_TILE_CACHE_FLUSH_FIX:1;
+ gctUINT32 BLT_YUV_OUTPUT:1;
+ gctUINT32 SH_IO_CG_FIX:1;
+ gctUINT32 PE_SWIZZLE:1;
+ gctUINT32 SH_ROBUSTNESS_FIX:1;
+ gctUINT32 USC_ATOMIC_FIX2:1;
+ gctUINT32 PE_A8B8G8R8:1;
+ gctUINT32 MULTIVIEW_RENDER:1;
+ gctUINT32 FE_DRAW_DIRECT:1;
+ gctUINT32 TX_VKBORDER_MODE:1;
+ gctUINT32 TX_UNNORMALIZED_COORD:1;
+ gctUINT32 PA_LINECLIP_FIX:1;
+ gctUINT32 TX_8bit_UVFrac_ROUNDING_FIX:1;
+ gctUINT32 MP_ARCH:1;
+ gctUINT32 TX_NO_FIXED_FILTER:1;
+ gctUINT32 SHARE_Z:1;
+ gctUINT32 DE_2D_FAST_CLEAR:1;
+ gctUINT32 TX_CLEAR_PENDING_FIX:1;
+ gctUINT32 NO_HI1_L2:1;
+ gctUINT32 USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX:1;
+ gctUINT32 VG_TS_CULLING:1;
+ gctUINT32 VG_FP25:1;
+ gctUINT32 VG_AYUV_INPUT_OUTPUT:1;
+ gctUINT32 VG_DOUBLE_IMAGE:1;
+ gctUINT32 VG_RECTANGLE_STRIPE_MODE:1;
+ gctUINT32 VG_MMU:1;
+ gctUINT32 VG_IM_FILTER:1;
+ gctUINT32 VG_IM_YUV_PACKET:1;
+ gctUINT32 VG_IM_YUV_PLANAR:1;
+ gctUINT32 VG_PE_YUV_PACKET:1;
+ gctUINT32 VG_COLOR_PRECISION_8_BIT:1;
+ gctUINT32 VG_RESOLVE_ENGINE:1;
+ gctUINT32 VG_PE_COLOR_KEY:1;
+ gctUINT32 VG_IM_INDEX_FORMAT:1;
+ gctUINT32 VG_RESOLUTION_8K:1;
+ gctUINT32 VG_IMAGE_16K:1;
+ gctUINT32 VG_FORMAT_ARGB2222:1;
+ gctUINT32 G2D_DEC400:1;
+ gctUINT32 DC_OVERLAY_SCALING:1;
+ gctUINT32 DC_SOURCE_ROTATION:1;
+ gctUINT32 DC_TILED:1;
+ gctUINT32 DC_YUV_L1:1;
+ gctUINT32 DC_D30_OUTPUT:1;
+ gctUINT32 DC_MMU:1;
+ gctUINT32 DC_COMPRESSION:1;
+ gctUINT32 DC_QOS:1;
+ gctUINT32 EVIS_NO_ABSDIFF:1;
+ gctUINT32 EVIS_NO_BITREPLACE:1;
+ gctUINT32 EVIS_NO_BOXFILTER:1;
+ gctUINT32 EVIS_NO_CORDIAC:1;
+ gctUINT32 EVIS_NO_DP32:1;
+ gctUINT32 EVIS_NO_FILTER:1;
+ gctUINT32 EVIS_NO_IADD:1;
+ gctUINT32 EVIS_NO_SELECTADD:1;
+ gctUINT32 EVIS_LERP_7OUTPUT:1;
+ gctUINT32 EVIS_ACCSQ_8OUTPUT:1;
+ gctUINT32 EVIS_VX2:1;
+ gctUINT32 NN_FLOAT:1;
+ gctUINT32 TP_ENGINE:1;
+ gctUINT32 VIP_V7:1;
+ gctUINT32 MCFE:1;
+ gctUINT32 NN_INTERLEVE8:1;
+ gctUINT32 TP_REORDER:1;
+ gctUINT32 TP_LRN:1;
+ gctUINT32 TP_MAX_POOLING_STRIDE1:1;
+ gctUINT32 NN_FP16_ALU:1;
+ gctUINT32 NN_INT16_ALU:1;
+ gctUINT32 TP_ROI_POOLING:1;
+ gctUINT32 NN_ZDP3:1;
+ gctUINT32 NN_ZDP6:1;
+ gctUINT32 NN_XYDP9:1;
+ gctUINT32 NN_INT8_SCALE:1;
+ gctUINT32 NN_POWER_ISOLATION:1;
+ gctUINT32 SWTILING_PHASE1:1;
+ gctUINT32 TF_QUANTIZATION:1;
+ gctUINT32 TP_SIMPLE_INT16:1;
+ gctUINT32 TP_REAL_INT16:1;
+ gctUINT32 TP_BFLOAT16:1;
+ gctUINT32 NN_FIRST_PIXEL_POOLING:1;
+ gctUINT32 SWTILING_PHASE2:1;
+ gctUINT32 NN_STRIDE_SUPPORT:1;
+ gctUINT32 NN_XYDP6:1;
+ gctUINT32 TP_REORDER_FIX:1;
+ gctUINT32 NN_CONV1x1_PERF_FIX:1;
+ gctUINT32 NN_CACHELINE_MODE_PERF_FIX:1;
+ gctUINT32 NN_PER3DTILE_BUBBLE_FIX:1;
+ gctUINT32 NN_CONVOUT_FIFO_DEPTH_FIX:1;
+ gctUINT32 SWTILING_PHASE3:1;
+ gctUINT32 USC_STAY_LRU:1;
+ gctUINT32 NN_NONZERO_MIRROR_BORDER:1;
+ gctUINT32 NN_COEF_DECOMPRESS_PERF2X:1;
+ gctUINT32 INPUT_4BIT:1;
+ gctUINT32 COEF_COMPRESSION_ENHANCEMENT:1;
+ gctUINT32 NN_ZXDP3_KERNEL_READ_CONFLICT_FIX:1;
+ gctUINT32 NN_ZDP3_NO_COMPRESS_FIX:1;
+ gctUINT32 NN_ASYNC_COPY_PERF_FIX:1;
+ gctUINT32 OCB_COUNTER:1;
+ gctUINT32 NN_XYDP0:1;
+ gctUINT32 ZRL_7BIT:1;
+ gctUINT32 NN_ASYNC_COPY_MERGE_FIX:1;
+ gctUINT32 NN_SMALLBATCH_PHASE1:1;
+ gctUINT32 TP_SMALLBATCH_PHASE1:1;
+ gctUINT32 SCALER:1;
+ gctUINT32 SCALER_4K:1;
+ gctUINT32 NN_REQ_SLOWARBITRATION_FIX:1;
+ gctUINT32 IMAGE_PARTIAL_CACHE:1;
+ gctUINT32 FULLCACHE_KERNELHEAD_FIX:1;
+ gctUINT32 NN_SINGLEPORT_ACCUMBUFFER:1;
+ gctUINT32 NN_SMALLBATCH:1;
+ gctUINT32 TP_SMALLBATCH:1;
+ gctUINT32 ZRL_8BIT:1;
+ gctUINT32 NN_DEPTHWISE_SUPPORT:1;
+ gctUINT32 NN_WRITE_WITHOUT_USC:1;
+ gctUINT32 NN_ZDP_INIMAGE_SIZE_FIX:1;
+ gctUINT32 HI_REORDER_FIX:1;
+ gctUINT32 INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX:1;
+ gctUINT32 TP_COEF_COMPRESSION_ENHANCEMENT:1;
+ gctUINT32 VIP_DEC400:1;
+ gctUINT32 IMAGE_NOT_PACKED_IN_SRAM_FIX:1;
+ gctUINT32 IDLE_BEFORE_FLUSH_COMPLETE_FIX:1;
+ gctUINT32 NO_FLUSH_USC_FIX:1;
+ gctUINT32 COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX:1;
+ gctUINT32 XY_OFFSET_LIMITATION_FIX:1;
+ gctUINT32 USC_INVALIDATE_CACHE_LINE_FIX:1;
+ gctUINT32 LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX:1;
+ gctUINT32 KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX:1;
+ gctUINT32 USC_BOTTLENECK_FIX:1;
+ gctUINT32 KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX:1;
+ gctUINT32 FULLCACHE_KERNEL_INTERLEAVE_FIX:1;
+ gctUINT32 TP_REORDER_LAYER_SUSPEND_FIX:1;
+ gctUINT32 KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX:1;
+ gctUINT32 IMG_POP_PIPELINE_PAUSE_FIX:1;
+ gctUINT32 DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX:1;
+ gctUINT32 OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX:1;
+ gctUINT32 NN_PER_CHANNEL_POST_MULTIPLY:1;
+ gctUINT32 NN_NO_Z_LOCATION_OFFSET:1;
+ gctUINT32 NN_PRELU:1;
+ gctUINT32 OCB_REMAP_PHYSICAL_ADDRESS:1;
+ gctUINT32 NN_SLICE_PADDING_TO_64BYTE_ALIGN:1;
+ gctUINT32 NN_DW_1x1_CONV_MERGE:1;
+ gctUINT32 NN_SLOW_OUTPUT:1;
+ gctUINT32 NO_NARROW_POST_PROCESS_PIPE:1;
+ gctUINT32 TP_NN_PROBE:1;
+ gctUINT32 TP_23BITS_POST_MULTIPLIER:1;
+ gctUINT32 NN_TRANSPOSE:1;
+ gctUINT32 EVIS2_FLOP_RESET_FIX:1;
+ gctUINT32 USC_ASYNC_CP_RTN_FLOP_RESET_FIX:1;
+} gcsFEATURE_DATABASE;
+
+static gcsFEATURE_DATABASE gChipInfo[] = {
+ /* dc0000_5550 */
+ {
+ 0x0, /* ChipID */
+ 0x5550, /* ChipRevision */
+ 0x12000000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x300, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x1, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 0x0, /* gcFEATURE_BIT_DC_OVERLAY_SCALING */
+ 0x1, /* gcFEATURE_BIT_DC_SOURCE_ROTATION */
+ 0x1, /* gcFEATURE_BIT_DC_TILED */
+ 0x0, /* gcFEATURE_BIT_DC_YUV_L1 */
+ 0x0, /* gcFEATURE_BIT_DC_D30_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_DC_MMU */
+ 0x1, /* gcFEATURE_BIT_DC_COMPRESSION */
+ 0x1, /* gcFEATURE_BIT_DC_QOS */
+ 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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* dc0000_5560 */
+ {
+ 0x0, /* ChipID */
+ 0x5560, /* ChipRevision */
+ 0x2000002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x302, /* CustomerID */
+ 0x3, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x1, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 0x0, /* gcFEATURE_BIT_DC_OVERLAY_SCALING */
+ 0x0, /* gcFEATURE_BIT_DC_SOURCE_ROTATION */
+ 0x0, /* gcFEATURE_BIT_DC_TILED */
+ 0x1, /* gcFEATURE_BIT_DC_YUV_L1 */
+ 0x1, /* gcFEATURE_BIT_DC_D30_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_DC_MMU */
+ 0x0, /* gcFEATURE_BIT_DC_COMPRESSION */
+ 0x1, /* gcFEATURE_BIT_DC_QOS */
+ 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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc200_4650 */
+ {
+ 0x200, /* ChipID */
+ 0x4650, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x1, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc200_4621 */
+ {
+ 0x200, /* ChipID */
+ 0x4621, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x1, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_TextureHorizontalAlignmentSelect */
+ 0x0, /* gcFEATURE_BIT_REG_NonPowerOfTwo */
+ 0x0, /* gcFEATURE_BIT_REG_LinearTextureSupport */
+ 0x0, /* gcFEATURE_BIT_REG_Halti0 */
+ 0x0, /* 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 */
+ 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc300_4650 */
+ {
+ 0x300, /* ChipID */
+ 0x4650, /* ChipRevision */
+ 0x5203, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x5, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc300_4650_guoke */
+ {
+ 0x300, /* ChipID */
+ 0x4650, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x4, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc300_4_6_6_rc0 */
+ {
+ 0x300, /* ChipID */
+ 0x4660, /* ChipRevision */
+ 0x5203, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc320_5007 */
+ {
+ 0x320, /* ChipID */
+ 0x5007, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x100, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x8, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* gcFEATURE_BIT_REG_NewFloatingPointArithmetic */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc320_5220 */
+ {
+ 0x320, /* ChipID */
+ 0x5220, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x0, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc320_5303 */
+ {
+ 0x320, /* ChipID */
+ 0x5303, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc320_5303_1 */
+ {
+ 0x320, /* ChipID */
+ 0x5303, /* ChipRevision */
+ 0x5202, /* ProductID */
+ 0x1, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x4, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc320_5340 */
+ {
+ 0x320, /* ChipID */
+ 0x5340, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x4, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc320c_5341 */
+ {
+ 0x320, /* ChipID */
+ 0x5341, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0xc, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_VAA */
+ 0x0, /* gcFEATURE_BIT_REG_BypassInMSAA */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* gcFEATURE_BIT_REG_VGDoubleBuffer */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes1 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes2 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_VMSAA */
+ 0x0, /* gcFEATURE_BIT_ChipEnableLink */
+ 0x1, /* gcFEATURE_BIT_MULTI_SRC_BLT_1_5_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_MULTI_SRC_BLT_BILINEAR_FILTER */
+ 0x0, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x1, /* gcFEATURE_BIT_V4Compression */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc320_5341 */
+ {
+ 0x320, /* ChipID */
+ 0x5341, /* ChipRevision */
+ 0x3202, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520l_5_3_5_rc0 */
+ {
+ 0x320, /* ChipID */
+ 0x5350, /* ChipRevision */
+ 0x5202, /* ProductID */
+ 0x0, /* EcoID */
+ 0x206, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc355_v121_rc5 */
+ {
+ 0x355, /* ChipID */
+ 0x1215, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc355_v121x */
+ {
+ 0x355, /* ChipID */
+ 0x1217, /* ChipRevision */
+ 0x3003550, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_VG_RESOLVE_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x1, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc355_8Kx8K */
+ {
+ 0x355, /* ChipID */
+ 0x1217, /* ChipRevision */
+ 0x3003550, /* ProductID */
+ 0x0, /* EcoID */
+ 0x407, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_VG_RESOLVE_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x1, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x1, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc355_16K */
+ {
+ 0x355, /* ChipID */
+ 0x1217, /* ChipRevision */
+ 0x3003550, /* ProductID */
+ 0x0, /* EcoID */
+ 0x408, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_VG_RESOLVE_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x1, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x1, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x1, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc400_4633 */
+ {
+ 0x400, /* ChipID */
+ 0x4633, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x80, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x80, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc600_4633 */
+ {
+ 0x600, /* ChipID */
+ 0x4633, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x80, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x80, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc400_4645 */
+ {
+ 0x400, /* ChipID */
+ 0x4645, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x4, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x80, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x240, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x80, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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 */
+ 0x1, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc400L_0x465x */
+ {
+ 0x400, /* ChipID */
+ 0x4652, /* ChipRevision */
+ 0x70001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x7, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x80, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x80, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000nano_0x4652 */
+ {
+ 0x400, /* ChipID */
+ 0x4652, /* ChipRevision */
+ 0x70001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x7, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x80, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x80, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000nano_0x4652 */
+ {
+ 0x400, /* ChipID */
+ 0x4652, /* ChipRevision */
+ 0x70001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x100, /* CustomerID */
+ 0x9, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x80, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x80, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc420_5325 */
+ {
+ 0x420, /* ChipID */
+ 0x5325, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x2, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x1, /* gcFEATURE_BIT_REG_WClip */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x1, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes14 */
+ 0x0, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x0, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes15 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_FEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DENoGamma */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements2 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc420_5336 */
+ {
+ 0x420, /* ChipID */
+ 0x5336, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x3, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x1, /* gcFEATURE_BIT_REG_WClip */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x1, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes14 */
+ 0x0, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x0, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes15 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_FEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DENoGamma */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements2 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc420cpd_533rc7a */
+ {
+ 0x420, /* ChipID */
+ 0x5337, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x1, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x1, /* gcFEATURE_BIT_REG_WClip */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x1, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes14 */
+ 0x0, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x0, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes15 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_FEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_DENoGamma */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements2 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV2 */
+ 0x0, /* gcFEATURE_BIT_REG_CSCV2 */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes18 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc428_5421 */
+ {
+ 0x428, /* ChipID */
+ 0x5421, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x1, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x1, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_ACE */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc428c_5_4_2_rc3a */
+ {
+ 0x428, /* ChipID */
+ 0x5423, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x1, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x1, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_ACE */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2 */
+ 0x1, /* gcFEATURE_BIT_REG_CSCV2 */
+ 0x0, /* gcFEATURE_BIT_REG_PAEnhancements3 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes18 */
+ 0x1, /* gcFEATURE_BIT_REG_Compression2D */
+ 0x0, /* gcFEATURE_BIT_REG_Probe */
+ 0x0, /* gcFEATURE_BIT_REG_MediumPrecision */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* gcFEATURE_BIT_REG_MiniMMUFix */
+ 0x0, /* gcFEATURE_BIT_REG_EEZ */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes21 */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraVgCaps */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV15 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes22 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti3 */
+ 0x0, /* gcFEATURE_BIT_REG_TessellationShaders */
+ 0x0, /* gcFEATURE_BIT_REG_OPF9Tap */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520_5341 */
+ {
+ 0x520, /* ChipID */
+ 0x5341, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520l_5341_rc1b */
+ {
+ 0x520, /* ChipID */
+ 0x5341, /* ChipRevision */
+ 0x5202, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520l_5341_rc1c */
+ {
+ 0x520, /* ChipID */
+ 0x5341, /* ChipRevision */
+ 0x5202, /* ProductID */
+ 0x0, /* EcoID */
+ 0x204, /* CustomerID */
+ 0x3, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes14 */
+ 0x0, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x0, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes15 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x1, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520_5540_rc0 */
+ {
+ 0x520, /* ChipID */
+ 0x5540, /* ChipRevision */
+ 0x5200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x1, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x0, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_ACE */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x1, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEC */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520l_5_3_4_rc2b */
+ {
+ 0x520, /* ChipID */
+ 0x5342, /* ChipRevision */
+ 0x5202, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x2, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_New2D */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x1, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_VMSAA */
+ 0x0, /* gcFEATURE_BIT_ChipEnableLink */
+ 0x1, /* gcFEATURE_BIT_MULTI_SRC_BLT_1_5_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_MULTI_SRC_BLT_BILINEAR_FILTER */
+ 0x0, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x1, /* gcFEATURE_BIT_V4Compression */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520c_5_5_0 */
+ {
+ 0x520, /* ChipID */
+ 0x5501, /* ChipRevision */
+ 0x5200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x3, /* CustomerID */
+ 0x2, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x1, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x1, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x0, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_ACE */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x1, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x0, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x1, /* gcFEATURE_BIT_V4Compression */
+ 0x1, /* 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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE2D_SEPARATE_CACHE */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520c_5_5_4_rc1 */
+ {
+ 0x520, /* ChipID */
+ 0x5541, /* ChipRevision */
+ 0x5200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x202, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x1, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x0, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x1, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEC */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520sp_5_5_2_rc0a */
+ {
+ 0x520, /* ChipID */
+ 0x5520, /* ChipRevision */
+ 0x5200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x1, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x1, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x1, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520_v552_rc1 */
+ {
+ 0x520, /* ChipID */
+ 0x5521, /* ChipRevision */
+ 0x5200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x1, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x1, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x1, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc520_5_5_3_rc2a */
+ {
+ 0x520, /* ChipID */
+ 0x5532, /* ChipRevision */
+ 0x5200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x1, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x1, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x0, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_ACE */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x1, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEC */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc600L_0x465x */
+ {
+ 0x600, /* ChipID */
+ 0x4652, /* ChipRevision */
+ 0x70005, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x7, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x1, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000nanoultra_4_6_5_rc3a */
+ {
+ 0x600, /* ChipID */
+ 0x4653, /* ChipRevision */
+ 0x70005, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x1, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000nanoultra_4_6_5_rc3b */
+ {
+ 0x600, /* ChipID */
+ 0x4653, /* ChipRevision */
+ 0x70005, /* ProductID */
+ 0x0, /* EcoID */
+ 0x101, /* CustomerID */
+ 0x2, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000nanoultra_4_6_5_rc3e */
+ {
+ 0x600, /* ChipID */
+ 0x4653, /* ChipRevision */
+ 0x70005, /* ProductID */
+ 0x0, /* EcoID */
+ 0x102, /* CustomerID */
+ 0x5, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000nanoultra_4_6_5_rc3e */
+ {
+ 0x600, /* ChipID */
+ 0x4653, /* ChipRevision */
+ 0x70005, /* ProductID */
+ 0x0, /* EcoID */
+ 0x104, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_HalfPECache */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x1, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc620_5_5_3_rc0 */
+ {
+ 0x620, /* ChipID */
+ 0x5530, /* ChipRevision */
+ 0x6200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x200, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x0, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x1, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc620_5_5_5_rc0d */
+ {
+ 0x620, /* ChipID */
+ 0x5550, /* ChipRevision */
+ 0x6200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x201, /* CustomerID */
+ 0x4, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x1, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x1, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x1, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc620s_5_5_5_rc1b */
+ {
+ 0x620, /* ChipID */
+ 0x5551, /* ChipRevision */
+ 0x6200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x203, /* CustomerID */
+ 0x2, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x1, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x1, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc620s_5_5_5_rc1b */
+ {
+ 0x620, /* ChipID */
+ 0x5551, /* ChipRevision */
+ 0x6200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x205, /* CustomerID */
+ 0x2, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x1, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x1, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc620tpc_5_5_6_rc0a */
+ {
+ 0x620, /* ChipID */
+ 0x5560, /* ChipRevision */
+ 0x6200, /* ProductID */
+ 0x0, /* EcoID */
+ 0x200, /* CustomerID */
+ 0x1, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x1, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x0, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* gcFEATURE_BIT_REG_DXTTextureCompression */
+ 0x0, /* gcFEATURE_BIT_REG_DebugMode */
+ 0x0, /* gcFEATURE_BIT_REG_ZCompression */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Filter */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x0, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x1, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x0, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* gcFEATURE_BIT_REG_NoEZ */
+ 0x1, /* gcFEATURE_BIT_REG_No422Texture */
+ 0x0, /* gcFEATURE_BIT_REG_BufferInterleaving */
+ 0x1, /* gcFEATURE_BIT_REG_ByteWrite2D */
+ 0x1, /* gcFEATURE_BIT_REG_NoScaler */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_ByteWrite3D */
+ 0x0, /* gcFEATURE_BIT_REG_RsYuvTarget */
+ 0x0, /* gcFEATURE_BIT_REG_FE20BitIndex */
+ 0x0, /* gcFEATURE_BIT_REG_FlipY */
+ 0x0, /* gcFEATURE_BIT_REG_DualReturnBus */
+ 0x0, /* gcFEATURE_BIT_REG_EndiannessConfig */
+ 0x0, /* gcFEATURE_BIT_REG_Texture8K */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectTextureConverter */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialMsaaLod */
+ 0x0, /* gcFEATURE_BIT_REG_FastClearFlush */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_VG20 */
+ 0x0, /* gcFEATURE_BIT_REG_TSExtendedCommands */
+ 0x0, /* gcFEATURE_BIT_REG_CompressionFifoFixed */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions0 */
+ 0x0, /* gcFEATURE_BIT_REG_VGFilter */
+ 0x0, /* gcFEATURE_BIT_REG_VG21 */
+ 0x0, /* gcFEATURE_BIT_REG_ShaderGetsW */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions1 */
+ 0x1, /* gcFEATURE_BIT_REG_DefaultReg0 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_A8TargetSupport */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectStencil */
+ 0x1, /* gcFEATURE_BIT_REG_EnhanceVR */
+ 0x0, /* gcFEATURE_BIT_REG_RSUVSwizzle */
+ 0x0, /* gcFEATURE_BIT_REG_V2Compression */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectOverflowVG */
+ 0x0, /* gcFEATURE_BIT_REG_NegativeLogFix */
+ 0x0, /* gcFEATURE_BIT_REG_ResolveOffset */
+ 0x1, /* gcFEATURE_BIT_REG_OkToGateAxiClock */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x0, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x1, /* gcFEATURE_BIT_REG_FlushFixed2D */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x0, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DEEnhancements5 */
+ 0x0, /* gcFEATURE_BIT_REG_TXEnhancements4 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x1, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x0, /* gcFEATURE_BIT_REG_SmallMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes17 */
+ 0x0, /* gcFEATURE_BIT_REG_Rasterizer2 */
+ 0x1, /* gcFEATURE_BIT_REG_DualPipeOPF */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DESupertile */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes19 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x1, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSrcV2StrQuad */
+ 0x1, /* gcFEATURE_BIT_REG_SeperateSRCAndDstCache */
+ 0x0, /* gcFEATURE_BIT_REG_Halti4 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x1, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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 */
+ 0x1, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_PE2D_LINEAR_YUV420_10BIT */
+ 0x0, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_G2D_3rd_PARTY_COMPRESSION_1_1 */
+ 0x0, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x0, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc860L_0x464x */
+ {
+ 0x860, /* ChipID */
+ 0x4647, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x4, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_MSAA */
+ 0x0, /* gcFEATURE_BIT_REG_DC */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc880_5106 */
+ {
+ 0x880, /* ChipID */
+ 0x5106, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x100, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0xb, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_ShaderMSAASideband */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes0 */
+ 0x0, /* gcFEATURE_BIT_REG_VAA */
+ 0x0, /* gcFEATURE_BIT_REG_BypassInMSAA */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x1, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x0, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x1, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x0, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc880_5122 */
+ {
+ 0x880, /* ChipID */
+ 0x5122, /* ChipRevision */
+ 0x70007, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x240, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0xc, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe2D */
+ 0x1, /* gcFEATURE_BIT_REG_ETC1TextureCompression */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x1, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x0, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x0, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x0, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc880TM_0x512x */
+ {
+ 0x880, /* ChipID */
+ 0x5124, /* ChipRevision */
+ 0x70007, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x2, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x240, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0xc, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x1, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x0, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x0, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x0, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc880TM_0x512x */
+ {
+ 0x880, /* ChipID */
+ 0x5124, /* ChipRevision */
+ 0x70007, /* ProductID */
+ 0x0, /* EcoID */
+ 0x103, /* CustomerID */
+ 0x2, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x240, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0xf, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x1, /* gcFEATURE_BIT_REG_FastClear */
+ 0x0, /* gcFEATURE_BIT_REG_SpecialAntiAliasing */
+ 0x1, /* gcFEATURE_BIT_REG_Pipe3D */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FastScaler */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x1, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x0, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x0, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x0, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc900_5250 */
+ {
+ 0x900, /* ChipID */
+ 0x5250, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x200, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x2, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x0, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x1, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x1, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes12 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes13 */
+ 0x0, /* gcFEATURE_BIT_REG_DEEnhancements1 */
+ 0x0, /* gcFEATURE_BIT_REG_ACE */
+ 0x1, /* gcFEATURE_BIT_REG_TXEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_SHEnhancements2 */
+ 0x0, /* gcFEATURE_BIT_REG_PEEnhancements1 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_EEZ */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes21 */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraVgCaps */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV15 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc1000_5036 */
+ {
+ 0x1000, /* ChipID */
+ 0x5036, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x240, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x0, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x1, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc1000_5037 */
+ {
+ 0x1000, /* ChipID */
+ 0x5037, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x240, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x0, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x1, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc1000_5037_1 */
+ {
+ 0x1000, /* ChipID */
+ 0x5037, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x1, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x240, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x0, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x1, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc1000_5039 */
+ {
+ 0x1000, /* ChipID */
+ 0x5039, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x11, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x240, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x0, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x4, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x8, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_NonPowerOfTwo */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x1, /* gcFEATURE_BIT_REG_FcFlushStall */
+ 0x0, /* gcFEATURE_BIT_REG_LineLoop */
+ 0x0, /* gcFEATURE_BIT_REG_LogicOp */
+ 0x0, /* gcFEATURE_BIT_REG_SeamlessCubeMap */
+ 0x0, /* gcFEATURE_BIT_REG_SuperTiledTexture */
+ 0x1, /* gcFEATURE_BIT_REG_LinearPE */
+ 0x0, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x0, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_PowerOptimizations0 */
+ 0x1, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc1500_5246 */
+ {
+ 0x1500, /* ChipID */
+ 0x5246, /* ChipRevision */
+ 0x70003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x6, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x400, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x2, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0xf, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_Interleaver */
+ 0x1, /* gcFEATURE_BIT_REG_MixedStreams */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheFor2D420 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes7 */
+ 0x0, /* gcFEATURE_BIT_REG_NoIndexPattern */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* gcFEATURE_BIT_REG_DERotationStallFix */
+ 0x0, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x0, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes12 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_EEZ */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes21 */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraVgCaps */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSrcV15 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc2000_5108 */
+ {
+ 0x2000, /* ChipID */
+ 0x5108, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0xa8, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x4, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0xb, /* gcFEATURE_VALUE_VaryingCount */
+ 0x200, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x0, /* gcFEATURE_BIT_REG_MinArea */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc2000_5140 */
+ {
+ 0x2000, /* ChipID */
+ 0x5140, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x5, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x100, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_NewFloatingPointArithmetic */
+ 0x1, /* gcFEATURE_BIT_REG_TextureHorizontalAlignmentSelect */
+ 0x1, /* gcFEATURE_BIT_REG_NonPowerOfTwo */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x0, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_DynamicFrequencyScaling */
+ 0x0, /* gcFEATURE_BIT_REG_TXFilter */
+ 0x0, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x0, /* gcFEATURE_BIT_REG_OnePass2DFilter */
+ 0x0, /* gcFEATURE_BIT_REG_ThreadWalkerInPS */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x0, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x0, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_WClip */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x0, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x0, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc2000w_5_1_4_rc0e */
+ {
+ 0x2000, /* ChipID */
+ 0x5140, /* ChipRevision */
+ 0x20000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x5, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x100, /* gcFEATURE_VALUE_InstructionCount */
+ 0x100, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x8, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_HighDynamicRange */
+ 0x1, /* gcFEATURE_BIT_REG_YUV420Tiler */
+ 0x1, /* gcFEATURE_BIT_REG_ModuleCG */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_NewFloatingPointArithmetic */
+ 0x1, /* gcFEATURE_BIT_REG_TextureHorizontalAlignmentSelect */
+ 0x1, /* gcFEATURE_BIT_REG_NonPowerOfTwo */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MMU */
+ 0x1, /* gcFEATURE_BIT_REG_WideLine */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes6 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_RectPrimitive */
+ 0x0, /* gcFEATURE_BIT_REG_Composition */
+ 0x0, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x0, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_TileFiller */
+ 0x1, /* gcFEATURE_BIT_REG_YUVStandard */
+ 0x0, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x0, /* gcFEATURE_BIT_REG_YUVConversion */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x0, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* gcFEATURE_BIT_REG_Generics */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes9 */
+ 0x0, /* gcFEATURE_BIT_REG_FastMSAA */
+ 0x0, /* gcFEATURE_BIT_REG_WClip */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes10 */
+ 0x0, /* gcFEATURE_BIT_REG_UnifiedSamplers */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixes11 */
+ 0x0, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_NewHZ */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc2500_5422 */
+ {
+ 0x2500, /* ChipID */
+ 0x5422, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x12, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x4, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0xf, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_EEZ */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc6400_5422 */
+ {
+ 0x6400, /* ChipID */
+ 0x5422, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x16, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0xf, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_EEZ */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc3000_5435 */
+ {
+ 0x3000, /* ChipID */
+ 0x5435, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x4, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0xf, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x1, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc2000_ffff5450 */
+ {
+ 0x2000, /* ChipID */
+ 0xffff5450, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x8, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x4, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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 */
+ 0x1, /* gcFEATURE_BIT_SH_ICACHE_PREFETCH */
+ 0x0, /* gcFEATURE_BIT_PE2D_SEPARATE_CACHE */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc3000_5450 */
+ {
+ 0x3000, /* ChipID */
+ 0x5450, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x8, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x4, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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 */
+ 0x1, /* gcFEATURE_BIT_SH_ICACHE_PREFETCH */
+ 0x0, /* gcFEATURE_BIT_PE2D_SEPARATE_CACHE */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc3000_5451 */
+ {
+ 0x3000, /* ChipID */
+ 0x5451, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x4, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x4, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x0, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheRemove */
+ 0x1, /* gcFEATURE_BIT_REG_FEAllowRndVtxCnt */
+ 0x0, /* gcFEATURE_BIT_REG_CubeMapFL28 */
+ 0x0, /* gcFEATURE_BIT_REG_TX6bitFrac */
+ 0x0, /* gcFEATURE_BIT_REG_FEAllowStallPrefetchEng */
+ 0x0, /* gcFEATURE_BIT_REG_ThirdPartyCompression */
+ 0x1, /* gcFEATURE_BIT_REG_RSS8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000L_551x */
+ {
+ 0x3000, /* ChipID */
+ 0x5512, /* ChipRevision */
+ 0x70002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x3, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x4, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x0, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x1, /* 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_SNAPPAGE_CMD */
+ 0x0, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x0, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x0, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x0, /* 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 */
+ 0x1, /* 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_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 */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x1, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000L_5512 */
+ {
+ 0x3000, /* ChipID */
+ 0x5512, /* ChipRevision */
+ 0x70002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x3, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x4, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x0, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x1, /* 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_SNAPPAGE_CMD */
+ 0x0, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x0, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x0, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x0, /* 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 */
+ 0x1, /* 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_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 */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x1, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000L_5514 */
+ {
+ 0x3000, /* ChipID */
+ 0x5514, /* ChipRevision */
+ 0x70002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x4, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x0, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x1, /* 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_SNAPPAGE_CMD */
+ 0x0, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x0, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x0, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x1, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x1, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc4000_5222 */
+ {
+ 0x4000, /* ChipID */
+ 0x5222, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x800, /* gcFEATURE_VALUE_InstructionCount */
+ 0x200, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x8, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0xb, /* gcFEATURE_VALUE_VaryingCount */
+ 0x800, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_Composition */
+ 0x1, /* gcFEATURE_BIT_REG_CorrectAutoDisableCountWidth */
+ 0x1, /* gcFEATURE_BIT_REG_PESwizzle */
+ 0x1, /* gcFEATURE_BIT_REG_EndEvent */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_TextureTileStatus */
+ 0x1, /* gcFEATURE_BIT_REG_DecompressZ16 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes8 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc4000_5245 */
+ {
+ 0x4000, /* ChipID */
+ 0x5245, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x400, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x8, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x0, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x0, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0xf, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_FullDirectFB */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x0, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x0, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_PerformanceCounters */
+ 0x0, /* gcFEATURE_BIT_REG_ExtraShaderInstructions2 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes12 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc5000_5434 */
+ {
+ 0x5000, /* ChipID */
+ 0x5434, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0xf, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_EEZ */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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_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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x0, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000_551x */
+ {
+ 0x5000, /* ChipID */
+ 0x5513, /* ChipRevision */
+ 0x70000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x1, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x0, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x1, /* 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_SNAPPAGE_CMD */
+ 0x0, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x0, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x0, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x0, /* 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 */
+ 0x1, /* 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_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 */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x1, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000_5513 */
+ {
+ 0x5000, /* ChipID */
+ 0x5513, /* ChipRevision */
+ 0x70000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x1, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x0, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x1, /* 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_SNAPPAGE_CMD */
+ 0x0, /* gcFEATURE_BIT_SH_NO_INDEX_CONST_ON_A0 */
+ 0x0, /* gcFEATURE_BIT_SH_NO_ONECONST_LIMIT */
+ 0x1, /* gcFEATURE_BIT_SH_IMG_LDST_ON_TEMP */
+ 0x0, /* gcFEATURE_BIT_COMPUTE_ONLY */
+ 0x0, /* 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 */
+ 0x1, /* 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_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 */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x1, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gcXAQ2_CMODEL */
+ {
+ 0x7000, /* ChipID */
+ 0x0, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x100, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_VAA */
+ 0x0, /* gcFEATURE_BIT_REG_BypassInMSAA */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_MultiSourceBlt */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_REG_PEEnhancements4 */
+ 0x1, /* gcFEATURE_BIT_REG_MCEnhancements1 */
+ 0x1, /* gcFEATURE_BIT_REG_Halti2 */
+ 0x0, /* gcFEATURE_BIT_REG_DEMirrorRotate */
+ 0x1, /* 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 */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements6 */
+ 0x0, /* gcFEATURE_BIT_REG_SHEnhancements7 */
+ 0x1, /* gcFEATURE_BIT_REG_BugFixes20 */
+ 0x0, /* gcFEATURE_BIT_REG_DEAddress40 */
+ 0x0, /* gcFEATURE_BIT_REG_MiniMMUFix */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x1, /* gcFEATURE_BIT_REG_S8MSAACompression */
+ 0x0, /* gcFEATURE_BIT_REG_BugFixesIn544 */
+ 0x0, /* gcFEATURE_BIT_REG_L2CacheRemove */
+ 0x0, /* gcFEATURE_BIT_REG_FEAllowRndVtxCnt */
+ 0x1, /* gcFEATURE_BIT_REG_CubeMapFL28 */
+ 0x1, /* gcFEATURE_BIT_REG_TX6bitFrac */
+ 0x0, /* gcFEATURE_BIT_REG_FEAllowStallPrefetchEng */
+ 0x0, /* gcFEATURE_BIT_REG_ThirdPartyCompression */
+ 0x1, /* gcFEATURE_BIT_REG_RSS8 */
+ 0x0, /* gcFEATURE_BIT_REG_MSAACoherencyCheck */
+ 0x1, /* gcFEATURE_BIT_REG_Halti5 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_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_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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x0, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x1, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XS_600x */
+ {
+ 0x7000, /* ChipID */
+ 0x6008, /* ChipRevision */
+ 0x70004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0xb, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x0, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x1, /* 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 */
+ 0x1, /* 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_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x0, /* gcFEATURE_BIT_PSIO_MSAA_CL_FIX */
+ 0x0, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XS_6008 */
+ {
+ 0x7000, /* ChipID */
+ 0x6008, /* ChipRevision */
+ 0x70004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0xb, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x0, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x1, /* 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 */
+ 0x1, /* 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_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x0, /* gcFEATURE_BIT_PSIO_MSAA_CL_FIX */
+ 0x0, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XSVX_600x */
+ {
+ 0x7000, /* ChipID */
+ 0x6008, /* ChipRevision */
+ 0x70008, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x0, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XSVX_6008 */
+ {
+ 0x7000, /* ChipID */
+ 0x6008, /* ChipRevision */
+ 0x70008, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x7, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x0, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XSVX_6009 */
+ {
+ 0x7000, /* ChipID */
+ 0x6009, /* ChipRevision */
+ 0x70008, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x9, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_Evis */
+ 0x1, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_RA_DEPTH_WRITE_MSAA1X_FIX */
+ 0x0, /* gcFEATURE_BIT_EZHZ_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SNAP2PAGE_FIX */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x1, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_PSO_MSAA1x_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x0, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XSVX_6009 */
+ {
+ 0x7000, /* ChipID */
+ 0x6009, /* ChipRevision */
+ 0x70008, /* ProductID */
+ 0x1, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x9, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_Evis */
+ 0x1, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_RA_DEPTH_WRITE_MSAA1X_FIX */
+ 0x0, /* gcFEATURE_BIT_EZHZ_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SNAP2PAGE_FIX */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_RS_NEW_BASEADDR */
+ 0x1, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX */
+ 0x1, /* gcFEATURE_BIT_SH_PSO_MSAA1x_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x0, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000_6100 */
+ {
+ 0x7000, /* ChipID */
+ 0x6100, /* ChipRevision */
+ 0x70000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x20, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x20, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_Evis */
+ 0x0, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_PE_NO_ALPHA_TEST */
+ 0x0, /* gcFEATURE_BIT_TX_LOD_NEAREST_SELECT */
+ 0x1, /* gcFEATURE_BIT_SH_FIX_LDEXP */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x0, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000L_6100 */
+ {
+ 0x7000, /* ChipID */
+ 0x6100, /* ChipRevision */
+ 0x70002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_Evis */
+ 0x0, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_PE_NO_ALPHA_TEST */
+ 0x0, /* gcFEATURE_BIT_TX_LOD_NEAREST_SELECT */
+ 0x1, /* gcFEATURE_BIT_SH_FIX_LDEXP */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x0, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XS_6100 */
+ {
+ 0x7000, /* ChipID */
+ 0x6100, /* ChipRevision */
+ 0x70004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_PE_NO_ALPHA_TEST */
+ 0x0, /* gcFEATURE_BIT_TX_LOD_NEAREST_SELECT */
+ 0x1, /* gcFEATURE_BIT_SH_FIX_LDEXP */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_PE_MSAA_OQ_FIX */
+ 0x0, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000_6200 */
+ {
+ 0x7000, /* ChipID */
+ 0x6200, /* ChipRevision */
+ 0x70000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x28, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x28, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000UL_6200 */
+ {
+ 0x7000, /* ChipID */
+ 0x6200, /* ChipRevision */
+ 0x70003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x0, /* gcFEATURE_BIT_REG_Evis */
+ 0x0, /* gcFEATURE_BIT_REG_BltEngine */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000ULVX_6200 */
+ {
+ 0x7000, /* ChipID */
+ 0x6200, /* ChipRevision */
+ 0x7000f, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_ABSDIFF */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BITREPLACE */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BOXFILTER */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_CORDIAC */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_DP32 */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_FILTER */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_IADD */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_SELECTADD */
+ 0x1, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x1, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7400_551x */
+ {
+ 0x7400, /* ChipID */
+ 0x5515, /* ChipRevision */
+ 0x74000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x6, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x0, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x2, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x0, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x0, /* gcFEATURE_BIT_REG_RAWriteDepth */
+ 0x0, /* gcFEATURE_BIT_REG_AndroidOnly */
+ 0x1, /* gcFEATURE_BIT_REG_HasChipProductReg */
+ 0x0, /* gcFEATURE_BIT_REG_TXSupportDEC */
+ 0x0, /* 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_MultiCoreSemaphoreStallV2 */
+ 0x0, /* gcFEATURE_BIT_VMSAA */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 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 */
+ 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 */
+ 0x1, /* 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x1, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x1, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8000UL_6200 */
+ {
+ 0x8000, /* ChipID */
+ 0x6200, /* ChipRevision */
+ 0x80003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x8, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x8, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_NO_ANISTRO_FILTER */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* v630 */
+ {
+ 0x7000, /* ChipID */
+ 0x6300, /* ChipRevision */
+ 0x0, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XS_6200 */
+ {
+ 0x7000, /* ChipID */
+ 0x6200, /* ChipRevision */
+ 0x70004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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 */
+ 0x1, /* 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000L_6200 */
+ {
+ 0x7000, /* ChipID */
+ 0x6200, /* ChipRevision */
+ 0x70002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000LXS_6200 */
+ {
+ 0x7000, /* ChipID */
+ 0x6200, /* ChipRevision */
+ 0x7000a, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000ULVX_V11_6200 */
+ {
+ 0x7000, /* ChipID */
+ 0x6200, /* ChipRevision */
+ 0x7000f, /* ProductID */
+ 0x0, /* EcoID */
+ 0x1, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_ABSDIFF */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BITREPLACE */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BOXFILTER */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_CORDIAC */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_DP32 */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_FILTER */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_IADD */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_SELECTADD */
+ 0x1, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x1, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000ULVX_V12_6200 */
+ {
+ 0x7000, /* ChipID */
+ 0x6200, /* ChipRevision */
+ 0x7000f, /* ProductID */
+ 0x0, /* EcoID */
+ 0x2, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x0, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_EVIS_NO_ABSDIFF */
+ 0x0, /* gcFEATURE_BIT_EVIS_NO_BITREPLACE */
+ 0x1, /* 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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8000ULVX */
+ {
+ 0x8000, /* ChipID */
+ 0x6204, /* ChipRevision */
+ 0x8000f, /* ProductID */
+ 0x0, /* EcoID */
+ 0x3, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x1, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x1, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x1, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x1, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x0, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x1, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x1, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x1, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x1, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8000ULVX */
+ {
+ 0x8000, /* ChipID */
+ 0x6205, /* ChipRevision */
+ 0x8000f, /* ProductID */
+ 0x1, /* EcoID */
+ 0x3, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x1, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x1, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x1, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x1, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x0, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x1, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x1, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x1, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x1, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8000UL */
+ {
+ 0x8000, /* ChipID */
+ 0x6205, /* ChipRevision */
+ 0x80003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x17, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x8, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x8, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x1, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x1, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x1, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x0, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x1, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x1, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x1, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x1, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* GCNANOULTRA31_VIP2 */
+ {
+ 0x7000, /* ChipID */
+ 0x6204, /* ChipRevision */
+ 0x70007, /* ProductID */
+ 0x0, /* EcoID */
+ 0x13, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "GCNANOULTRA31_VIP2", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x200, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x7, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x1, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x1, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_ROBUST_FIX */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x1, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x0, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x1, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x1, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x1, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x1, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x1, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* GCNANOULTRA31_VIP2 */
+ {
+ 0x8000, /* ChipID */
+ 0x6205, /* ChipRevision */
+ 0x80003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x15, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "GCNANOULTRA31_VIP2", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x7, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x1, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x1, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_ROBUST_FIX */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x1, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x0, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x1, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x1, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x1, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x1, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x1, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* GCNANOULTRA31 */
+ {
+ 0x7000, /* ChipID */
+ 0x6205, /* ChipRevision */
+ 0x70007, /* ProductID */
+ 0x0, /* EcoID */
+ 0x12, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "GCNANOULTRA31", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x8, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x8, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK */
+ 0x1, /* gcFEATURE_BIT_SH_DUAL16_SAMPLEMASK_ZW */
+ 0x1, /* gcFEATURE_BIT_TPG_TRIVIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_ASTC_MULTISLICE_FIX */
+ 0x0, /* gcFEATURE_BIT_FE_ROBUST_FIX */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x1, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x0, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x1, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x1, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x1, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x1, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x1, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x1, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000ULVX_6200_pid0x60 */
+ {
+ 0x7000, /* ChipID */
+ 0x6203, /* ChipRevision */
+ 0x7000f, /* ProductID */
+ 0x0, /* EcoID */
+ 0x60, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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 */
+ 0x1, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_EVIS_NO_ABSDIFF */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BITREPLACE */
+ 0x1, /* 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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000ULN_v122 */
+ {
+ 0x7000, /* ChipID */
+ 0x6203, /* ChipRevision */
+ 0x70003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x4, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x8, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x8, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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 */
+ 0x1, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_ABSDIFF */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BITREPLACE */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BOXFILTER */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_CORDIAC */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_DP32 */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_FILTER */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_IADD */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_SELECTADD */
+ 0x0, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000ULN_v123 */
+ {
+ 0x7000, /* ChipID */
+ 0x6203, /* ChipRevision */
+ 0x70003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x11, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x8, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x8, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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 */
+ 0x1, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_ABSDIFF */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BITREPLACE */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BOXFILTER */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_CORDIAC */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_DP32 */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_FILTER */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_IADD */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_SELECTADD */
+ 0x0, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000ULN_v123 */
+ {
+ 0x7000, /* ChipID */
+ 0x6204, /* ChipRevision */
+ 0x70003, /* ProductID */
+ 0x1, /* EcoID */
+ 0x11, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x8, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x8, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x10, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_RA_HZEZ_CLOCK_CONTROL */
+ 0x1, /* gcFEATURE_BIT_CACHE128B256BPERLINE */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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 */
+ 0x1, /* gcFEATURE_BIT_TX_FLUSH_L1CACHE */
+ 0x1, /* gcFEATURE_BIT_PE_DITHER_FIX2 */
+ 0x0, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_ABSDIFF */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BITREPLACE */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_BOXFILTER */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_CORDIAC */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_DP32 */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_FILTER */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_IADD */
+ 0x1, /* gcFEATURE_BIT_EVIS_NO_SELECTADD */
+ 0x0, /* gcFEATURE_BIT_EVIS_LERP_7OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_ACCSQ_8OUTPUT */
+ 0x0, /* gcFEATURE_BIT_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XS_6FFF */
+ {
+ 0x7000, /* ChipID */
+ 0x6fff, /* ChipRevision */
+ 0x70004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000_6210 */
+ {
+ 0x7000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x70000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x6, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000_6210 */
+ {
+ 0x7000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x70000, /* ProductID */
+ 0x0, /* EcoID */
+ 0xa, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XS_6210 */
+ {
+ 0x7000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x70004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x8, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x30, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x30, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8000XS_6210 */
+ {
+ 0x8000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x80004, /* ProductID */
+ 0x0, /* EcoID */
+ 0xd, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x30, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x30, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8200LXS */
+ {
+ 0x8200, /* ChipID */
+ 0x6212, /* ChipRevision */
+ 0x8200a, /* ProductID */
+ 0x0, /* EcoID */
+ 0xe, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x2, /* gcFEATURE_VALUE_CoreCount */
+ 0x30, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x30, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XS_6210 */
+ {
+ 0x7000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x70004, /* ProductID */
+ 0x0, /* EcoID */
+ 0xc, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x30, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x30, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000L_6210 */
+ {
+ 0x7000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x70002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x5, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000L_6210 */
+ {
+ 0x7000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x70002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x9, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000LXS_6210 */
+ {
+ 0x7000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x7000a, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x30, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x30, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XSVX_6210 */
+ {
+ 0x7000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x70008, /* ProductID */
+ 0x0, /* EcoID */
+ 0x7, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XSVX_6210 */
+ {
+ 0x7000, /* ChipID */
+ 0x6210, /* ChipRevision */
+ 0x70008, /* ProductID */
+ 0x0, /* EcoID */
+ 0xb, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000XSVX */
+ {
+ 0x7000, /* ChipID */
+ 0x6212, /* ChipRevision */
+ 0x70008, /* ProductID */
+ 0x0, /* EcoID */
+ 0x14, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x1, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x1, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x1, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x1, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x1, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x1, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8000XSVX */
+ {
+ 0x7000, /* ChipID */
+ 0x6212, /* ChipRevision */
+ 0x80008, /* ProductID */
+ 0x0, /* EcoID */
+ 0x16, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x0, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x1, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x0, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x1, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x1, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x1, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x1, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x1, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x1, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x1, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000L_DEC400 */
+ {
+ 0x7000, /* ChipID */
+ 0x6214, /* ChipRevision */
+ 0x70002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x30, /* CustomerID */
+ 0x8, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x1, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7000L_DEC400 */
+ {
+ 0x7000, /* ChipID */
+ 0x6214, /* ChipRevision */
+ 0x70002, /* ProductID */
+ 0x1, /* EcoID */
+ 0x30, /* CustomerID */
+ 0x8, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x1, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7400_0002 */
+ {
+ 0x8400, /* ChipID */
+ 0x6310, /* ChipRevision */
+ 0x8400a, /* ProductID */
+ 0x0, /* EcoID */
+ 0x44, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x30, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x30, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x1, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7400_0003 */
+ {
+ 0x8400, /* ChipID */
+ 0x6310, /* ChipRevision */
+ 0x8400a, /* ProductID */
+ 0x0, /* EcoID */
+ 0x45, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x30, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x30, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x1, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc7403_0002 */
+ {
+ 0x8400, /* ChipID */
+ 0x6310, /* ChipRevision */
+ 0x8400b, /* ProductID */
+ 0x0, /* EcoID */
+ 0x48, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x30, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x30, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x0, /* 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 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 */
+ 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 */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x1, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8400_6302 */
+ {
+ 0x8400, /* ChipID */
+ 0x6302, /* ChipRevision */
+ 0x84004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x41, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0xf, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8400_6302 */
+ {
+ 0x8400, /* ChipID */
+ 0x6302, /* ChipRevision */
+ 0x84004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x49, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0xf, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* cc8400_6302 */
+ {
+ 0x8400, /* ChipID */
+ 0x6302, /* ChipRevision */
+ 0x6084000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x52, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0xf, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x1, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x1, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* cc8200_6302 */
+ {
+ 0x8200, /* ChipID */
+ 0x6302, /* ChipRevision */
+ 0x6082000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x53, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x3, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_REG_OclOnly */
+ 0x1, /* gcFEATURE_BIT_REG_NewFeatures0 */
+ 0x1, /* gcFEATURE_BIT_REG_InstructionCache */
+ 0x1, /* gcFEATURE_BIT_REG_GeometryShader */
+ 0x1, /* gcFEATURE_BIT_REG_TexCompressionSupertiled */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8100_6302_pid0x43 */
+ {
+ 0x8100, /* ChipID */
+ 0x6302, /* ChipRevision */
+ 0x81004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x43, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x1, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8100_6300_pid0x47 */
+ {
+ 0x8100, /* ChipID */
+ 0x6302, /* ChipRevision */
+ 0x81004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x47, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x1, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gc8200_6302_pid0x46 */
+ {
+ 0x8200, /* ChipID */
+ 0x6302, /* ChipRevision */
+ 0x82004, /* ProductID */
+ 0x0, /* EcoID */
+ 0x46, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x10, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x40, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x3, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_MULTI_CLUSTER */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_TEXLD_U_FIX */
+ 0x1, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x1, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x1, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x1, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x1, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x1, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* cc8000_6331 */
+ {
+ 0x8000, /* ChipID */
+ 0x6331, /* ChipRevision */
+ 0x6080000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x51, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x20, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x20, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x0, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x0, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x10, /* gcFEATURE_VALUE_Streams */
+ 0x1f, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x0, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x0, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x0, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x0, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 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 */
+ 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 */
+ 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_CMPLX */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 0x0, /* gcFEATURE_BIT_TX_BORDER_CLAMP_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_IMG_LD_LASTPIXEL_FIX */
+ 0x1, /* gcFEATURE_BIT_ASYNC_BLT */
+ 0x1, /* gcFEATURE_BIT_ASYNC_FE_FENCE_FIX */
+ 0x1, /* gcFEATURE_BIT_PSCS_THROTTLE */
+ 0x1, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x1, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x1, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip7000UL_6100 */
+ {
+ 0x7000, /* ChipID */
+ 0x6100, /* ChipRevision */
+ 0x5070003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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 */
+ 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 */
+ 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_NEW_GPIPE */
+ 0x1, /* 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 */
+ 0x0, /* gcFEATURE_BIT_RA_DEPTH_WRITE_MSAA1X_FIX */
+ 0x0, /* gcFEATURE_BIT_EZHZ_CLOCKGATE_FIX */
+ 0x0, /* gcFEATURE_BIT_SH_SNAP2PAGE_FIX */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_PE_8bpp_DUALPIPE_FIX */
+ 0x1, /* 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 */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_USC_VX_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_GOS_ADDR_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac */
+ 0x0, /* gcFEATURE_BIT_TX_DESC_CACHE_CLOCKGATE_FIX */
+ 0x1, /* gcFEATURE_BIT_RSBLT_MSAA_DECOMPRESSION */
+ 0x0, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE */
+ 0x1, /* gcFEATURE_BIT_DRAWID */
+ 0x0, /* gcFEATURE_BIT_PSIO_SAMPLEMASK_IN_R0ZW_FIX */
+ 0x1, /* gcFEATURE_BIT_TX_INTEGER_COORDINATE_V2 */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG */
+ 0x1, /* 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 */
+ 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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x1, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip7000L_6200 */
+ {
+ 0x7000, /* ChipID */
+ 0x6200, /* ChipRevision */
+ 0x5070002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x20, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x20, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip7000UL_6200 */
+ {
+ 0x7000, /* ChipID */
+ 0x6201, /* ChipRevision */
+ 0x5070003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x0, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000UL_6211 */
+ {
+ 0x8000, /* ChipID */
+ 0x6212, /* ChipRevision */
+ 0x5080003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x21, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000ULFN_6211 */
+ {
+ 0x8000, /* ChipID */
+ 0x6211, /* ChipRevision */
+ 0x5080003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x22, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000UL_6211 */
+ {
+ 0x8000, /* ChipID */
+ 0x6211, /* ChipRevision */
+ 0x5080003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x29, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* gcnanovip */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x424f5343, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x8, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x1, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x0, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x0, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x0, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x1, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q */
+ {
+ 0x8000, /* ChipID */
+ 0x7100, /* ChipRevision */
+ 0x45080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x24, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x10, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q */
+ {
+ 0x8000, /* ChipID */
+ 0x7100, /* ChipRevision */
+ 0x45080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x82, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0xa, /* gcFEATURE_VALUE_NNCoreCount */
+ 0xa, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x1f0000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d */
+ {
+ 0x8000, /* ChipID */
+ 0x7110, /* ChipRevision */
+ 0x25080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x89, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x40000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x3, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x3, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000UL-s */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x15080003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x25, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x18, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x18, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000UL-s */
+ {
+ 0x8000, /* ChipID */
+ 0x7005, /* ChipRevision */
+ 0x15080003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x83, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x2, /* gcFEATURE_VALUE_CoreCount */
+ 0x18, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x18, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000UL-q */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x45080003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x26, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x18, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x18, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000UL */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x5080003, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x18, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x18, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000-q */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x45080000, /* ProductID */
+ 0x0, /* EcoID */
+ 0x72, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x40, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x40, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x0, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d */
+ {
+ 0x8000, /* ChipID */
+ 0x7003, /* ChipRevision */
+ 0x25080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x2a, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x25080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x76, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000L-O */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x85080002, /* ProductID */
+ 0x0, /* EcoID */
+ 0x2f, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x20, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x20, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x4, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_CMPLX */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x1, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000L-qi */
+ {
+ 0x8000, /* ChipID */
+ 0x7200, /* ChipRevision */
+ 0x4508000a, /* ProductID */
+ 0x0, /* EcoID */
+ 0x85, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x20, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x20, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x4, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_CMPLX */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x1, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000L-di */
+ {
+ 0x8000, /* ChipID */
+ 0x7200, /* ChipRevision */
+ 0x2508000a, /* ProductID */
+ 0x0, /* EcoID */
+ 0x91, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x20, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x20, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x4, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_CMPLX */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SEPARATE_LS */
+ 0x0, /* gcFEATURE_BIT_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x1, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-s */
+ {
+ 0x8000, /* ChipID */
+ 0x7003, /* ChipRevision */
+ 0x15080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x23, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-si */
+ {
+ 0x8000, /* ChipID */
+ 0x7005, /* ChipRevision */
+ 0x5000009, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0x96, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x0, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x0, /* gcFEATURE_BIT_TP_LRN */
+ 0x0, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x0, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x0, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-qi */
+ {
+ 0x8000, /* ChipID */
+ 0x7004, /* ChipRevision */
+ 0x45080009, /* ProductID */
+ 0x0, /* EcoID */
+ 0x7d, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x100000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x1, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-qi */
+ {
+ 0x8000, /* ChipID */
+ 0x7004, /* ChipRevision */
+ 0x45080009, /* ProductID */
+ 0x1, /* EcoID */
+ 0x7d, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x100000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x1, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x0, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x0, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-di */
+ {
+ 0x8000, /* ChipID */
+ 0x7000, /* ChipRevision */
+ 0x25080009, /* ProductID */
+ 0x0, /* EcoID */
+ 0x7e, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x1, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-si */
+ {
+ 0x8000, /* ChipID */
+ 0x7120, /* ChipRevision */
+ 0x15080009, /* ProductID */
+ 0x0, /* EcoID */
+ 0x80, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-qi+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x16000000, /* EcoID */
+ 0xa3, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x16, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x16, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x16, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000nano-di */
+ {
+ 0x9000, /* ChipID */
+ 0x0, /* ChipRevision */
+ 0x5090009, /* ProductID */
+ 0x8000000, /* EcoID */
+ 0xb6, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x400, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x1, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000nano-d */
+ {
+ 0x9000, /* ChipID */
+ 0x0, /* ChipRevision */
+ 0x5090001, /* ProductID */
+ 0x8000000, /* EcoID */
+ 0xb7, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x1, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-qi+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8001, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x18000000, /* EcoID */
+ 0xa9, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000nano-si */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x4000000, /* EcoID */
+ 0xac, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x60000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000nano-si+ */
+ {
+ 0x9000, /* ChipID */
+ 0x8100, /* ChipRevision */
+ 0x5090009, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0xb0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000nano-qi+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8004, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x18000000, /* EcoID */
+ 0xb1, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x1, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000nano-si+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0xb2, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000nano-si+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8003, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0xb3, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000L-si+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8003, /* ChipRevision */
+ 0x508000a, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0xb4, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x20, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x20, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x20, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x4, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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 */
+ 0x1, /* 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000nano-si+ */
+ {
+ 0x9000, /* ChipID */
+ 0x8101, /* ChipRevision */
+ 0x5090009, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0xb8, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x1, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000nano-si */
+ {
+ 0x9000, /* ChipID */
+ 0x8100, /* ChipRevision */
+ 0x5090009, /* ProductID */
+ 0x4000000, /* EcoID */
+ 0xb9, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x7, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x1, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000nano-si+ */
+ {
+ 0x9000, /* ChipID */
+ 0x0, /* ChipRevision */
+ 0x5090009, /* ProductID */
+ 0x7000000, /* EcoID */
+ 0xbd, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x7, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x7, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x7, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x1, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000nano-di */
+ {
+ 0x9000, /* ChipID */
+ 0x0, /* ChipRevision */
+ 0x5090009, /* ProductID */
+ 0x8000000, /* EcoID */
+ 0xbe, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x1, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000UL-si */
+ {
+ 0x9000, /* ChipID */
+ 0x8100, /* ChipRevision */
+ 0x509000b, /* ProductID */
+ 0x4000000, /* EcoID */
+ 0xba, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x1, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x1, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000UL-si */
+ {
+ 0x9000, /* ChipID */
+ 0x0, /* ChipRevision */
+ 0x509000b, /* ProductID */
+ 0x4000000, /* EcoID */
+ 0xbc, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x1, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x1, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x1, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000nano-si */
+ {
+ 0x9000, /* ChipID */
+ 0x8101, /* ChipRevision */
+ 0x5090009, /* ProductID */
+ 0x4000000, /* EcoID */
+ 0xbb, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x1, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x60000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000-oi */
+ {
+ 0x8000, /* ChipID */
+ 0x8100, /* ChipRevision */
+ 0x5080008, /* ProductID */
+ 0x20000000, /* EcoID */
+ 0xa4, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x800, /* gcFEATURE_VALUE_ThreadCount */
+ 0x8, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x4, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x20, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x20, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x20, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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 */
+ 0x1, /* 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000L-qi_v8 */
+ {
+ 0x8000, /* ChipID */
+ 0x8100, /* ChipRevision */
+ 0x508000a, /* ProductID */
+ 0x10000000, /* EcoID */
+ 0xaf, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x400, /* gcFEATURE_VALUE_ThreadCount */
+ 0x4, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x2, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x4, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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 */
+ 0x1, /* 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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-ni */
+ {
+ 0x8000, /* ChipID */
+ 0x7121, /* ChipRevision */
+ 0x5000009, /* ProductID */
+ 0x1000000, /* EcoID */
+ 0xa2, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000UL-si */
+ {
+ 0x8000, /* ChipID */
+ 0x7121, /* ChipRevision */
+ 0x508000b, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0x98, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-si */
+ {
+ 0x8000, /* ChipID */
+ 0x7121, /* ChipRevision */
+ 0x5000009, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0x97, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-si */
+ {
+ 0x8000, /* ChipID */
+ 0x8003, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x4000000, /* EcoID */
+ 0xa5, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000nano-si */
+ {
+ 0x8000, /* ChipID */
+ 0x8003, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x4000000, /* EcoID */
+ 0xb5, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000nano-ni */
+ {
+ 0x8000, /* ChipID */
+ 0x8020, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0xad, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x1, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x0, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vippico_v1 */
+ {
+ 0x8000, /* ChipID */
+ 0x7120, /* ChipRevision */
+ 0x8000001, /* ProductID */
+ 0x1000000, /* EcoID */
+ 0x87, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x800, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x0, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vippico_v2 */
+ {
+ 0x8000, /* ChipID */
+ 0x7130, /* ChipRevision */
+ 0x8000001, /* ProductID */
+ 0x1000000, /* EcoID */
+ 0x93, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x7, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x1, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vippico_v3 */
+ {
+ 0x8000, /* ChipID */
+ 0x7131, /* ChipRevision */
+ 0x8000001, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0x99, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x7, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x0, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x1, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-si */
+ {
+ 0x8000, /* ChipID */
+ 0x7131, /* ChipRevision */
+ 0x5000009, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0x9, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x60000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x1, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x0, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000-oi MP */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x5080008, /* ProductID */
+ 0x10000000, /* EcoID */
+ 0x86, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x8, /* gcFEATURE_VALUE_CoreCount */
+ 0x9, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x9, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x9, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x1, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* VIP8000OI_SP */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x5080008, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0xa7, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x9, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x9, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x9, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x1, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000L-qi MP */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x508000a, /* ProductID */
+ 0x8000000, /* EcoID */
+ 0x9b, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x4, /* gcFEATURE_VALUE_CoreCount */
+ 0x9, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x9, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x9, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x1, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000UL-di MP */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x508000b, /* ProductID */
+ 0x4000000, /* EcoID */
+ 0x9c, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x2, /* gcFEATURE_VALUE_CoreCount */
+ 0x9, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x9, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x9, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x1, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* VIP8000OI_SP */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x5080008, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0x90, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x1, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-qi */
+ {
+ 0x8000, /* ChipID */
+ 0x7120, /* ChipRevision */
+ 0x45080009, /* ProductID */
+ 0x0, /* EcoID */
+ 0x88, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x100000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-qi */
+ {
+ 0x8000, /* ChipID */
+ 0x7131, /* ChipRevision */
+ 0x5000009, /* ProductID */
+ 0x8000000, /* EcoID */
+ 0xa1, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x180, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-di */
+ {
+ 0x8000, /* ChipID */
+ 0x7110, /* ChipRevision */
+ 0x25080009, /* ProductID */
+ 0x0, /* EcoID */
+ 0x7f, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x80000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000UL-di */
+ {
+ 0x8000, /* ChipID */
+ 0x7120, /* ChipRevision */
+ 0x508000b, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0x92, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x200, /* gcFEATURE_VALUE_ThreadCount */
+ 0x2, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x80000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x0, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip9000pico4c */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x8000001, /* ProductID */
+ 0x1000000, /* EcoID */
+ 0xaa, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x0, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* VIP9000PicoSi+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8001, /* ChipRevision */
+ 0x8090001, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0xab, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x0, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* VIPPico */
+ {
+ 0x8000, /* ChipID */
+ 0x0, /* ChipRevision */
+ 0x8000001, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0xa8, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x0, /* gcFEATURE_VALUE_TempRegisters */
+ 0x0, /* gcFEATURE_VALUE_ThreadCount */
+ 0x0, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x1, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x10, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x200, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-di */
+ {
+ 0x8000, /* ChipID */
+ 0x7131, /* ChipRevision */
+ 0x25080009, /* ProductID */
+ 0x0, /* EcoID */
+ 0x84, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x1, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-si */
+ {
+ 0x8000, /* ChipID */
+ 0x7130, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0x9a, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x1, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-si+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8002, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0x9f, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-si+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8002, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0xa0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-si+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8002, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x7000000, /* EcoID */
+ 0xa6, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x7, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x7, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x7, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x1, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000Nanosi+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8020, /* ChipRevision */
+ 0x5080009, /* ProductID */
+ 0x7000000, /* EcoID */
+ 0xae, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x0, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x7, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x7, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x7, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x9, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x5, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x40, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x80, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x10, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x0, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x1, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x1, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x1, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x1, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x1, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x1, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x1, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x1, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x1, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-s */
+ {
+ 0x8000, /* ChipID */
+ 0x7010, /* ChipRevision */
+ 0x15080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0xe0, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x100000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x1, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d */
+ {
+ 0x8000, /* ChipID */
+ 0x7010, /* ChipRevision */
+ 0x25080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x100000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x1, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q */
+ {
+ 0x8000, /* ChipID */
+ 0x7010, /* ChipRevision */
+ 0x45080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x100000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x1, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-o */
+ {
+ 0x8000, /* ChipID */
+ 0x7010, /* ChipRevision */
+ 0x85080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0x6, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x100000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x1, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-s */
+ {
+ 0x8000, /* ChipID */
+ 0x7100, /* ChipRevision */
+ 0x15080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x40000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-s+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7100, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x3000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x40000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d */
+ {
+ 0x8000, /* ChipID */
+ 0x7100, /* ChipRevision */
+ 0x25080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x80000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7100, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x80000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q */
+ {
+ 0x8000, /* ChipID */
+ 0x7100, /* ChipRevision */
+ 0x45080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x100000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7100, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0xc000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x100000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-o */
+ {
+ 0x8000, /* ChipID */
+ 0x7100, /* ChipRevision */
+ 0x85080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-o+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7100, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x18000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0xc, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x200000, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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_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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x0, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x0, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x0, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-s */
+ {
+ 0x8000, /* ChipID */
+ 0x7200, /* ChipRevision */
+ 0x15080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-s+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7200, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x3000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d */
+ {
+ 0x8000, /* ChipID */
+ 0x7200, /* ChipRevision */
+ 0x25080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7200, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q */
+ {
+ 0x8000, /* ChipID */
+ 0x7200, /* ChipRevision */
+ 0x45080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7200, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0xc000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-o */
+ {
+ 0x8000, /* ChipID */
+ 0x7200, /* ChipRevision */
+ 0x85080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x200000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-o+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7200, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x18000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x200000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0xc, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x0, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x0, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x0, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x0, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x0, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x0, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-s */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x15080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-s+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x3000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x3, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x25080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x45080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0xc000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-o */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x85080001, /* ProductID */
+ 0x0, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x200000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-o+ */
+ {
+ 0x8000, /* ChipID */
+ 0x7300, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x18000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x40, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x200000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0xc, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x10, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x0, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x0, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x0, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x0, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-s */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x4, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x2, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-s+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x3000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x1, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x6, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x40000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x3, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x10, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x4000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x8, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x20, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-d+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x6000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0xc, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x80000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x6, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x20, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x8000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x8, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x40, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-q+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0xc000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x4, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0xc, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x40, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-o */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x10000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x4, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x20, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x20, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x20, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x20, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x200000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x40, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vipnano-o+ */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080001, /* ProductID */
+ 0x18000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x4, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x30, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x30, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x30, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x30, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x200000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x18, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x40, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x40, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000ulo_mp */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080003, /* ProductID */
+ 0x10000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x2, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x1, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000ulo+_mp */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080003, /* ProductID */
+ 0x18000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x2, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x18, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x1, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000lh_mp */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080002, /* ProductID */
+ 0x20000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x4, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x10, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x1, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vip8000lh+_mp */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x5080002, /* ProductID */
+ 0x30000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x4, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x18, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x100000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x18, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 0x1, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 0x0, /* gcFEATURE_BIT_MULTI_CORE_BLOCK_SET_CONFIG2 */
+ 0x0, /* gcFEATURE_BIT_PE_VMSAA_COVERAGE_CACHE_FIX */
+ 0x1, /* gcFEATURE_BIT_SECURITY_AHB */
+ 0x1, /* 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x1, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+ /* vippico */
+ {
+ 0x8000, /* ChipID */
+ 0x8000, /* ChipRevision */
+ 0x8000001, /* ProductID */
+ 0x2000000, /* EcoID */
+ 0x0, /* CustomerID */
+ 0x0, /* PatchVersion */
+ "", /* ProductName */
+ 0x1, /* FormalRelease */
+ 0x40, /* gcFEATURE_VALUE_TempRegisters */
+ 0x100, /* gcFEATURE_VALUE_ThreadCount */
+ 0x1, /* gcFEATURE_VALUE_NumShaderCores */
+ 0x200, /* gcFEATURE_VALUE_InstructionCount */
+ 0x140, /* gcFEATURE_VALUE_NumberOfConstants */
+ 0x1, /* gcFEATURE_VALUE_CoreCount */
+ 0x10, /* gcFEATURE_VALUE_LocalStorageSize */
+ 0x10, /* gcFEATURE_VALUE_L1CacheSize */
+ 0x200, /* gcFEATURE_VALUE_InstructionMemorySize */
+ 0x14, /* gcFEATURE_VALUE_ShaderPCLength */
+ 0x10, /* gcFEATURE_VALUE_USC_MAX_PAGES */
+ 0x1, /* gcFEATURE_VALUE_NumPixelPipes */
+ 0x2, /* gcFEATURE_VALUE_USC_CACHE_CONTROLLERS */
+ 0x2, /* gcFEATURE_VALUE_USC_BANKS */
+ 0x8, /* gcFEATURE_VALUE_Streams */
+ 0x10, /* gcFEATURE_VALUE_VaryingCount */
+ 0x400, /* gcFEATURE_VALUE_VertexOutputBufferSize */
+ 0x0, /* gcFEATURE_VALUE_BufferSize */
+ 0x10, /* gcFEATURE_VALUE_VertexCacheSize */
+ 0x0, /* gcFEATURE_VALUE_NumResolvePipes */
+ 0x100, /* gcFEATURE_VALUE_RESULT_WINDOW_MAX_SIZE */
+ 0x0, /* gcFEATURE_VALUE_ClusterAliveMask */
+ 0x40, /* gcFEATURE_VALUE_NNMadPerCore */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT8 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_INT16 */
+ 0x2, /* gcFEATURE_VALUE_NNCoreCount_FLOAT16 */
+ 0x0, /* gcFEATURE_VALUE_NNCoreCount_BFLOAT */
+ 0xc, /* gcFEATURE_VALUE_NNInputBufferDepth */
+ 0x20, /* gcFEATURE_VALUE_NNAccumBufferDepth */
+ 0x400, /* gcFEATURE_VALUE_TPEngine_PwlLUTCount */
+ 0x10, /* gcFEATURE_VALUE_TPEngine_PwlLUTSize */
+ 0x20000, /* gcFEATURE_VALUE_VIP_SRAM_SIZE */
+ 0x1, /* gcFEATURE_VALUE_TPEngine_CoreCount */
+ 0x0, /* gcFEATURE_VALUE_AXI_SRAM_SIZE */
+ 0x4, /* gcFEATURE_VALUE_NN_INIMAGE_OFFSET_BITS */
+ 0x200, /* gcFEATURE_VALUE_TP_REORDER_INIMAGE_SIZE */
+ 0x0, /* gcFEATURE_VALUE_TPLite_CoreCount */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_X */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_XYDP_Y */
+ 0x1, /* gcFEATURE_VALUE_NNFP16_ZDP */
+ 0x8, /* gcFEATURE_VALUE_NN_LANES_PER_OUT_CYCLE */
+ 0x20, /* gcFEATURE_VALUE_MAX_OT_NUMBER */
+ 0x20, /* gcFEATURE_VALUE_EQUIVALENT_VIP_SRAM_WIDTH_INBYTE */
+ 0x8, /* gcFEATURE_VALUE_TP_ZRL_BITS */
+ 0x0, /* gcFEATURE_VALUE_LATENCY_HIDING_AT_FULL_AXI_BW */
+ 0x0, /* gcFEATURE_VALUE_AXI_BUS_WIDTH */
+ 0x0, /* 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 */
+ 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_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 */
+ 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_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_SH_TEXLD_U_FIX */
+ 0x0, /* gcFEATURE_BIT_MC_FCCACHE_BYTEMASK */
+ 0x0, /* gcFEATURE_BIT_SH_MULTI_WG_PACK_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_ADVANCE_BLEND_PART0 */
+ 0x0, /* gcFEATURE_BIT_FE_PATCHLIST_FETCH_FIX */
+ 0x1, /* gcFEATURE_BIT_RA_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_DEC400 */
+ 0x0, /* gcFEATURE_BIT_LS_SUPPORT_PERCOMP_DEPENDENCY */
+ 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 */
+ 0x1, /* gcFEATURE_BIT_SH_END_OF_BB */
+ 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_WIDELINE_TRIANGLE_EMU */
+ 0x0, /* gcFEATURE_BIT_FENCE_32BIT */
+ 0x0, /* gcFEATURE_BIT_FENCE_64BIT */
+ 0x0, /* gcFEATURE_BIT_PE_DEPTH_ONLY_OQFIX */
+ 0x0, /* gcFEATURE_BIT_TX_SEAMLESS_CUBE */
+ 0x0, /* gcFEATURE_BIT_TX_SNORM_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_SH_SCATTER_GATHER */
+ 0x0, /* gcFEATURE_BIT_HWMANAGED_LS */
+ 0x0, /* gcFEATURE_BIT_SH_IMAGE_ENABLE_FIX */
+ 0x1, /* gcFEATURE_BIT_MSAA_FRAGMENT_OPERATION */
+ 0x0, /* gcFEATURE_BIT_PE_TILE_CACHE_FLUSH_FIX */
+ 0x0, /* gcFEATURE_BIT_BLT_YUV_OUTPUT */
+ 0x1, /* gcFEATURE_BIT_SH_IO_CG_FIX */
+ 0x0, /* gcFEATURE_BIT_PE_SWIZZLE */
+ 0x0, /* gcFEATURE_BIT_SH_ROBUSTNESS_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ATOMIC_FIX2 */
+ 0x0, /* gcFEATURE_BIT_PE_A8B8G8R8 */
+ 0x0, /* gcFEATURE_BIT_MULTIVIEW_RENDER */
+ 0x0, /* gcFEATURE_BIT_FE_DRAW_DIRECT */
+ 0x0, /* gcFEATURE_BIT_TX_VKBORDER_MODE */
+ 0x0, /* gcFEATURE_BIT_TX_UNNORMALIZED_COORD */
+ 0x0, /* gcFEATURE_BIT_PA_LINECLIP_FIX */
+ 0x0, /* gcFEATURE_BIT_TX_8bit_UVFrac_ROUNDING_FIX */
+ 0x0, /* gcFEATURE_BIT_MP_ARCH */
+ 0x0, /* gcFEATURE_BIT_TX_NO_FIXED_FILTER */
+ 0x0, /* gcFEATURE_BIT_SHARE_Z */
+ 0x0, /* gcFEATURE_BIT_DE_2D_FAST_CLEAR */
+ 0x0, /* gcFEATURE_BIT_TX_CLEAR_PENDING_FIX */
+ 0x0, /* gcFEATURE_BIT_NO_HI1_L2 */
+ 0x0, /* gcFEATURE_BIT_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_VG_TS_CULLING */
+ 0x0, /* gcFEATURE_BIT_VG_FP25 */
+ 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_VG_RESOLVE_ENGINE */
+ 0x0, /* gcFEATURE_BIT_VG_PE_COLOR_KEY */
+ 0x0, /* gcFEATURE_BIT_VG_IM_INDEX_FORMAT */
+ 0x0, /* gcFEATURE_BIT_VG_RESOLUTION_8K */
+ 0x0, /* gcFEATURE_BIT_VG_IMAGE_16K */
+ 0x0, /* gcFEATURE_BIT_VG_FORMAT_ARGB2222 */
+ 0x0, /* gcFEATURE_BIT_G2D_DEC400 */
+ 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_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_EVIS_VX2 */
+ 0x1, /* gcFEATURE_BIT_NN_FLOAT */
+ 0x1, /* gcFEATURE_BIT_TP_ENGINE */
+ 0x1, /* gcFEATURE_BIT_VIP_V7 */
+ 0x1, /* gcFEATURE_BIT_MCFE */
+ 0x1, /* gcFEATURE_BIT_NN_INTERLEVE8 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER */
+ 0x1, /* gcFEATURE_BIT_TP_LRN */
+ 0x1, /* gcFEATURE_BIT_TP_MAX_POOLING_STRIDE1 */
+ 0x1, /* gcFEATURE_BIT_NN_FP16_ALU */
+ 0x1, /* gcFEATURE_BIT_NN_INT16_ALU */
+ 0x1, /* gcFEATURE_BIT_TP_ROI_POOLING */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3 */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP6 */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP9 */
+ 0x1, /* gcFEATURE_BIT_NN_INT8_SCALE */
+ 0x1, /* gcFEATURE_BIT_NN_POWER_ISOLATION */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE1 */
+ 0x1, /* gcFEATURE_BIT_TF_QUANTIZATION */
+ 0x0, /* gcFEATURE_BIT_TP_SIMPLE_INT16 */
+ 0x1, /* gcFEATURE_BIT_TP_REAL_INT16 */
+ 0x0, /* gcFEATURE_BIT_TP_BFLOAT16 */
+ 0x1, /* gcFEATURE_BIT_NN_FIRST_PIXEL_POOLING */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE2 */
+ 0x1, /* gcFEATURE_BIT_NN_STRIDE_SUPPORT */
+ 0x0, /* gcFEATURE_BIT_NN_XYDP6 */
+ 0x1, /* gcFEATURE_BIT_TP_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONV1x1_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CACHELINE_MODE_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_PER3DTILE_BUBBLE_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_CONVOUT_FIFO_DEPTH_FIX */
+ 0x1, /* gcFEATURE_BIT_SWTILING_PHASE3 */
+ 0x1, /* gcFEATURE_BIT_USC_STAY_LRU */
+ 0x1, /* gcFEATURE_BIT_NN_NONZERO_MIRROR_BORDER */
+ 0x1, /* gcFEATURE_BIT_NN_COEF_DECOMPRESS_PERF2X */
+ 0x1, /* gcFEATURE_BIT_INPUT_4BIT */
+ 0x1, /* gcFEATURE_BIT_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ZDP3_NO_COMPRESS_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_PERF_FIX */
+ 0x1, /* gcFEATURE_BIT_OCB_COUNTER */
+ 0x1, /* gcFEATURE_BIT_NN_XYDP0 */
+ 0x0, /* gcFEATURE_BIT_ZRL_7BIT */
+ 0x1, /* gcFEATURE_BIT_NN_ASYNC_COPY_MERGE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_TP_SMALLBATCH_PHASE1 */
+ 0x0, /* gcFEATURE_BIT_SCALER */
+ 0x0, /* gcFEATURE_BIT_SCALER_4K */
+ 0x0, /* gcFEATURE_BIT_NN_REQ_SLOWARBITRATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMAGE_PARTIAL_CACHE */
+ 0x0, /* gcFEATURE_BIT_FULLCACHE_KERNELHEAD_FIX */
+ 0x1, /* gcFEATURE_BIT_NN_SINGLEPORT_ACCUMBUFFER */
+ 0x1, /* gcFEATURE_BIT_NN_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_TP_SMALLBATCH */
+ 0x1, /* gcFEATURE_BIT_ZRL_8BIT */
+ 0x1, /* gcFEATURE_BIT_NN_DEPTHWISE_SUPPORT */
+ 0x1, /* gcFEATURE_BIT_NN_WRITE_WITHOUT_USC */
+ 0x0, /* gcFEATURE_BIT_NN_ZDP_INIMAGE_SIZE_FIX */
+ 0x1, /* gcFEATURE_BIT_HI_REORDER_FIX */
+ 0x1, /* gcFEATURE_BIT_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_COEF_COMPRESSION_ENHANCEMENT */
+ 0x1, /* gcFEATURE_BIT_VIP_DEC400 */
+ 0x0, /* gcFEATURE_BIT_IMAGE_NOT_PACKED_IN_SRAM_FIX */
+ 0x1, /* gcFEATURE_BIT_IDLE_BEFORE_FLUSH_COMPLETE_FIX */
+ 0x1, /* gcFEATURE_BIT_NO_FLUSH_USC_FIX */
+ 0x1, /* gcFEATURE_BIT_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX */
+ 0x0, /* gcFEATURE_BIT_XY_OFFSET_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_INVALIDATE_CACHE_LINE_FIX */
+ 0x0, /* gcFEATURE_BIT_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_BOTTLENECK_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX */
+ 0x1, /* gcFEATURE_BIT_FULLCACHE_KERNEL_INTERLEAVE_FIX */
+ 0x0, /* gcFEATURE_BIT_TP_REORDER_LAYER_SUSPEND_FIX */
+ 0x0, /* gcFEATURE_BIT_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX */
+ 0x0, /* gcFEATURE_BIT_IMG_POP_PIPELINE_PAUSE_FIX */
+ 0x0, /* gcFEATURE_BIT_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX */
+ 0x0, /* gcFEATURE_BIT_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX */
+ 0x0, /* gcFEATURE_BIT_NN_PER_CHANNEL_POST_MULTIPLY */
+ 0x1, /* gcFEATURE_BIT_NN_NO_Z_LOCATION_OFFSET */
+ 0x0, /* gcFEATURE_BIT_NN_PRELU */
+ 0x0, /* gcFEATURE_BIT_OCB_REMAP_PHYSICAL_ADDRESS */
+ 0x0, /* gcFEATURE_BIT_NN_SLICE_PADDING_TO_64BYTE_ALIGN */
+ 0x0, /* gcFEATURE_BIT_NN_DW_1x1_CONV_MERGE */
+ 0x0, /* gcFEATURE_BIT_NN_SLOW_OUTPUT */
+ 0x0, /* gcFEATURE_BIT_NO_NARROW_POST_PROCESS_PIPE */
+ 0x0, /* gcFEATURE_BIT_TP_NN_PROBE */
+ 0x0, /* gcFEATURE_BIT_TP_23BITS_POST_MULTIPLIER */
+ 0x0, /* gcFEATURE_BIT_NN_TRANSPOSE */
+ 0x0, /* gcFEATURE_BIT_EVIS2_FLOP_RESET_FIX */
+ 0x0, /* gcFEATURE_BIT_USC_ASYNC_CP_RTN_FLOP_RESET_FIX */
+ },
+};
+
+static gcsFEATURE_DATABASE*
+gcQueryFeatureDB(
+ gctUINT32 ChipID,
+ gctUINT32 ChipVersion,
+ gctUINT32 ProductID,
+ gctUINT32 EcoID,
+ gctUINT32 CustomerID
+ )
+{
+ gctINT entryNum = sizeof(gChipInfo) / sizeof(gChipInfo[0]);
+ gctINT i;
+
+ /* check formal release entries first */
+ for (i = 0; i < entryNum; ++i)
+ {
+
+ if ((gChipInfo[i].chipID == ChipID)
+ && (gChipInfo[i].chipVersion == ChipVersion)
+ && (gChipInfo[i].productID == ProductID)
+ && (gChipInfo[i].ecoID == EcoID)
+ && (gChipInfo[i].customerID == CustomerID)
+ && (gChipInfo[i].formalRelease)
+ )
+ {
+ return &gChipInfo[i];
+ }
+ }
+
+ /* check informal release entries if we dont find in formal entries */
+ for (i = 0; i < entryNum; ++i)
+ {
+
+ if ((gChipInfo[i].chipID == ChipID)
+ && ((gChipInfo[i].chipVersion & 0xFFF0) == (ChipVersion & 0xFFF0))
+ && (gChipInfo[i].productID == ProductID)
+ && (gChipInfo[i].ecoID == EcoID)
+ && (gChipInfo[i].customerID == CustomerID)
+ && (!gChipInfo[i].formalRelease)
+ )
+ {
+ return &gChipInfo[i];
+ }
+ }
+
+ return gcvNULL;
+}
+#endif /* _gc_feature_database_h_ */
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
new file mode 100644
index 000000000000..a1d112c76ee4
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal.h
@@ -0,0 +1,2291 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_h_
+#define __gc_hal_h_
+
+#include "gc_hal_types.h"
+#include "gc_hal_enum.h"
+#include "gc_hal_base.h"
+#include "gc_hal_profiler.h"
+#include "gc_hal_driver.h"
+#if gcdENABLE_3D
+#include "gc_hal_statistics.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************\
+******************************* Alignment Macros *******************************
+\******************************************************************************/
+
+/* Alignment with a non-power of two value. */
+#define gcmALIGN_NP2(n, align) (((n) + (align) - 1) - (((n) + (align) - 1) % (align)))
+
+#define gcmALIGN_NP2_SAFE(n, align) \
+(\
+ (gcmALIGN_NP2((n) & ~0ULL, (align) & ~0ULL) ^ gcmALIGN_NP2(n, align)) ? \
+ (n) : gcmALIGN_NP2(n, align) \
+)
+
+/* Alignment with a power of two value. */
+#define gcmALIGN(n, align) (((n) + ((align) - 1)) & ~((align) - 1))
+
+#define gcmALIGN_SAFE(n, align) \
+(\
+ (gcmALIGN((n) & ~0ULL, (align) & ~0ULL) ^ gcmALIGN(n, align)) ? \
+ (n) : gcmALIGN(n, align) \
+)
+
+#define gcmALIGN_BASE(n, align) \
+(\
+ ((n) & ~((align) - 1)) \
+)
+
+/******************************************************************************\
+***************************** Element Count Macro *****************************
+\******************************************************************************/
+
+#define gcmSIZEOF(a) \
+(\
+ (gctSIZE_T) (sizeof(a)) \
+)
+
+#define gcmCOUNTOF(a) \
+(\
+ sizeof(a) / sizeof(a[0]) \
+)
+
+/******************************************************************************\
+********************************* Cast Macro **********************************
+\******************************************************************************/
+#define gcmNAME_TO_PTR(na) \
+ gckKERNEL_QueryPointerFromName(kernel, gcmALL_TO_UINT32(na))
+
+#define gcmPTR_TO_NAME(ptr) \
+ gckKERNEL_AllocateNameFromPointer(kernel, ptr)
+
+#define gcmRELEASE_NAME(na) \
+ gckKERNEL_DeleteName(kernel, gcmALL_TO_UINT32(na))
+
+#define gcmALL_TO_UINT32(t) \
+(\
+ (gctUINT32) (gctUINTPTR_T) (t)\
+)
+
+#define gcmPTR_TO_UINT64(p) \
+(\
+ (gctUINT64) (gctUINTPTR_T) (p)\
+)
+
+#define gcmUINT64_TO_PTR(u) \
+(\
+ (gctPOINTER) (gctUINTPTR_T) (u)\
+)
+
+#define gcmUINT64_TO_TYPE(u, t) \
+(\
+ (t) (gctUINTPTR_T) (u)\
+)
+
+/******************************************************************************\
+******************************** Useful Macro *********************************
+\******************************************************************************/
+
+#define gcvINVALID_ADDRESS ~0U
+#define gcvINVALID_VALUE 0xCCCCCCCC
+
+#define gcvINVALID_PHYSICAL_ADDRESS ~0ULL
+
+#define gcmGET_PRE_ROTATION(rotate) \
+ ((rotate) & (~(gcvSURF_POST_FLIP_X | gcvSURF_POST_FLIP_Y)))
+
+#define gcmGET_POST_ROTATION(rotate) \
+ ((rotate) & (gcvSURF_POST_FLIP_X | gcvSURF_POST_FLIP_Y))
+
+/******************************************************************************\
+******************************** gcsOBJECT Object *******************************
+\******************************************************************************/
+
+/* Type of objects. */
+typedef enum _gceOBJECT_TYPE
+{
+ gcvOBJ_UNKNOWN = 0,
+ gcvOBJ_2D = gcmCC('2','D',' ',' '),
+ gcvOBJ_3D = gcmCC('3','D',' ',' '),
+ gcvOBJ_ATTRIBUTE = gcmCC('A','T','T','R'),
+ gcvOBJ_BRUSHCACHE = gcmCC('B','R','U','$'),
+ gcvOBJ_BRUSHNODE = gcmCC('B','R','U','n'),
+ gcvOBJ_BRUSH = gcmCC('B','R','U','o'),
+ gcvOBJ_BUFFER = gcmCC('B','U','F','R'),
+ gcvOBJ_COMMAND = gcmCC('C','M','D',' '),
+ gcvOBJ_COMMANDBUFFER = gcmCC('C','M','D','B'),
+ gcvOBJ_CONTEXT = gcmCC('C','T','X','T'),
+ gcvOBJ_DEVICE = gcmCC('D','E','V',' '),
+ gcvOBJ_DUMP = gcmCC('D','U','M','P'),
+ gcvOBJ_EVENT = gcmCC('E','V','N','T'),
+ gcvOBJ_FUNCTION = gcmCC('F','U','N','C'),
+ gcvOBJ_HAL = gcmCC('H','A','L',' '),
+ gcvOBJ_HARDWARE = gcmCC('H','A','R','D'),
+ gcvOBJ_HEAP = gcmCC('H','E','A','P'),
+ gcvOBJ_INDEX = gcmCC('I','N','D','X'),
+ gcvOBJ_INTERRUPT = gcmCC('I','N','T','R'),
+ gcvOBJ_KERNEL = gcmCC('K','E','R','N'),
+ gcvOBJ_KERNEL_FUNCTION = gcmCC('K','F','C','N'),
+ gcvOBJ_MEMORYBUFFER = gcmCC('M','E','M','B'),
+ gcvOBJ_MMU = gcmCC('M','M','U',' '),
+ gcvOBJ_OS = gcmCC('O','S',' ',' '),
+ gcvOBJ_OUTPUT = gcmCC('O','U','T','P'),
+ gcvOBJ_PAINT = gcmCC('P','N','T',' '),
+ gcvOBJ_PATH = gcmCC('P','A','T','H'),
+ gcvOBJ_QUEUE = gcmCC('Q','U','E',' '),
+ gcvOBJ_SAMPLER = gcmCC('S','A','M','P'),
+ gcvOBJ_SHADER = gcmCC('S','H','D','R'),
+ gcvOBJ_VIR_SHADER = gcmCC('V','S','D','R'),
+ gcvOBJ_STREAM = gcmCC('S','T','R','M'),
+ gcvOBJ_SURF = gcmCC('S','U','R','F'),
+ gcvOBJ_TEXTURE = gcmCC('T','X','T','R'),
+ gcvOBJ_UNIFORM = gcmCC('U','N','I','F'),
+ gcvOBJ_VARIABLE = gcmCC('V','A','R','I'),
+ gcvOBJ_VERTEX = gcmCC('V','R','T','X'),
+ gcvOBJ_VIDMEM = gcmCC('V','M','E','M'),
+ gcvOBJ_VIDMEM_BLOCK = gcmCC('V','M','B','K'),
+ gcvOBJ_VG = gcmCC('V','G',' ',' '),
+ gcvOBJ_BUFOBJ = gcmCC('B','U','F','O'),
+ gcvOBJ_UNIFORM_BLOCK = gcmCC('U','B','L','K'),
+ gcvOBJ_CL = gcmCC('C','L',' ',' '),
+ gcvOBJ_STORAGE_BLOCK = gcmCC('S','B','L','K'),
+ gcvOBJ_IO_BLOCK = gcmCC('I','O','B','K'),
+}
+gceOBJECT_TYPE;
+
+/* gcsOBJECT object defintinon. */
+typedef struct _gcsOBJECT
+{
+ /* Type of an object. */
+ gceOBJECT_TYPE type;
+}
+gcsOBJECT;
+
+typedef struct _gckHARDWARE * gckHARDWARE;
+
+
+#define gcdMAX_GPU_COUNT gcvCORE_COUNT
+
+#define gcdMAX_SURF_LAYERS 4
+
+#define gcdMAX_DRAW_BUFFERS 16
+
+#define gcdMAX_3DGPU_COUNT 8
+/*******************************************************************************
+**
+** gcmVERIFY_OBJECT
+**
+** Assert if an object is invalid or is not of the specified type. If the
+** object is invalid or not of the specified type, gcvSTATUS_INVALID_OBJECT
+** will be returned from the current function. In retail mode this macro
+** does nothing.
+**
+** ARGUMENTS:
+**
+** obj Object to test.
+** t Expected type of the object.
+*/
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+#define _gcmVERIFY_OBJECT(prefix, obj, t) \
+ if ((obj) == gcvNULL) \
+ { \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "VERIFY_OBJECT failed: NULL"); \
+ prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
+ gcmCC_PRINT(t)); \
+ prefix##ASSERT((obj) != gcvNULL); \
+ prefix##FOOTER_ARG("status=%d", gcvSTATUS_INVALID_OBJECT); \
+ return gcvSTATUS_INVALID_OBJECT; \
+ } \
+ else if (((gcsOBJECT*) (obj))->type != t) \
+ { \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "VERIFY_OBJECT failed: %c%c%c%c", \
+ gcmCC_PRINT(((gcsOBJECT*) (obj))->type)); \
+ prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
+ gcmCC_PRINT(t)); \
+ prefix##ASSERT(((gcsOBJECT*)(obj))->type == t); \
+ prefix##FOOTER_ARG("status=%d", gcvSTATUS_INVALID_OBJECT); \
+ return gcvSTATUS_INVALID_OBJECT; \
+ }
+
+# define gcmVERIFY_OBJECT(obj, t) _gcmVERIFY_OBJECT(gcm, obj, t)
+# define gcmkVERIFY_OBJECT(obj, t) _gcmVERIFY_OBJECT(gcmk, obj, t)
+#else
+# define gcmVERIFY_OBJECT(obj, t) do {} while (gcvFALSE)
+# define gcmkVERIFY_OBJECT(obj, t) do {} while (gcvFALSE)
+#endif
+
+/******************************************************************************/
+/*VERIFY_OBJECT if special return expected*/
+/******************************************************************************/
+#ifndef EGL_API_ANDROID
+# define _gcmVERIFY_OBJECT_RETURN(prefix, obj, t, retVal) \
+ do \
+ { \
+ if ((obj) == gcvNULL) \
+ { \
+ prefix##PRINT_VERSION(); \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "VERIFY_OBJECT_RETURN failed: NULL"); \
+ prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
+ gcmCC_PRINT(t)); \
+ prefix##ASSERT((obj) != gcvNULL); \
+ prefix##FOOTER_ARG("retVal=%d", retVal); \
+ return retVal; \
+ } \
+ else if (((gcsOBJECT*) (obj))->type != t) \
+ { \
+ prefix##PRINT_VERSION(); \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "VERIFY_OBJECT_RETURN failed: %c%c%c%c", \
+ gcmCC_PRINT(((gcsOBJECT*) (obj))->type)); \
+ prefix##TRACE(gcvLEVEL_ERROR, " expected: %c%c%c%c", \
+ gcmCC_PRINT(t)); \
+ prefix##ASSERT(((gcsOBJECT*)(obj))->type == t); \
+ prefix##FOOTER_ARG("retVal=%d", retVal); \
+ return retVal; \
+ } \
+ } \
+ while (gcvFALSE)
+# define gcmVERIFY_OBJECT_RETURN(obj, t, retVal) \
+ _gcmVERIFY_OBJECT_RETURN(gcm, obj, t, retVal)
+# define gcmkVERIFY_OBJECT_RETURN(obj, t, retVal) \
+ _gcmVERIFY_OBJECT_RETURN(gcmk, obj, t, retVal)
+#else
+# define gcmVERIFY_OBJECT_RETURN(obj, t) do {} while (gcvFALSE)
+# define gcmVERIFY_OBJECT_RETURN(obj, t) do {} while (gcvFALSE)
+#endif
+
+/******************************************************************************\
+********************************** gckOS Object *********************************
+\******************************************************************************/
+
+/* Construct a new gckOS object. */
+gceSTATUS
+gckOS_Construct(
+ IN gctPOINTER Context,
+ OUT gckOS * Os
+ );
+
+/* Destroy an gckOS object. */
+gceSTATUS
+gckOS_Destroy(
+ IN gckOS Os
+ );
+
+/* Query the video memory. */
+gceSTATUS
+gckOS_QueryVideoMemory(
+ IN gckOS Os,
+ OUT gctPHYS_ADDR * InternalAddress,
+ OUT gctSIZE_T * InternalSize,
+ OUT gctPHYS_ADDR * ExternalAddress,
+ OUT gctSIZE_T * ExternalSize,
+ OUT gctPHYS_ADDR * ContiguousAddress,
+ OUT gctSIZE_T * ContiguousSize
+ );
+
+/* Allocate memory from the heap. */
+gceSTATUS
+gckOS_Allocate(
+ IN gckOS Os,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Memory
+ );
+
+/* Free allocated memory. */
+gceSTATUS
+gckOS_Free(
+ IN gckOS Os,
+ IN gctPOINTER Memory
+ );
+
+/* Wrapper for allocation memory.. */
+gceSTATUS
+gckOS_AllocateMemory(
+ IN gckOS Os,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Memory
+ );
+
+/* Wrapper for freeing memory. */
+gceSTATUS
+gckOS_FreeMemory(
+ IN gckOS Os,
+ IN gctPOINTER Memory
+ );
+
+/* Allocate paged memory. */
+gceSTATUS
+gckOS_AllocatePagedMemory(
+ IN gckOS Os,
+ IN gctUINT32 Flag,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gctUINT32 * Gid,
+ OUT gctPHYS_ADDR * Physical
+ );
+
+/* Lock pages. */
+gceSTATUS
+gckOS_LockPages(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctBOOL Cacheable,
+ OUT gctPOINTER * Logical
+ );
+
+/* Map pages. */
+gceSTATUS
+gckOS_MapPagesEx(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T PageCount,
+ IN gctUINT32 Address,
+ IN gctPOINTER PageTable,
+ IN gctBOOL Writable,
+ IN gceVIDMEM_TYPE Type
+ );
+
+/* Map 1M pages. */
+gceSTATUS
+gckOS_Map1MPages(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T PageCount,
+ IN gctUINT32 Address,
+ IN gctPOINTER PageTable,
+ IN gctBOOL Writable,
+ IN gceVIDMEM_TYPE Type
+ );
+
+gceSTATUS
+gckOS_UnmapPages(
+ IN gckOS Os,
+ IN gctSIZE_T PageCount,
+ IN gctUINT32 Address
+ );
+
+/* Unlock pages. */
+gceSTATUS
+gckOS_UnlockPages(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical
+ );
+
+/* Free paged memory. */
+gceSTATUS
+gckOS_FreePagedMemory(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes
+ );
+
+/* Allocate non-paged memory. */
+gceSTATUS
+gckOS_AllocateNonPagedMemory(
+ IN gckOS Os,
+ IN gctBOOL InUserSpace,
+ IN gctUINT32 Flag,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gctPHYS_ADDR * Physical,
+ OUT gctPOINTER * Logical
+ );
+
+/* Free non-paged memory. */
+gceSTATUS
+gckOS_FreeNonPagedMemory(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ );
+
+/* Reserved memory. */
+gceSTATUS
+gckOS_RequestReservedMemory(
+ gckOS Os,
+ gctPHYS_ADDR_T Start,
+ gctSIZE_T Size,
+ const char * Name,
+ gctBOOL Requested,
+ gctPOINTER * MemoryHandle
+ );
+
+void
+gckOS_ReleaseReservedMemory(
+ gckOS Os,
+ gctPOINTER MemoryHandle
+ );
+
+/* Get the number fo bytes per page. */
+gceSTATUS
+gckOS_GetPageSize(
+ IN gckOS Os,
+ OUT gctSIZE_T * PageSize
+ );
+
+/* Get the physical address of a corresponding logical address. */
+gceSTATUS
+gckOS_GetPhysicalAddress(
+ IN gckOS Os,
+ IN gctPOINTER Logical,
+ OUT gctPHYS_ADDR_T * Address
+ );
+
+/* Get real physical address from handle. */
+gceSTATUS
+gckOS_GetPhysicalFromHandle(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * PhysicalAddress
+ );
+
+/* Get the physical address of a corresponding user logical address. */
+gceSTATUS
+gckOS_UserLogicalToPhysical(
+ IN gckOS Os,
+ IN gctPOINTER Logical,
+ OUT gctPHYS_ADDR_T * Address
+ );
+
+/* Map physical memory. */
+gceSTATUS
+gckOS_MapPhysical(
+ IN gckOS Os,
+ IN gctPHYS_ADDR_T Physical,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Logical
+ );
+
+/* Unmap previously mapped physical memory. */
+gceSTATUS
+gckOS_UnmapPhysical(
+ IN gckOS Os,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ );
+
+/* Read data from a hardware register. */
+gceSTATUS
+gckOS_ReadRegister(
+ IN gckOS Os,
+ IN gctUINT32 Address,
+ OUT gctUINT32 * Data
+ );
+
+/* Read data from a hardware register. */
+gceSTATUS
+gckOS_ReadRegisterEx(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT32 Address,
+ OUT gctUINT32 * Data
+ );
+
+/* Write data to a hardware register. */
+gceSTATUS
+gckOS_WriteRegister(
+ IN gckOS Os,
+ IN gctUINT32 Address,
+ IN gctUINT32 Data
+ );
+
+/* Write data to a hardware register. */
+gceSTATUS
+gckOS_WriteRegisterEx(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT32 Address,
+ IN gctUINT32 Data
+ );
+
+/* Write data to a hardware register without dump. */
+gceSTATUS
+gckOS_WriteRegisterEx_NoDump(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT32 Address,
+ IN gctUINT32 Data
+ );
+
+#ifdef __QNXNTO__
+static gcmINLINE gceSTATUS
+gckOS_WriteMemory(
+ IN gckOS Os,
+ IN gctPOINTER Address,
+ IN gctUINT32 Data
+ )
+{
+ /* Write memory. */
+ *(gctUINT32 *)Address = Data;
+ return gcvSTATUS_OK;
+}
+
+#else
+/* Write data to a 32-bit memory location. */
+gceSTATUS
+gckOS_WriteMemory(
+ IN gckOS Os,
+ IN gctPOINTER Address,
+ IN gctUINT32 Data
+ );
+#endif
+
+/* Map physical memory into the process space. */
+gceSTATUS
+gckOS_MapMemory(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Logical
+ );
+
+/* Unmap physical memory from the specified process space. */
+gceSTATUS
+gckOS_UnmapMemoryEx(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical,
+ IN gctUINT32 PID
+ );
+
+/* Unmap physical memory from the process space. */
+gceSTATUS
+gckOS_UnmapMemory(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical
+ );
+
+/* Delete a mutex. */
+gceSTATUS
+gckOS_DeleteMutex(
+ IN gckOS Os,
+ IN gctPOINTER Mutex
+ );
+
+/* Acquire a mutex. */
+gceSTATUS
+gckOS_AcquireMutex(
+ IN gckOS Os,
+ IN gctPOINTER Mutex,
+ IN gctUINT32 Timeout
+ );
+
+/* Release a mutex. */
+gceSTATUS
+gckOS_ReleaseMutex(
+ IN gckOS Os,
+ IN gctPOINTER Mutex
+ );
+
+/* Atomically exchange a pair of 32-bit values. */
+gceSTATUS
+gckOS_AtomicExchange(
+ IN gckOS Os,
+ IN OUT gctUINT32_PTR Target,
+ IN gctUINT32 NewValue,
+ OUT gctUINT32_PTR OldValue
+ );
+
+/* Atomically exchange a pair of pointers. */
+gceSTATUS
+gckOS_AtomicExchangePtr(
+ IN gckOS Os,
+ IN OUT gctPOINTER * Target,
+ IN gctPOINTER NewValue,
+ OUT gctPOINTER * OldValue
+ );
+
+gceSTATUS
+gckOS_AtomSetMask(
+ IN gctPOINTER Atom,
+ IN gctUINT32 Mask
+ );
+
+gceSTATUS
+gckOS_AtomClearMask(
+ IN gctPOINTER Atom,
+ IN gctUINT32 Mask
+ );
+
+gceSTATUS
+gckOS_DumpCallStack(
+ IN gckOS Os
+ );
+
+gceSTATUS
+gckOS_GetProcessNameByPid(
+ IN gctINT Pid,
+ IN gctSIZE_T Length,
+ OUT gctUINT8_PTR String
+ );
+
+/*******************************************************************************
+**
+** gckOS_AtomConstruct
+**
+** Create an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** OUTPUT:
+**
+** gctPOINTER * Atom
+** Pointer to a variable receiving the constructed atom.
+*/
+gceSTATUS
+gckOS_AtomConstruct(
+ IN gckOS Os,
+ OUT gctPOINTER * Atom
+ );
+
+/*******************************************************************************
+**
+** gckOS_AtomDestroy
+**
+** Destroy an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctPOINTER Atom
+** Pointer to the atom to destroy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_AtomDestroy(
+ IN gckOS Os,
+ OUT gctPOINTER Atom
+ );
+
+/*******************************************************************************
+**
+** gckOS_AtomGet
+**
+** Get the 32-bit value protected by an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctPOINTER Atom
+** Pointer to the atom.
+**
+** OUTPUT:
+**
+** gctINT32_PTR Value
+** Pointer to a variable the receives the value of the atom.
+*/
+gceSTATUS
+gckOS_AtomGet(
+ IN gckOS Os,
+ IN gctPOINTER Atom,
+ OUT gctINT32_PTR Value
+ );
+
+/*******************************************************************************
+**
+** gckOS_AtomSet
+**
+** Set the 32-bit value protected by an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctPOINTER Atom
+** Pointer to the atom.
+**
+** gctINT32 Value
+** The value of the atom.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_AtomSet(
+ IN gckOS Os,
+ IN gctPOINTER Atom,
+ IN gctINT32 Value
+ );
+
+/*******************************************************************************
+**
+** gckOS_AtomIncrement
+**
+** Atomically increment the 32-bit integer value inside an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctPOINTER Atom
+** Pointer to the atom.
+**
+** OUTPUT:
+**
+** gctINT32_PTR Value
+** Pointer to a variable the receives the original value of the atom.
+*/
+gceSTATUS
+gckOS_AtomIncrement(
+ IN gckOS Os,
+ IN gctPOINTER Atom,
+ OUT gctINT32_PTR Value
+ );
+
+/*******************************************************************************
+**
+** gckOS_AtomDecrement
+**
+** Atomically decrement the 32-bit integer value inside an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctPOINTER Atom
+** Pointer to the atom.
+**
+** OUTPUT:
+**
+** gctINT32_PTR Value
+** Pointer to a variable the receives the original value of the atom.
+*/
+gceSTATUS
+gckOS_AtomDecrement(
+ IN gckOS Os,
+ IN gctPOINTER Atom,
+ OUT gctINT32_PTR Value
+ );
+
+/* Delay a number of milliseconds. */
+gceSTATUS
+gckOS_Delay(
+ IN gckOS Os,
+ IN gctUINT32 Delay
+ );
+
+/* Get time in milliseconds. */
+gceSTATUS
+gckOS_GetTicks(
+ OUT gctUINT32_PTR Time
+ );
+
+/* Compare time value. */
+gceSTATUS
+gckOS_TicksAfter(
+ IN gctUINT32 Time1,
+ IN gctUINT32 Time2,
+ OUT gctBOOL_PTR IsAfter
+ );
+
+/* Get time in microseconds. */
+gceSTATUS
+gckOS_GetTime(
+ OUT gctUINT64_PTR Time
+ );
+
+/* Memory barrier. */
+gceSTATUS
+gckOS_MemoryBarrier(
+ IN gckOS Os,
+ IN gctPOINTER Address
+ );
+
+/* Map user pointer. */
+gceSTATUS
+gckOS_MapUserPointer(
+ IN gckOS Os,
+ IN gctPOINTER Pointer,
+ IN gctSIZE_T Size,
+ OUT gctPOINTER * KernelPointer
+ );
+
+/* Unmap user pointer. */
+gceSTATUS
+gckOS_UnmapUserPointer(
+ IN gckOS Os,
+ IN gctPOINTER Pointer,
+ IN gctSIZE_T Size,
+ IN gctPOINTER KernelPointer
+ );
+
+/*******************************************************************************
+**
+** gckOS_QueryNeedCopy
+**
+** Query whether the memory can be accessed or mapped directly or it has to be
+** copied.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctUINT32 ProcessID
+** Process ID of the current process.
+**
+** OUTPUT:
+**
+** gctBOOL_PTR NeedCopy
+** Pointer to a boolean receiving gcvTRUE if the memory needs a copy or
+** gcvFALSE if the memory can be accessed or mapped dircetly.
+*/
+gceSTATUS
+gckOS_QueryNeedCopy(
+ IN gckOS Os,
+ IN gctUINT32 ProcessID,
+ OUT gctBOOL_PTR NeedCopy
+ );
+
+/*******************************************************************************
+**
+** gckOS_CopyFromUserData
+**
+** Copy data from user to kernel memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER KernelPointer
+** Pointer to kernel memory.
+**
+** gctPOINTER Pointer
+** Pointer to user memory.
+**
+** gctSIZE_T Size
+** Number of bytes to copy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_CopyFromUserData(
+ IN gckOS Os,
+ IN gctPOINTER KernelPointer,
+ IN gctPOINTER Pointer,
+ IN gctSIZE_T Size
+ );
+
+/*******************************************************************************
+**
+** gckOS_CopyToUserData
+**
+** Copy data from kernel to user memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER KernelPointer
+** Pointer to kernel memory.
+**
+** gctPOINTER Pointer
+** Pointer to user memory.
+**
+** gctSIZE_T Size
+** Number of bytes to copy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_CopyToUserData(
+ IN gckOS Os,
+ IN gctPOINTER KernelPointer,
+ IN gctPOINTER Pointer,
+ IN gctSIZE_T Size
+ );
+
+gceSTATUS
+gckOS_SuspendInterrupt(
+ IN gckOS Os
+ );
+
+gceSTATUS
+gckOS_SuspendInterruptEx(
+ IN gckOS Os,
+ IN gceCORE Core
+ );
+
+gceSTATUS
+gckOS_ResumeInterrupt(
+ IN gckOS Os
+ );
+
+gceSTATUS
+gckOS_ResumeInterruptEx(
+ IN gckOS Os,
+ IN gceCORE Core
+ );
+
+/* Get the base address for the physical memory. */
+gceSTATUS
+gckOS_GetBaseAddress(
+ IN gckOS Os,
+ OUT gctUINT32_PTR BaseAddress
+ );
+
+/* Perform a memory copy. */
+gceSTATUS
+gckOS_MemCopy(
+ IN gctPOINTER Destination,
+ IN gctCONST_POINTER Source,
+ IN gctSIZE_T Bytes
+ );
+
+/* Zero memory. */
+gceSTATUS
+gckOS_ZeroMemory(
+ IN gctPOINTER Memory,
+ IN gctSIZE_T Bytes
+ );
+
+/*******************************************************************************
+**
+** gckOS_GetProcessID
+**
+** Get current process ID.
+**
+** INPUT:
+**
+** Nothing.
+**
+** OUTPUT:
+**
+** gctUINT32_PTR ProcessID
+** Pointer to the variable that receives the process ID.
+*/
+gceSTATUS
+gckOS_GetProcessID(
+ OUT gctUINT32_PTR ProcessID
+ );
+
+gceSTATUS
+gckOS_GetCurrentProcessID(
+ OUT gctUINT32_PTR ProcessID
+ );
+
+/*******************************************************************************
+**
+** gckOS_GetThreadID
+**
+** Get current thread ID.
+**
+** INPUT:
+**
+** Nothing.
+**
+** OUTPUT:
+**
+** gctUINT32_PTR ThreadID
+** Pointer to the variable that receives the thread ID.
+*/
+gceSTATUS
+gckOS_GetThreadID(
+ OUT gctUINT32_PTR ThreadID
+ );
+
+/******************************************************************************\
+********************************** Signal Object *********************************
+\******************************************************************************/
+
+/* Create a signal. */
+gceSTATUS
+gckOS_CreateSignal(
+ IN gckOS Os,
+ IN gctBOOL ManualReset,
+ OUT gctSIGNAL * Signal
+ );
+
+/* Destroy a signal. */
+gceSTATUS
+gckOS_DestroySignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal
+ );
+
+/* Signal a signal. */
+gceSTATUS
+gckOS_Signal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal,
+ IN gctBOOL State
+ );
+
+/* Wait for a signal. */
+gceSTATUS
+gckOS_WaitSignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal,
+ IN gctBOOL Interruptable,
+ IN gctUINT32 Wait
+ );
+
+#ifdef __QNXNTO__
+gceSTATUS
+gckOS_SignalPulse(
+ IN gckOS Os,
+ IN gctSIGNAL Signal
+ );
+
+gceSTATUS
+gckOS_SignalPending(
+ IN gckOS Os,
+ IN gctSIGNAL Signal
+ );
+#endif
+
+/* Map a user signal to the kernel space. */
+gceSTATUS
+gckOS_MapSignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal,
+ IN gctHANDLE Process,
+ OUT gctSIGNAL * MappedSignal
+ );
+
+/* Unmap a user signal */
+gceSTATUS
+gckOS_UnmapSignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal
+ );
+
+/* 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(
+ IN gckOS Os,
+ IN gcsUSER_MEMORY_DESC_PTR Desc,
+ OUT gctSIZE_T *Bytes,
+ OUT gctPHYS_ADDR * Physical,
+ OUT gctBOOL *Contiguous,
+ OUT gctSIZE_T * PageCountCpu
+ );
+
+gceSTATUS
+gckOS_GetPolicyID(
+ IN gckOS Os,
+ IN gceVIDMEM_TYPE Type,
+ OUT gctUINT32_PTR PolicyID,
+ OUT gctUINT32_PTR AXIConfig
+ );
+
+/******************************************************************************\
+************************** Android Native Fence Sync ***************************
+\******************************************************************************/
+gceSTATUS
+gckOS_CreateSyncTimeline(
+ IN gckOS Os,
+ IN gceCORE Core,
+ OUT gctHANDLE * Timeline
+ );
+
+gceSTATUS
+gckOS_DestroySyncTimeline(
+ IN gckOS Os,
+ IN gctHANDLE Timeline
+ );
+
+gceSTATUS
+gckOS_CreateNativeFence(
+ IN gckOS Os,
+ IN gctHANDLE Timeline,
+ IN gctSIGNAL Signal,
+ OUT gctINT * FenceFD
+ );
+
+gceSTATUS
+gckOS_WaitNativeFence(
+ IN gckOS Os,
+ IN gctHANDLE Timeline,
+ IN gctINT FenceFD,
+ IN gctUINT32 Timeout
+ );
+
+#if !USE_NEW_LINUX_SIGNAL
+/* Create signal to be used in the user space. */
+gceSTATUS
+gckOS_CreateUserSignal(
+ IN gckOS Os,
+ IN gctBOOL ManualReset,
+ OUT gctINT * SignalID
+ );
+
+/* Destroy signal used in the user space. */
+gceSTATUS
+gckOS_DestroyUserSignal(
+ IN gckOS Os,
+ IN gctINT SignalID
+ );
+
+/* Wait for signal used in the user space. */
+gceSTATUS
+gckOS_WaitUserSignal(
+ IN gckOS Os,
+ IN gctINT SignalID,
+ IN gctUINT32 Wait
+ );
+
+/* Signal a signal used in the user space. */
+gceSTATUS
+gckOS_SignalUserSignal(
+ IN gckOS Os,
+ IN gctINT SignalID,
+ IN gctBOOL State
+ );
+#endif /* USE_NEW_LINUX_SIGNAL */
+
+/* Set a signal owned by a process. */
+#if defined(__QNXNTO__)
+gceSTATUS
+gckOS_UserSignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal,
+ IN gctINT Recvid,
+ IN gctINT Coid
+ );
+#else
+gceSTATUS
+gckOS_UserSignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal,
+ IN gctHANDLE Process
+ );
+#endif
+
+/******************************************************************************\
+** Cache Support
+*/
+
+gceSTATUS
+gckOS_CacheClean(
+ gckOS Os,
+ gctUINT32 ProcessID,
+ gctPHYS_ADDR Handle,
+ gctSIZE_T Offset,
+ gctPOINTER Logical,
+ gctSIZE_T Bytes
+ );
+
+gceSTATUS
+gckOS_CacheFlush(
+ gckOS Os,
+ gctUINT32 ProcessID,
+ gctPHYS_ADDR Handle,
+ gctSIZE_T Offset,
+ gctPOINTER Logical,
+ gctSIZE_T Bytes
+ );
+
+gceSTATUS
+gckOS_CacheInvalidate(
+ gckOS Os,
+ gctUINT32 ProcessID,
+ gctPHYS_ADDR Handle,
+ gctSIZE_T Offset,
+ gctPOINTER Logical,
+ gctSIZE_T Bytes
+ );
+
+gceSTATUS
+gckOS_CPUPhysicalToGPUPhysical(
+ IN gckOS Os,
+ IN gctPHYS_ADDR_T CPUPhysical,
+ IN gctPHYS_ADDR_T * GPUPhysical
+ );
+
+gceSTATUS
+gckOS_GPUPhysicalToCPUPhysical(
+ IN gckOS Os,
+ IN gctUINT32 GPUPhysical,
+ IN gctPHYS_ADDR_T * CPUPhysical
+ );
+
+gceSTATUS
+gckOS_QueryOption(
+ IN gckOS Os,
+ IN gctCONST_STRING Option,
+ OUT gctUINT64 * Value
+ );
+
+/******************************************************************************\
+** Debug Support
+*/
+
+void
+gckOS_SetDebugLevel(
+ IN gctUINT32 Level
+ );
+
+void
+gckOS_SetDebugZone(
+ IN gctUINT32 Zone
+ );
+
+void
+gckOS_SetDebugLevelZone(
+ IN gctUINT32 Level,
+ IN gctUINT32 Zone
+ );
+
+void
+gckOS_SetDebugZones(
+ IN gctUINT32 Zones,
+ IN gctBOOL Enable
+ );
+
+void
+gckOS_SetDebugFile(
+ IN gctCONST_STRING FileName
+ );
+
+/*******************************************************************************
+** Broadcast interface.
+*/
+
+typedef enum _gceBROADCAST
+{
+ /* GPU might be idle. */
+ gcvBROADCAST_GPU_IDLE,
+
+ /* A commit is going to happen. */
+ gcvBROADCAST_GPU_COMMIT,
+
+ /* GPU seems to be stuck. */
+ gcvBROADCAST_GPU_STUCK,
+
+ /* First process gets attached. */
+ gcvBROADCAST_FIRST_PROCESS,
+
+ /* Last process gets detached. */
+ gcvBROADCAST_LAST_PROCESS,
+
+ /* AXI bus error. */
+ gcvBROADCAST_AXI_BUS_ERROR,
+
+ /* Out of memory. */
+ gcvBROADCAST_OUT_OF_MEMORY,
+}
+gceBROADCAST;
+
+gceSTATUS
+gckOS_Broadcast(
+ IN gckOS Os,
+ IN gckHARDWARE Hardware,
+ IN gceBROADCAST Reason
+ );
+
+gceSTATUS
+gckOS_BroadcastHurry(
+ IN gckOS Os,
+ IN gckHARDWARE Hardware,
+ IN gctUINT Urgency
+ );
+
+gceSTATUS
+gckOS_BroadcastCalibrateSpeed(
+ IN gckOS Os,
+ IN gckHARDWARE Hardware,
+ IN gctUINT Idle,
+ IN gctUINT Time
+ );
+
+/*******************************************************************************
+**
+** gckOS_SetGPUPower
+**
+** Set the power of the GPU on or off.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gceCORE Core
+** GPU whose power is set.
+**
+** gctBOOL Clock
+** gcvTRUE to turn on the clock, or gcvFALSE to turn off the clock.
+**
+** gctBOOL Power
+** gcvTRUE to turn on the power, or gcvFALSE to turn off the power.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_SetGPUPower(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctBOOL Clock,
+ IN gctBOOL Power
+ );
+
+gceSTATUS
+gckOS_ResetGPU(
+ IN gckOS Os,
+ IN gceCORE Core
+ );
+
+gceSTATUS
+gckOS_PrepareGPUFrequency(
+ IN gckOS Os,
+ IN gceCORE Core
+ );
+
+gceSTATUS
+gckOS_FinishGPUFrequency(
+ IN gckOS Os,
+ IN gceCORE Core
+ );
+
+gceSTATUS
+gckOS_QueryGPUFrequency(
+ IN gckOS Os,
+ IN gceCORE Core,
+ OUT gctUINT32 * Frequency,
+ OUT gctUINT8 * Scale
+ );
+
+gceSTATUS
+gckOS_SetGPUFrequency(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT8 Scale
+ );
+
+/*******************************************************************************
+** Semaphores.
+*/
+
+/* Create a new semaphore. */
+gceSTATUS
+gckOS_CreateSemaphore(
+ IN gckOS Os,
+ OUT gctPOINTER * Semaphore
+ );
+
+#if gcdENABLE_VG
+gceSTATUS
+gckOS_CreateSemaphoreVG(
+ IN gckOS Os,
+ OUT gctPOINTER * Semaphore
+ );
+#endif
+
+/* Delete a semahore. */
+gceSTATUS
+gckOS_DestroySemaphore(
+ IN gckOS Os,
+ IN gctPOINTER Semaphore
+ );
+
+/* Acquire a semahore. */
+gceSTATUS
+gckOS_AcquireSemaphore(
+ IN gckOS Os,
+ IN gctPOINTER Semaphore
+ );
+
+/* Try to acquire a semahore. */
+gceSTATUS
+gckOS_TryAcquireSemaphore(
+ IN gckOS Os,
+ IN gctPOINTER Semaphore
+ );
+
+/* Release a semahore. */
+gceSTATUS
+gckOS_ReleaseSemaphore(
+ IN gckOS Os,
+ IN gctPOINTER Semaphore
+ );
+
+/*******************************************************************************
+** Timer API.
+*/
+
+typedef void (*gctTIMERFUNCTION)(gctPOINTER);
+
+/* Create a timer. */
+gceSTATUS
+gckOS_CreateTimer(
+ IN gckOS Os,
+ IN gctTIMERFUNCTION Function,
+ IN gctPOINTER Data,
+ OUT gctPOINTER * Timer
+ );
+
+/* Destory a timer. */
+gceSTATUS
+gckOS_DestroyTimer(
+ IN gckOS Os,
+ IN gctPOINTER Timer
+ );
+
+/* Start a timer. */
+gceSTATUS
+gckOS_StartTimer(
+ IN gckOS Os,
+ IN gctPOINTER Timer,
+ IN gctUINT32 Delay
+ );
+
+/* Stop a timer. */
+gceSTATUS
+gckOS_StopTimer(
+ IN gckOS Os,
+ IN gctPOINTER Timer
+ );
+
+/******************************************************************************\
+********************************* gckHEAP Object ********************************
+\******************************************************************************/
+
+typedef struct _gckHEAP * gckHEAP;
+
+/* Construct a new gckHEAP object. */
+gceSTATUS
+gckHEAP_Construct(
+ IN gckOS Os,
+ IN gctSIZE_T AllocationSize,
+ OUT gckHEAP * Heap
+ );
+
+/* Destroy an gckHEAP object. */
+gceSTATUS
+gckHEAP_Destroy(
+ IN gckHEAP Heap
+ );
+
+/* Allocate memory. */
+gceSTATUS
+gckHEAP_Allocate(
+ IN gckHEAP Heap,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Node
+ );
+
+/* Free memory. */
+gceSTATUS
+gckHEAP_Free(
+ IN gckHEAP Heap,
+ IN gctPOINTER Node
+ );
+
+/* Profile the heap. */
+gceSTATUS
+gckHEAP_ProfileStart(
+ IN gckHEAP Heap
+ );
+
+gceSTATUS
+gckHEAP_ProfileEnd(
+ IN gckHEAP Heap,
+ IN gctCONST_STRING Title
+ );
+
+typedef struct _gckVIDMEM * gckVIDMEM;
+typedef struct _gckKERNEL * gckKERNEL;
+typedef struct _gckDB * gckDB;
+typedef struct _gckDVFS * gckDVFS;
+typedef struct _gckMMU * gckMMU;
+typedef struct _gcsDEVICE * gckDEVICE;
+
+/******************************************************************************\
+******************************** gckKERNEL Object ******************************
+\******************************************************************************/
+
+struct _gcsHAL_INTERFACE;
+
+/* Notifications. */
+typedef enum _gceNOTIFY
+{
+ gcvNOTIFY_INTERRUPT,
+ gcvNOTIFY_COMMAND_QUEUE,
+}
+gceNOTIFY;
+
+/* Flush flags. */
+typedef enum _gceKERNEL_FLUSH
+{
+ gcvFLUSH_COLOR = 0x01,
+ gcvFLUSH_DEPTH = 0x02,
+ gcvFLUSH_TEXTURE = 0x04,
+ gcvFLUSH_2D = 0x08,
+ gcvFLUSH_L2 = 0x10,
+ gcvFLUSH_TILE_STATUS = 0x20,
+ gcvFLUSH_ICACHE = 0x40,
+ gcvFLUSH_TXDESC = 0x80,
+ gcvFLUSH_FENCE = 0x100,
+ gcvFLUSH_VERTEX = 0x200,
+ gcvFLUSH_TFBHEADER = 0x400,
+ gcvFLUSH_ALL = gcvFLUSH_COLOR
+ | gcvFLUSH_DEPTH
+ | gcvFLUSH_TEXTURE
+ | gcvFLUSH_2D
+ | gcvFLUSH_L2
+ | gcvFLUSH_TILE_STATUS
+ | gcvFLUSH_ICACHE
+ | gcvFLUSH_TXDESC
+ | gcvFLUSH_FENCE
+ | gcvFLUSH_VERTEX
+ | gcvFLUSH_TFBHEADER
+}
+gceKERNEL_FLUSH;
+
+/* Construct a new gckKERNEL object. */
+gceSTATUS
+gckKERNEL_Construct(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT ChipID,
+ IN gctPOINTER Context,
+ IN gckDEVICE Device,
+ IN gckDB SharedDB,
+ OUT gckKERNEL * Kernel
+ );
+
+/* Destroy an gckKERNEL object. */
+gceSTATUS
+gckKERNEL_Destroy(
+ IN gckKERNEL Kernel
+ );
+
+/* Dispatch a user-level command. */
+gceSTATUS
+gckKERNEL_Dispatch(
+ IN gckKERNEL Kernel,
+ IN gckDEVICE Device,
+ IN OUT struct _gcsHAL_INTERFACE * Interface
+ );
+
+/* Query Database requirements. */
+gceSTATUS
+ gckKERNEL_QueryDatabase(
+ IN gckKERNEL Kernel,
+ IN gctUINT32 ProcessID,
+ IN OUT gcsHAL_INTERFACE * Interface
+ );
+
+/* Query the video memory. */
+gceSTATUS
+gckKERNEL_QueryVideoMemory(
+ IN gckKERNEL Kernel,
+ OUT struct _gcsHAL_INTERFACE * Interface
+ );
+
+/* Lookup the gckVIDMEM object for a pool. */
+gceSTATUS
+gckKERNEL_GetVideoMemoryPool(
+ IN gckKERNEL Kernel,
+ IN gcePOOL Pool,
+ OUT gckVIDMEM * VideoMemory
+ );
+
+/* Map dedicated video memory node. */
+gceSTATUS
+gckKERNEL_MapVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gctBOOL InUserSpace,
+ IN gcePOOL Pool,
+ IN gctPHYS_ADDR Physical,
+ IN gctUINT32 Offset,
+ IN gctUINT32 Bytes,
+ OUT gctPOINTER * Logical
+ );
+
+/* Unmap dedicated video memory. */
+gceSTATUS
+gckKERNEL_UnmapVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gcePOOL Pool,
+ IN gctPHYS_ADDR Physical,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Pid,
+ IN gctSIZE_T Bytes
+ );
+
+/* Map memory. */
+gceSTATUS
+gckKERNEL_MapMemory(
+ IN gckKERNEL Kernel,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Logical
+ );
+
+/* Unmap memory. */
+gceSTATUS
+gckKERNEL_UnmapMemory(
+ IN gckKERNEL Kernel,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical,
+ IN gctUINT32 ProcessID
+ );
+
+/* Notification of events. */
+gceSTATUS
+gckKERNEL_Notify(
+ IN gckKERNEL Kernel,
+ IN gceNOTIFY Notifcation
+ );
+
+/*******************************************************************************
+**
+** gckKERNEL_Recovery
+**
+** Try to recover the GPU from a fatal error.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_Recovery(
+ IN gckKERNEL Kernel
+ );
+
+/* Get access to the user data. */
+gceSTATUS
+gckKERNEL_OpenUserData(
+ IN gckKERNEL Kernel,
+ IN gctBOOL NeedCopy,
+ IN gctPOINTER StaticStorage,
+ IN gctPOINTER UserPointer,
+ IN gctSIZE_T Size,
+ OUT gctPOINTER * KernelPointer
+ );
+
+/* Release resources associated with the user data connection. */
+gceSTATUS
+gckKERNEL_CloseUserData(
+ IN gckKERNEL Kernel,
+ IN gctBOOL NeedCopy,
+ IN gctBOOL FlushData,
+ IN gctPOINTER UserPointer,
+ IN gctSIZE_T Size,
+ OUT gctPOINTER * KernelPointer
+ );
+
+gceSTATUS
+gckDVFS_Construct(
+ IN gckHARDWARE Hardware,
+ OUT gckDVFS * Frequency
+ );
+
+gceSTATUS
+gckDVFS_Destroy(
+ IN gckDVFS Dvfs
+ );
+
+gceSTATUS
+gckDVFS_Start(
+ IN gckDVFS Dvfs
+ );
+
+gceSTATUS
+gckDVFS_Stop(
+ IN gckDVFS Dvfs
+ );
+
+/******************************************************************************\
+******************************* gckHARDWARE Object *****************************
+\******************************************************************************/
+
+/* Construct a new gckHARDWARE object. */
+gceSTATUS
+gckHARDWARE_Construct(
+ IN gckOS Os,
+ IN gckDEVICE Device,
+ IN gceCORE Core,
+ OUT gckHARDWARE * Hardware
+ );
+
+/* Post hardware resource allocation after gckHARDWARE object constructed. */
+gceSTATUS
+gckHARDWARE_PostConstruct(
+ IN gckHARDWARE Hardware
+ );
+
+/* Pre-destroy hardwre resource before destroying an gckHARDWARE object. */
+gceSTATUS
+gckHARDWARE_PreDestroy(
+ IN gckHARDWARE Hardware
+ );
+
+/* Destroy an gckHARDWARE object. */
+gceSTATUS
+gckHARDWARE_Destroy(
+ IN gckHARDWARE Hardware
+ );
+
+/* Get hardware type. */
+gceSTATUS
+gckHARDWARE_GetType(
+ IN gckHARDWARE Hardware,
+ OUT gceHARDWARE_TYPE * Type
+ );
+
+/* Query system memory requirements. */
+gceSTATUS
+gckHARDWARE_QuerySystemMemory(
+ IN gckHARDWARE Hardware,
+ OUT gctSIZE_T * SystemSize,
+ OUT gctUINT32 * SystemBaseAddress
+ );
+
+/* Build virtual address. */
+gceSTATUS
+gckHARDWARE_BuildVirtualAddress(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Index,
+ IN gctUINT32 Offset,
+ OUT gctUINT32 * Address
+ );
+
+/* Query command buffer requirements. */
+gceSTATUS
+gckHARDWARE_QueryCommandBuffer(
+ IN gckHARDWARE Hardware,
+ IN gceENGINE Engine,
+ OUT gctUINT32 * Alignment,
+ OUT gctUINT32 * ReservedHead,
+ OUT gctUINT32 * ReservedTail
+ );
+
+/* Add a PIPESELECT command in the command queue. */
+gceSTATUS
+gckHARDWARE_PipeSelect(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gcePIPE_SELECT Pipe,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Query the available memory. */
+gceSTATUS
+gckHARDWARE_QueryMemory(
+ IN gckHARDWARE Hardware,
+ OUT gctSIZE_T * InternalSize,
+ OUT gctUINT32 * InternalBaseAddress,
+ OUT gctUINT32 * InternalAlignment,
+ OUT gctSIZE_T * ExternalSize,
+ OUT gctUINT32 * ExternalBaseAddress,
+ OUT gctUINT32 * ExternalAlignment,
+ OUT gctUINT32 * HorizontalTileSize,
+ OUT gctUINT32 * VerticalTileSize
+ );
+
+/* Query the identity of the hardware. */
+gceSTATUS
+gckHARDWARE_QueryChipIdentity(
+ IN gckHARDWARE Hardware,
+ OUT gcsHAL_QUERY_CHIP_IDENTITY_PTR Identity
+ );
+
+gceSTATUS
+gckHARDWARE_QueryChipOptions(
+ IN gckHARDWARE Hardware,
+ OUT gcsHAL_QUERY_CHIP_OPTIONS_PTR Options
+ );
+
+
+/* Split a harwdare specific address into API stuff. */
+gceSTATUS
+gckHARDWARE_SplitMemory(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Address,
+ OUT gcePOOL * Pool,
+ OUT gctUINT32 * Offset
+ );
+
+/* Update command queue tail pointer. */
+gceSTATUS
+gckHARDWARE_UpdateQueueTail(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Offset
+ );
+
+/* Interrupt manager. */
+gceSTATUS
+gckHARDWARE_Interrupt(
+ IN gckHARDWARE Hardware
+ );
+
+gceSTATUS
+gckHARDWARE_Notify(
+ IN gckHARDWARE Hardware
+ );
+
+/* Program MMU. */
+gceSTATUS
+gckHARDWARE_SetMMU(
+ IN gckHARDWARE Hardware,
+ IN gckMMU Mmu
+ );
+
+/* Flush the MMU. */
+gceSTATUS
+gckHARDWARE_FlushMMU(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address,
+ IN gctUINT32 SubsequentBytes,
+ IN OUT gctUINT32 * Bytes
+ );
+
+gceSTATUS
+gckHARDWARE_FlushAsyncMMU(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ );
+
+gceSTATUS
+gckHARDWARE_FlushMcfeMMU(
+ IN gckHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Get idle register. */
+gceSTATUS
+gckHARDWARE_GetIdle(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL Wait,
+ OUT gctUINT32 * Data
+ );
+
+/* Flush the caches. */
+gceSTATUS
+gckHARDWARE_Flush(
+ IN gckHARDWARE Hardware,
+ IN gceKERNEL_FLUSH Flush,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ );
+
+/* Enable/disable fast clear. */
+gceSTATUS
+gckHARDWARE_SetFastClear(
+ IN gckHARDWARE Hardware,
+ IN gctINT Enable,
+ IN gctINT Compression
+ );
+
+gceSTATUS
+gckHARDWARE_ReadInterrupt(
+ IN gckHARDWARE Hardware,
+ OUT gctUINT32_PTR IDs
+ );
+
+/*
+* State timer helper.
+*/
+gceSTATUS
+gckHARDWARE_StartTimerReset(
+ IN gckHARDWARE Hardware
+ );
+
+/* Power management. */
+gceSTATUS
+gckHARDWARE_SetPowerState(
+ IN gckHARDWARE Hardware,
+ IN gceCHIPPOWERSTATE State
+ );
+
+gceSTATUS
+gckHARDWARE_QueryPowerState(
+ IN gckHARDWARE Hardware,
+ OUT gceCHIPPOWERSTATE* State
+ );
+
+gceSTATUS
+gckHARDWARE_EnablePowerManagement(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gckHARDWARE_SetGpuProfiler(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL GpuProfiler
+ );
+
+#if gcdENABLE_FSCALE_VAL_ADJUST
+gceSTATUS
+gckHARDWARE_SetFscaleValue(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 FscaleValue,
+ IN gctUINT32 ShaderFscaleValue
+ );
+
+gceSTATUS
+gckHARDWARE_GetFscaleValue(
+ IN gckHARDWARE Hardware,
+ IN gctUINT * FscaleValue,
+ IN gctUINT * MinFscaleValue,
+ IN gctUINT * MaxFscaleValue
+ );
+
+gceSTATUS
+gckHARDWARE_SetMinFscaleValue(
+ IN gckHARDWARE Hardware,
+ IN gctUINT MinFscaleValue
+ );
+#endif
+
+gceSTATUS
+gckHARDWARE_InitializeHardware(
+ IN gckHARDWARE Hardware
+ );
+
+gceSTATUS
+gckHARDWARE_Reset(
+ IN gckHARDWARE Hardware
+ );
+
+/* Check for Hardware features. */
+gceSTATUS
+gckHARDWARE_IsFeatureAvailable(
+ IN gckHARDWARE Hardware,
+ IN gceFEATURE Feature
+ );
+
+gceSTATUS
+gckHARDWARE_DumpMMUException(
+ IN gckHARDWARE Hardware
+ );
+
+gceSTATUS
+gckHARDWARE_DumpGPUState(
+ IN gckHARDWARE Hardware
+ );
+
+gceSTATUS
+gckHARDWARE_InitDVFS(
+ IN gckHARDWARE Hardware
+ );
+
+gceSTATUS
+gckHARDWARE_QueryLoad(
+ IN gckHARDWARE Hardware,
+ OUT gctUINT32 * Load
+ );
+
+gceSTATUS
+gckHARDWARE_SetDVFSPeroid(
+ IN gckHARDWARE Hardware,
+ IN gctUINT32 Frequency
+ );
+
+gceSTATUS
+gckHARDWARE_QueryStateTimer(
+ IN gckHARDWARE Hardware,
+ OUT gctUINT64_PTR On,
+ OUT gctUINT64_PTR Off,
+ OUT gctUINT64_PTR Idle,
+ OUT gctUINT64_PTR Suspend
+ );
+
+gceSTATUS
+gckHARDWARE_Fence(
+ IN gckHARDWARE Hardware,
+ IN gceENGINE Engine,
+ IN gctPOINTER Logical,
+ IN gctUINT32 FenceAddress,
+ IN gctUINT64 FenceData,
+ IN OUT gctUINT32 * Bytes
+ );
+
+#if !gcdENABLE_VG
+/******************************************************************************\
+***************************** gckINTERRUPT Object ******************************
+\******************************************************************************/
+
+typedef struct _gckINTERRUPT * gckINTERRUPT;
+
+typedef gceSTATUS (* gctINTERRUPT_HANDLER)(
+ IN gckKERNEL Kernel
+ );
+
+gceSTATUS
+gckINTERRUPT_Construct(
+ IN gckKERNEL Kernel,
+ OUT gckINTERRUPT * Interrupt
+ );
+
+gceSTATUS
+gckINTERRUPT_Destroy(
+ IN gckINTERRUPT Interrupt
+ );
+
+gceSTATUS
+gckINTERRUPT_SetHandler(
+ IN gckINTERRUPT Interrupt,
+ IN OUT gctINT32_PTR Id,
+ IN gctINTERRUPT_HANDLER Handler
+ );
+
+gceSTATUS
+gckINTERRUPT_Notify(
+ IN gckINTERRUPT Interrupt,
+ IN gctBOOL Valid
+ );
+#endif
+
+/******************************************************************************\
+********************************* gckMMU Object ********************************
+\******************************************************************************/
+
+/* Construct a new gckMMU object. */
+gceSTATUS
+gckMMU_Construct(
+ IN gckKERNEL Kernel,
+ IN gctSIZE_T MmuSize,
+ OUT gckMMU * Mmu
+ );
+
+/* Destroy an gckMMU object. */
+gceSTATUS
+gckMMU_Destroy(
+ IN gckMMU Mmu
+ );
+
+/* Allocate pages inside the MMU. */
+gceSTATUS
+gckMMU_AllocatePages(
+ IN gckMMU Mmu,
+ IN gctSIZE_T PageCount,
+ IN gcePAGE_TYPE PageType,
+ OUT gctPOINTER * PageTable,
+ OUT gctUINT32 * Address
+ );
+
+gceSTATUS
+gckMMU_AllocatePagesEx(
+ IN gckMMU Mmu,
+ IN gctSIZE_T PageCount,
+ IN gceVIDMEM_TYPE Type,
+ IN gcePAGE_TYPE PageType,
+ IN gctBOOL Secure,
+ OUT gctPOINTER * PageTable,
+ OUT gctUINT32 * Address
+ );
+
+/* Remove a page table from the MMU. */
+gceSTATUS
+gckMMU_FreePages(
+ IN gckMMU Mmu,
+ IN gctBOOL Secure,
+ IN gcePAGE_TYPE PageType,
+ IN gctUINT32 Address,
+ IN gctPOINTER PageTable,
+ IN gctSIZE_T PageCount
+ );
+
+/* Set the MMU page with info. */
+gceSTATUS
+gckMMU_SetPage(
+ IN gckMMU Mmu,
+ IN gctPHYS_ADDR_T PageAddress,
+ IN gcePAGE_TYPE PageType,
+ IN gctBOOL Writable,
+ IN gctUINT32 *PageEntry
+ );
+
+gceSTATUS
+gckMMU_Flush(
+ IN gckMMU Mmu,
+ IN gceVIDMEM_TYPE Type
+ );
+
+gceSTATUS
+gckMMU_DumpPageTableEntry(
+ IN gckMMU Mmu,
+ IN gceAREA_TYPE AreaType,
+ IN gctUINT32 Address
+ );
+
+gceSTATUS
+gckMMU_FillFlatMapping(
+ IN gckMMU Mmu,
+ IN gctUINT64 PhysBase,
+ IN gctSIZE_T Size
+ );
+
+gceSTATUS
+gckMMU_IsFlatMapped(
+ IN gckMMU Mmu,
+ IN gctUINT64 Physical,
+ IN gctUINT32 Address,
+ OUT gctBOOL *In
+ );
+
+gceSTATUS
+gckMMU_GetAreaType(
+ IN gckMMU Mmu,
+ IN gctUINT32 GpuAddress,
+ OUT gceAREA_TYPE *AreaType
+ );
+
+gceSTATUS
+gckHARDWARE_QueryContextProfile(
+ IN gckHARDWARE Hardware,
+ IN gctBOOL Reset,
+ IN gckCONTEXT Context,
+ OUT gcsPROFILER_COUNTERS_PART1 * Counters_part1,
+ OUT gcsPROFILER_COUNTERS_PART2 * Counters_part2
+ );
+
+gceSTATUS
+gckHARDWARE_UpdateContextProfile(
+ IN gckHARDWARE Hardware,
+ IN gckCONTEXT Context
+ );
+
+gceSTATUS
+gckHARDWARE_InitProfiler(
+ IN gckHARDWARE Hardware
+ );
+
+gceSTATUS
+gckOS_DetectProcessByName(
+ IN gctCONST_POINTER Name
+ );
+
+void
+gckOS_DumpParam(
+ void
+ );
+
+#ifdef __cplusplus
+}
+#endif
+
+#if gcdENABLE_VG
+#include "gc_hal_vg.h"
+#endif
+
+#endif /* __gc_hal_h_ */
+
+
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
new file mode 100644
index 000000000000..56a7d59cd8b4
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_base.h
@@ -0,0 +1,6051 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_base_h_
+#define __gc_hal_base_h_
+
+#include "gc_hal_enum.h"
+#include "gc_hal_types.h"
+#include "gc_hal_debug_zones.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************\
+****************************** Object Declarations *****************************
+\******************************************************************************/
+
+typedef struct _gckOS * gckOS;
+typedef struct _gcoHAL * gcoHAL;
+typedef struct _gcoOS * gcoOS;
+typedef struct _gco2D * gco2D;
+typedef struct gcsATOM * gcsATOM_PTR;
+
+typedef struct _gco3D * gco3D;
+typedef struct _gcoCL * gcoCL;
+typedef struct _gcoVX * gcoVX;
+typedef struct _gcsFAST_FLUSH * gcsFAST_FLUSH_PTR;
+
+typedef struct _gcoSURF * gcoSURF;
+typedef struct _gcsSURF_NODE * gcsSURF_NODE_PTR;
+typedef struct _gcsSURF_FORMAT_INFO * gcsSURF_FORMAT_INFO_PTR;
+typedef struct _gcsPOINT * gcsPOINT_PTR;
+typedef struct _gcsSIZE * gcsSIZE_PTR;
+typedef struct _gcsRECT * gcsRECT_PTR;
+typedef struct _gcsBOUNDARY * gcsBOUNDARY_PTR;
+typedef struct _gcoHARDWARE * gcoHARDWARE;
+typedef union _gcuVIDMEM_NODE * gcuVIDMEM_NODE_PTR;
+typedef struct _gcsVIDMEM_NODE * gckVIDMEM_NODE;
+typedef struct _gcsVIDMEM_BLOCK * gckVIDMEM_BLOCK;
+
+#if gcdENABLE_VG
+typedef struct _gcoVG * gcoVG;
+typedef struct _gcsCOMPLETION_SIGNAL * gcsCOMPLETION_SIGNAL_PTR;
+typedef struct _gcsCONTEXT_MAP * gcsCONTEXT_MAP_PTR;
+#else
+typedef void * gcoVG;
+#endif
+
+typedef struct _gcoFENCE * gcoFENCE;
+typedef struct _gcsSYNC_CONTEXT * gcsSYNC_CONTEXT_PTR;
+
+typedef enum {
+ gcvFENCE_TYPE_READ = 0x1,
+ gcvFENCE_TYPE_WRITE = 0x2,
+ gcvFENCE_TYPE_ALL = gcvFENCE_TYPE_READ | gcvFENCE_TYPE_WRITE,
+ gcvFNECE_TYPE_INVALID = 0x10000,
+}
+gceFENCE_TYPE;
+
+typedef struct _gcsUSER_MEMORY_DESC * gcsUSER_MEMORY_DESC_PTR;
+
+/* Immuatable features from database */
+typedef struct _gcsNN_FIXED_FEATURE
+{
+ gctUINT vipCoreCount;
+ gctUINT nnCoreCount; /* total nn core count */
+ gctUINT nnCoreCountInt8; /* total nn core count supporting int8 */
+ gctUINT nnCoreCountInt16; /* total nn core count supporting int16 */
+ gctUINT nnCoreCountFloat16; /* total nn core count supporting float16 */
+ gctUINT nnCoreCountBFloat16; /* total nn core count supporting Bfloat16 */
+ gctUINT nnMadPerCore;
+ gctUINT nnInputBufferDepth;
+ gctUINT nnAccumBufferDepth;
+ gctUINT nnFCNonPrunAccel;
+ gctUINT nnInImageOffsetBits;
+ gctUINT tpCoreCount; /* full-function core count */
+ gctUINT tpPwlLUTCount;
+ gctUINT tpPwlLUTSize;
+ gctUINT vip7Version;
+ gctUINT vipBrickMode;
+ gctUINT tpReorderInImageSize;
+ gctUINT tpliteCoreCount; /* fc-only core count */
+ gctUINT nnFP16XYDPX;
+ gctUINT nnFP16XYDPY;
+ gctUINT nnFP16ZDP;
+ gctUINT zrlBits;
+ gctUINT uscCacheControllers;
+ gctUINT uscBanks;
+ gctUINT nnLanesPerOutCycle;
+ gctUINT maxOTNumber;
+ gctUINT equivalentVipsramWidthInByte;
+ gctUINT shaderCoreCount;
+ gctUINT latencyHidingAtFullAxiBw;
+ gctUINT axiBusWidth;
+} gcsNN_FIXED_FEATURE;
+
+/* Features can be customized from outside */
+typedef struct _gcsNN_CUSTOMIZED_FEATURE
+{
+ gctUINT vipSRAMSize;
+ gctUINT axiSRAMSize;
+ gctFLOAT ddrReadBWLimit;
+ gctFLOAT ddrWriteBWLimit;
+ gctFLOAT ddrTotalBWLimit;
+ gctFLOAT axiSramReadBWLimit;
+ gctFLOAT axiSramWriteBWLimit;
+ gctFLOAT axiSramTotalBWLimit;
+ gctFLOAT axiBusReadBWLimit;
+ gctFLOAT axiBusWriteBWLimit;
+ gctFLOAT axiBusTotalBWLimit;
+ gctUINT vipSWTiling;
+ gctFLOAT ddrLatency;
+ gctUINT freqInMHZ;
+ gctUINT axiClockFreqInMHZ;
+ gctUINT maxSocOTNumber;/*max SOC outstanding transfer number*/
+ gctUINT nnWriteWithoutUSC;
+ gctUINT depthWiseSupport;
+ gctUINT vipVectorPrune;
+} gcsNN_CUSTOMIZED_FEATURE;
+
+/* Features are unified (hardcoded) for hardwares */
+typedef struct _gcsNN_UNIFIED_FEATURE
+{
+ gctUINT nnUSCCacheSize;
+ gctUINT nnCmdSizeInBytes;
+ gctUINT tpCmdSizeInBytes;
+ gctUINT vipCoefDecodePerf;
+ gctUINT vipCachedReadFromSram;
+ gctUINT vipImagePartialCache;
+ gctUINT lanesPerConv;
+ gctUINT maxTileSize;
+ gctUINT fullCacheKernelHeadFix : 1;
+ gctUINT conv1x1HalfPerformance : 1;
+ gctUINT per3DTileBubbleFix : 1;
+ gctUINT cacheLineModeDisabled : 1;
+ gctUINT tpReOrderFix : 1;
+ gctUINT zdp3NoCompressFix : 1;
+ gctUINT asyncCopyPerfFix : 1;
+ gctUINT accurateTileBW : 1;
+ gctUINT zxdp3KernelReadConflictFix : 1;
+ gctUINT axiSramSlowedDownByAddr:1;
+ gctUINT slowNNReqArbitrationFix:1;
+ gctUINT singlePortAccBuffer : 1;
+ gctUINT convOutFifoDepthFix : 1;
+ gctUINT smallBatchEnable : 1;
+ gctUINT axiSramOnlySWTiling : 1;
+ gctUINT imageNotPackedInSram : 1;
+ gctUINT coefDeltaCordOverFlowZRL8BitFix : 1;
+ gctUINT lowEfficiencyOfIDWriteImgBufFix : 1;
+ gctUINT xyOffsetLimitationFix : 1;
+ gctUINT kernelPerCoreLTOneThirdCoefFix : 1;
+ gctUINT diffConditionForCachelineModePreFix : 1;
+} gcsNN_UNIFIED_FEATURE;
+
+/* Features are derived from above ones */
+typedef struct _gcsNN_DERIVIED_FEATURE
+{
+ gctUINT nnDPAmount;
+ gctUINT nnXYDPX;
+ gctUINT nnXYDPY;
+ gctUINT nnZDP;
+ gctFLOAT totalLatency;
+ gctFLOAT internalLatency;
+ gctFLOAT ddrReadBWInBytePerCycle;
+ gctFLOAT ddrWriteBWInBytePerCycle;
+} gcsNN_DERIVED_FEATURE;
+
+/******************************************************************************\
+********************* Share obj lock/unlock macros. ****************************
+\******************************************************************************/
+#define gcmLOCK_SHARE_OBJ(Obj) \
+{ \
+ if(Obj->sharedLock != gcvNULL)\
+ {\
+ (gcoOS_AcquireMutex(\
+ gcvNULL, Obj->sharedLock, gcvINFINITE));\
+ }\
+}
+
+
+#define gcmUNLOCK_SHARE_OBJ(Obj)\
+{\
+ if(Obj->sharedLock != gcvNULL)\
+ {\
+ (gcoOS_ReleaseMutex(gcvNULL, Obj->sharedLock));\
+ }\
+}
+
+typedef struct _gcsSystemInfo
+{
+ /* memory latency number for SH data fetch, in SH cycle*/
+ gctUINT32 memoryLatencySH;
+}
+gcsSystemInfo;
+
+
+#define gcPLS_INITIALIZER \
+{ \
+ gcvNULL, /* gcoOS object. */ \
+ gcvNULL, /* gcoHAL object. */ \
+ 0, /* internalSize */ \
+ 0, /* internalPhysName */ \
+ gcvNULL, /* internalLogical */ \
+ 0, /* externalSize */ \
+ 0, /* externalPhysName */ \
+ gcvNULL, /* externalLogical */ \
+ 0, /* contiguousSize */ \
+ 0, /* contiguousPhysName */ \
+ gcvNULL, /* contiguousLogical */ \
+ gcvNULL, /* eglDisplayInfo */ \
+ gcvNULL, /* eglSurfaceInfo */ \
+ gcvSURF_A8R8G8B8,/* eglConfigFormat */ \
+ gcvNULL, /* reference */ \
+ 0, /* processID */ \
+ 0, /* threadID */ \
+ gcvFALSE, /* exiting */ \
+ gcvFALSE, /* Special flag for NP2 texture. */ \
+ gcvFALSE, /* device open. */ \
+ gcvNULL, /* destructor */ \
+ gcvNULL, /* accessLock */ \
+ gcvNULL, /* GL FE compiler lock*/ \
+ gcvNULL, /* CL FE compiler lock*/ \
+ gcvNULL, /* VX context lock */ \
+ gcvPATCH_NOTINIT,/* global patchID */ \
+ gcvNULL, /* global fenceID*/ \
+ gcvFALSE, /* memory profile flag */ \
+ gcvNULL, /* profileLock; */ \
+ 0, /* allocCount; */ \
+ 0, /* allocSize; */ \
+ 0, /* maxAllocSize; */ \
+ 0, /* freeCount; */ \
+ 0, /* freeSize; */ \
+ 0, /* currentSize; */ \
+ 0, /* video_allocCount; */ \
+ 0, /* video_allocSize; */ \
+ 0, /* video_maxAllocSize; */ \
+ 0, /* video_freeCount; */ \
+ 0, /* video_freeSize; */ \
+ 0, /* video_currentSize; */ \
+}
+
+/******************************************************************************\
+******************************* Thread local storage *************************
+\******************************************************************************/
+
+typedef struct _gcsDRIVER_TLS * gcsDRIVER_TLS_PTR;
+
+typedef struct _gcsDRIVER_TLS
+{
+ void (* destructor)(gcsDRIVER_TLS_PTR Tls);
+}
+gcsDRIVER_TLS;
+
+typedef enum _gceTLS_KEY
+{
+ gcvTLS_KEY_EGL,
+ gcvTLS_KEY_OPENGL_ES,
+ gcvTLS_KEY_OPENVG,
+ gcvTLS_KEY_OPENGL,
+ gcvTLS_KEY_OPENCL,
+ gcvTLS_KEY_OPENVX,
+
+ gcvTLS_KEY_COUNT
+}
+gceTLS_KEY;
+
+typedef struct _gcsTLS * gcsTLS_PTR;
+
+typedef struct _gcsTLS
+{
+ gceHARDWARE_TYPE currentType;
+
+ /* To which core device control is called,
+ * it is index in a hardware type.
+ */
+ gctUINT32 currentCoreIndex;
+
+ /* Current 3D hardwre of this thread */
+ gcoHARDWARE currentHardware;
+
+ /* Default 3D hardware of this thread */
+ gcoHARDWARE defaultHardware;
+
+ /* Only for separated 3D and 2D */
+ gcoHARDWARE hardware2D;
+#if gcdENABLE_VG
+ gcoVGHARDWARE vg;
+ gcoVG engineVG;
+#endif /* gcdENABLE_VG */
+#if gcdENABLE_3D
+ gco3D engine3D;
+#endif
+#if gcdENABLE_2D
+ gco2D engine2D;
+#if gcdDUMP_2D
+ gctUINT32 newDump2DFlag;
+#endif
+
+#endif
+ gcoVX engineVX;
+
+ gctBOOL copied;
+
+ /* libGAL.so handle */
+ gctHANDLE handle;
+
+ /* If true, do not releas 2d engine and hardware in hal layer */
+ gctBOOL release2DUpper;
+
+ /* Driver tls. */
+ gcsDRIVER_TLS_PTR driverTLS[gcvTLS_KEY_COUNT];
+}
+gcsTLS;
+
+/******************************************************************************\
+********************************* Enumerations *********************************
+\******************************************************************************/
+
+typedef enum _gcePLS_VALUE
+{
+ gcePLS_VALUE_EGL_DISPLAY_INFO,
+ gcePLS_VALUE_EGL_CONFIG_FORMAT_INFO,
+ gcePLS_VALUE_EGL_DESTRUCTOR_INFO,
+}
+gcePLS_VALUE;
+
+/* Video memory pool type. */
+typedef enum _gcePOOL
+{
+ gcvPOOL_UNKNOWN = 0,
+ gcvPOOL_DEFAULT,
+ gcvPOOL_LOCAL,
+ gcvPOOL_LOCAL_INTERNAL,
+ gcvPOOL_LOCAL_EXTERNAL,
+ gcvPOOL_UNIFIED,
+ gcvPOOL_SYSTEM,
+ gcvPOOL_SRAM,
+ gcvPOOL_VIRTUAL,
+ gcvPOOL_USER,
+ gcvPOOL_INTERNAL_SRAM,
+ gcvPOOL_EXTERNAL_SRAM,
+
+ gcvPOOL_NUMBER_OF_POOLS
+}
+gcePOOL;
+
+#if gcdENABLE_3D
+/* Blending functions. */
+typedef enum _gceBLEND_FUNCTION
+{
+ gcvBLEND_ZERO,
+ gcvBLEND_ONE,
+ gcvBLEND_SOURCE_COLOR,
+ gcvBLEND_INV_SOURCE_COLOR,
+ gcvBLEND_SOURCE_ALPHA,
+ gcvBLEND_INV_SOURCE_ALPHA,
+ gcvBLEND_TARGET_COLOR,
+ gcvBLEND_INV_TARGET_COLOR,
+ gcvBLEND_TARGET_ALPHA,
+ gcvBLEND_INV_TARGET_ALPHA,
+ gcvBLEND_SOURCE_ALPHA_SATURATE,
+ gcvBLEND_CONST_COLOR,
+ gcvBLEND_INV_CONST_COLOR,
+ gcvBLEND_CONST_ALPHA,
+ gcvBLEND_INV_CONST_ALPHA,
+}
+gceBLEND_FUNCTION;
+
+/* Blending modes. */
+typedef enum _gceBLEND_MODE
+{
+ gcvBLEND_ADD = 0,
+ gcvBLEND_SUBTRACT,
+ gcvBLEND_REVERSE_SUBTRACT,
+ gcvBLEND_MIN,
+ gcvBLEND_MAX,
+ gcvBLEND_MULTIPLY,
+ gcvBLEND_SCREEN,
+ gcvBLEND_OVERLAY,
+ gcvBLEND_DARKEN,
+ gcvBLEND_LIGHTEN,
+ gcvBLEND_COLORDODGE,
+ gcvBLEND_COLORBURN,
+ gcvBLEND_HARDLIGHT,
+ gcvBLEND_SOFTLIGHT,
+ gcvBLEND_DIFFERENCE,
+ gcvBLEND_EXCLUSION,
+ gcvBLEND_HSL_HUE,
+ gcvBLEND_HSL_SATURATION,
+ gcvBLEND_HSL_COLOR,
+ gcvBLEND_HSL_LUMINOSITY,
+
+ gcvBLEND_TOTAL
+}
+gceBLEND_MODE;
+
+/* Depth modes. */
+typedef enum _gceDEPTH_MODE
+{
+ gcvDEPTH_NONE,
+ gcvDEPTH_Z,
+ gcvDEPTH_W,
+}
+gceDEPTH_MODE;
+#endif /* gcdENABLE_3D */
+
+
+/* API flags. */
+typedef enum _gceAPI
+{
+ gcvAPI_D3D = 1,
+ gcvAPI_OPENGL_ES11,
+ gcvAPI_OPENGL_ES20,
+ gcvAPI_OPENGL_ES30,
+ gcvAPI_OPENGL_ES31,
+ gcvAPI_OPENGL_ES32,
+ gcvAPI_OPENGL,
+ gcvAPI_OPENVG,
+ gcvAPI_OPENCL,
+ gcvAPI_OPENVK,
+}
+gceAPI;
+
+typedef enum _gceWHERE
+{
+ gcvWHERE_COMMAND_PREFETCH = 0,
+ gcvWHERE_COMMAND,
+ gcvWHERE_RASTER,
+ gcvWHERE_PIXEL,
+ gcvWHERE_BLT,
+}
+gceWHERE;
+
+typedef enum _gceHOW
+{
+ gcvHOW_SEMAPHORE = 0x1,
+ gcvHOW_STALL = 0x2,
+ gcvHOW_SEMAPHORE_STALL = 0x3,
+}
+gceHOW;
+
+typedef enum _gceSignalHandlerType
+{
+ gcvHANDLE_SIGFPE_WHEN_SIGNAL_CODE_IS_0 = 0x1,
+}
+gceSignalHandlerType;
+
+typedef struct _gcsSURF_VIEW
+{
+ gcoSURF surf;
+ gctUINT firstSlice;
+ gctUINT numSlices;
+}gcsSURF_VIEW;
+
+/* gcsHAL_Limits*/
+typedef struct _gcsHAL_LIMITS
+{
+ /* chip info */
+ gceCHIPMODEL chipModel;
+ gctUINT32 chipRevision;
+ gctUINT32 featureCount;
+ gctUINT32 *chipFeatures;
+
+ /* target caps */
+ gctUINT32 maxWidth;
+ gctUINT32 maxHeight;
+ gctUINT32 multiTargetCount;
+ gctUINT32 maxSamples;
+
+}gcsHAL_LIMITS;
+
+
+typedef struct _gcsHAL_CHIPIDENTITY
+{
+ gceCHIPMODEL chipModel;
+ gctUINT32 chipRevision;
+ gctUINT32 productID;
+ gctUINT32 customerID;
+ gctUINT32 ecoID;
+ gceCHIP_FLAG chipFlags;
+ gctUINT64 platformFlagBits;
+}
+gcsHAL_CHIPIDENTITY;
+
+
+#define gcdEXTERNAL_MEMORY_NAME_MAX 32
+#define gcdEXTERNAL_MEMORY_DATA_MAX 8
+
+typedef struct _gcsEXTERNAL_MEMORY_INFO
+{
+ /* Name of allocator used to attach this memory. */
+ gctCHAR allocatorName[gcdEXTERNAL_MEMORY_NAME_MAX];
+
+ /* User defined data which will be passed to allocator. */
+ gctUINT32 userData[gcdEXTERNAL_MEMORY_DATA_MAX];
+}
+gcsEXTERNAL_MEMORY_INFO;
+
+/******************************************************************************\
+********************************* gcoHAL Object *********************************
+\******************************************************************************/
+
+/* Construct a new gcoHAL object. */
+gceSTATUS
+gcoHAL_ConstructEx(
+ IN gctPOINTER Context,
+ IN gcoOS Os,
+ OUT gcoHAL * Hal
+ );
+
+/* Destroy an gcoHAL object. */
+gceSTATUS
+gcoHAL_DestroyEx(
+ IN gcoHAL Hal
+ );
+
+/* Empty function for compatibility. */
+gceSTATUS
+gcoHAL_Construct(
+ IN gctPOINTER Context,
+ IN gcoOS Os,
+ OUT gcoHAL * Hal
+ );
+
+/* Empty function for compatibility. */
+gceSTATUS
+gcoHAL_Destroy(
+ IN gcoHAL Hal
+ );
+
+/* Get HAL options */
+gceSTATUS
+gcoHAL_GetOption(
+ IN gcoHAL Hal,
+ IN gceOPTION Option
+ );
+
+gceSTATUS
+gcoHAL_FrameInfoOps(
+ IN gcoHAL Hal,
+ IN gceFRAMEINFO FrameInfo,
+ IN gceFRAMEINFO_OP Op,
+ IN OUT gctUINT * Val
+ );
+
+/* Set HAL options */
+gceSTATUS
+gcoHAL_SetOption(
+ IN gcoHAL Hal,
+ IN gceOPTION Option,
+ IN gctBOOL Value
+ );
+
+gceSTATUS
+gcoHAL_GetHardware(
+ IN gcoHAL Hal,
+ OUT gcoHARDWARE* Hw
+ );
+
+#if gcdENABLE_2D
+/* Get pointer to gco2D object. */
+gceSTATUS
+gcoHAL_Get2DEngine(
+ IN gcoHAL Hal,
+ OUT gco2D * Engine
+ );
+#endif
+
+#if gcdENABLE_3D
+gceSTATUS
+gcoHAL_GetSpecialHintData(
+ IN gcoHAL Hal,
+ OUT gctINT * Hint
+ );
+/*
+** Deprecated(Don't use it), keep it here for external library(libgcu.so)
+*/
+gceSTATUS
+gcoHAL_Get3DEngine(
+ IN gcoHAL Hal,
+ OUT gco3D * Engine
+ );
+#endif /* gcdENABLE_3D */
+
+
+gceSTATUS
+gcoHAL_GetProductName(
+ IN gcoHAL Hal,
+ OUT gctSTRING *ProductName,
+ OUT gctUINT *PID
+ );
+
+gceSTATUS
+gcoHAL_SetFscaleValue(
+ IN gctUINT FscaleValue,
+ IN gctUINT ShaderFscaleValue
+ );
+
+gceSTATUS
+gcoHAL_GetFscaleValue(
+ OUT gctUINT * FscaleValue,
+ OUT gctUINT * MinFscaleValue,
+ OUT gctUINT * MaxFscaleValue
+ );
+
+gceSTATUS
+gcoHAL_SetBltNP2Texture(
+ gctBOOL enable
+ );
+
+gceSTATUS
+gcoHAL_ExportVideoMemory(
+ IN gctUINT32 Handle,
+ IN gctUINT32 Flags,
+ OUT gctINT32 * FD
+ );
+
+gceSTATUS
+gcoHAL_NameVideoMemory(
+ IN gctUINT32 Handle,
+ OUT gctUINT32 * Name
+ );
+
+gceSTATUS
+gcoHAL_ImportVideoMemory(
+ IN gctUINT32 Name,
+ OUT gctUINT32 * Handle
+ );
+
+gceSTATUS
+gcoHAL_GetVideoMemoryFd(
+ IN gctUINT32 Handle,
+ OUT gctINT * Fd
+ );
+
+/* Verify whether the specified feature is available in hardware. */
+gceSTATUS
+gcoHAL_IsFeatureAvailable(
+ IN gcoHAL Hal,
+ IN gceFEATURE Feature
+ );
+
+gceSTATUS
+gcoHAL_IsFeatureAvailable1(
+ IN gcoHAL Hal,
+ IN gceFEATURE Feature
+ );
+
+/* Query the identity of the hardware. */
+gceSTATUS
+gcoHAL_QueryChipIdentity(
+ IN gcoHAL Hal,
+ OUT gceCHIPMODEL* ChipModel,
+ OUT gctUINT32* ChipRevision,
+ OUT gctUINT32* ChipFeatures,
+ OUT gctUINT32* ChipMinorFeatures
+ );
+
+gceSTATUS gcoHAL_QueryChipIdentityEx(
+ IN gcoHAL Hal,
+ IN gctUINT32 SizeOfParam,
+ OUT gcsHAL_CHIPIDENTITY *ChipIdentity
+ );
+
+
+gceSTATUS
+gcoHAL_QuerySuperTileMode(
+ OUT gctUINT32_PTR SuperTileMode
+ );
+
+gceSTATUS
+gcoHAL_QueryChipAxiBusWidth(
+ OUT gctBOOL * AXI128Bits
+ );
+
+gceSTATUS
+gcoHAL_QueryMultiGPUAffinityConfig(
+ IN gceHARDWARE_TYPE Type,
+ OUT gceMULTI_GPU_MODE *Mode,
+ OUT gctUINT32_PTR CoreIndex
+ );
+
+gceSTATUS
+gcoHAL_QuerySRAM(
+ IN gcoHAL Hal,
+ IN gcePOOL Type,
+ OUT gctUINT32 *Size,
+ OUT gctUINT32 *GPUVirtAddr,
+ OUT gctPHYS_ADDR_T *GPUPhysAddr,
+ OUT gctUINT32 *GPUPhysName,
+ OUT gctPHYS_ADDR_T *CPUPhysAddr
+ );
+
+#ifdef LINUX
+gctINT32
+gcoOS_EndRecordAllocation(void);
+void
+gcoOS_RecordAllocation(void);
+void
+gcoOS_AddRecordAllocation(gctSIZE_T Size);
+#endif
+
+/* Query the amount of video memory. */
+gceSTATUS
+gcoHAL_QueryVideoMemory(
+ IN gcoHAL Hal,
+ OUT gctUINT32 * InternalPhysName,
+ OUT gctSIZE_T * InternalSize,
+ OUT gctUINT32 * ExternalPhysName,
+ OUT gctSIZE_T * ExternalSize,
+ OUT gctUINT32 * ContiguousPhysName,
+ OUT gctSIZE_T * ContiguousSize
+ );
+
+/* Map video memory. */
+gceSTATUS
+gcoHAL_MapMemory(
+ IN gcoHAL Hal,
+ IN gctUINT32 PhysName,
+ IN gctSIZE_T NumberOfBytes,
+ OUT gctPOINTER * Logical
+ );
+
+/* Unmap video memory. */
+gceSTATUS
+gcoHAL_UnmapMemory(
+ IN gcoHAL Hal,
+ IN gctUINT32 PhysName,
+ IN gctSIZE_T NumberOfBytes,
+ IN gctPOINTER Logical
+ );
+
+/* Schedule an unmap of a buffer mapped through its physical address. */
+gceSTATUS
+gcoHAL_ScheduleUnmapMemory(
+ IN gcoHAL Hal,
+ IN gctUINT32 PhysName,
+ IN gctSIZE_T NumberOfBytes,
+ IN gctPOINTER Logical
+ );
+
+/* Allocate video memory. */
+gceSTATUS
+gcoOS_AllocateVideoMemory(
+ IN gcoOS Os,
+ IN gctBOOL InUserSpace,
+ IN gctBOOL InCacheable,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gctUINT32 * Physical,
+ OUT gctPOINTER * Logical,
+ OUT gctPOINTER * Handle
+ );
+
+/* Free video memory. */
+gceSTATUS
+gcoOS_FreeVideoMemory(
+ IN gcoOS Os,
+ IN gctPOINTER Handle
+ );
+
+/* Lock video memory. */
+gceSTATUS
+gcoOS_LockVideoMemory(
+ IN gcoOS Os,
+ IN gctPOINTER Handle,
+ IN gctBOOL InUserSpace,
+ IN gctBOOL InCacheable,
+ OUT gctUINT32 * Address,
+ OUT gctPOINTER * Logical
+ );
+
+/* Commit the current command buffer. */
+gceSTATUS
+gcoHAL_Commit(
+ IN gcoHAL Hal,
+ IN gctBOOL Stall
+ );
+
+#if gcdENABLE_3D
+/* Sencd fence command. */
+gceSTATUS
+gcoHAL_SendFence(
+ IN gcoHAL Hal
+ );
+#endif /* gcdENABLE_3D */
+
+/* Query the tile capabilities. */
+gceSTATUS
+gcoHAL_QueryTiled(
+ IN gcoHAL Hal,
+ OUT gctINT32 * TileWidth2D,
+ OUT gctINT32 * TileHeight2D,
+ OUT gctINT32 * TileWidth3D,
+ OUT gctINT32 * TileHeight3D
+ );
+
+gceSTATUS
+gcoHAL_Compact(
+ IN gcoHAL Hal
+ );
+
+#if VIVANTE_PROFILER_SYSTEM_MEMORY
+gceSTATUS
+gcoHAL_ProfileStart(
+ IN gcoHAL Hal
+ );
+
+gceSTATUS
+gcoHAL_ProfileEnd(
+ IN gcoHAL Hal,
+ IN gctCONST_STRING Title
+ );
+#endif
+
+/* Power Management */
+gceSTATUS
+gcoHAL_SetPowerManagementState(
+ IN gcoHAL Hal,
+ IN gceCHIPPOWERSTATE State
+ );
+
+gceSTATUS
+gcoHAL_QueryPowerManagementState(
+ IN gcoHAL Hal,
+ OUT gceCHIPPOWERSTATE *State
+ );
+
+/* Set the filter type for filter blit. */
+gceSTATUS
+gcoHAL_SetFilterType(
+ IN gcoHAL Hal,
+ IN gceFILTER_TYPE FilterType
+ );
+
+/* Call the kernel HAL layer. */
+gceSTATUS
+gcoHAL_Call(
+ IN gcoHAL Hal,
+ IN OUT gcsHAL_INTERFACE_PTR Interface
+ );
+
+/* Schedule an event. */
+gceSTATUS
+gcoHAL_ScheduleEvent(
+ IN gcoHAL Hal,
+ IN OUT gcsHAL_INTERFACE_PTR Interface
+ );
+
+/* Request a start/stop timestamp. */
+gceSTATUS
+gcoHAL_SetTimer(
+ IN gcoHAL Hal,
+ IN gctUINT32 Index,
+ IN gctBOOL Start
+ );
+
+/* Get Time delta from a Timer in microseconds. */
+gceSTATUS
+gcoHAL_GetTimerTime(
+ IN gcoHAL Hal,
+ IN gctUINT32 Timer,
+ OUT gctINT32_PTR TimeDelta
+ );
+
+/* set timeout value. */
+gceSTATUS
+gcoHAL_SetTimeOut(
+ IN gcoHAL Hal,
+ IN gctUINT32 timeOut
+ );
+
+gceSTATUS
+gcoHAL_SetHardwareType(
+ IN gcoHAL Hal,
+ IN gceHARDWARE_TYPE HardwardType
+ );
+
+gceSTATUS
+gcoHAL_GetHardwareType(
+ IN gcoHAL Hal,
+ OUT gceHARDWARE_TYPE * HardwardType
+ );
+
+gceSTATUS
+gcoHAL_QueryChipCount(
+ IN gcoHAL Hal,
+ OUT gctINT32 * Count
+ );
+
+gceSTATUS
+gcoHAL_Query3DCoreCount(
+ IN gcoHAL Hal,
+ OUT gctUINT32 *Count
+ );
+
+gceSTATUS
+gcoHAL_QueryCluster(
+ IN gcoHAL Hal,
+ OUT gctINT32 *ClusterMinID,
+ OUT gctINT32 *ClusterMaxID,
+ OUT gctUINT32 *ClusterCount,
+ OUT gctUINT32 *ClusterIDWidth
+ );
+
+gceSTATUS
+gcoHAL_QueryCoreCount(
+ IN gcoHAL Hal,
+ IN gceHARDWARE_TYPE Type,
+ OUT gctUINT *Count,
+ OUT gctUINT_PTR ChipIDs
+ );
+
+gceSTATUS
+gcoHAL_QuerySeparated2D(
+ IN gcoHAL Hal
+ );
+
+gceSTATUS
+gcoHAL_QueryHybrid2D(
+ IN gcoHAL Hal
+ );
+
+gceSTATUS
+gcoHAL_Is3DAvailable(
+ IN gcoHAL Hal
+ );
+
+/* Get pointer to gcoVG object. */
+gceSTATUS
+gcoHAL_GetVGEngine(
+ IN gcoHAL Hal,
+ OUT gcoVG * Engine
+ );
+
+gceSTATUS
+gcoHAL_QueryChipLimits(
+ IN gcoHAL Hal,
+ IN gctINT32 Chip,
+ OUT gcsHAL_LIMITS *Limits);
+
+gceSTATUS
+gcoHAL_QueryChipFeature(
+ IN gcoHAL Hal,
+ IN gctINT32 Chip,
+ IN gceFEATURE Feature);
+
+gceSTATUS
+gcoHAL_SetCoreIndex(
+ IN gcoHAL Hal,
+ IN gctUINT32 Core
+ );
+
+gceSTATUS
+gcoHAL_GetCurrentCoreIndex(
+ IN gcoHAL Hal,
+ OUT gctUINT32 *Core
+ );
+
+gceSTATUS
+gcoHAL_SelectChannel(
+ IN gcoHAL Hal,
+ IN gctBOOL Priority,
+ IN gctUINT32 ChannelId
+ );
+
+gceSTATUS
+gcoHAL_MCFESemaphore(
+ IN gctUINT32 SemaHandle,
+ IN gctBOOL SendSema
+ );
+
+gceSTATUS
+gcoHAL_AllocateMCFESemaphore(
+ OUT gctUINT32 * SemaHandle
+ );
+
+gceSTATUS
+gcoHAL_FreeMCFESemaphore(
+ IN gctUINT32 SemaHandle
+ );
+
+/*----------------------------------------------------------------------------*/
+/*----- Shared Buffer --------------------------------------------------------*/
+
+/* Create shared buffer. */
+gceSTATUS
+gcoHAL_CreateShBuffer(
+ IN gctUINT32 Size,
+ OUT gctSHBUF * ShBuf
+ );
+
+/* Destroy shared buffer. */
+gceSTATUS
+gcoHAL_DestroyShBuffer(
+ IN gctSHBUF ShBuf
+ );
+
+/* Map shared buffer to current process. */
+gceSTATUS
+gcoHAL_MapShBuffer(
+ IN gctSHBUF ShBuf
+ );
+
+/* Write user data to shared buffer. */
+gceSTATUS
+gcoHAL_WriteShBuffer(
+ IN gctSHBUF ShBuf,
+ IN gctCONST_POINTER Data,
+ IN gctUINT32 ByteCount
+ );
+
+/* Read user data from shared buffer. */
+gceSTATUS
+gcoHAL_ReadShBuffer(
+ IN gctSHBUF ShBuf,
+ IN gctPOINTER Data,
+ IN gctUINT32 BytesCount,
+ OUT gctUINT32 * BytesRead
+ );
+
+/* Config power management to be enabled or disabled. */
+gceSTATUS
+gcoHAL_ConfigPowerManagement(
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gcoHAL_AllocateVideoMemory(
+ IN gctUINT Alignment,
+ IN gceVIDMEM_TYPE Type,
+ IN gctUINT32 Flag,
+ IN gcePOOL Pool,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gctUINT32_PTR Node
+ );
+
+gceSTATUS
+gcoHAL_LockVideoMemory(
+ IN gctUINT32 Node,
+ IN gctBOOL Cacheable,
+ IN gceENGINE engine,
+ OUT gctUINT32 * Address,
+ OUT gctPOINTER * Logical
+ );
+
+gceSTATUS
+gcoHAL_UnlockVideoMemory(
+ IN gctUINT32 Node,
+ IN gceVIDMEM_TYPE Type,
+ IN gceENGINE engine
+ );
+
+gceSTATUS
+gcoHAL_ReleaseVideoMemory(
+ IN gctUINT32 Node
+ );
+
+#if gcdENABLE_3D || gcdENABLE_VG
+/* Query the target capabilities. */
+gceSTATUS
+gcoHAL_QueryTargetCaps(
+ IN gcoHAL Hal,
+ OUT gctUINT * MaxWidth,
+ OUT gctUINT * MaxHeight,
+ OUT gctUINT * MultiTargetCount,
+ OUT gctUINT * MaxSamples
+ );
+#endif
+
+gceSTATUS
+gcoHAL_WrapUserMemory(
+ IN gcsUSER_MEMORY_DESC_PTR UserMemoryDesc,
+ IN gceVIDMEM_TYPE Type,
+ OUT gctUINT32_PTR Node
+ );
+
+gceSTATUS
+gcoHAL_QueryResetTimeStamp(
+ OUT gctUINT64_PTR ResetTimeStamp,
+ OUT gctUINT64_PTR ContextID
+ );
+
+gceSTATUS
+gcoHAL_WaitFence(
+ IN gctUINT32 Handle,
+ IN gctUINT32 TimeOut
+ );
+
+#if gcdENABLE_2D
+gceSTATUS
+gcoHAL_AttachExternalMemory(
+ IN gcoHAL Hal,
+ IN gcsEXTERNAL_MEMORY_INFO * External,
+ OUT gctPOINTER * Handle,
+ OUT gctUINT32_PTR GPU2DAddress
+ );
+
+gceSTATUS
+gcoHAL_DetachExternalMemory(
+ IN gcoHAL Hal,
+ IN gctPOINTER * Handle
+ );
+#endif
+
+gceSTATUS
+gcoHAL_ScheduleSignal(
+ IN gctSIGNAL Signal,
+ IN gctSIGNAL AuxSignal,
+ IN gctINT ProcessID,
+ IN gceKERNEL_WHERE FromWhere
+ );
+
+gceSTATUS
+gcoHAL_GetGraphicBufferFd(
+ IN gctUINT32 Node[3],
+ IN gctSHBUF ShBuf,
+ IN gctSIGNAL Signal,
+ OUT gctINT32 * Fd
+ );
+
+gceSTATUS
+gcoHAL_AlignToTile(
+ IN OUT gctUINT32 * Width,
+ IN OUT gctUINT32 * Height,
+ IN gceSURF_TYPE Type,
+ IN gceSURF_FORMAT Format
+ );
+
+/******************************************************************************\
+********************************** gcoOS Object *********************************
+\******************************************************************************/
+/* Lock PLS access */
+gceSTATUS
+gcoOS_LockPLS(
+ void
+ );
+
+/* Unlock PLS access */
+gceSTATUS
+gcoOS_UnLockPLS(
+ void
+ );
+
+/* Get PLS value for given key */
+gctPOINTER
+gcoOS_GetPLSValue(
+ IN gcePLS_VALUE key
+ );
+
+/* Set PLS value of a given key */
+void
+gcoOS_SetPLSValue(
+ IN gcePLS_VALUE key,
+ OUT gctPOINTER value
+ );
+
+/* Lock GL FE compiler access */
+gceSTATUS
+gcoOS_LockGLFECompiler(
+ void
+ );
+
+/* Unlock GL FE compiler access */
+gceSTATUS
+gcoOS_UnLockGLFECompiler(
+ void
+ );
+
+/* Lock CL FE compiler access */
+gceSTATUS
+gcoOS_LockCLFECompiler(
+ void
+ );
+
+/* Unlock CL FE compiler access */
+gceSTATUS
+gcoOS_UnLockCLFECompiler(
+ void
+ );
+
+gceSTATUS
+gcoOS_GetTLS(
+ OUT gcsTLS_PTR * TLS
+ );
+
+/* Copy the TLS from a source thread. */
+gceSTATUS
+gcoOS_CopyTLS(
+ IN gcsTLS_PTR Source
+ );
+
+/* Query the thread local storage. */
+gceSTATUS
+gcoOS_QueryTLS(
+ OUT gcsTLS_PTR * TLS
+ );
+
+/* Get access to driver tls. */
+gceSTATUS
+gcoOS_GetDriverTLS(
+ IN gceTLS_KEY Key,
+ OUT gcsDRIVER_TLS_PTR * TLS
+ );
+
+/*
+ * Set driver tls.
+ * May cause memory leak if 'destructor' not set.
+ */
+gceSTATUS
+gcoOS_SetDriverTLS(
+ IN gceTLS_KEY Key,
+ IN gcsDRIVER_TLS * TLS
+ );
+
+/* Destroy the objects associated with the current thread. */
+void
+gcoOS_FreeThreadData(
+ void
+ );
+
+/* Empty function for compatibility. */
+gceSTATUS
+gcoOS_Construct(
+ IN gctPOINTER Context,
+ OUT gcoOS * Os
+ );
+
+/* Empty function for compatibility. */
+gceSTATUS
+gcoOS_Destroy(
+ IN gcoOS Os
+ );
+
+/* Deprecated API: please use gcoHAL_GetBaseAddr() instead.
+** This API was kept only for legacy BSP usage.
+**
+** Get the base address for the physical memory.
+*/
+gceSTATUS
+gcoOS_GetBaseAddress(
+ IN gcoOS Os,
+ OUT gctUINT32_PTR BaseAddress
+ );
+
+/* Allocate memory from the heap. */
+gceSTATUS
+gcoOS_Allocate(
+ IN gcoOS Os,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Memory
+ );
+
+/* Get allocated memory size. */
+gceSTATUS
+gcoOS_GetMemorySize(
+ IN gcoOS Os,
+ IN gctPOINTER Memory,
+ OUT gctSIZE_T_PTR MemorySize
+ );
+
+/* Free allocated memory. */
+gceSTATUS
+gcoOS_Free(
+ IN gcoOS Os,
+ IN gctPOINTER Memory
+ );
+
+/* Allocate memory. */
+gceSTATUS
+gcoOS_AllocateSharedMemory(
+ IN gcoOS Os,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Memory
+ );
+
+/* Free memory. */
+gceSTATUS
+gcoOS_FreeSharedMemory(
+ IN gcoOS Os,
+ IN gctPOINTER Memory
+ );
+
+/* Allocate memory. */
+gceSTATUS
+gcoOS_AllocateMemory(
+ IN gcoOS Os,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Memory
+ );
+
+/* Free memory. */
+gceSTATUS
+gcoOS_FreeMemory(
+ IN gcoOS Os,
+ IN gctPOINTER Memory
+ );
+
+/* Device I/O Control call to the kernel HAL layer. */
+gceSTATUS
+gcoOS_DeviceControl(
+ IN gcoOS Os,
+ IN gctUINT32 IoControlCode,
+ IN gctPOINTER InputBuffer,
+ IN gctSIZE_T InputBufferSize,
+ IN gctPOINTER OutputBuffer,
+ IN gctSIZE_T OutputBufferSize
+ );
+
+#define gcmOS_SAFE_FREE(os, mem) \
+ gcoOS_Free(os, mem); \
+ mem = gcvNULL
+
+#define gcmOS_SAFE_FREE_SHARED_MEMORY(os, mem) \
+ gcoOS_FreeSharedMemory(os, mem); \
+ mem = gcvNULL
+
+#define gcmkOS_SAFE_FREE(os, mem) \
+ gckOS_Free(os, mem); \
+ mem = gcvNULL
+
+#define gcdMAX_PATH 512
+
+typedef enum _gceFILE_MODE
+{
+ gcvFILE_CREATE = 0,
+ gcvFILE_APPEND,
+ gcvFILE_READ,
+ gcvFILE_CREATETEXT,
+ gcvFILE_APPENDTEXT,
+ gcvFILE_READTEXT,
+}
+gceFILE_MODE;
+
+/* Open a file. */
+gceSTATUS
+gcoOS_Open(
+ IN gcoOS Os,
+ IN gctCONST_STRING FileName,
+ IN gceFILE_MODE Mode,
+ OUT gctFILE * File
+ );
+
+/* Close a file. */
+gceSTATUS
+gcoOS_Close(
+ IN gcoOS Os,
+ IN gctFILE File
+ );
+
+/* Remove a file. */
+gceSTATUS
+gcoOS_Remove(
+ IN gcoOS Os,
+ IN gctCONST_STRING FileName
+ );
+
+/* Read data from a file. */
+gceSTATUS
+gcoOS_Read(
+ IN gcoOS Os,
+ IN gctFILE File,
+ IN gctSIZE_T ByteCount,
+ IN gctPOINTER Data,
+ OUT gctSIZE_T * ByteRead
+ );
+
+/* Write data to a file. */
+gceSTATUS
+gcoOS_Write(
+ IN gcoOS Os,
+ IN gctFILE File,
+ IN gctSIZE_T ByteCount,
+ IN gctCONST_POINTER Data
+ );
+
+/* Flush data to a file. */
+gceSTATUS
+gcoOS_Flush(
+ IN gcoOS Os,
+ IN gctFILE File
+ );
+
+/* Close a file descriptor. */
+gceSTATUS
+gcoOS_CloseFD(
+ IN gcoOS Os,
+ IN gctINT FD
+ );
+
+/* Scan a file. */
+gceSTATUS
+gcoOS_FscanfI(
+ IN gcoOS Os,
+ IN gctFILE File,
+ IN gctCONST_STRING Format,
+ OUT gctUINT *result
+ );
+
+/* Dup file descriptor to another. */
+gceSTATUS
+gcoOS_DupFD(
+ IN gcoOS Os,
+ IN gctINT FD,
+ OUT gctINT * FD2
+ );
+
+/* Lock a file. */
+gceSTATUS
+gcoOS_LockFile(
+ IN gcoOS Os,
+ IN gctFILE File,
+ IN gctBOOL Shared,
+ IN gctBOOL Block
+ );
+
+/* Unlock a file. */
+gceSTATUS
+gcoOS_UnlockFile(
+ IN gcoOS Os,
+ IN gctFILE File
+ );
+
+/* Create an endpoint for communication. */
+gceSTATUS
+gcoOS_Socket(
+ IN gcoOS Os,
+ IN gctINT Domain,
+ IN gctINT Type,
+ IN gctINT Protocol,
+ OUT gctINT *SockFd
+ );
+
+/* Close a socket. */
+gceSTATUS
+gcoOS_CloseSocket(
+ IN gcoOS Os,
+ IN gctINT SockFd
+ );
+
+/* Initiate a connection on a socket. */
+gceSTATUS
+gcoOS_Connect(
+ IN gcoOS Os,
+ IN gctINT SockFd,
+ IN gctCONST_POINTER HostName,
+ IN gctUINT Port);
+
+/* Shut down part of connection on a socket. */
+gceSTATUS
+gcoOS_Shutdown(
+ IN gcoOS Os,
+ IN gctINT SockFd,
+ IN gctINT How
+ );
+
+/* Send a message on a socket. */
+gceSTATUS
+gcoOS_Send(
+ IN gcoOS Os,
+ IN gctINT SockFd,
+ IN gctSIZE_T ByteCount,
+ IN gctCONST_POINTER Data,
+ IN gctINT Flags
+ );
+
+/* Initiate a connection on a socket. */
+gceSTATUS
+gcoOS_WaitForSend(
+ IN gcoOS Os,
+ IN gctINT SockFd,
+ IN gctINT Seconds,
+ IN gctINT MicroSeconds);
+
+/* Get environment variable value. */
+gceSTATUS
+gcoOS_GetEnv(
+ IN gcoOS Os,
+ IN gctCONST_STRING VarName,
+ OUT gctSTRING * Value
+ );
+
+/* Set environment variable value. */
+gceSTATUS
+gcoOS_SetEnv(
+ IN gcoOS Os,
+ IN gctCONST_STRING VarName,
+ IN gctSTRING Value
+ );
+
+/* Get current working directory. */
+gceSTATUS
+gcoOS_GetCwd(
+ IN gcoOS Os,
+ IN gctINT SizeInBytes,
+ OUT gctSTRING Buffer
+ );
+
+/* Get file status info. */
+gceSTATUS
+gcoOS_Stat(
+ IN gcoOS Os,
+ IN gctCONST_STRING FileName,
+ OUT gctPOINTER Buffer
+ );
+
+typedef enum _gceFILE_WHENCE
+{
+ gcvFILE_SEEK_SET,
+ gcvFILE_SEEK_CUR,
+ gcvFILE_SEEK_END
+}
+gceFILE_WHENCE;
+
+/* Set the current position of a file. */
+gceSTATUS
+gcoOS_Seek(
+ IN gcoOS Os,
+ IN gctFILE File,
+ IN gctUINT32 Offset,
+ IN gceFILE_WHENCE Whence
+ );
+
+/* Set the current position of a file. */
+gceSTATUS
+gcoOS_SetPos(
+ IN gcoOS Os,
+ IN gctFILE File,
+ IN gctUINT32 Position
+ );
+
+/* Get the current position of a file. */
+gceSTATUS
+gcoOS_GetPos(
+ IN gcoOS Os,
+ IN gctFILE File,
+ OUT gctUINT32 * Position
+ );
+
+/* Same as strstr. */
+gceSTATUS
+gcoOS_StrStr(
+ IN gctCONST_STRING String,
+ IN gctCONST_STRING SubString,
+ OUT gctSTRING * Output
+ );
+
+/* Find the last occurance of a character inside a string. */
+gceSTATUS
+gcoOS_StrFindReverse(
+ IN gctCONST_STRING String,
+ IN gctINT8 Character,
+ OUT gctSTRING * Output
+ );
+
+gceSTATUS
+gcoOS_StrDup(
+ IN gcoOS Os,
+ IN gctCONST_STRING String,
+ OUT gctSTRING * Target
+ );
+
+/* Copy a string. */
+gceSTATUS
+gcoOS_StrCopySafe(
+ IN gctSTRING Destination,
+ IN gctSIZE_T DestinationSize,
+ IN gctCONST_STRING Source
+ );
+
+/* Append a string. */
+gceSTATUS
+gcoOS_StrCatSafe(
+ IN gctSTRING Destination,
+ IN gctSIZE_T DestinationSize,
+ IN gctCONST_STRING Source
+ );
+
+/* Compare two strings. */
+gceSTATUS
+gcoOS_StrCmp(
+ IN gctCONST_STRING String1,
+ IN gctCONST_STRING String2
+ );
+
+/* Compare characters of two strings. */
+gceSTATUS
+gcoOS_StrNCmp(
+ IN gctCONST_STRING String1,
+ IN gctCONST_STRING String2,
+ IN gctSIZE_T Count
+ );
+
+/* Convert string to float. */
+gceSTATUS
+gcoOS_StrToFloat(
+ IN gctCONST_STRING String,
+ OUT gctFLOAT * Float
+ );
+
+/* Convert hex string to integer. */
+gceSTATUS gcoOS_HexStrToInt(
+ IN gctCONST_STRING String,
+ OUT gctINT * Int
+ );
+
+/* Convert hex string to float. */
+gceSTATUS
+gcoOS_HexStrToFloat(
+ IN gctCONST_STRING String,
+ OUT gctFLOAT * Float
+ );
+
+/* Convert string to integer. */
+gceSTATUS
+gcoOS_StrToInt(
+ IN gctCONST_STRING String,
+ OUT gctINT * Int
+ );
+
+gceSTATUS
+gcoOS_MemCmp(
+ IN gctCONST_POINTER Memory1,
+ IN gctCONST_POINTER Memory2,
+ IN gctSIZE_T Bytes
+ );
+
+gceSTATUS
+gcoOS_PrintStrSafe(
+ OUT gctSTRING String,
+ IN gctSIZE_T StringSize,
+ IN OUT gctUINT * Offset,
+ IN gctCONST_STRING Format,
+ ...
+ );
+
+gceSTATUS
+gcoOS_LoadLibrary(
+ IN gcoOS Os,
+ IN gctCONST_STRING Library,
+ OUT gctHANDLE * Handle
+ );
+
+gceSTATUS
+gcoOS_FreeLibrary(
+ IN gcoOS Os,
+ IN gctHANDLE Handle
+ );
+
+gceSTATUS
+gcoOS_GetProcAddress(
+ IN gcoOS Os,
+ IN gctHANDLE Handle,
+ IN gctCONST_STRING Name,
+ OUT gctPOINTER * Function
+ );
+
+gceSTATUS
+gcoOS_Compact(
+ IN gcoOS Os
+ );
+
+gceSTATUS
+gcoOS_AddSignalHandler (
+ IN gceSignalHandlerType SignalHandlerType
+ );
+
+#if VIVANTE_PROFILER_SYSTEM_MEMORY
+gceSTATUS
+gcoOS_ProfileStart(
+ IN gcoOS Os
+ );
+
+gceSTATUS
+gcoOS_ProfileEnd(
+ IN gcoOS Os,
+ IN gctCONST_STRING Title
+ );
+
+gceSTATUS
+gcoOS_SetProfileSetting(
+ IN gcoOS Os,
+ IN gctBOOL Enable,
+ IN gctCONST_STRING FileName
+ );
+#endif
+
+/* Get the amount of physical system memory */
+gceSTATUS
+gcoOS_GetPhysicalSystemMemorySize(
+ OUT gctSIZE_T * PhysicalSystemMemorySize
+ );
+
+/* Query the video memory. */
+gceSTATUS
+gcoOS_QueryVideoMemory(
+ IN gcoOS Os,
+ OUT gctUINT32 * InternalPhysName,
+ OUT gctSIZE_T * InternalSize,
+ OUT gctUINT32 * ExternalPhysName,
+ OUT gctSIZE_T * ExternalSize,
+ OUT gctUINT32 * ContiguousPhysName,
+ OUT gctSIZE_T * ContiguousSize
+ );
+
+gceSTATUS
+gcoOS_QueryCurrentProcessName(
+ OUT gctSTRING Name,
+ IN gctSIZE_T Size
+ );
+
+
+/*----------------------------------------------------------------------------*/
+/*----- Atoms ----------------------------------------------------------------*/
+
+/* Construct an atom. */
+gceSTATUS
+gcoOS_AtomConstruct(
+ IN gcoOS Os,
+ OUT gcsATOM_PTR * Atom
+ );
+
+/* Destroy an atom. */
+gceSTATUS
+gcoOS_AtomDestroy(
+ IN gcoOS Os,
+ IN gcsATOM_PTR Atom
+ );
+
+/* Get the 32-bit value protected by an atom. */
+gceSTATUS
+gcoOS_AtomGet(
+ IN gcoOS Os,
+ IN gcsATOM_PTR Atom,
+ OUT gctINT32_PTR Value
+ );
+
+/* Set the 32-bit value protected by an atom. */
+gceSTATUS
+gcoOS_AtomSet(
+ IN gcoOS Os,
+ IN gcsATOM_PTR Atom,
+ IN gctINT32 Value
+ );
+
+/* Increment an atom. */
+gceSTATUS
+gcoOS_AtomIncrement(
+ IN gcoOS Os,
+ IN gcsATOM_PTR Atom,
+ OUT gctINT32_PTR OldValue
+ );
+
+/* Decrement an atom. */
+gceSTATUS
+gcoOS_AtomDecrement(
+ IN gcoOS Os,
+ IN gcsATOM_PTR Atom,
+ OUT gctINT32_PTR OldValue
+ );
+
+gctHANDLE
+gcoOS_GetCurrentProcessID(
+ void
+ );
+
+gctHANDLE
+gcoOS_GetCurrentThreadID(
+ void
+ );
+
+/*----------------------------------------------------------------------------*/
+/*----- Time -----------------------------------------------------------------*/
+
+/* Get the number of milliseconds since the system started. */
+gctUINT32
+gcoOS_GetTicks(
+ void
+ );
+
+/* Get time in microseconds. */
+gceSTATUS
+gcoOS_GetTime(
+ gctUINT64_PTR Time
+ );
+
+/* Get CPU usage in microseconds. */
+gceSTATUS
+gcoOS_GetCPUTime(
+ gctUINT64_PTR CPUTime
+ );
+
+/* Get memory usage. */
+gceSTATUS
+gcoOS_GetMemoryUsage(
+ gctUINT32_PTR MaxRSS,
+ gctUINT32_PTR IxRSS,
+ gctUINT32_PTR IdRSS,
+ gctUINT32_PTR IsRSS
+ );
+
+/* Delay a number of microseconds. */
+gceSTATUS
+gcoOS_Delay(
+ IN gcoOS Os,
+ IN gctUINT32 Delay
+ );
+
+/*----------------------------------------------------------------------------*/
+/*----- Threads --------------------------------------------------------------*/
+
+#ifdef _WIN32
+/* Cannot include windows.h here becuase "near" and "far"
+ * which are used in gcsDEPTH_INFO, are defined to nothing in WinDef.h.
+ * So, use the real value of DWORD and WINAPI, instead.
+ * DWORD is unsigned long, and WINAPI is __stdcall.
+ * If these two are change in WinDef.h, the following two typdefs
+ * need to be changed, too.
+ */
+typedef unsigned long gctTHREAD_RETURN;
+typedef unsigned long (__stdcall * gcTHREAD_ROUTINE)(void * Argument);
+#else
+typedef void * gctTHREAD_RETURN;
+typedef void * (* gcTHREAD_ROUTINE)(void *);
+#endif
+
+/* Create a new thread. */
+gceSTATUS
+gcoOS_CreateThread(
+ IN gcoOS Os,
+ IN gcTHREAD_ROUTINE Worker,
+ IN gctPOINTER Argument,
+ OUT gctPOINTER * Thread
+ );
+
+/* Close a thread. */
+gceSTATUS
+gcoOS_CloseThread(
+ IN gcoOS Os,
+ IN gctPOINTER Thread
+ );
+
+/*----------------------------------------------------------------------------*/
+/*----- Mutexes --------------------------------------------------------------*/
+
+/* Create a new mutex. */
+gceSTATUS
+gcoOS_CreateMutex(
+ IN gcoOS Os,
+ OUT gctPOINTER * Mutex
+ );
+
+/* Delete a mutex. */
+gceSTATUS
+gcoOS_DeleteMutex(
+ IN gcoOS Os,
+ IN gctPOINTER Mutex
+ );
+
+/* Acquire a mutex. */
+gceSTATUS
+gcoOS_AcquireMutex(
+ IN gcoOS Os,
+ IN gctPOINTER Mutex,
+ IN gctUINT32 Timeout
+ );
+
+/* Release a mutex. */
+gceSTATUS
+gcoOS_ReleaseMutex(
+ IN gcoOS Os,
+ IN gctPOINTER Mutex
+ );
+
+/*----------------------------------------------------------------------------*/
+/*----- Signals --------------------------------------------------------------*/
+
+/* Create a signal. */
+gceSTATUS
+gcoOS_CreateSignal(
+ IN gcoOS Os,
+ IN gctBOOL ManualReset,
+ OUT gctSIGNAL * Signal
+ );
+
+/* Destroy a signal. */
+gceSTATUS
+gcoOS_DestroySignal(
+ IN gcoOS Os,
+ IN gctSIGNAL Signal
+ );
+
+/* Signal a signal. */
+gceSTATUS
+gcoOS_Signal(
+ IN gcoOS Os,
+ IN gctSIGNAL Signal,
+ IN gctBOOL State
+ );
+
+/* Wait for a signal. */
+gceSTATUS
+gcoOS_WaitSignal(
+ IN gcoOS Os,
+ IN gctSIGNAL Signal,
+ IN gctUINT32 Wait
+ );
+
+/* Map a signal from another process */
+gceSTATUS
+gcoOS_MapSignal(
+ IN gctSIGNAL RemoteSignal,
+ OUT gctSIGNAL * LocalSignal
+ );
+
+/* Unmap a signal mapped from another process */
+gceSTATUS
+gcoOS_UnmapSignal(
+ IN gctSIGNAL Signal
+ );
+
+/*----------------------------------------------------------------------------*/
+/*----- Android Native Fence -------------------------------------------------*/
+
+/* Create native fence. */
+gceSTATUS
+gcoOS_CreateNativeFence(
+ IN gcoOS Os,
+ IN gctSIGNAL Signal,
+ OUT gctINT * FenceFD
+ );
+
+/* (CPU) Wait on native fence. */
+gceSTATUS
+gcoOS_ClientWaitNativeFence(
+ IN gcoOS Os,
+ IN gctINT FenceFD,
+ IN gctUINT32 Timeout
+ );
+
+/* (GPU) Wait on native fence. */
+gceSTATUS
+gcoOS_WaitNativeFence(
+ IN gcoOS Os,
+ IN gctINT FenceFD,
+ IN gctUINT32 Timeout
+ );
+
+/*----------------------------------------------------------------------------*/
+/*----- Memory Access and Cache ----------------------------------------------*/
+
+/* Write a register. */
+gceSTATUS
+gcoOS_WriteRegister(
+ IN gcoOS Os,
+ IN gctUINT32 Address,
+ IN gctUINT32 Data
+ );
+
+/* Read a register. */
+gceSTATUS
+gcoOS_ReadRegister(
+ IN gcoOS Os,
+ IN gctUINT32 Address,
+ OUT gctUINT32 * Data
+ );
+
+gceSTATUS
+gcoOS_CacheClean(
+ IN gcoOS Os,
+ IN gctUINT32 Node,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ );
+
+gceSTATUS
+gcoOS_CacheFlush(
+ IN gcoOS Os,
+ IN gctUINT32 Node,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ );
+
+gceSTATUS
+gcoOS_CacheInvalidate(
+ IN gcoOS Os,
+ IN gctUINT32 Node,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ );
+
+gceSTATUS
+gcoOS_MemoryBarrier(
+ IN gcoOS Os,
+ IN gctPOINTER Logical
+ );
+
+gceSTATUS
+gcoOS_CPUPhysicalToGPUPhysical(
+ IN gctPHYS_ADDR_T CPUPhysical,
+ OUT gctPHYS_ADDR_T * GPUPhysical
+ );
+
+gceSTATUS
+gcoOS_QuerySystemInfo(
+ IN gcoOS Os,
+ OUT gcsSystemInfo *Info
+ );
+
+
+/*----------------------------------------------------------------------------*/
+/*----- Profile --------------------------------------------------------------*/
+
+gceSTATUS
+gckOS_GetProfileTick(
+ OUT gctUINT64_PTR Tick
+ );
+
+gceSTATUS
+gckOS_QueryProfileTickRate(
+ OUT gctUINT64_PTR TickRate
+ );
+
+gctUINT32
+gckOS_ProfileToMS(
+ IN gctUINT64 Ticks
+ );
+
+gceSTATUS
+gcoOS_GetProfileTick(
+ OUT gctUINT64_PTR Tick
+ );
+
+gceSTATUS
+gcoOS_QueryProfileTickRate(
+ OUT gctUINT64_PTR TickRate
+ );
+
+#if gcdSTATIC_LINK && defined(WIN32)
+void gcoOS_ModuleConstructor(
+ void
+ );
+
+void gcoOS_ModuleDestructor(
+ void
+ );
+#endif
+
+#define _gcmPROFILE_INIT(prefix, freq, start) \
+ do { \
+ prefix ## OS_QueryProfileTickRate(&(freq)); \
+ prefix ## OS_GetProfileTick(&(start)); \
+ } while (gcvFALSE)
+
+#define _gcmPROFILE_QUERY(prefix, start, ticks) \
+ do { \
+ prefix ## OS_GetProfileTick(&(ticks)); \
+ (ticks) = ((ticks) > (start)) ? ((ticks) - (start)) \
+ : (~0ull - (start) + (ticks) + 1); \
+ } while (gcvFALSE)
+
+#if gcdENABLE_PROFILING
+# define gcmkPROFILE_INIT(freq, start) _gcmPROFILE_INIT(gck, freq, start)
+# define gcmkPROFILE_QUERY(start, ticks) _gcmPROFILE_QUERY(gck, start, ticks)
+# define gcmPROFILE_INIT(freq, start) _gcmPROFILE_INIT(gco, freq, start)
+# define gcmPROFILE_QUERY(start, ticks) _gcmPROFILE_QUERY(gco, start, ticks)
+# define gcmPROFILE_ONLY(x) x
+# define gcmPROFILE_ELSE(x) do { } while (gcvFALSE)
+# define gcmPROFILE_DECLARE_ONLY(x) x
+# define gcmPROFILE_DECLARE_ELSE(x) typedef x
+#else
+# define gcmkPROFILE_INIT(start, freq) do { } while (gcvFALSE)
+# define gcmkPROFILE_QUERY(start, ticks) do { } while (gcvFALSE)
+# define gcmPROFILE_INIT(start, freq) do { } while (gcvFALSE)
+# define gcmPROFILE_QUERY(start, ticks) do { } while (gcvFALSE)
+# define gcmPROFILE_ONLY(x) do { } while (gcvFALSE)
+# define gcmPROFILE_ELSE(x) x
+# define gcmPROFILE_DECLARE_ONLY(x) do { } while (gcvFALSE)
+# define gcmPROFILE_DECLARE_ELSE(x) x
+#endif
+
+/*******************************************************************************
+** gcoMATH object
+*/
+
+#define gcdPI 3.14159265358979323846f
+
+/* Kernel. */
+gctINT
+gckMATH_ModuloInt(
+ IN gctINT X,
+ IN gctINT Y
+ );
+
+/* User. */
+gctUINT32
+gcoMATH_Log2in5dot5(
+ IN gctINT X
+ );
+
+
+gctFLOAT
+gcoMATH_UIntAsFloat(
+ IN gctUINT32 X
+ );
+
+gctUINT32
+gcoMATH_FloatAsUInt(
+ IN gctFLOAT X
+ );
+
+gctBOOL
+gcoMATH_CompareEqualF(
+ IN gctFLOAT X,
+ IN gctFLOAT Y
+ );
+
+gctUINT16
+gcoMATH_UInt8AsFloat16(
+ IN gctUINT8 X
+ );
+
+gctUINT32
+gcoMATH_Float16ToFloat(
+ IN gctUINT16 In
+ );
+
+gctUINT16
+gcoMATH_FloatToFloat16(
+ IN gctUINT32 In
+ );
+
+gctUINT32
+gcoMATH_Float11ToFloat(
+ IN gctUINT32 In
+ );
+
+gctUINT16
+gcoMATH_FloatToFloat11(
+ IN gctUINT32 In
+ );
+
+gctUINT32
+gcoMATH_Float10ToFloat(
+ IN gctUINT32 In
+ );
+
+gctUINT16
+gcoMATH_FloatToFloat10(
+ IN gctUINT32 In
+ );
+
+gctUINT32
+gcoMATH_Float14ToFloat(
+ IN gctUINT16 In
+ );
+
+/******************************************************************************\
+**************************** Coordinate Structures *****************************
+\******************************************************************************/
+
+typedef struct _gcsPOINT
+{
+ gctINT32 x;
+ gctINT32 y;
+}
+gcsPOINT;
+
+typedef struct _gcsSIZE
+{
+ gctINT32 width;
+ gctINT32 height;
+}
+gcsSIZE;
+
+typedef struct _gcsRECT
+{
+ gctINT32 left;
+ gctINT32 top;
+ gctINT32 right;
+ gctINT32 bottom;
+}
+gcsRECT;
+
+typedef struct _gcsPIXEL
+{
+ union
+ {
+ struct
+ {
+ gctFLOAT r, g, b, a;
+ } f;
+ struct
+ {
+ gctINT32 r, g, b, a;
+ } i;
+ struct
+ {
+ gctUINT32 r, g, b, a;
+ } ui;
+ } color;
+
+ gctFLOAT d;
+ gctUINT32 s;
+
+} gcsPIXEL;
+
+/******************************************************************************\
+********************************* gcoSURF Object ********************************
+\******************************************************************************/
+
+/*----------------------------------------------------------------------------*/
+/*------------------------------- gcoSURF Common ------------------------------*/
+
+/* Color format classes. */
+typedef enum _gceFORMAT_CLASS
+{
+ gcvFORMAT_CLASS_RGBA = 4500,
+ gcvFORMAT_CLASS_YUV,
+ gcvFORMAT_CLASS_INDEX,
+ gcvFORMAT_CLASS_LUMINANCE,
+ gcvFORMAT_CLASS_BUMP,
+ gcvFORMAT_CLASS_DEPTH,
+ gcvFORMAT_CLASS_ASTC,
+ gcvFORMAT_CLASS_COMPRESSED,
+ gcvFORMAT_CLASS_OTHER
+}
+gceFORMAT_CLASS;
+
+/* Color format data type */
+typedef enum _gceFORMAT_DATATYPE
+{
+ gcvFORMAT_DATATYPE_UNSIGNED_NORMALIZED,
+ gcvFORMAT_DATATYPE_SIGNED_NORMALIZED,
+ gcvFORMAT_DATATYPE_UNSIGNED_INTEGER,
+ gcvFORMAT_DATATYPE_SIGNED_INTEGER,
+ gcvFORMAT_DATATYPE_FLOAT16,
+ gcvFORMAT_DATATYPE_FLOAT32,
+ gcvFORMAT_DATATYPE_FLOAT_E5B9G9R9,
+ gcvFORMAT_DATATYPE_FLOAT_B10G11R11F,
+ gcvFORMAT_DATATYPE_INDEX,
+ gcvFORMAT_DATATYPE_SRGB,
+ gcvFORMAT_DATATYPE_FLOAT32_UINT,
+}
+gceFORMAT_DATATYPE;
+
+/* Special enums for width field in gcsFORMAT_COMPONENT. */
+typedef enum _gceCOMPONENT_CONTROL
+{
+ gcvCOMPONENT_NOTPRESENT = 0x00,
+ gcvCOMPONENT_DONTCARE = 0x80,
+ gcvCOMPONENT_WIDTHMASK = 0x7F,
+ gcvCOMPONENT_ODD = 0x80
+}
+gceCOMPONENT_CONTROL;
+
+/* Color format component parameters. */
+typedef struct _gcsFORMAT_COMPONENT
+{
+ gctUINT8 start;
+ gctUINT8 width;
+}
+gcsFORMAT_COMPONENT;
+
+/* RGBA color format class. */
+typedef struct _gcsFORMAT_CLASS_TYPE_RGBA
+{
+ gcsFORMAT_COMPONENT alpha;
+ gcsFORMAT_COMPONENT red;
+ gcsFORMAT_COMPONENT green;
+ gcsFORMAT_COMPONENT blue;
+}
+gcsFORMAT_CLASS_TYPE_RGBA;
+
+/* YUV color format class. */
+typedef struct _gcsFORMAT_CLASS_TYPE_YUV
+{
+ gcsFORMAT_COMPONENT y;
+ gcsFORMAT_COMPONENT u;
+ gcsFORMAT_COMPONENT v;
+}
+gcsFORMAT_CLASS_TYPE_YUV;
+
+/* Index color format class. */
+typedef struct _gcsFORMAT_CLASS_TYPE_INDEX
+{
+ gcsFORMAT_COMPONENT value;
+}
+gcsFORMAT_CLASS_TYPE_INDEX;
+
+/* Luminance color format class. */
+typedef struct _gcsFORMAT_CLASS_TYPE_LUMINANCE
+{
+ gcsFORMAT_COMPONENT alpha;
+ gcsFORMAT_COMPONENT value;
+}
+gcsFORMAT_CLASS_TYPE_LUMINANCE;
+
+/* Bump map color format class. */
+typedef struct _gcsFORMAT_CLASS_TYPE_BUMP
+{
+ gcsFORMAT_COMPONENT alpha;
+ gcsFORMAT_COMPONENT l;
+ gcsFORMAT_COMPONENT v;
+ gcsFORMAT_COMPONENT u;
+ gcsFORMAT_COMPONENT q;
+ gcsFORMAT_COMPONENT w;
+}
+gcsFORMAT_CLASS_TYPE_BUMP;
+
+/* Depth and stencil format class. */
+typedef struct _gcsFORMAT_CLASS_TYPE_DEPTH
+{
+ gcsFORMAT_COMPONENT depth;
+ gcsFORMAT_COMPONENT stencil;
+}
+gcsFORMAT_CLASS_TYPE_DEPTH;
+
+typedef union _gcuPIXEL_FORMAT_CLASS
+{
+ gcsFORMAT_CLASS_TYPE_BUMP bump;
+ gcsFORMAT_CLASS_TYPE_RGBA rgba;
+ gcsFORMAT_CLASS_TYPE_YUV yuv;
+ gcsFORMAT_CLASS_TYPE_LUMINANCE lum;
+ gcsFORMAT_CLASS_TYPE_INDEX index;
+ gcsFORMAT_CLASS_TYPE_DEPTH depth;
+}
+gcuPIXEL_FORMAT_CLASS;
+
+/* Format parameters. */
+typedef struct _gcsSURF_FORMAT_INFO
+{
+ /* Name of the format */
+ gctCONST_STRING formatName;
+
+ /* Format code and class. */
+ gceSURF_FORMAT format;
+ gceFORMAT_CLASS fmtClass;
+
+ /* Format data type */
+ gceFORMAT_DATATYPE fmtDataType;
+
+ /* The size of one pixel in bits. */
+ gctUINT8 bitsPerPixel;
+
+ /* Pixel block dimensions. */
+ gctUINT blockWidth;
+ gctUINT blockHeight;
+
+ /* Pixel block size in bits. */
+ gctUINT blockSize;
+
+ /* Some formats are larger than what the GPU can support. */
+ /* These formats are read in the number of layers specified. */
+ gctUINT8 layers;
+
+ /* The format is faked and software will interpret it differently
+ ** with HW. Most of them can't be blendable(PE) or filterable(TX).
+ */
+ gctBOOL fakedFormat;
+
+ /* Some formats have two neighbour pixels interleaved together. */
+ /* To describe such format, set the flag to 1 and add another */
+ /* like this one describing the odd pixel format. */
+ gctBOOL interleaved;
+
+ /* sRGB format. */
+ gctBOOL sRGB;
+
+ /* How GPU read from big-endian host memory */
+ gceENDIAN_HINT endian;
+
+ /* Format components. */
+ gcuPIXEL_FORMAT_CLASS u;
+
+ /* Format components. */
+ gcuPIXEL_FORMAT_CLASS uOdd;
+
+ /* Render format. */
+ gceSURF_FORMAT closestRenderFormat;
+ /*gctCLOSEST_FORMAT dynamicClosestRenderFormat;*/
+ gctUINT renderFormat;
+ const gceTEXTURE_SWIZZLE * pixelSwizzle;
+
+ /* Texture format. */
+ gceSURF_FORMAT closestTXFormat;
+ gctUINT txFormat;
+ const gceTEXTURE_SWIZZLE * txSwizzle;
+ gctBOOL txIntFilter;
+}
+gcsSURF_FORMAT_INFO;
+
+/* Frame buffer information. */
+typedef struct _gcsSURF_FRAMEBUFFER
+{
+ gctPOINTER logical;
+ gctUINT width, height;
+ gctINT stride;
+ gceSURF_FORMAT format;
+}
+gcsSURF_FRAMEBUFFER;
+
+/* Generic pixel component descriptors. */
+extern gcsFORMAT_COMPONENT gcvPIXEL_COMP_XXX8;
+extern gcsFORMAT_COMPONENT gcvPIXEL_COMP_XX8X;
+extern gcsFORMAT_COMPONENT gcvPIXEL_COMP_X8XX;
+extern gcsFORMAT_COMPONENT gcvPIXEL_COMP_8XXX;
+
+typedef enum _gceORIENTATION
+{
+ gcvORIENTATION_TOP_BOTTOM,
+ gcvORIENTATION_BOTTOM_TOP,
+}
+gceORIENTATION;
+
+
+/* Construct a new gcoSURF object. */
+gceSTATUS
+gcoSURF_Construct(
+ IN gcoHAL Hal,
+ IN gctUINT Width,
+ IN gctUINT Height,
+ IN gctUINT Depth,
+ IN gceSURF_TYPE Type,
+ IN gceSURF_FORMAT Format,
+ IN gcePOOL Pool,
+ OUT gcoSURF * Surface
+ );
+
+/* Destroy an gcoSURF object. */
+gceSTATUS
+gcoSURF_Destroy(
+ IN gcoSURF Surface
+ );
+
+/* Map user-allocated surface. */
+gceSTATUS
+gcoSURF_MapUserSurface(
+ IN gcoSURF Surface,
+ IN gctUINT Alignment,
+ IN gctPOINTER Logical,
+ IN gctPHYS_ADDR_T Physical
+ );
+
+/* Wrapp surface with known logical/GPU address */
+gceSTATUS
+gcoSURF_WrapSurface(
+ IN gcoSURF Surface,
+ IN gctUINT Alignment,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Address
+ );
+
+
+/* Query vid mem node info. */
+gceSTATUS
+gcoSURF_QueryVidMemNode(
+ IN gcoSURF Surface,
+ OUT gctUINT32 * Node,
+ OUT gcePOOL * Pool,
+ OUT gctSIZE_T_PTR Bytes,
+ OUT gctUINT32 * TsNode,
+ OUT gcePOOL * TsPool,
+ OUT gctSIZE_T_PTR TsBytes
+ );
+
+/* Set the color type of the surface. */
+gceSTATUS
+gcoSURF_SetColorType(
+ IN gcoSURF Surface,
+ IN gceSURF_COLOR_TYPE ColorType
+ );
+
+/* Get the color type of the surface. */
+gceSTATUS
+gcoSURF_GetColorType(
+ IN gcoSURF Surface,
+ OUT gceSURF_COLOR_TYPE *ColorType
+ );
+
+/* Set the color space of the surface. */
+gceSTATUS
+gcoSURF_SetColorSpace(
+ IN gcoSURF Surface,
+ IN gceSURF_COLOR_SPACE ColorSpace
+ );
+
+/* Get the color space of the surface. */
+gceSTATUS
+gcoSURF_GetColorSpace(
+ IN gcoSURF Surface,
+ OUT gceSURF_COLOR_SPACE *ColorSpace
+ );
+
+
+/* Set the surface ration angle. */
+gceSTATUS
+gcoSURF_SetRotation(
+ IN gcoSURF Surface,
+ IN gceSURF_ROTATION Rotation
+ );
+
+gceSTATUS
+gcoSURF_IsValid(
+ IN gcoSURF Surface
+ );
+
+#if gcdENABLE_3D
+/* Verify and return the state of the tile status mechanism. */
+gceSTATUS
+gcoSURF_IsTileStatusSupported(
+ IN gcoSURF Surface
+ );
+
+/* Verify if surface has tile status enabled. */
+gceSTATUS
+gcoSURF_IsTileStatusEnabled(
+ IN gcsSURF_VIEW *SurfView
+ );
+
+/* Verify if surface is compressed. */
+gceSTATUS
+gcoSURF_IsCompressed(
+ IN gcsSURF_VIEW *SurfView
+ );
+
+/* Enable tile status for the specified surface on zero slot. */
+gceSTATUS
+gcoSURF_EnableTileStatus(
+ IN gcsSURF_VIEW *Surface
+ );
+
+/* Enable tile status for the specified surface on specified slot. */
+gceSTATUS
+gcoSURF_EnableTileStatusEx(
+ IN gcsSURF_VIEW *surfView,
+ IN gctUINT RtIndex
+ );
+
+/* Disable tile status for the specified surface. */
+gceSTATUS
+gcoSURF_DisableTileStatus(
+ IN gcsSURF_VIEW *SurfView,
+ IN gctBOOL Decompress
+ );
+
+/* Flush tile status cache for the specified surface. */
+gceSTATUS
+gcoSURF_FlushTileStatus(
+ IN gcsSURF_VIEW *SurfView,
+ IN gctBOOL Decompress
+ );
+#endif /* gcdENABLE_3D */
+
+/* Get surface size. */
+gceSTATUS
+gcoSURF_GetSize(
+ IN gcoSURF Surface,
+ OUT gctUINT * Width,
+ OUT gctUINT * Height,
+ OUT gctUINT * Depth
+ );
+
+/* Get surface information */
+gceSTATUS
+gcoSURF_GetInfo(
+ IN gcoSURF Surface,
+ IN gceSURF_INFO_TYPE InfoType,
+ IN OUT gctINT32 *Value
+ );
+
+/* Get surface aligned sizes. */
+gceSTATUS
+gcoSURF_GetAlignedSize(
+ IN gcoSURF Surface,
+ OUT gctUINT * Width,
+ OUT gctUINT * Height,
+ OUT gctINT * Stride
+ );
+
+/* Get alignments. */
+gceSTATUS
+gcoSURF_GetAlignment(
+ IN gceSURF_TYPE Type,
+ IN gceSURF_FORMAT Format,
+ OUT gctUINT * AddressAlignment,
+ OUT gctUINT * XAlignment,
+ OUT gctUINT * YAlignment
+ );
+
+gceSTATUS
+gcoSURF_AlignResolveRect(
+ IN gcoSURF Surf,
+ IN gcsPOINT_PTR RectOrigin,
+ IN gcsPOINT_PTR RectSize,
+ OUT gcsPOINT_PTR AlignedOrigin,
+ OUT gcsPOINT_PTR AlignedSize
+ );
+
+/* Get surface type and format. */
+gceSTATUS
+gcoSURF_GetFormat(
+ IN gcoSURF Surface,
+ OUT OPTIONAL gceSURF_TYPE * Type,
+ OUT OPTIONAL gceSURF_FORMAT * Format
+ );
+
+/* Get surface information */
+gceSTATUS
+gcoSURF_GetFormatInfo(
+ IN gcoSURF Surface,
+ OUT gcsSURF_FORMAT_INFO_PTR * formatInfo
+ );
+
+/* Get Surface pack format */
+gceSTATUS
+gcoSURF_GetPackedFormat(
+ IN gcoSURF Surface,
+ OUT gceSURF_FORMAT * Format
+ );
+
+/* Get surface tiling. */
+gceSTATUS
+gcoSURF_GetTiling(
+ IN gcoSURF Surface,
+ OUT gceTILING * Tiling
+ );
+
+/* Get bottom buffer offset bytes. */
+gceSTATUS
+gcoSURF_GetBottomBufferOffset(
+ IN gcoSURF Surface,
+ OUT gctUINT_PTR BottomBufferOffset
+ );
+
+/* Lock the surface. */
+gceSTATUS
+gcoSURF_Lock(
+ IN gcoSURF Surface,
+ IN OUT gctUINT32 * Address,
+ IN OUT gctPOINTER * Memory
+ );
+
+/* Unlock the surface. */
+gceSTATUS
+gcoSURF_Unlock(
+ IN gcoSURF Surface,
+ IN gctPOINTER Memory
+ );
+
+/*. Query surface flags.*/
+gceSTATUS
+gcoSURF_QueryFlags(
+ IN gcoSURF Surface,
+ IN gceSURF_FLAG Flag
+ );
+
+gceSTATUS
+gcoSURF_QueryHints(
+ IN gcoSURF Surface,
+ IN gceSURF_TYPE Hints
+ );
+
+/* Return pixel format parameters; Info is required to be a pointer to an
+ * array of at least two items because some formats have up to two records
+ * of description. */
+gceSTATUS
+gcoSURF_QueryFormat(
+ IN gceSURF_FORMAT Format,
+ OUT gcsSURF_FORMAT_INFO_PTR * Info
+ );
+
+/* Compute the color pixel mask. */
+gceSTATUS
+gcoSURF_ComputeColorMask(
+ IN gcsSURF_FORMAT_INFO_PTR Format,
+ OUT gctUINT32_PTR ColorMask
+ );
+
+/* Flush the surface. */
+gceSTATUS
+gcoSURF_Flush(
+ IN gcoSURF Surface
+ );
+
+/* Fill surface from it's tile status buffer. */
+gceSTATUS
+gcoSURF_FillFromTile(
+ IN gcsSURF_VIEW *SurView
+ );
+
+/* Fill surface with a value. */
+gceSTATUS
+gcoSURF_Fill(
+ IN gcoSURF Surface,
+ IN gcsPOINT_PTR Origin,
+ IN gcsSIZE_PTR Size,
+ IN gctUINT32 Value,
+ IN gctUINT32 Mask
+ );
+
+/* Alpha blend two surfaces together. */
+gceSTATUS
+gcoSURF_Blend(
+ IN gcoSURF SrcSurf,
+ IN gcoSURF DstSurf,
+ IN gcsPOINT_PTR SrcOrigin,
+ IN gcsPOINT_PTR DstOrigin,
+ IN gcsSIZE_PTR Size,
+ IN gceSURF_BLEND_MODE Mode
+ );
+
+/* Create a new gcoSURF wrapper object. */
+gceSTATUS
+gcoSURF_ConstructWrapper(
+ IN gcoHAL Hal,
+ OUT gcoSURF * Surface
+ );
+
+/* Set surface flags.*/
+gceSTATUS
+gcoSURF_SetFlags(
+ IN gcoSURF Surface,
+ IN gceSURF_FLAG Flag,
+ IN gctBOOL Value
+ );
+
+/* Set the underlying buffer for the surface wrapper. */
+gceSTATUS
+gcoSURF_SetBuffer(
+ IN gcoSURF Surface,
+ IN gceSURF_TYPE Type,
+ IN gceSURF_FORMAT Format,
+ IN gctUINT Stride,
+ IN gctPOINTER Logical,
+ IN gctUINT64 Physical
+ );
+
+/* Set the size of the surface in pixels and map the underlying buffer. */
+gceSTATUS
+gcoSURF_SetWindow(
+ IN gcoSURF Surface,
+ IN gctUINT X,
+ IN gctUINT Y,
+ IN gctUINT Width,
+ IN gctUINT Height
+ );
+
+/* Set the size of the surface in pixels and map the underlying buffer. */
+gceSTATUS
+gcoSURF_SetImage(
+ IN gcoSURF Surface,
+ IN gctUINT X,
+ IN gctUINT Y,
+ IN gctUINT Width,
+ IN gctUINT Height,
+ IN gctUINT Depth
+ );
+
+/* Set width/height alignment of the surface directly and calculate stride/size. This is only for dri backend now. Please be careful before use. */
+gceSTATUS
+gcoSURF_SetAlignment(
+ IN gcoSURF Surface,
+ IN gctUINT Width,
+ IN gctUINT Height
+ );
+
+/* Increase reference count of the surface. */
+gceSTATUS
+gcoSURF_ReferenceSurface(
+ IN gcoSURF Surface
+ );
+
+/* Get surface reference count. */
+gceSTATUS
+gcoSURF_QueryReferenceCount(
+ IN gcoSURF Surface,
+ OUT gctINT32 * ReferenceCount
+ );
+
+/* Set surface orientation. */
+gceSTATUS
+gcoSURF_SetOrientation(
+ IN gcoSURF Surface,
+ IN gceORIENTATION Orientation
+ );
+
+/* Query surface orientation. */
+gceSTATUS
+gcoSURF_QueryOrientation(
+ IN gcoSURF Surface,
+ OUT gceORIENTATION * Orientation
+ );
+
+gceSTATUS
+gcoSURF_NODE_Cache(
+ IN gcsSURF_NODE_PTR Node,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes,
+ IN gceCACHEOPERATION Operation
+ );
+
+gceSTATUS
+gcsSURF_NODE_SetHardwareAddress(
+ IN gcsSURF_NODE_PTR Node,
+ IN gctUINT32 Address
+ );
+
+gceSTATUS
+gcsSURF_NODE_GetHardwareAddress(
+ IN gcsSURF_NODE_PTR Node,
+ OUT gctUINT32_PTR Physical,
+ OUT gctUINT32_PTR Physical2,
+ OUT gctUINT32_PTR Physical3,
+ OUT gctUINT32_PTR PhysicalBottom
+ );
+
+gctUINT32
+gcsSURF_NODE_GetHWAddress(
+ IN gcsSURF_NODE_PTR Node
+ );
+
+/* Lock and unlock surface node */
+gceSTATUS
+gcoSURF_LockNode(
+ IN gcsSURF_NODE_PTR Node,
+ OUT gctUINT32 * Address,
+ OUT gctPOINTER * Memory
+ );
+
+gceSTATUS
+gcoSURF_UnLockNode(
+ IN gcsSURF_NODE_PTR Node,
+ IN gceSURF_TYPE Type
+ );
+
+/* Perform CPU cache operation on surface node */
+gceSTATUS
+gcoSURF_NODE_CPUCacheOperation(
+ IN gcsSURF_NODE_PTR Node,
+ IN gceSURF_TYPE Type,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Length,
+ IN gceCACHEOPERATION Operation
+ );
+
+/* Perform CPU cache operation on surface */
+gceSTATUS
+gcoSURF_CPUCacheOperation(
+ IN gcoSURF Surface,
+ IN gceCACHEOPERATION Operation
+ );
+
+
+gceSTATUS
+gcoSURF_Swap(
+ IN gcoSURF Surface1,
+ IN gcoSURF Surface2
+ );
+
+gceSTATUS
+gcoSURF_ResetSurWH(
+ IN gcoSURF Surface,
+ IN gctUINT oriw,
+ IN gctUINT orih,
+ IN gctUINT alignw,
+ IN gctUINT alignh,
+ IN gceSURF_FORMAT fmt
+);
+
+/* Update surface timestamp. */
+gceSTATUS
+gcoSURF_UpdateTimeStamp(
+ IN gcoSURF Surface
+ );
+
+/* Query surface current timestamp. */
+gceSTATUS
+gcoSURF_QueryTimeStamp(
+ IN gcoSURF Surface,
+ OUT gctUINT64 * TimeStamp
+ );
+
+/*
+ * Allocate shared buffer for this surface, so that
+ * surface states can be shared across processes.
+ */
+gceSTATUS
+gcoSURF_AllocShBuffer(
+ IN gcoSURF Surface,
+ OUT gctSHBUF * ShBuf
+ );
+
+/* Bind shared buffer to this surface */
+gceSTATUS
+gcoSURF_BindShBuffer(
+ IN gcoSURF Surface,
+ IN gctSHBUF ShBuf
+ );
+
+/* Push surface shared states to shared buffer. */
+gceSTATUS
+gcoSURF_PushSharedInfo(
+ IN gcoSURF Surface
+ );
+
+/* Pop shared states from shared buffer. */
+gceSTATUS
+gcoSURF_PopSharedInfo(
+ IN gcoSURF Surface
+ );
+
+#if (gcdENABLE_3D || gcdENABLE_VG)
+/* Copy surface. */
+gceSTATUS
+gcoSURF_Copy(
+ IN gcoSURF Surface,
+ IN gcoSURF Source
+ );
+
+/* Set number of samples for a gcoSURF object. */
+gceSTATUS
+gcoSURF_SetSamples(
+ IN gcoSURF Surface,
+ IN gctUINT Samples
+ );
+
+/* Get the number of samples per pixel. */
+gceSTATUS
+gcoSURF_GetSamples(
+ IN gcoSURF Surface,
+ OUT gctUINT_PTR Samples
+ );
+
+/* Append tile status buffer to user pool surface. */
+gceSTATUS
+gcoSURF_AppendTileStatus(
+ IN gcoSURF Surface
+ );
+#endif
+
+gceSTATUS
+gcoSURF_WrapUserMemory(
+ IN gcoHAL Hal,
+ IN gctUINT Width,
+ IN gctUINT Height,
+ IN gctUINT Stride,
+ IN gctUINT Depth,
+ IN gceSURF_TYPE Type,
+ IN gceSURF_FORMAT Format,
+ IN gctUINT32 Handle,
+ IN gctUINT32 Flag,
+ OUT gcoSURF * Surface
+ );
+
+gceSTATUS
+gcoSURF_WrapUserMultiBuffer(
+ IN gcoHAL Hal,
+ IN gctUINT Width,
+ IN gctUINT Height,
+ IN gceSURF_TYPE Type,
+ IN gceSURF_FORMAT Format,
+ IN gctUINT Stride[3],
+ IN gctUINT32 Handle[3],
+ IN gctUINT BufferOffset[3],
+ IN gctUINT32 Flag,
+ OUT gcoSURF * Surface
+ );
+
+gceSTATUS
+gcoSURF_UpdateMetadata(
+ IN gcoSURF Surface,
+ IN gctINT TsFD
+ );
+
+#define MAX_SURF_MIX_SRC_NUM 64
+gceSTATUS
+gcoSURF_MixSurfacesCPU(
+ IN gcoSURF TargetSurface,
+ IN gctUINT TargetSliceIndex,
+ IN gcoSURF *SourceSurface,
+ IN gctUINT *SourceSliceIndices,
+ IN gctFLOAT *Weights,
+ IN gctINT Count
+ );
+
+/******************************************************************************\
+******************************* Hash Structure ******************************
+\******************************************************************************/
+
+typedef struct _gcsHASH_MD5CTX
+{
+ gctBOOL bigEndian;
+ gctSIZE_T bytes; /* Number of bytes processed */
+ gctUINT32 states[4];
+ gctUINT8 buffer[64];
+} gcsHASH_MD5CTX;
+
+void gcsHASH_MD5Init(
+ gcsHASH_MD5CTX *ctx
+ );
+void gcsHASH_MD5Update(
+ gcsHASH_MD5CTX *ctx,
+ const void *data,
+ gctSIZE_T bytes
+ );
+void gcsHASH_MD5Final(
+ gcsHASH_MD5CTX *ctx,
+ gctUINT8 digest[16]
+ );
+
+
+/******************************************************************************\
+******************************* gcsRECT Structure ******************************
+\******************************************************************************/
+
+/* Initialize rectangle structure. */
+gceSTATUS
+gcsRECT_Set(
+ OUT gcsRECT_PTR Rect,
+ IN gctINT32 Left,
+ IN gctINT32 Top,
+ IN gctINT32 Right,
+ IN gctINT32 Bottom
+ );
+
+/* Return the width of the rectangle. */
+gceSTATUS
+gcsRECT_Width(
+ IN gcsRECT_PTR Rect,
+ OUT gctINT32 * Width
+ );
+
+/* Return the height of the rectangle. */
+gceSTATUS
+gcsRECT_Height(
+ IN gcsRECT_PTR Rect,
+ OUT gctINT32 * Height
+ );
+
+/* Ensure that top left corner is to the left and above the right bottom. */
+gceSTATUS
+gcsRECT_Normalize(
+ IN OUT gcsRECT_PTR Rect
+ );
+
+/* Compare two rectangles. */
+gceSTATUS
+gcsRECT_IsEqual(
+ IN gcsRECT_PTR Rect1,
+ IN gcsRECT_PTR Rect2,
+ OUT gctBOOL * Equal
+ );
+
+/* Compare the sizes of two rectangles. */
+gceSTATUS
+gcsRECT_IsOfEqualSize(
+ IN gcsRECT_PTR Rect1,
+ IN gcsRECT_PTR Rect2,
+ OUT gctBOOL * EqualSize
+ );
+
+gceSTATUS
+gcsRECT_RelativeRotation(
+ IN gceSURF_ROTATION Orientation,
+ IN OUT gceSURF_ROTATION *Relation);
+
+gceSTATUS
+
+gcsRECT_Rotate(
+
+ IN OUT gcsRECT_PTR Rect,
+
+ IN gceSURF_ROTATION Rotation,
+
+ IN gceSURF_ROTATION toRotation,
+
+ IN gctINT32 SurfaceWidth,
+
+ IN gctINT32 SurfaceHeight
+
+ );
+
+/******************************************************************************\
+**************************** gcsBOUNDARY Structure *****************************
+\******************************************************************************/
+
+typedef struct _gcsBOUNDARY
+{
+ gctINT x;
+ gctINT y;
+ gctINT width;
+ gctINT height;
+}
+gcsBOUNDARY;
+
+/******************************************************************************\
+********************************* gcoHEAP Object ********************************
+\******************************************************************************/
+
+typedef struct _gcoHEAP * gcoHEAP;
+
+/* Construct a new gcoHEAP object. */
+gceSTATUS
+gcoHEAP_Construct(
+ IN gcoOS Os,
+ IN gctSIZE_T AllocationSize,
+ OUT gcoHEAP * Heap
+ );
+
+/* Destroy an gcoHEAP object. */
+gceSTATUS
+gcoHEAP_Destroy(
+ IN gcoHEAP Heap
+ );
+
+/* Allocate memory. */
+gceSTATUS
+gcoHEAP_Allocate(
+ IN gcoHEAP Heap,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Node
+ );
+
+gceSTATUS
+gcoHEAP_GetMemorySize(
+ IN gcoHEAP Heap,
+ IN gctPOINTER Memory,
+ OUT gctSIZE_T_PTR MemorySize
+ );
+
+/* Free memory. */
+gceSTATUS
+gcoHEAP_Free(
+ IN gcoHEAP Heap,
+ IN gctPOINTER Node
+ );
+
+#if (VIVANTE_PROFILER_SYSTEM_MEMORY || gcdDEBUG)
+/* Profile the heap. */
+gceSTATUS
+gcoHEAP_ProfileStart(
+ IN gcoHEAP Heap
+ );
+
+gceSTATUS
+gcoHEAP_ProfileEnd(
+ IN gcoHEAP Heap,
+ IN gctCONST_STRING Title
+ );
+#endif
+
+/******************************************************************************\
+******************************* Debugging Macros *******************************
+\******************************************************************************/
+
+void
+gcoOS_SetDebugLevel(
+ IN gctUINT32 Level
+ );
+
+void
+gcoOS_GetDebugLevel(
+ OUT gctUINT32_PTR DebugLevel
+ );
+
+void
+gcoOS_GetDebugZone(
+ IN gctUINT32 Zone,
+ OUT gctUINT32_PTR DebugZone
+ );
+
+void
+gcoOS_SetDebugZone(
+ IN gctUINT32 Zone
+ );
+
+void
+gcoOS_SetDebugFile(
+ IN gctCONST_STRING FileName
+ );
+
+void
+gcoOS_EnableDebugDump(
+ IN gctBOOL Enable
+ );
+
+gctFILE
+gcoOS_ReplaceDebugFile(
+ IN gctFILE fp
+ );
+
+/*******************************************************************************
+**
+** gcmFATAL
+**
+** Print a message to the debugger and execute a break point.
+**
+** ARGUMENTS:
+**
+** message Message.
+** ... Optional arguments.
+*/
+
+void
+gckOS_DebugFatal(
+ IN gctCONST_STRING Message,
+ ...
+ );
+
+void
+gcoOS_DebugFatal(
+ IN gctCONST_STRING Message,
+ ...
+ );
+
+#if gcmIS_DEBUG(gcdDEBUG_FATAL)
+# define gcmFATAL gcoOS_DebugFatal
+# define gcmkFATAL gckOS_DebugFatal
+#elif gcdHAS_ELLIPSIS
+# define gcmFATAL(...)
+# define gcmkFATAL(...)
+#else
+ gcmINLINE static void
+ __dummy_fatal(
+ IN gctCONST_STRING Message,
+ ...
+ )
+ {
+ }
+# define gcmFATAL __dummy_fatal
+# define gcmkFATAL __dummy_fatal
+#endif
+
+#define gcmENUM2TEXT(e) case e: return #e
+
+/*******************************************************************************
+**
+** gcmTRACE
+**
+** Print a message to the debugfer if the correct level has been set. In
+** retail mode this macro does nothing.
+**
+** ARGUMENTS:
+**
+** level Level of message.
+** message Message.
+** ... Optional arguments.
+*/
+#define gcvLEVEL_NONE -1
+#define gcvLEVEL_ERROR 0
+#define gcvLEVEL_WARNING 1
+#define gcvLEVEL_INFO 2
+#define gcvLEVEL_VERBOSE 3
+
+void
+gckOS_DebugTrace(
+ IN gctUINT32 Level,
+ IN gctCONST_STRING Message,
+ ...
+ );
+
+void
+gcoOS_DebugTrace(
+ IN gctUINT32 Level,
+ IN gctCONST_STRING Message,
+ ...
+ );
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+# define gcmTRACE gcoOS_DebugTrace
+# define gcmkTRACE gckOS_DebugTrace
+# define gcmkTRACE_N(Level, ArgumentSize, ...) \
+ gckOS_DebugTrace(Level, __VA_ARGS__)
+#elif gcdHAS_ELLIPSIS
+# define gcmTRACE(...)
+# define gcmkTRACE(...)
+# define gcmkTRACE_N(...)
+#else
+ gcmINLINE static void
+ __dummy_trace(
+ IN gctUINT32 Level,
+ IN gctCONST_STRING Message,
+ ...
+ )
+ {
+ }
+
+ gcmINLINE static void
+ __dummy_trace_n(
+ IN gctUINT32 Level,
+ IN gctUINT ArgumentSize,
+ IN gctCONST_STRING Message,
+ ...
+ )
+ {
+ }
+
+# define gcmTRACE __dummy_trace
+# define gcmkTRACE __dummy_trace
+# define gcmkTRACE_N __dummy_trace_n
+#endif
+
+/*******************************************************************************
+**
+** gcmTRACE_ZONE
+**
+** Print a message to the debugger if the correct level and zone has been
+** set. In retail mode this macro does nothing.
+**
+** ARGUMENTS:
+**
+** Level Level of message.
+** Zone Zone of message.
+** Message Message.
+** ... Optional arguments.
+*/
+
+void
+gckOS_DebugTraceZone(
+ IN gctUINT32 Level,
+ IN gctUINT32 Zone,
+ IN gctCONST_STRING Message,
+ ...
+ );
+
+void
+gcoOS_DebugTraceZone(
+ IN gctUINT32 Level,
+ IN gctUINT32 Zone,
+ IN gctCONST_STRING Message,
+ ...
+ );
+
+#if gcmIS_DEBUG(gcdDEBUG_TRACE)
+# define gcmTRACE_ZONE gcoOS_DebugTraceZone
+# define gcmkTRACE_ZONE gckOS_DebugTraceZone
+# define gcmkTRACE_ZONE_N(Level, Zone, ArgumentSize, ...) \
+ gckOS_DebugTraceZone(Level, Zone, __VA_ARGS__)
+#elif gcdHAS_ELLIPSIS
+# define gcmTRACE_ZONE(...)
+# define gcmkTRACE_ZONE(...)
+# define gcmkTRACE_ZONE_N(...)
+#else
+ gcmINLINE static void
+ __dummy_trace_zone(
+ IN gctUINT32 Level,
+ IN gctUINT32 Zone,
+ IN gctCONST_STRING Message,
+ ...
+ )
+ {
+ }
+
+ gcmINLINE static void
+ __dummy_trace_zone_n(
+ IN gctUINT32 Level,
+ IN gctUINT32 Zone,
+ IN gctUINT ArgumentSize,
+ IN gctCONST_STRING Message,
+ ...
+ )
+ {
+ }
+
+# define gcmTRACE_ZONE __dummy_trace_zone
+# define gcmkTRACE_ZONE __dummy_trace_zone
+# define gcmkTRACE_ZONE_N __dummy_trace_zone_n
+#endif
+
+
+/*******************************************************************************
+**
+** gcmDEBUG_ONLY
+**
+** Execute a statement or function only in DEBUG mode.
+**
+** ARGUMENTS:
+**
+** f Statement or function to execute.
+*/
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+# define gcmDEBUG_ONLY(f) f
+#else
+# define gcmDEBUG_ONLY(f)
+#endif
+
+
+/*******************************************************************************
+**
+** gcmSTACK_PUSH
+** gcmSTACK_POP
+** gcmSTACK_DUMP
+** gcmSTACK_REMOVE
+**
+** Push or pop a function with entry arguments on the trace stack.
+**
+** ARGUMENTS:
+**
+** Function Name of function.
+** Line Line number.
+** Text Optional text.
+** ... Optional arguments for text.
+**
+** Thread Thread id.
+*/
+void
+gcoOS_StackPush(
+ IN gctINT8_PTR Identity,
+ IN gctCONST_STRING Function,
+ IN gctINT Line,
+ IN gctCONST_STRING Text,
+ ...
+ );
+
+void
+gcoOS_StackPop(
+ IN gctINT8_PTR Identity,
+ IN gctCONST_STRING Function
+ );
+
+void
+gcoOS_StackDump(
+ void);
+
+void
+gcoOS_StackRemove(
+ IN gctHANDLE Thread
+ );
+
+#if gcmIS_DEBUG(gcdDEBUG_STACK)
+# define gcmSTACK_PUSH gcoOS_StackPush
+# define gcmSTACK_POP gcoOS_StackPop
+# define gcmSTACK_DUMP gcoOS_StackDump
+# define gcmSTACK_REMOVE gcoOS_StackRemove
+#elif gcdHAS_ELLIPSIS
+# define gcmSTACK_PUSH(...)
+# define gcmSTACK_POP(...)
+# define gcmSTACK_DUMP()
+# define gcmSTACK_REMOVE(...)
+#else
+ gcmINLINE static void
+ __dummy_stack_push(
+ IN gctCONST_STRING Function,
+ IN gctINT Line,
+ IN gctCONST_STRING Text,
+ ...
+ )
+ {
+ }
+
+ gcmINLINE static void
+ __dummy_stack_pop(
+ IN gctINT8_PTR Identity,
+ IN gctCONST_STRING Function
+ );
+
+ gcmINLINE static void
+ __dummy_stack_remove(
+ IN gctHANDLE Thread
+ );
+
+# define gcmSTACK_PUSH __dummy_stack_push
+# define gcmSTACK_POP(a,b) __dummy_stack_pop
+# define gcmSTACK_DUMP()
+# define gcmSTACK_REMOVE(a) __dummy_stack_remove
+#endif
+
+
+/*******************************************************************************
+**
+** gcmBINARY_TRACE
+**
+** Push or pop a function with entry arguments on the trace stack.
+**
+** ARGUMENTS:
+**
+** Function Name of function
+** Line Line number
+** Text Optional text
+** ... Optional arguments for text.
+*/
+typedef struct _gcsBINARY_TRACE_MESSAGE * gcsBINARY_TRACE_MESSAGE_PTR;
+typedef struct _gcsBINARY_TRACE_MESSAGE
+{
+ gctUINT32 signature;
+ gctUINT32 pid;
+ gctUINT32 tid;
+ gctUINT32 line;
+ gctUINT32 numArguments;
+ gctUINT8 payload;
+}
+gcsBINARY_TRACE_MESSAGE;
+
+void
+gcoOS_BinaryTrace(
+ IN gctCONST_STRING Function,
+ IN gctINT Line,
+ IN gctCONST_STRING Text OPTIONAL,
+ ...
+ );
+
+void
+gckOS_BinaryTrace(
+ IN gctCONST_STRING Function,
+ IN gctINT Line,
+ IN gctCONST_STRING Text OPTIONAL,
+ ...
+ );
+
+#define gcdBINARY_TRACE_MESSAGE_SIZE 240
+
+#if gcdBINARY_TRACE
+# define gcmBINARY_TRACE gcoOS_BinaryTrace
+# define gcmkBINARY_TRACE gckOS_BinaryTrace
+#elif gcdHAS_ELLIPSIS
+# define gcmBINARY_TRACE(Function, Line, Text, ...)
+# define gcmkBINARY_TRACE(Function, Line, Text, ...)
+#else
+ gcmINLINE static void
+ __dummy_binary_trace(
+ IN gctCONST_STRING Function,
+ IN gctINT Line,
+ IN gctCONST_STRING Text,
+ )
+ {
+ }
+
+# define gcmBINARY_TRACE __dummy_binary_trace
+# define gcmkBINARY_TRACE __dummy_binary_trace
+#endif
+
+
+/*******************************************************************************
+**
+** gcmSYSTRACE_BEGIN
+** gcmSYSTRACE_END
+**
+** Systrace is a performance tunning tool on linux.
+**
+** ARGUMENTS:
+**
+** FuncName Function name
+** Zone Systrace zone. Only specified zones are traced.
+*/
+
+void
+gcoOS_SysTraceBegin(
+ IN gctUINT32 Zone,
+ IN gctCONST_STRING FuncName
+ );
+
+void
+gcoOS_SysTraceEnd(
+ IN gctUINT32 Zone
+ );
+
+#if defined(LINUX) && gcdSYSTRACE
+# define gcmSYSTRACE_BEGIN gcoOS_SysTraceBegin
+# define gcmSYSTRACE_END gcoOS_SysTraceEnd
+#elif gcdHAS_ELLIPSIS
+# define gcmSYSTRACE_BEGIN(...)
+# define gcmSYSTRACE_END(...)
+#else
+ gcmINLINE static void
+ __dummy_systrace_begin(
+ IN gctUINT32 Zone,
+ IN gctCONST_STRING FuncName
+ )
+ {
+ }
+
+ gcmINLINE static void
+ __dummy_systrace_end(
+ IN gctUINT32 Zone
+ )
+ {
+ }
+
+# define gcmSYSTRACE_BEGIN __dummy_systrace_begin
+# define gcmSYSTRACE_END __dummy_systrace_end
+#endif
+
+
+/******************************************************************************\
+******************************** Logging Macros ********************************
+\******************************************************************************/
+
+#define gcdHEADER_LEVEL gcvLEVEL_VERBOSE
+
+/* Always enable header/footer when systrace build is on */
+#if defined(LINUX) && gcdSYSTRACE
+#undef gcdEMPTY_HEADER_FOOTER
+#endif
+
+#ifndef gcdEMPTY_HEADER_FOOTER
+#define gcdEMPTY_HEADER_FOOTER 0
+#endif
+
+#if gcdENABLE_PROFILING
+void
+gcoOS_ProfileDB(
+ IN gctCONST_STRING Function,
+ IN OUT gctBOOL_PTR Initialized
+ );
+
+#define gcmHEADER() \
+ gctINT8 __user__ = 1; \
+ static gctBOOL __profile__initialized__ = gcvFALSE; \
+ gcmSTACK_PUSH(&__user__, __FUNCTION__, __LINE__, gcvNULL, gcvNULL); \
+ gcoOS_ProfileDB(__FUNCTION__, &__profile__initialized__)
+
+#define gcmHEADER_ARG(...) \
+ gctINT8 __user__ = 1; \
+ static gctBOOL __profile__initialized__ = gcvFALSE; \
+ gcmSTACK_PUSH(&__user__, __FUNCTION__, __LINE__, Text, __VA_ARGS__); \
+ gcoOS_ProfileDB(__FUNCTION__, &__profile__initialized__)
+
+#define gcmFOOTER() \
+ gcmSTACK_POP(&__user__, __FUNCTION__); \
+ gcoOS_ProfileDB(__FUNCTION__, gcvNULL)
+
+#define gcmFOOTER_NO() \
+ gcmSTACK_POP(&__user__, __FUNCTION__); \
+ gcoOS_ProfileDB(__FUNCTION__, gcvNULL)
+
+#define gcmFOOTER_ARG(...) \
+ gcmSTACK_POP(&__user__, __FUNCTION__); \
+ gcoOS_ProfileDB(__FUNCTION__, gcvNULL)
+
+#define gcmFOOTER_KILL() \
+ gcmSTACK_POP(&__user__, __FUNCTION__); \
+ gcoOS_ProfileDB(gcvNULL, gcvNULL)
+
+#else /* !gcdENABLE_PROFILING */
+
+#if gcdEMPTY_HEADER_FOOTER
+# define gcmHEADER()
+#elif gcdHAS_ELLIPSIS
+#define gcmHEADER() \
+ gctINT8 __user__ = 1; \
+ gctINT8_PTR __user_ptr__ = &__user__; \
+ gcmSTACK_PUSH(__user_ptr__, __FUNCTION__, __LINE__, gcvNULL, gcvNULL); \
+ gcmSYSTRACE_BEGIN(_GC_OBJ_ZONE, __FUNCTION__); \
+ gcmBINARY_TRACE(__FUNCTION__, __LINE__, gcvNULL, gcvNULL); \
+ gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "++%s(%d)", __FUNCTION__, __LINE__)
+#else
+ gcmINLINE static void
+ __dummy_header(void)
+ {
+ }
+# define gcmHEADER __dummy_header
+#endif
+
+#if gcdHAS_ELLIPSIS
+#if gcdEMPTY_HEADER_FOOTER
+# define gcmHEADER_ARG(Text, ...)
+#else
+# define gcmHEADER_ARG(Text, ...) \
+ gctINT8 __user__ = 1; \
+ gctINT8_PTR __user_ptr__ = &__user__; \
+ gcmSTACK_PUSH(__user_ptr__, __FUNCTION__, __LINE__, Text, __VA_ARGS__); \
+ gcmSYSTRACE_BEGIN(_GC_OBJ_ZONE, __FUNCTION__); \
+ gcmBINARY_TRACE(__FUNCTION__, __LINE__, Text, __VA_ARGS__); \
+ gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "++%s(%d): " Text, __FUNCTION__, __LINE__, __VA_ARGS__)
+#endif
+#else
+ gcmINLINE static void
+ __dummy_header_arg(
+ IN gctCONST_STRING Text,
+ ...
+ )
+ {
+ }
+# define gcmHEADER_ARG __dummy_header_arg
+#endif
+
+#if gcdEMPTY_HEADER_FOOTER
+# define gcmFOOTER()
+#elif gcdHAS_ELLIPSIS
+# define gcmFOOTER() \
+ gcmSTACK_POP(__user_ptr__, __FUNCTION__); \
+ gcmSYSTRACE_END(_GC_OBJ_ZONE); \
+ gcmBINARY_TRACE(__FUNCTION__, __LINE__, gcvNULL, gcvNULL); \
+ gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "--%s(%d): status=%d(%s)", \
+ __FUNCTION__, __LINE__, \
+ status, gcoOS_DebugStatus2Name(status)); \
+ *__user_ptr__ -= 1
+#else
+ gcmINLINE static void
+ __dummy_footer(void)
+ {
+ }
+# define gcmFOOTER __dummy_footer
+#endif
+
+#if gcdEMPTY_HEADER_FOOTER
+# define gcmFOOTER_NO()
+#elif gcdHAS_ELLIPSIS
+#define gcmFOOTER_NO() \
+ gcmSTACK_POP(__user_ptr__, __FUNCTION__); \
+ gcmSYSTRACE_END(_GC_OBJ_ZONE); \
+ gcmBINARY_TRACE(__FUNCTION__, __LINE__, gcvNULL, gcvNULL); \
+ gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "--%s(%d)", __FUNCTION__, __LINE__); \
+ *__user_ptr__ -= 1
+#else
+ gcmINLINE static void
+ __dummy_footer_no(void)
+ {
+ }
+# define gcmFOOTER_NO __dummy_footer_no
+#endif
+
+#if gcdEMPTY_HEADER_FOOTER
+# define gcmFOOTER_KILL()
+#elif gcdHAS_ELLIPSIS
+#define gcmFOOTER_KILL() \
+ gcmSTACK_POP(__user_ptr__, __FUNCTION__); \
+ gcmSYSTRACE_END(_GC_OBJ_ZONE); \
+ gcmBINARY_TRACE(__FUNCTION__, __LINE__, gcvNULL, gcvNULL); \
+ gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "--%s(%d)", __FUNCTION__, __LINE__); \
+ *__user_ptr__ -= 1
+#else
+ gcmINLINE static void
+ __dummy_footer_kill(void)
+ {
+ }
+# define gcmFOOTER_KILL __dummy_footer_kill
+#endif
+
+#if gcdHAS_ELLIPSIS
+#if gcdEMPTY_HEADER_FOOTER
+# define gcmFOOTER_ARG(Text, ...)
+#else
+# define gcmFOOTER_ARG(Text, ...) \
+ gcmSTACK_POP(__user_ptr__, __FUNCTION__); \
+ gcmSYSTRACE_END(_GC_OBJ_ZONE); \
+ gcmBINARY_TRACE(__FUNCTION__, __LINE__, Text, __VA_ARGS__); \
+ gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "--%s(%d): " Text, __FUNCTION__, __LINE__, __VA_ARGS__); \
+ *__user_ptr__ -= 1
+#endif
+#else
+ gcmINLINE static void
+ __dummy_footer_arg(
+ IN gctCONST_STRING Text,
+ ...
+ )
+ {
+ }
+# define gcmFOOTER_ARG __dummy_footer_arg
+#endif
+
+#endif /* gcdENABLE_PROFILING */
+
+#if gcdHAS_ELLIPSIS
+#define gcmkHEADER() \
+ gctINT8 __kernel__ = 1; \
+ gctINT8_PTR __kernel_ptr__ = &__kernel__; \
+ gcmkBINARY_TRACE(__FUNCTION__, __LINE__, gcvNULL, gcvNULL); \
+ gcmkTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "++%s(%d)", __FUNCTION__, __LINE__)
+#else
+ gcmINLINE static void
+ __dummy_kheader(void)
+ {
+ }
+# define gcmkHEADER __dummy_kheader
+#endif
+
+#if gcdHAS_ELLIPSIS
+# define gcmkHEADER_ARG(Text, ...) \
+ gctINT8 __kernel__ = 1; \
+ gctINT8_PTR __kernel_ptr__ = &__kernel__; \
+ gcmkBINARY_TRACE(__FUNCTION__, __LINE__, Text, __VA_ARGS__); \
+ gcmkTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "++%s(%d): " Text, __FUNCTION__, __LINE__, __VA_ARGS__)
+#else
+ gcmINLINE static void
+ __dummy_kheader_arg(
+ IN gctCONST_STRING Text,
+ ...
+ )
+ {
+ }
+# define gcmkHEADER_ARG __dummy_kheader_arg
+#endif
+
+#if gcdHAS_ELLIPSIS
+#define gcmkFOOTER() \
+ gcmkBINARY_TRACE(__FUNCTION__, __LINE__, gcvNULL, status); \
+ gcmkTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "--%s(%d): status=%d(%s)", \
+ __FUNCTION__, __LINE__, status, gckOS_DebugStatus2Name(status)); \
+ *__kernel_ptr__ -= 1
+#else
+ gcmINLINE static void
+ __dummy_kfooter(void)
+ {
+ }
+# define gcmkFOOTER __dummy_kfooter
+#endif
+
+#if gcdHAS_ELLIPSIS
+#define gcmkFOOTER_NO() \
+ gcmkBINARY_TRACE(__FUNCTION__, __LINE__, gcvNULL, gcvNULL); \
+ gcmkTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "--%s(%d)", __FUNCTION__, __LINE__); \
+ *__kernel_ptr__ -= 1
+#else
+ gcmINLINE static void
+ __dummy_kfooter_no(void)
+ {
+ }
+# define gcmkFOOTER_NO __dummy_kfooter_no
+#endif
+
+#if gcdHAS_ELLIPSIS
+# define gcmkFOOTER_ARG(Text, ...) \
+ gcmkBINARY_TRACE(__FUNCTION__, __LINE__, Text, __VA_ARGS__); \
+ gcmkTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
+ "--%s(%d): " Text, \
+ __FUNCTION__, __LINE__, __VA_ARGS__); \
+ *__kernel_ptr__ -= 1
+#else
+ gcmINLINE static void
+ __dummy_kfooter_arg(
+ IN gctCONST_STRING Text,
+ ...
+ )
+ {
+ }
+# define gcmkFOOTER_ARG __dummy_kfooter_arg
+#endif
+
+#define gcmOPT_VALUE(ptr) (((ptr) == gcvNULL) ? 0 : *(ptr))
+#define gcmOPT_VALUE_INDEX(ptr, index) (((ptr) == gcvNULL) ? 0 : ptr[index])
+#define gcmOPT_POINTER(ptr) (((ptr) == gcvNULL) ? gcvNULL : *(ptr))
+#define gcmOPT_STRING(ptr) (((ptr) == gcvNULL) ? "(nil)" : (ptr))
+
+void
+gckOS_Print(
+ IN gctCONST_STRING Message,
+ ...
+ );
+
+void
+gcoOS_Print(
+ IN gctCONST_STRING Message,
+ ...
+ );
+
+#define gcmPRINT gcoOS_Print
+#define gcmkPRINT gckOS_Print
+#define gcmkPRINT_N(ArgumentSize, ...) gckOS_Print(__VA_ARGS__)
+
+#if gcdHAS_ELLIPSIS
+# define gcmPRINT_ONCE(Text, ...) \
+ { \
+ static gctBOOL _once = gcvFALSE; \
+ if (!_once) \
+ { \
+ gcmPRINT(Text, __VA_ARGS__); \
+ _once = gcvTRUE; \
+ } \
+ } \
+
+#else
+ gcmINLINE static void
+ __dummy_printonce_arg(
+ IN gctCONST_STRING Text,
+ ...
+ )
+ {
+ }
+# define gcmPRINT_ONCE __dummy_printonce_arg
+#endif
+
+#if gcdFEATURE_SANITYCHECK
+#define gcmFEATURE_CHECKED gcmPRINT_ONCE
+#else
+#define gcmFEATURE_CHECKED(Text, ...)
+#endif
+
+#if gcdPRINT_VERSION
+# define gcmPRINT_VERSION() do { \
+ _gcmPRINT_VERSION(gcm); \
+ gcmSTACK_DUMP(); \
+ } while (0)
+# define gcmkPRINT_VERSION() _gcmPRINT_VERSION(gcmk)
+# define _gcmPRINT_VERSION(prefix) \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ "Vivante HAL version %d.%d.%d build %d", \
+ gcvVERSION_MAJOR, gcvVERSION_MINOR, \
+ gcvVERSION_PATCH, gcvVERSION_BUILD)
+#else
+# define gcmPRINT_VERSION() do { gcmSTACK_DUMP(); } while (gcvFALSE)
+# define gcmkPRINT_VERSION() do { } while (gcvFALSE)
+#endif
+
+typedef enum _gceDUMP_BUFFER_TYPE
+{
+ gcvDUMP_BUFFER_USER_STRING,
+ gcvDUMP_BUFFER_VERIFY,
+
+ gcvDUMP_BUFFER_MEMORY,
+ gcvDUMP_BUFFER_TEXTURE,
+ gcvDUMP_BUFFER_STREAM,
+ gcvDUMP_BUFFER_INDEX,
+ gcvDUMP_BUFFER_BUFOBJ,
+ gcvDUMP_BUFFER_IMAGE,
+ /* A type of command, but should not execute directly. */
+ gcvDUMP_BUFFER_INSTRUCTION,
+ gcvDUMP_BUFFER_CONTEXT,
+ gcvDUMP_BUFFER_COMMAND,
+ gcvDUMP_BUFFER_ASYNC_COMMAND,
+ gcvDUMP_BUFFER_USER_TYPE_LAST = gcvDUMP_BUFFER_ASYNC_COMMAND,
+
+ gcvDUMP_BUFFER_KERNEL_CONTEXT,
+ gcvDUMP_BUFFER_KERNEL_COMMAND,
+
+ gcvDUMP_BUFFER_PHYSICAL_MEMORY,
+
+ gcvDUMP_BUFFER_TYPE_COUNT,
+}
+gceDUMP_BUFFER_TYPE;
+
+void
+gckOS_Dump(
+ IN gckOS Os,
+ IN gctCONST_STRING Format,
+ ...
+ );
+
+void
+gckOS_DumpBuffer(
+ IN gckOS Os,
+ IN gceDUMP_BUFFER_TYPE Type,
+ IN gctPOINTER Buffer,
+ IN gctUINT64 Address,
+ IN gctSIZE_T Size
+ );
+
+#if gcdDUMP_IN_KERNEL
+# define gcmkDUMP gckOS_Dump
+
+# define gcmkDUMP_BUFFER gckOS_DumpBuffer
+#else
+# define gcmkDUMP(...) do {} while (0)
+# define gcmkDUMP_BUFFER(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+**
+** gcmDUMP_FRAMERATE
+**
+** Print average frame rate
+**
+*/
+gceSTATUS
+gcoOS_DumpFrameRate(
+ void
+ );
+# define gcmDUMP_FRAMERATE gcoOS_DumpFrameRate
+
+/*******************************************************************************
+**
+** gcoOS_SetDumpFlag
+**
+** Dump print switch.
+**
+** ARGUMENTS:
+**
+** DumpState
+** True to enable dump prints.
+*/
+
+gceSTATUS
+gcoOS_SetDumpFlag(
+ IN gctBOOL DumpState
+ );
+
+/*******************************************************************************
+**
+** gcmDUMP
+**
+** Print a dump message.
+**
+** ARGUMENTS:
+**
+** gctSTRING Message.
+**
+** ... Optional arguments.
+*/
+
+#if gcdDUMP
+gceSTATUS
+gcoOS_Dump(
+ IN gcoOS Os,
+ IN gctCONST_STRING String,
+ ...
+ );
+# define gcmDUMP gcoOS_Dump
+#else
+# define gcmDUMP(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+**
+** gcmDUMP_BUFFER
+**
+** Print a buffer to the dump.
+**
+** ARGUMENTS:
+**
+** gctSTRING Tag
+** Tag for dump.
+**
+** gctUINT32 Address
+** GPU address of buffer.
+**
+** gctPOINTER Logical
+** Logical address of buffer.
+**
+** gctUINT32 Offset
+** Offset into buffer.
+**
+** gctSIZE_T Bytes
+** Number of bytes.
+*/
+
+#if gcdDUMP
+gceSTATUS
+gcoOS_DumpBuffer(
+ IN gcoOS Os,
+ IN gceDUMP_BUFFER_TYPE Type,
+ IN gctUINT32 Address,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes
+ );
+# define gcmDUMP_BUFFER gcoOS_DumpBuffer
+#else
+# define gcmDUMP_BUFFER(...) do {} while (0)
+#endif
+
+#if gcdDUMP
+void
+gcoOS_DumpLock(
+ void
+ );
+# define gcmDUMP_LOCK gcoOS_DumpLock
+#else
+# define gcmDUMP_LOCK(...) do {} while (0)
+#endif
+
+#if gcdDUMP
+void
+gcoOS_DumpUnlock(
+ void
+ );
+# define gcmDUMP_UNLOCK gcoOS_DumpUnlock
+#else
+# define gcmDUMP_UNLOCK(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+**
+** gcmDUMP_API
+**
+** Print a dump message for a high level API prefixed by the function name.
+**
+** ARGUMENTS:
+**
+** gctSTRING Message.
+**
+** ... Optional arguments.
+*/
+gceSTATUS gcoOS_DumpApi(IN gctCONST_STRING String, ...);
+#if gcdDUMP_API
+# define gcmDUMP_API gcoOS_DumpApi
+#else
+# define gcmDUMP_API(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+**
+** gcmDUMP_API_ARRAY
+**
+** Print an array of data.
+**
+** ARGUMENTS:
+**
+** gctUINT32_PTR Pointer to array.
+** gctUINT32 Size.
+*/
+gceSTATUS gcoOS_DumpArray(IN gctCONST_POINTER Data, IN gctUINT32 Size);
+#if gcdDUMP_API
+# define gcmDUMP_API_ARRAY gcoOS_DumpArray
+#else
+# define gcmDUMP_API_ARRAY(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+**
+** gcmDUMP_API_ARRAY_TOKEN
+**
+** Print an array of data terminated by a token.
+**
+** ARGUMENTS:
+**
+** gctUINT32_PTR Pointer to array.
+** gctUINT32 Termination.
+*/
+gceSTATUS gcoOS_DumpArrayToken(IN gctCONST_POINTER Data, IN gctUINT32 Termination);
+#if gcdDUMP_API
+# define gcmDUMP_API_ARRAY_TOKEN gcoOS_DumpArrayToken
+#else
+# define gcmDUMP_API_ARRAY_TOKEN(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+**
+** gcmDUMP_API_DATA
+**
+** Print an array of bytes.
+**
+** ARGUMENTS:
+**
+** gctCONST_POINTER Pointer to array.
+** gctSIZE_T Size.
+*/
+gceSTATUS gcoOS_DumpApiData(IN gctCONST_POINTER Data, IN gctSIZE_T Size);
+#if gcdDUMP_API
+# define gcmDUMP_API_DATA gcoOS_DumpApiData
+#else
+# define gcmDUMP_API_DATA(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+** gcmDUMP_2D_COMMAND
+**
+** Print the 2D command buffer.
+**
+** ARGUMENTS:
+**
+** gctUINT32_PTR Pointer to the command buffer.
+** gctUINT32 Command buffer size.
+*/
+gceSTATUS gcoOS_Dump2DCommand(IN gctUINT32_PTR Command, IN gctUINT32 Size);
+#if gcdDUMP_2D
+# define gcmDUMP_2D_COMMAND(cmd, size) \
+ if (Hardware->newDump2DLevel > 1) \
+ gcoOS_Dump2DCommand(cmd, size)
+#else
+# define gcmDUMP_2D_COMMAND(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+** gcmDUMP_2D_SURFACE
+**
+** Print the 2D surface memory.
+**
+** ARGUMENTS:
+**
+** gctBOOL Src.
+** gctUINT32 Address.
+*/
+gceSTATUS gcoOS_Dump2DSurface(IN gctBOOL Src, IN gctUINT32 Address);
+#if gcdDUMP_2D
+# define gcmDUMP_2D_SURFACE(src, addr) \
+ if (Hardware->newDump2DLevel > 2) \
+ gcoOS_Dump2DSurface(src, addr)
+#else
+# define gcmDUMP_2D_SURFACE(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+** gcmDUMP_ADD_MEMORY_INFO
+**
+** Record the memory info.
+**
+** ARGUMENTS:
+**
+** gctUINT32 Address.
+** gctSIZE_T Size.
+*/
+gceSTATUS gcfAddMemoryInfo(IN gctUINT32 GPUAddress, IN gctPOINTER Logical, IN gctUINT64 Physical, IN gctUINT32 Size);
+#if gcdDUMP_2D
+# define gcmDUMP_ADD_MEMORY_INFO gcfAddMemoryInfo
+#else
+# define gcmDUMP_ADD_MEMORY_INFO(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+** gcmDUMP_DEL_MEMORY_INFO
+**
+** Record the memory info.
+**
+** ARGUMENTS:
+**
+** gctUINT32 Address.
+*/
+gceSTATUS gcfDelMemoryInfo(IN gctUINT32 Address);
+#if gcdDUMP_2D
+# define gcmDUMP_DEL_MEMORY_INFO gcfDelMemoryInfo
+#else
+# define gcmDUMP_DEL_MEMORY_INFO(...) do {} while (0)
+#endif
+
+/*******************************************************************************
+**
+** gcmTRACE_RELEASE
+**
+** Print a message to the shader debugger.
+**
+** ARGUMENTS:
+**
+** message Message.
+** ... Optional arguments.
+*/
+
+#define gcmTRACE_RELEASE gcoOS_DebugShaderTrace
+
+void
+gcoOS_DebugShaderTrace(
+ IN gctCONST_STRING Message,
+ ...
+ );
+
+void
+gcoOS_SetDebugShaderFiles(
+ IN gctCONST_STRING VSFileName,
+ IN gctCONST_STRING FSFileName
+ );
+
+void
+gcoOS_SetDebugShaderFileType(
+ IN gctUINT32 ShaderType
+ );
+
+void
+gcoOS_EnableDebugBuffer(
+ IN gctBOOL Enable
+ );
+
+/*******************************************************************************
+**
+** gcmBREAK
+**
+** Break into the debugger. In retail mode this macro does nothing.
+**
+** ARGUMENTS:
+**
+** None.
+*/
+
+void
+gcoOS_DebugBreak(
+ void
+ );
+
+void
+gckOS_DebugBreak(
+ void
+ );
+
+#if gcmIS_DEBUG(gcdDEBUG_BREAK)
+# define gcmBREAK gcoOS_DebugBreak
+# define gcmkBREAK gckOS_DebugBreak
+#else
+# define gcmBREAK()
+# define gcmkBREAK()
+#endif
+
+/*******************************************************************************
+**
+** gcmASSERT
+**
+** Evaluate an expression and break into the debugger if the expression
+** evaluates to false. In retail mode this macro does nothing.
+**
+** ARGUMENTS:
+**
+** exp Expression to evaluate.
+*/
+#if gcmIS_DEBUG(gcdDEBUG_ASSERT)
+# define _gcmASSERT(prefix, exp) \
+ do \
+ { \
+ if (!(exp)) \
+ { \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "ASSERT at %s(%d)", \
+ __FUNCTION__, __LINE__); \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ "(%s)", #exp); \
+ prefix##BREAK(); \
+ } \
+ } \
+ while (gcvFALSE)
+# define gcmASSERT(exp) _gcmASSERT(gcm, exp)
+# define gcmkASSERT(exp) _gcmASSERT(gcmk, exp)
+#else
+# define gcmASSERT(exp)
+# define gcmkASSERT(exp)
+#endif
+
+/*******************************************************************************
+**
+** gcmSTATIC_ASSERT
+**
+** Tests a software assertion at compile time. If the specific constant
+** expression is false, the compiler displays the specified message and
+** the compilation fails with an error, otherwise the declaration has
+** no effect.
+** Static assert is suitable for both user and kernel space.
+**
+** ARGUMENTS:
+**
+** exp Constant expression.
+** message Error message displayed on assertion failure.
+*/
+#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || (__GNUC__ > 4))
+# define gcmSTATIC_ASSERT(constExp, message) \
+ do \
+ { \
+ _Static_assert((constExp), message); \
+ } \
+ while (0)
+
+#elif defined(_MSC_VER) && (_MSC_VER >= 1600)
+# define gcmSTATIC_ASSERT(constExp, message) \
+ static_assert((constExp), message)
+
+#else
+# define gcmSTATIC_ASSERT(constExp, message) \
+ do {} while (0)
+#endif
+
+/*******************************************************************************
+**
+** gcmVERIFY
+**
+** Verify if an expression returns true. If the expression does not
+** evaluates to true, an assertion will happen in debug mode.
+**
+** ARGUMENTS:
+**
+** exp Expression to evaluate.
+*/
+#if gcmIS_DEBUG(gcdDEBUG_ASSERT)
+# define gcmVERIFY(exp) gcmASSERT(exp)
+# define gcmkVERIFY(exp) gcmkASSERT(exp)
+#else
+# define gcmVERIFY(exp) (void)exp
+# define gcmkVERIFY(exp) (void)exp
+#endif
+
+/*******************************************************************************
+**
+** gcmVERIFY_OK
+**
+** Verify a fucntion returns gcvSTATUS_OK. If the function does not return
+** gcvSTATUS_OK, an assertion will happen in debug mode.
+**
+** ARGUMENTS:
+**
+** func Function to evaluate.
+*/
+
+void
+gcoOS_Verify(
+ IN gceSTATUS status
+ );
+
+void
+gckOS_Verify(
+ IN gceSTATUS status
+ );
+
+#if gcmIS_DEBUG(gcdDEBUG_ASSERT)
+# define gcmVERIFY_OK(func) \
+ do \
+ { \
+ gceSTATUS verifyStatus = func; \
+ gcoOS_Verify(verifyStatus); \
+ if (verifyStatus != gcvSTATUS_OK) \
+ { \
+ gcmTRACE(\
+ gcvLEVEL_ERROR, \
+ "gcmVERIFY_OK(%d): function returned %d", \
+ __LINE__, verifyStatus \
+ ); \
+ } \
+ gcmASSERT(verifyStatus == gcvSTATUS_OK); \
+ } \
+ while (gcvFALSE)
+# define gcmkVERIFY_OK(func) \
+ do \
+ { \
+ gceSTATUS verifyStatus = func; \
+ if (verifyStatus != gcvSTATUS_OK) \
+ { \
+ gcmkTRACE(\
+ gcvLEVEL_ERROR, \
+ "gcmkVERIFY_OK(%d): function returned %d", \
+ __LINE__, verifyStatus \
+ ); \
+ } \
+ gckOS_Verify(verifyStatus); \
+ gcmkASSERT(verifyStatus == gcvSTATUS_OK); \
+ } \
+ while (gcvFALSE)
+#else
+# define gcmVERIFY_OK(func) func
+# define gcmkVERIFY_OK(func) func
+#endif
+
+gctCONST_STRING
+gcoOS_DebugStatus2Name(
+ gceSTATUS status
+ );
+
+gctCONST_STRING
+gckOS_DebugStatus2Name(
+ gceSTATUS status
+ );
+
+/*******************************************************************************
+**
+** gcmERR_BREAK
+**
+** Executes a break statement on error.
+**
+** ASSUMPTIONS:
+**
+** 'status' variable of gceSTATUS type must be defined.
+**
+** ARGUMENTS:
+**
+** func Function to evaluate.
+*/
+#define _gcmERR_BREAK(prefix, func){ \
+ status = func; \
+ if (gcmIS_ERROR(status)) \
+ { \
+ prefix##PRINT_VERSION(); \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "ERR_BREAK: status=%d(%s) @ %s(%d)", \
+ status, gcoOS_DebugStatus2Name(status), __FUNCTION__, __LINE__); \
+ break; \
+ } \
+ do { } while (gcvFALSE); \
+ }
+
+#define _gcmkERR_BREAK(prefix, func){ \
+ status = func; \
+ if (gcmIS_ERROR(status)) \
+ { \
+ prefix##PRINT_VERSION(); \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "ERR_BREAK: status=%d(%s) @ %s(%d)", \
+ status, gckOS_DebugStatus2Name(status), __FUNCTION__, __LINE__); \
+ break; \
+ } \
+ do { } while (gcvFALSE); \
+ }
+
+#define gcmERR_BREAK(func) _gcmERR_BREAK(gcm, func)
+#define gcmkERR_BREAK(func) _gcmkERR_BREAK(gcmk, func)
+
+/*******************************************************************************
+**
+** gcmERR_RETURN
+**
+** Executes a return on error.
+**
+** ASSUMPTIONS:
+**
+** 'status' variable of gceSTATUS type must be defined.
+**
+** ARGUMENTS:
+**
+** func Function to evaluate.
+*/
+#define _gcmERR_RETURN(prefix, func) \
+ status = func; \
+ if (gcmIS_ERROR(status)) \
+ { \
+ prefix##PRINT_VERSION(); \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "ERR_RETURN: status=%d(%s) @ %s(%d)", \
+ status, gcoOS_DebugStatus2Name(status), __FUNCTION__, __LINE__); \
+ prefix##FOOTER(); \
+ return status; \
+ } \
+ do { } while (gcvFALSE)
+#define _gcmkERR_RETURN(prefix, func) \
+ status = func; \
+ if (gcmIS_ERROR(status)) \
+ { \
+ prefix##PRINT_VERSION(); \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "ERR_RETURN: status=%d(%s) @ %s(%d)", \
+ status, gckOS_DebugStatus2Name(status), __FUNCTION__, __LINE__); \
+ prefix##FOOTER(); \
+ return status; \
+ } \
+ do { } while (gcvFALSE)
+#define gcmERR_RETURN(func) _gcmERR_RETURN(gcm, func)
+#define gcmkERR_RETURN(func) _gcmkERR_RETURN(gcmk, func)
+
+
+/*******************************************************************************
+**
+** gcmONERROR
+**
+** Jump to the error handler in case there is an error.
+**
+** ASSUMPTIONS:
+**
+** 'status' variable of gceSTATUS type must be defined.
+**
+** ARGUMENTS:
+**
+** func Function to evaluate.
+*/
+#define _gcmONERROR(prefix, func) \
+ do \
+ { \
+ status = func; \
+ if (gcmIS_ERROR(status)) \
+ { \
+ prefix##PRINT_VERSION(); \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "ONERROR: status=%d(%s) @ %s(%d)", \
+ status, gcoOS_DebugStatus2Name(status), __FUNCTION__, __LINE__); \
+ goto OnError; \
+ } \
+ } \
+ while (gcvFALSE)
+#define _gcmkONERROR(prefix, func) \
+ do \
+ { \
+ status = func; \
+ if (gcmIS_ERROR(status)) \
+ { \
+ prefix##PRINT_VERSION(); \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "ONERROR: status=%d(%s) @ %s(%d)", \
+ status, gckOS_DebugStatus2Name(status), __FUNCTION__, __LINE__); \
+ goto OnError; \
+ } \
+ } \
+ while (gcvFALSE)
+#define gcmONERROR(func) _gcmONERROR(gcm, func)
+#define gcmkONERROR(func) _gcmkONERROR(gcmk, func)
+
+#define gcmGET_INDEX_SIZE(type, size) \
+ switch (type) \
+ { \
+ case gcvINDEX_8: \
+ size = 1; \
+ break; \
+ case gcvINDEX_16: \
+ size = 2; \
+ break; \
+ case gcvINDEX_32: \
+ size = 4; \
+ break; \
+ default: \
+ gcmONERROR(gcvSTATUS_INVALID_ARGUMENT); \
+ } \
+
+/*******************************************************************************
+**
+** gcmkSAFECASTSIZET
+**
+** Check wether value of a gctSIZE_T varible beyond the capability
+** of 32bits GPU hardware.
+**
+** ASSUMPTIONS:
+**
+**
+**
+** ARGUMENTS:
+**
+** x A gctUINT32 variable
+** y A gctSIZE_T variable
+*/
+#define gcmkSAFECASTSIZET(x, y) \
+ do \
+ { \
+ gctUINT32 tmp = (gctUINT32)(y); \
+ if (gcmSIZEOF(gctSIZE_T) > gcmSIZEOF(gctUINT32)) \
+ { \
+ gcmkASSERT(tmp <= gcvMAXUINT32); \
+ } \
+ (x) = tmp; \
+ } \
+ while (gcvFALSE)
+
+#define gcmSAFECASTSIZET(x, y) \
+ do \
+ { \
+ gctUINT32 tmp = (gctUINT32)(y); \
+ if (gcmSIZEOF(gctSIZE_T) > gcmSIZEOF(gctUINT32)) \
+ { \
+ gcmASSERT(tmp <= gcvMAXUINT32); \
+ } \
+ (x) = tmp; \
+ } \
+ while (gcvFALSE)
+
+/*******************************************************************************
+**
+** gcmkSAFECASTPHYSADDRT
+**
+** Check whether value of a gctPHYS_ADDR_T variable beyond the capability
+** of 32bits GPU hardware.
+**
+** ASSUMPTIONS:
+**
+**
+**
+** ARGUMENTS:
+**
+** x A gctUINT32 variable
+** y A gctPHYS_ADDR_T variable
+*/
+#define gcmkSAFECASTPHYSADDRT(x, y) \
+ do \
+ { \
+ gctUINT32 tmp = (gctUINT32)(y); \
+ if (gcmSIZEOF(gctPHYS_ADDR_T) > gcmSIZEOF(gctUINT32)) \
+ { \
+ gcmkASSERT(tmp <= gcvMAXUINT32); \
+ } \
+ (x) = tmp; \
+ } \
+ while (gcvFALSE)
+
+/*******************************************************************************
+**
+** gcmSAFECASTPHYSADDRT
+**
+** Check whether value of a gctPHYS_ADDR_T variable beyond the capability
+** of 32bits GPU hardware.
+**
+** ASSUMPTIONS:
+**
+**
+**
+** ARGUMENTS:
+**
+** x A gctUINT32 variable
+** y A gctPHYS_ADDR_T variable
+*/
+#define gcmSAFECASTPHYSADDRT(x, y) \
+ do \
+ { \
+ gctUINT32 tmp = (gctUINT32)(y); \
+ if (gcmSIZEOF(gctPHYS_ADDR_T) > gcmSIZEOF(gctUINT32)) \
+ { \
+ gcmASSERT(tmp <= gcvMAXUINT32); \
+ } \
+ (x) = tmp; \
+ } \
+ while (gcvFALSE)
+
+/*******************************************************************************
+**
+** gcmVERIFY_LOCK
+**
+** Verifies whether the surface is locked.
+**
+** ARGUMENTS:
+**
+** surfaceInfo Pointer to the surface iniformational structure.
+*/
+#define gcmVERIFY_LOCK(surfaceInfo) \
+ if (!surfaceInfo->node.valid) \
+ { \
+ gcmONERROR(gcvSTATUS_MEMORY_UNLOCKED); \
+ } \
+
+/*******************************************************************************
+**
+** gcmVERIFY_NODE_LOCK
+**
+** Verifies whether the surface node is locked.
+**
+** ARGUMENTS:
+**
+** surfaceInfo Pointer to the surface iniformational structure.
+*/
+#define gcmVERIFY_NODE_LOCK(surfaceNode) \
+ if (!(surfaceNode)->valid) \
+ { \
+ status = gcvSTATUS_MEMORY_UNLOCKED; \
+ break; \
+ } \
+ do { } while (gcvFALSE)
+
+/*******************************************************************************
+**
+** gcmBADOBJECT_BREAK
+**
+** Executes a break statement on bad object.
+**
+** ARGUMENTS:
+**
+** obj Object to test.
+** t Expected type of the object.
+*/
+#define gcmBADOBJECT_BREAK(obj, t) \
+ if ((obj == gcvNULL) \
+ || (((gcsOBJECT *)(obj))->type != t) \
+ ) \
+ { \
+ status = gcvSTATUS_INVALID_OBJECT; \
+ break; \
+ } \
+ do { } while (gcvFALSE)
+
+/*******************************************************************************
+**
+** gcmCHECK_STATUS
+**
+** Executes a break statement on error.
+**
+** ASSUMPTIONS:
+**
+** 'status' variable of gceSTATUS type must be defined.
+**
+** ARGUMENTS:
+**
+** func Function to evaluate.
+*/
+#define _gcmCHECK_STATUS(prefix, func) \
+ do \
+ { \
+ last = func; \
+ if (gcmIS_ERROR(last)) \
+ { \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "CHECK_STATUS: status=%d(%s) @ %s(%d)", \
+ last, gcoOS_DebugStatus2Name(last), __FUNCTION__, __LINE__); \
+ status = last; \
+ } \
+ } \
+ while (gcvFALSE)
+#define _gcmkCHECK_STATUS(prefix, func) \
+ do \
+ { \
+ last = func; \
+ if (gcmIS_ERROR(last)) \
+ { \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "CHECK_STATUS: status=%d(%s) @ %s(%d)", \
+ last, gckOS_DebugStatus2Name(last), __FUNCTION__, __LINE__); \
+ status = last; \
+ } \
+ } \
+ while (gcvFALSE)
+#define gcmCHECK_STATUS(func) _gcmCHECK_STATUS(gcm, func)
+#define gcmkCHECK_STATUS(func) _gcmkCHECK_STATUS(gcmk, func)
+
+/*******************************************************************************
+**
+** gcmVERIFY_ARGUMENT
+**
+** Assert if an argument does not apply to the specified expression. If
+** the argument evaluates to false, gcvSTATUS_INVALID_ARGUMENT will be
+** returned from the current function. In retail mode this macro does
+** nothing.
+**
+** ARGUMENTS:
+**
+** arg Argument to evaluate.
+*/
+# define _gcmVERIFY_ARGUMENT(prefix, arg) \
+ do \
+ { \
+ if (!(arg)) \
+ { \
+ prefix##TRACE(gcvLEVEL_ERROR, #prefix "VERIFY_ARGUMENT failed:"); \
+ prefix##ASSERT(arg); \
+ prefix##FOOTER_ARG("status=%d", gcvSTATUS_INVALID_ARGUMENT); \
+ return gcvSTATUS_INVALID_ARGUMENT; \
+ } \
+ } \
+ while (gcvFALSE)
+# define gcmVERIFY_ARGUMENT(arg) _gcmVERIFY_ARGUMENT(gcm, arg)
+# define gcmkVERIFY_ARGUMENT(arg) _gcmVERIFY_ARGUMENT(gcmk, arg)
+
+/*******************************************************************************
+**
+** gcmDEBUG_VERIFY_ARGUMENT
+**
+** Works just like gcmVERIFY_ARGUMENT, but is only valid in debug mode.
+** Use this to verify arguments inside non-public API functions.
+*/
+#if gcdDEBUG
+# define gcmDEBUG_VERIFY_ARGUMENT(arg) _gcmVERIFY_ARGUMENT(gcm, arg)
+# define gcmkDEBUG_VERIFY_ARGUMENT(arg) _gcmkVERIFY_ARGUMENT(gcm, arg)
+#else
+# define gcmDEBUG_VERIFY_ARGUMENT(arg)
+# define gcmkDEBUG_VERIFY_ARGUMENT(arg)
+#endif
+
+/*******************************************************************************
+**
+** gcmVERIFY_ARGUMENT_RETURN
+**
+** Assert if an argument does not apply to the specified expression. If
+** the argument evaluates to false, gcvSTATUS_INVALID_ARGUMENT will be
+** returned from the current function. In retail mode this macro does
+** nothing.
+**
+** ARGUMENTS:
+**
+** arg Argument to evaluate.
+*/
+# define _gcmVERIFY_ARGUMENT_RETURN(prefix, arg, value) \
+ do \
+ { \
+ if (!(arg)) \
+ { \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "gcmVERIFY_ARGUMENT_RETURN failed:"); \
+ prefix##ASSERT(arg); \
+ prefix##FOOTER_ARG("value=%d", value); \
+ return value; \
+ } \
+ } \
+ while (gcvFALSE)
+# define gcmVERIFY_ARGUMENT_RETURN(arg, value) \
+ _gcmVERIFY_ARGUMENT_RETURN(gcm, arg, value)
+# define gcmkVERIFY_ARGUMENT_RETURN(arg, value) \
+ _gcmVERIFY_ARGUMENT_RETURN(gcmk, arg, value)
+
+#define MAX_LOOP_COUNT 0x7FFFFFFF
+
+/******************************************************************************\
+****************************** User Debug Option ******************************
+\******************************************************************************/
+
+/* User option. */
+typedef enum _gceDEBUG_MSG
+{
+ gcvDEBUG_MSG_NONE,
+ gcvDEBUG_MSG_ERROR,
+ gcvDEBUG_MSG_WARNING
+}
+gceDEBUG_MSG;
+
+typedef struct _gcsUSER_DEBUG_OPTION
+{
+ gceDEBUG_MSG debugMsg;
+}
+gcsUSER_DEBUG_OPTION;
+
+gcsUSER_DEBUG_OPTION *
+gcoHAL_GetUserDebugOption(
+ void
+ );
+
+#if gcdHAS_ELLIPSIS
+#define gcmUSER_DEBUG_MSG(level, ...) \
+ do \
+ { \
+ if (level <= gcoHAL_GetUserDebugOption()->debugMsg) \
+ { \
+ gcoOS_Print(__VA_ARGS__); \
+ } \
+ } while (gcvFALSE)
+
+#define gcmUSER_DEBUG_ERROR_MSG(...) gcmUSER_DEBUG_MSG(gcvDEBUG_MSG_ERROR, "Error: " __VA_ARGS__)
+#define gcmUSER_DEBUG_WARNING_MSG(...) gcmUSER_DEBUG_MSG(gcvDEBUG_MSG_WARNING, "Warring: " __VA_ARGS__)
+#else
+#define gcmUSER_DEBUG_MSG
+#define gcmUSER_DEBUG_ERROR_MSG
+#define gcmUSER_DEBUG_WARNING_MSG
+#endif
+
+/*******************************************************************************
+**
+** A set of macros to aid state loading.
+**
+** ARGUMENTS:
+**
+** CommandBuffer Pointer to a gcoCMDBUF object.
+** StateDelta Pointer to a gcsSTATE_DELTA state delta structure.
+** Memory Destination memory pointer of gctUINT32_PTR type.
+** PartOfContext Whether or not the state is a part of the context.
+** FixedPoint Whether or not the state is of the fixed point format.
+** Count Number of consecutive states to be loaded.
+** Address State address.
+** Data Data to be set to the state.
+*/
+
+/*----------------------------------------------------------------------------*/
+
+#if gcmIS_DEBUG(gcdDEBUG_CODE)
+
+# define gcmSTORELOADSTATE(CommandBuffer, Memory, Address, Count) \
+ CommandBuffer->lastLoadStatePtr = gcmPTR_TO_UINT64(Memory); \
+ CommandBuffer->lastLoadStateAddress = Address; \
+ CommandBuffer->lastLoadStateCount = Count
+
+# define gcmVERIFYLOADSTATE(CommandBuffer, Memory, Address) \
+ gcmASSERT(\
+ (gctUINT) (Memory - gcmUINT64_TO_TYPE(CommandBuffer->lastLoadStatePtr, gctUINT32_PTR) - 1) \
+ == \
+ (gctUINT) (Address - CommandBuffer->lastLoadStateAddress) \
+ ); \
+ \
+ gcmASSERT(CommandBuffer->lastLoadStateCount > 0); \
+ \
+ CommandBuffer->lastLoadStateCount -= 1
+
+# define gcmVERIFYLOADSTATEDONE(CommandBuffer) \
+ gcmASSERT(CommandBuffer->lastLoadStateCount == 0);
+
+# define gcmDEFINELOADSTATEBASE() \
+ gctUINT32_PTR LoadStateBase;
+
+# define gcmSETLOADSTATEBASE(CommandBuffer, OutSide) \
+ if (OutSide) \
+ {\
+ LoadStateBase = (gctUINT32_PTR)*OutSide; \
+ }\
+ else\
+ {\
+ LoadStateBase = (gctUINT_PTR)CommandBuffer->buffer;\
+ }
+
+
+# define gcmVERIFYLOADSTATEALIGNED(CommandBuffer, Memory) \
+ gcmASSERT(((Memory - LoadStateBase) & 1) == 0);
+
+# define gcmUNSETLOADSTATEBASE() \
+ LoadStateBase = LoadStateBase;
+
+#else
+
+# define gcmSTORELOADSTATE(CommandBuffer, Memory, Address, Count)
+# define gcmVERIFYLOADSTATE(CommandBuffer, Memory, Address)
+# define gcmVERIFYLOADSTATEDONE(CommandBuffer)
+
+# define gcmDEFINELOADSTATEBASE()
+# define gcmSETLOADSTATEBASE(CommandBuffer, OutSide)
+# define gcmVERIFYLOADSTATEALIGNED(CommandBuffer, Memory)
+# define gcmUNSETLOADSTATEBASE()
+
+#endif
+
+/*----------------------------------------------------------------------------*/
+
+/* This style of dump is deprecated. */
+# define gcmDUMPSTATEDATA(StateDelta, FixedPoint, Address, Data)
+
+#define gcmDEFINESTATEBUFFER(CommandBuffer, StateDelta, Memory, ReserveSize) \
+ gctSIZE_T ReserveSize; \
+ gcoCMDBUF CommandBuffer; \
+ gctUINT32_PTR Memory; \
+ gcsSTATE_DELTA_PTR StateDelta; \
+ gceENGINE CurrentEngine = gcvENGINE_RENDER
+
+#define gcmBEGINSTATEBUFFER(Hardware, CommandBuffer, StateDelta, Memory, ReserveSize) \
+{ \
+ gcmONERROR(gcoBUFFER_Reserve(\
+ Hardware->engine[CurrentEngine].buffer, ReserveSize, gcvTRUE, gcvCOMMAND_3D, &CommandBuffer \
+ )); \
+ \
+ Memory = (gctUINT32_PTR) gcmUINT64_TO_PTR(CommandBuffer->lastReserve); \
+ \
+ StateDelta = Hardware->delta; \
+ \
+}
+
+#define gcmENDSTATEBUFFER(Hardware, CommandBuffer, Memory, ReserveSize) \
+{ \
+ gcmASSERT(\
+ gcmUINT64_TO_TYPE(CommandBuffer->lastReserve, gctUINT8_PTR) + ReserveSize \
+ == \
+ (gctUINT8_PTR) Memory \
+ ); \
+}
+
+/*----------------------------------------------------------------------------*/
+
+#define gcmBEGINSTATEBATCH(CommandBuffer, Memory, FixedPoint, Address, Count) \
+{ \
+ gcmASSERT(((Memory - gcmUINT64_TO_TYPE(CommandBuffer->lastReserve, gctUINT32_PTR)) & 1) == 0); \
+ gcmASSERT((gctUINT32)Count <= 1024); \
+ \
+ gcmVERIFYLOADSTATEDONE(CommandBuffer); \
+ \
+ gcmSTORELOADSTATE(CommandBuffer, Memory, Address, Count); \
+ \
+ *Memory++ \
+ = gcmSETFIELDVALUE(0, AQ_COMMAND_LOAD_STATE_COMMAND, OPCODE, LOAD_STATE) \
+ | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, FLOAT, FixedPoint) \
+ | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, COUNT, Count) \
+ | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, ADDRESS, Address); \
+}
+
+#define gcmENDSTATEBATCH(CommandBuffer, Memory) \
+{ \
+ gcmVERIFYLOADSTATEDONE(CommandBuffer); \
+ \
+ gcmASSERT(((Memory - gcmUINT64_TO_TYPE(CommandBuffer->lastReserve, gctUINT32_PTR)) & 1) == 0); \
+}
+
+/*----------------------------------------------------------------------------*/
+
+#define gcmSETSTATEDATA(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+{ \
+ gctUINT32 __temp_data32__; \
+ \
+ gcmVERIFYLOADSTATE(CommandBuffer, Memory, Address); \
+ \
+ gcmSAFECASTSIZET(__temp_data32__, Data); \
+ \
+ *Memory++ = __temp_data32__; \
+ \
+ gcoHARDWARE_UpdateDelta(\
+ StateDelta, Address, 0, __temp_data32__ \
+ ); \
+ \
+ gcmDUMPSTATEDATA(StateDelta, FixedPoint, Address, __temp_data32__); \
+}
+
+#define gcmSETSTATEDATAWITHMASK(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data) \
+{ \
+ gctUINT32 __temp_data32__; \
+ \
+ gcmVERIFYLOADSTATE(CommandBuffer, Memory, Address); \
+ \
+ __temp_data32__ = Data; \
+ \
+ *Memory++ = __temp_data32__; \
+ \
+ gcoHARDWARE_UpdateDelta(\
+ StateDelta, Address, Mask, __temp_data32__ \
+ ); \
+ \
+ gcmDUMPSTATEDATA(StateDelta, FixedPoint, Address, __temp_data32__); \
+}
+
+
+#define gcmSETCTRLSTATE(StateDelta, CommandBuffer, Memory, Address, Data) \
+{ \
+ gctUINT32 __temp_data32__; \
+ \
+ gcmVERIFYLOADSTATE(CommandBuffer, Memory, Address); \
+ \
+ __temp_data32__ = Data; \
+ \
+ *Memory++ = __temp_data32__; \
+ \
+ gcmDUMPSTATEDATA(StateDelta, gcvFALSE, Address, __temp_data32__); \
+}
+
+#define gcmSETFILLER(CommandBuffer, Memory) \
+{ \
+ gcmVERIFYLOADSTATEDONE(CommandBuffer); \
+ \
+ *(gctUINT32_PTR)Memory = 0x18000000; \
+ Memory += 1; \
+}
+
+/*----------------------------------------------------------------------------*/
+
+#define gcmSETSINGLESTATE(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+{ \
+ gcmBEGINSTATEBATCH(CommandBuffer, Memory, FixedPoint, Address, 1); \
+ gcmSETSTATEDATA(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data); \
+ gcmENDSTATEBATCH(CommandBuffer, Memory); \
+}
+
+#define gcmSETSINGLESTATEWITHMASK(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data) \
+{ \
+ gcmBEGINSTATEBATCH(CommandBuffer, Memory, FixedPoint, Address, 1); \
+ gcmSETSTATEDATAWITHMASK(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data); \
+ gcmENDSTATEBATCH(CommandBuffer, Memory); \
+}
+
+
+#define gcmSETSINGLECTRLSTATE(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+{ \
+ gcmBEGINSTATEBATCH(CommandBuffer, Memory, FixedPoint, Address, 1); \
+ gcmSETCTRLSTATE(StateDelta, CommandBuffer, Memory, Address, Data); \
+ gcmENDSTATEBATCH(CommandBuffer, Memory); \
+}
+
+
+
+#define gcmSETSEMASTALLPIPE(StateDelta, CommandBuffer, Memory, Data) \
+{ \
+ gcmSETSINGLECTRLSTATE(StateDelta, CommandBuffer, Memory, gcvFALSE, 0x0E02, Data); \
+ \
+ *Memory++ = gcmSETFIELDVALUE(0, STALL_COMMAND, OPCODE, STALL); \
+ \
+ *Memory++ = Data; \
+ \
+ gcmDUMP(gcvNULL, "#[stall 0x%08X 0x%08X]", \
+ gcmSETFIELDVALUE(0, AQ_SEMAPHORE, SOURCE, FRONT_END), \
+ gcmSETFIELDVALUE(0, AQ_SEMAPHORE, DESTINATION, PIXEL_ENGINE)); \
+}
+
+/*******************************************************************************
+**
+** gcmSETSTARTDECOMMAND
+**
+** Form a START_DE command.
+**
+** ARGUMENTS:
+**
+** Memory Destination memory pointer of gctUINT32_PTR type.
+** Count Number of the rectangles.
+*/
+
+#define gcmSETSTARTDECOMMAND(Memory, Count) \
+{ \
+ *Memory++ \
+ = gcmSETFIELDVALUE(0, AQ_COMMAND_START_DE_COMMAND, OPCODE, START_DE) \
+ | gcmSETFIELD (0, AQ_COMMAND_START_DE_COMMAND, COUNT, Count) \
+ | gcmSETFIELD (0, AQ_COMMAND_START_DE_COMMAND, DATA_COUNT, 0); \
+ \
+ *Memory++ = 0xDEADDEED; \
+}
+
+/*****************************************
+** Temp command buffer macro
+*/
+#define gcmDEFINESTATEBUFFER_NEW(CommandBuffer, StateDelta, Memory) \
+ gcmDEFINELOADSTATEBASE() \
+ gcsTEMPCMDBUF CommandBuffer = gcvNULL; \
+ gctUINT32_PTR Memory; \
+ gcsSTATE_DELTA_PTR StateDelta; \
+ gceENGINE CurrentEngine = gcvENGINE_RENDER
+
+
+#define gcmBEGINSTATEBUFFER_NEW(Hardware, CommandBuffer, StateDelta, Memory, OutSide) \
+{ \
+ if (OutSide) \
+ {\
+ Memory = (gctUINT32_PTR)*OutSide; \
+ }\
+ else \
+ {\
+ gcmONERROR(gcoBUFFER_StartTEMPCMDBUF(\
+ Hardware->engine[CurrentEngine].buffer, Hardware->engine[CurrentEngine].queue, &CommandBuffer \
+ ));\
+ \
+ Memory = (gctUINT32_PTR)(CommandBuffer->buffer); \
+ \
+ }\
+ StateDelta = Hardware->tempDelta; \
+ \
+ gcmSETLOADSTATEBASE(CommandBuffer,OutSide);\
+}
+
+#define gcmENDSTATEBUFFER_NEW(Hardware, CommandBuffer, Memory, OutSide) \
+{ \
+ if (OutSide) \
+ {\
+ *OutSide = Memory; \
+ }\
+ else \
+ {\
+ CommandBuffer->currentByteSize = (gctUINT32)((gctUINT8_PTR)Memory - \
+ (gctUINT8_PTR)CommandBuffer->buffer); \
+ \
+ gcmONERROR(gcoBUFFER_EndTEMPCMDBUF(Hardware->engine[CurrentEngine].buffer, gcvFALSE));\
+ if (Hardware->constructType != gcvHARDWARE_2D) \
+ { \
+ gcoHARDWARE_UpdateTempDelta(Hardware);\
+ } \
+ }\
+ gcmUNSETLOADSTATEBASE()\
+}
+
+#define gcmDEFINECTRLSTATEBUFFER(CommandBuffer, Memory) \
+ gcmDEFINELOADSTATEBASE() \
+ gcsTEMPCMDBUF CommandBuffer = gcvNULL; \
+ gctUINT32_PTR Memory; \
+ gceENGINE CurrentEngine = gcvENGINE_RENDER
+
+#define gcmBEGINCTRLSTATEBUFFER(Hardware, CommandBuffer, Memory, OutSide) \
+{ \
+ if (OutSide) \
+ { \
+ Memory = (gctUINT32_PTR)*OutSide; \
+ } \
+ else \
+ { \
+ gcmONERROR(gcoBUFFER_StartTEMPCMDBUF(\
+ Hardware->engine[CurrentEngine].buffer, \
+ Hardware->engine[CurrentEngine].queue, &CommandBuffer \
+ )); \
+ \
+ Memory = (gctUINT32_PTR)(CommandBuffer->buffer); \
+ } \
+ gcmSETLOADSTATEBASE(CommandBuffer,OutSide); \
+}
+
+/*----------------------------------------------------------------------------*/
+
+#define gcmBEGINSTATEBATCH_NEW(CommandBuffer, Memory, FixedPoint, Address, Count) \
+{ \
+ gcmVERIFYLOADSTATEALIGNED(CommandBuffer,Memory);\
+ gcmASSERT((gctUINT32)Count <= 1024); \
+ \
+ *Memory++ \
+ = gcmSETFIELDVALUE(0, AQ_COMMAND_LOAD_STATE_COMMAND, OPCODE, LOAD_STATE) \
+ | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, FLOAT, FixedPoint) \
+ | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, COUNT, Count) \
+ | gcmSETFIELD (0, AQ_COMMAND_LOAD_STATE_COMMAND, ADDRESS, Address); \
+}
+
+#define gcmENDSTATEBATCH_NEW(CommandBuffer, Memory) \
+ gcmVERIFYLOADSTATEALIGNED(CommandBuffer,Memory);
+
+/*----------------------------------------------------------------------------*/
+
+#define gcmSETSTATEDATA_NEW(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+{ \
+ gctUINT32 __temp_data32__; \
+ \
+ gcmSAFECASTSIZET(__temp_data32__, Data); \
+ \
+ *Memory++ = __temp_data32__; \
+ \
+ gcoHARDWARE_UpdateDelta(\
+ StateDelta, Address, 0, __temp_data32__ \
+ ); \
+ \
+ gcmDUMPSTATEDATA(StateDelta, FixedPoint, Address, __temp_data32__); \
+}
+
+#define gcmSETSTATEDATAWITHMASK_NEW(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data) \
+{ \
+ gctUINT32 __temp_data32__; \
+ \
+ __temp_data32__ = Data; \
+ \
+ *Memory++ = __temp_data32__; \
+ \
+ gcoHARDWARE_UpdateDelta(\
+ StateDelta, Address, Mask, __temp_data32__ \
+ ); \
+ \
+ gcmDUMPSTATEDATA(StateDelta, FixedPoint, Address, __temp_data32__); \
+}
+
+
+#define gcmSETCTRLSTATE_NEW(StateDelta, CommandBuffer, Memory, Address, Data) \
+{ \
+ gctUINT32 __temp_data32__; \
+ \
+ __temp_data32__ = Data; \
+ \
+ *Memory++ = __temp_data32__; \
+ \
+ gcmDUMPSTATEDATA(StateDelta, gcvFALSE, Address, __temp_data32__); \
+}
+
+#define gcmSETFILLER_NEW(CommandBuffer, Memory) \
+{ \
+ *(gctUINT32_PTR)Memory = 0x18000000; \
+ Memory += 1; \
+}
+
+/*----------------------------------------------------------------------------*/
+#define gcmSETSINGLESTATE_DUMY(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+ { \
+ gctUINT32 __temp_data32__; \
+ __temp_data32__ = Data ; \
+ gcmVERIFYLOADSTATEALIGNED(CommandBuffer, Memory); \
+ *Memory++ = \
+ (gctUINT32)(0) | (0xFFFF & Address); \
+ *Memory++ = __temp_data32__; \
+ gcmENDSTATEBATCH_NEW(CommandBuffer, Memory); \
+}
+
+#define gcmSETSINGLESTATE_NEW(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+{ \
+ gcmBEGINSTATEBATCH_NEW(CommandBuffer, Memory, FixedPoint, Address, 1); \
+ gcmSETSTATEDATA_NEW(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data); \
+ gcmENDSTATEBATCH_NEW(CommandBuffer, Memory); \
+}
+
+#define gcmSETSINGLESTATEWITHMASK_NEW(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data) \
+{ \
+ gcmBEGINSTATEBATCH_NEW(CommandBuffer, Memory, FixedPoint, Address, 1); \
+ gcmSETSTATEDATAWITHMASK_NEW(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data); \
+ gcmENDSTATEBATCH_NEW(CommandBuffer, Memory); \
+}
+
+
+#define gcmSETSINGLECTRLSTATE_NEW(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+{ \
+ gcmBEGINSTATEBATCH_NEW(CommandBuffer, Memory, FixedPoint, Address, 1); \
+ gcmSETCTRLSTATE_NEW(StateDelta, CommandBuffer, Memory, Address, Data); \
+ gcmENDSTATEBATCH_NEW(CommandBuffer, Memory); \
+}
+
+
+
+#define gcmSETSEMASTALLPIPE_NEW(StateDelta, CommandBuffer, Memory, Data) \
+{ \
+ gcmSETSINGLECTRLSTATE_NEW(StateDelta, CommandBuffer, Memory, gcvFALSE, 0x0E02, Data); \
+ \
+ *Memory++ = gcmSETFIELDVALUE(0, STALL_COMMAND, OPCODE, STALL); \
+ \
+ *Memory++ = Data; \
+ \
+ gcmDUMP(gcvNULL, "#[stall 0x%08X 0x%08X]", \
+ gcmSETFIELDVALUE(0, AQ_SEMAPHORE, SOURCE, FRONT_END), \
+ gcmSETFIELDVALUE(0, AQ_SEMAPHORE, DESTINATION, PIXEL_ENGINE)); \
+}
+
+#define gcmSETSTARTDECOMMAND_NEW(CommandBuffer, Memory, Count) \
+{ \
+ *Memory++ \
+ = gcmSETFIELDVALUE(0, AQ_COMMAND_START_DE_COMMAND, OPCODE, START_DE) \
+ | gcmSETFIELD (0, AQ_COMMAND_START_DE_COMMAND, COUNT, Count) \
+ | gcmSETFIELD (0, AQ_COMMAND_START_DE_COMMAND, DATA_COUNT, 0); \
+ \
+ *Memory++ = 0xDEADDEED; \
+ \
+}
+
+#define gcmSETSTATEDATA_NEW_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+{ \
+ gctUINT32 __temp_data32__; \
+ \
+ __temp_data32__ = Data; \
+ \
+ *Memory++ = __temp_data32__; \
+ \
+ gcmDUMPSTATEDATA(StateDelta, FixedPoint, Address, __temp_data32__); \
+}
+
+#define gcmSETSTATEDATAWITHMASK_NEW_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data) \
+{ \
+ gctUINT32 __temp_data32__; \
+ \
+ __temp_data32__ = Data; \
+ \
+ *Memory++ = __temp_data32__; \
+ \
+ gcmDUMPSTATEDATA(StateDelta, FixedPoint, Address, __temp_data32__); \
+}
+
+#define gcmSETSINGLESTATE_NEW_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+{ \
+ gcmBEGINSTATEBATCH_NEW(CommandBuffer, Memory, FixedPoint, Address, 1); \
+ gcmSETSTATEDATA_NEW_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data); \
+ gcmENDSTATEBATCH_NEW(CommandBuffer, Memory); \
+}
+
+#define gcmSETSINGLESTATEWITHMASK_NEW_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data) \
+{ \
+ gcmBEGINSTATEBATCH_NEW(CommandBuffer, Memory, FixedPoint, Address, 1); \
+ gcmSETSTATEDATAWITHMASK_NEW_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data); \
+ gcmENDSTATEBATCH_NEW(CommandBuffer, Memory); \
+}
+
+#define gcmSETSTATEDATA_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+{ \
+ gctUINT32 __temp_data32__; \
+ \
+ gcmVERIFYLOADSTATE(CommandBuffer, Memory, Address); \
+ \
+ gcmSAFECASTSIZET(__temp_data32__, Data); \
+ \
+ *Memory++ = __temp_data32__; \
+ \
+ gcmDUMPSTATEDATA(StateDelta, FixedPoint, Address, __temp_data32__); \
+}
+
+#define gcmSETSTATEDATAWITHMASK_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data) \
+{ \
+ gctUINT32 __temp_data32__; \
+ \
+ gcmVERIFYLOADSTATE(CommandBuffer, Memory, Address); \
+ \
+ __temp_data32__ = Data; \
+ \
+ *Memory++ = __temp_data32__; \
+ \
+ gcmDUMPSTATEDATA(StateDelta, FixedPoint, Address, __temp_data32__); \
+}
+
+#define gcmSETSINGLESTATE_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data) \
+{ \
+ gcmBEGINSTATEBATCH(CommandBuffer, Memory, FixedPoint, Address, 1); \
+ gcmSETSTATEDATA_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Data); \
+ gcmENDSTATEBATCH(CommandBuffer, Memory); \
+}
+
+#define gcmSETSINGLESTATEWITHMASK_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data) \
+{ \
+ gcmBEGINSTATEBATCH(CommandBuffer, Memory, FixedPoint, Address, 1); \
+ gcmSETSTATEDATAWITHMASK_FAST(StateDelta, CommandBuffer, Memory, FixedPoint, \
+ Address, Mask, Data); \
+ gcmENDSTATEBATCH(CommandBuffer, Memory); \
+}
+
+#define gcmDEFINESTATEBUFFER_NEW_FAST(CommandBuffer, Memory) \
+ gcmDEFINELOADSTATEBASE() \
+ gcsTEMPCMDBUF CommandBuffer = gcvNULL; \
+ gctUINT32_PTR Memory;
+
+#define gcmDEFINESTATEBUFFER_FAST(CommandBuffer, Memory, ReserveSize) \
+ gctSIZE_T ReserveSize; \
+ gcoCMDBUF CommandBuffer; \
+ gctUINT32_PTR Memory;
+
+#define gcmBEGINSTATEBUFFER_FAST(Hardware, CommandBuffer, Memory, ReserveSize) \
+{ \
+ gcmONERROR(gcoBUFFER_Reserve(\
+ Hardware->engine[gcvENGINE_RENDER].buffer, ReserveSize, gcvTRUE, &CommandBuffer \
+ )); \
+ \
+ Memory = (gctUINT32_PTR) gcmUINT64_TO_PTR(CommandBuffer->lastReserve); \
+ \
+}
+
+#define gcmBEGINSTATEBUFFER_NEW_FAST(Hardware, CommandBuffer, Memory, OutSide) \
+{ \
+ if (OutSide) \
+ {\
+ Memory = (gctUINT32_PTR)*OutSide; \
+ }\
+ else \
+ {\
+ gcmONERROR(gcoBUFFER_StartTEMPCMDBUF(\
+ Hardware->engine[gcvENGINE_RENDER].buffer, Hardware->engine[gcvENGINE_RENDER].queue, &CommandBuffer \
+ ));\
+ \
+ Memory = (gctUINT32_PTR)(CommandBuffer->buffer); \
+ \
+ }\
+ \
+ gcmSETLOADSTATEBASE(CommandBuffer,OutSide);\
+}
+
+#define gcmENDSTATEBUFFER_NEW_FAST(Hardware, CommandBuffer, Memory, OutSide) \
+{ \
+ if (OutSide) \
+ {\
+ *OutSide = Memory; \
+ }\
+ else \
+ {\
+ CommandBuffer->currentByteSize = (gctUINT32)((gctUINT8_PTR)Memory - \
+ (gctUINT8_PTR)CommandBuffer->buffer); \
+ \
+ gcmONERROR(gcoBUFFER_EndTEMPCMDBUF(Hardware->engine[gcvENGINE_RENDER].buffer, gcvFALSE));\
+ }\
+ gcmUNSETLOADSTATEBASE()\
+}
+
+/*******************************************************************************
+**
+** gcmCONFIGUREUNIFORMS
+**
+** Configure uniforms according to chip and numConstants.
+*/
+#if !gcdENABLE_UNIFIED_CONSTANT
+#define gcmCONFIGUREUNIFORMS(ChipModel, ChipRevision, NumConstants, \
+ UnifiedConst, VsConstBase, PsConstBase, VsConstMax, PsConstMax, ConstMax) \
+{ \
+ if (ChipModel == gcv2000 && (ChipRevision == 0x5118 || ChipRevision == 0x5140)) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstBase = 0x1400; \
+ PsConstBase = 0x1C00; \
+ VsConstMax = 256; \
+ PsConstMax = 64; \
+ ConstMax = 320; \
+ } \
+ else if (NumConstants == 320) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstBase = 0x1400; \
+ PsConstBase = 0x1C00; \
+ VsConstMax = 256; \
+ PsConstMax = 64; \
+ ConstMax = 320; \
+ } \
+ /* All GC1000 series chips can only support 64 uniforms for ps on non-unified const mode. */ \
+ else if (NumConstants > 256 && ChipModel == gcv1000) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstBase = 0x1400; \
+ PsConstBase = 0x1C00; \
+ VsConstMax = 256; \
+ PsConstMax = 64; \
+ ConstMax = 320; \
+ } \
+ else if (NumConstants > 256) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstBase = 0x1400; \
+ PsConstBase = 0x1C00; \
+ VsConstMax = 256; \
+ PsConstMax = 256; \
+ ConstMax = 512; \
+ } \
+ else if (NumConstants == 256) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstBase = 0x1400; \
+ PsConstBase = 0x1C00; \
+ VsConstMax = 256; \
+ PsConstMax = 256; \
+ ConstMax = 512; \
+ } \
+ else \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstBase = 0x1400; \
+ PsConstBase = 0x1C00; \
+ VsConstMax = 168; \
+ PsConstMax = 64; \
+ ConstMax = 232; \
+ } \
+}
+#else
+#define gcmCONFIGUREUNIFORMS(ChipModel, ChipRevision, Halti5Avail, SmallBatch, NumConstants, \
+ UnifiedConst, VsConstBase, PsConstBase, VsConstMax, PsConstMax, ConstMax) \
+{ \
+ if (NumConstants > 256) \
+ { \
+ UnifiedConst = gcvTRUE; \
+ if (SmallBatch) \
+ { \
+ VsConstBase = 0xD000; \
+ PsConstBase = 0xD000; \
+ } \
+ else if (Halti5Avail) \
+ { \
+ VsConstBase = 0xD000; \
+ PsConstBase = 0xD800; \
+ } \
+ else \
+ {\
+ VsConstBase = 0xC000; \
+ PsConstBase = 0xC000; \
+ }\
+ if ((ChipModel == gcv880) && ((ChipRevision & 0xfff0) == 0x5120)) \
+ { \
+ VsConstMax = 512; \
+ PsConstMax = 64; \
+ ConstMax = 576; \
+ } \
+ else \
+ { \
+ VsConstMax = gcmMIN(512, NumConstants - 64); \
+ PsConstMax = gcmMIN(512, NumConstants - 64); \
+ ConstMax = NumConstants; \
+ } \
+ } \
+ else if (NumConstants == 256) \
+ { \
+ if (ChipModel == gcv2000 && (ChipRevision == 0x5118 || ChipRevision == 0x5140)) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstBase = 0x1400; \
+ PsConstBase = 0x1C00; \
+ VsConstMax = 256; \
+ PsConstMax = 64; \
+ ConstMax = 320; \
+ } \
+ else \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstBase = 0x1400; \
+ PsConstBase = 0x1C00; \
+ VsConstMax = 256; \
+ PsConstMax = 256; \
+ ConstMax = 512; \
+ } \
+ } \
+ else \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstBase = 0x1400; \
+ PsConstBase = 0x1C00; \
+ VsConstMax = 168; \
+ PsConstMax = 64; \
+ ConstMax = 232; \
+ } \
+}
+#endif
+
+/*******************************************************************************
+**
+** gcmCONFIGUREUNIFORMS2
+** only fix clang build error
+**
+** Configure uniforms according to chip and numConstants.
+*/
+#if !gcdENABLE_UNIFIED_CONSTANT
+#define gcmCONFIGUREUNIFORMS2(ChipModel, ChipRevision, NumConstants, \
+ UnifiedConst, VsConstMax, PsConstMax) \
+{ \
+ if (ChipModel == gcv2000 && (ChipRevision == 0x5118 || ChipRevision == 0x5140)) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstMax = 256; \
+ PsConstMax = 64; \
+ } \
+ else if (NumConstants == 320) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstMax = 256; \
+ PsConstMax = 64; \
+ } \
+ /* All GC1000 series chips can only support 64 uniforms for ps on non-unified const mode. */ \
+ else if (NumConstants > 256 && ChipModel == gcv1000) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstMax = 256; \
+ PsConstMax = 64; \
+ } \
+ else if (NumConstants > 256) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstMax = 256; \
+ PsConstMax = 256; \
+ } \
+ else if (NumConstants == 256) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstMax = 256; \
+ PsConstMax = 256; \
+ } \
+ else \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstMax = 168; \
+ PsConstMax = 64; \
+ } \
+}
+#else
+#define gcmCONFIGUREUNIFORMS2(ChipModel, ChipRevision, Halti5Avail, SmallBatch, NumConstants, \
+ UnifiedConst, VsConstMax, PsConstMax) \
+{ \
+ if (NumConstants > 256) \
+ { \
+ UnifiedConst = gcvTRUE; \
+ if ((ChipModel == gcv880) && ((ChipRevision & 0xfff0) == 0x5120)) \
+ { \
+ VsConstMax = 512; \
+ PsConstMax = 64; \
+ } \
+ else \
+ { \
+ VsConstMax = gcmMIN(512, NumConstants - 64); \
+ PsConstMax = gcmMIN(512, NumConstants - 64); \
+ } \
+ } \
+ else if (NumConstants == 256) \
+ { \
+ if (ChipModel == gcv2000 && (ChipRevision == 0x5118 || ChipRevision == 0x5140)) \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstMax = 256; \
+ PsConstMax = 64; \
+ } \
+ else \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstMax = 256; \
+ PsConstMax = 256; \
+ } \
+ } \
+ else \
+ { \
+ UnifiedConst = gcvFALSE; \
+ VsConstMax = 168; \
+ PsConstMax = 64; \
+ } \
+}
+#endif
+
+#define gcmAnyTileStatusEnableForFullMultiSlice(SurfView, anyTsEnableForMultiSlice)\
+{\
+ gctUINT i = 0; \
+ for (; i < (SurfView->surf->requestD); i++)\
+ {\
+ if ((SurfView->surf->tileStatusNode.pool != gcvPOOL_UNKNOWN) && \
+ (SurfView->surf->tileStatusDisabled[i] == gcvFALSE))\
+ {\
+ *anyTsEnableForMultiSlice = gcvTRUE;\
+ break;\
+ }\
+ }\
+}\
+
+#define gcmAnyTileStatusEnableForMultiSlice(SurfView, anyTsEnableForMultiSlice)\
+{\
+ gctUINT i = SurfView->firstSlice; \
+ for (; i < (SurfView->firstSlice + SurfView->numSlices); i++)\
+ {\
+ if ((SurfView->surf->tileStatusNode.pool != gcvPOOL_UNKNOWN) && \
+ (SurfView->surf->tileStatusDisabled[i] == gcvFALSE))\
+ {\
+ *anyTsEnableForMultiSlice = gcvTRUE;\
+ break;\
+ }\
+ }\
+}\
+
+#define gcmCanTileStatusEnabledForMultiSlice(SurfView, canTsEnabled)\
+{\
+ if (SurfView->numSlices > 1)\
+ {\
+ if (SurfView->surf->tileStatusNode.pool != gcvPOOL_UNKNOWN) \
+ {\
+ gctUINT i = 0;\
+ for (; i < SurfView->numSlices; i++)\
+ {\
+ if (SurfView->surf->tileStatusDisabled[i] == gcvTRUE)\
+ {\
+ *canTsEnabled = gcvFALSE;\
+ break;\
+ }\
+ if (SurfView->surf->fcValue[i] != SurfView->surf->fcValue[0])\
+ {\
+ *canTsEnabled = gcvFALSE;\
+ break;\
+ }\
+ \
+ if (SurfView->surf->fcValueUpper[i] != SurfView->surf->fcValueUpper[0])\
+ {\
+ *canTsEnabled = gcvFALSE;\
+ break;\
+ }\
+ }\
+ }\
+ else\
+ {\
+ *canTsEnabled = gcvFALSE;\
+ }\
+ }\
+ else\
+ {\
+ if ((SurfView->surf->tileStatusNode.pool == gcvPOOL_UNKNOWN) || (SurfView->surf->tileStatusDisabled[SurfView->firstSlice] == gcvTRUE))\
+ {\
+ *canTsEnabled = gcvFALSE;\
+ }\
+ }\
+}\
+
+
+#define gcmCONFIGUSC(prefix, featureUSC, featureSeparateLS, featureComputeOnly, \
+ featureTS, featureGS, featureUSCFullCacheFix, featureL1CacheSize, featureUSCMaxPages, \
+ attribCacheRatio, L1CacheRatio) \
+{ \
+ attribCacheRatio = 0x2; \
+ \
+ if (featureUSC) \
+ { \
+ if (featureSeparateLS) \
+ { \
+ L1CacheRatio = 0x0; \
+ } \
+ else \
+ { \
+ gctUINT L1cacheSize; \
+ \
+ if (featureComputeOnly) \
+ { \
+ L1cacheSize = featureL1CacheSize; \
+ } \
+ else \
+ { \
+ gctUINT attribBufSizeInKB; \
+ if (featureTS) \
+ { \
+ /* GS/TS must be bundled. */ \
+ prefix##ASSERT(featureGS); \
+ featureGS = featureGS; \
+ attribBufSizeInKB = 42; \
+ } \
+ else \
+ { \
+ prefix##ASSERT(!featureGS); \
+ attribBufSizeInKB = 8; \
+ } \
+ if (attribBufSizeInKB < featureUSCMaxPages) \
+ { \
+ L1cacheSize = featureUSCMaxPages - attribBufSizeInKB; \
+ } \
+ else \
+ { \
+ attribBufSizeInKB -= 2; \
+ L1cacheSize = 2; \
+ } \
+ } \
+ prefix##ASSERT(L1cacheSize); \
+ if (L1cacheSize >= featureL1CacheSize) \
+ { \
+ L1CacheRatio = 0x0; \
+ prefix##ASSERT(featureUSCFullCacheFix); \
+ featureUSCFullCacheFix = featureUSCFullCacheFix; \
+ } \
+ 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 = featureL1CacheSize * s_uscCacheRatio[i]; \
+ \
+ if ((maxL1cacheSize >= curL1cacheSize) && \
+ ((maxL1cacheSize - curL1cacheSize) < delta)) \
+ { \
+ curIndex = i; \
+ delta = maxL1cacheSize - curL1cacheSize; \
+ } \
+ } \
+ prefix##ASSERT(-1 != curIndex); \
+ L1CacheRatio = curIndex; \
+ } \
+ } \
+ } \
+} \
+
+#define gcmCONFIGUSC2(prefix, featureUSC, featureSeparateLS, featureComputeOnly, \
+ featureTS, featureL1CacheSize, featureUSCMaxPages, \
+ attribCacheRatio, L1CacheRatio) \
+{ \
+ attribCacheRatio = 0x2; \
+ \
+ if (featureUSC) \
+ { \
+ if (featureSeparateLS) \
+ { \
+ L1CacheRatio = 0x0; \
+ } \
+ else \
+ { \
+ gctUINT L1cacheSize; \
+ \
+ if (featureComputeOnly) \
+ { \
+ L1cacheSize = featureL1CacheSize; \
+ } \
+ else \
+ { \
+ gctUINT attribBufSizeInKB; \
+ if (featureTS) \
+ { \
+ /* GS/TS must be bundled. */ \
+ attribBufSizeInKB = 42; \
+ } \
+ else \
+ { \
+ attribBufSizeInKB = 8; \
+ } \
+ if (attribBufSizeInKB < featureUSCMaxPages) \
+ { \
+ L1cacheSize = featureUSCMaxPages - attribBufSizeInKB; \
+ } \
+ else \
+ { \
+ attribBufSizeInKB -= 4; \
+ L1cacheSize = 4; \
+ } \
+ } \
+ prefix##ASSERT(L1cacheSize); \
+ if (L1cacheSize >= featureL1CacheSize) \
+ { \
+ L1CacheRatio = 0x0; \
+ } \
+ 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 = featureL1CacheSize * s_uscCacheRatio[i]; \
+ \
+ if ((maxL1cacheSize >= curL1cacheSize) && \
+ ((maxL1cacheSize - curL1cacheSize) < delta)) \
+ { \
+ curIndex = i; \
+ delta = maxL1cacheSize - curL1cacheSize; \
+ } \
+ } \
+ prefix##ASSERT(-1 != curIndex); \
+ L1CacheRatio = curIndex; \
+ } \
+ } \
+ } \
+} \
+
+#if VIVANTE_PROFILER_SYSTEM_MEMORY
+typedef struct _memory_profile_info
+{
+ struct
+ {
+ gctUINT64 currentSize;
+ gctUINT64 peakSize;
+ gctUINT64 total_allocate;
+ gctUINT64 total_free;
+ gctUINT32 total_allocateCount;
+ gctUINT32 total_freeCount;
+ } system_memory, gpu_memory;
+} memory_profile_info;
+
+
+gceSTATUS
+gcoOS_GetMemoryProfileInfo(
+ size_t size,
+ struct _memory_profile_info *info
+ );
+
+gceSTATUS gcoOS_DumpMemoryProfile(void);
+gceSTATUS gcoOS_InitMemoryProfile(void);
+gceSTATUS gcoOS_DeInitMemoryProfile(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_base_h_ */
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_debug_zones.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_debug_zones.h
new file mode 100644
index 000000000000..f0fbf9e29ebc
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_debug_zones.h
@@ -0,0 +1,329 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_debug_zones_h_
+#define __gc_hal_debug_zones_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************\
+ ************************ Debug Zone Pattern Summary ***************************
+ * A debug zone is an unsigned integer of 32 bit (Bit 31- Bit 0). *
+ * Bit 31 to 28 defines API, which is 0 for HAL API and has value of 1 - 14 *
+ * for Khronos API. Value 15 (0xF) is reserved for gcdZONE_NONE. *
+ * Bit 27 to 0 defines subzones of each API. Value 0xFFFFFFF is resevered for *
+ * gcdZONE_ALL. *
+ * *
+\******************************************************************************/
+
+/* Retrieve API bits 31 to 28 */
+#define gcmZONE_GET_API(zone) ((zone) >> 28)
+
+/* Retrieve Subzone bits 27 to 0 */
+#define gcmZONE_GET_SUBZONES(zone) ((zone) << 4)
+
+/******************************************************************************\
+******************************** HAL Zone **************************************
+\******************************************************************************/
+
+#define gcdZONE_API_HAL ((gctUINT32) 0 << 28)
+
+/******************************************************************************\
+******************************** HAL Subzones **********************************
+\******************************************************************************/
+
+/* Subzones Kernel and User have in common */
+#define gcvZONE_OS (1 << 0)
+#define gcvZONE_HARDWARE (1 << 1)
+#define gcvZONE_HEAP (1 << 2)
+#define gcvZONE_SIGNAL (1 << 3)
+
+/* Subzones of HAL Kernel */
+#define gcvZONE_KERNEL (1 << 4)
+#define gcvZONE_VIDMEM (1 << 5)
+#define gcvZONE_COMMAND (1 << 6)
+#define gcvZONE_DRIVER (1 << 7)
+#define gcvZONE_CMODEL (1 << 8)
+#define gcvZONE_MMU (1 << 9)
+#define gcvZONE_EVENT (1 << 10)
+#define gcvZONE_DEVICE (1 << 11)
+#define gcvZONE_DATABASE (1 << 12)
+#define gcvZONE_INTERRUPT (1 << 13)
+#define gcvZONE_POWER (1 << 14)
+#define gcvZONE_ASYNC_COMMAND (1 << 15)
+#define gcvZONE_ALLOCATOR (1 << 16)
+
+/* Subzones of HAL User */
+#define gcdZONE_HAL_API (1 << 4)
+#define gcdZONE_BUFFER (1 << 5)
+#define gcdZONE_VGBUFFER (1 << 6)
+#define gcdZONE_SURFACE (1 << 7)
+#define gcdZONE_INDEX (1 << 8)
+#define gcdZONE_STREAM (1 << 9)
+#define gcdZONE_TEXTURE (1 << 10)
+#define gcdZONE_2D (1 << 11)
+#define gcdZONE_3D (1 << 12)
+#define gcdZONE_COMPILER (1 << 13)
+#define gcdZONE_MEM (1 << 14)
+#define gcdZONE_VERTEXARRAY (1 << 15)
+#define gcdZONE_CL (1 << 16)
+#define gcdZONE_VG (1 << 17)
+#define gcdZONE_VX (1 << 18)
+#define gcdZONE_UTILITY (1 << 19)
+#define gcdZONE_RECT (1 << 20)
+#define gcdZONE_BUFOBJ (1 << 21)
+#define gcdZONE_PROFILER (1 << 22)
+#define gcdZONE_SHADER (1 << 23)
+
+
+/******************************************************************************\
+******************************** Khronos API Zones *****************************
+\******************************************************************************/
+
+#define gcdZONE_API_EGL ((gctUINT32) 1 << 28)
+#define gcdZONE_API_ES11 ((gctUINT32) 2 << 28)
+#define gcdZONE_API_ES30 ((gctUINT32) 3 << 28)
+#define gcdZONE_API_GL40 ((gctUINT32) 4 << 28)
+#define gcdZONE_API_VG3D ((gctUINT32) 5 << 28)
+#define gcdZONE_API_CL ((gctUINT32) 6 << 28)
+#define gcdZONE_API_VX ((gctUINT32) 7 << 28)
+#define gcdZONE_API_VG ((gctUINT32) 8 << 28)
+
+/******************************************************************************\
+************************* Subzones of Khronos API Zones ************************
+\******************************************************************************/
+
+/* Subzones of EGL API */
+#define gcdZONE_EGL_API (gcdZONE_API_EGL | (1 << 0))
+#define gcdZONE_EGL_SURFACE (gcdZONE_API_EGL | (1 << 1))
+#define gcdZONE_EGL_CONTEXT (gcdZONE_API_EGL | (1 << 2))
+#define gcdZONE_EGL_CONFIG (gcdZONE_API_EGL | (1 << 3))
+#define gcdZONE_EGL_OS (gcdZONE_API_EGL | (1 << 4)) /* unused */
+#define gcdZONE_EGL_IMAGE (gcdZONE_API_EGL | (1 << 5))
+#define gcdZONE_EGL_SWAP (gcdZONE_API_EGL | (1 << 6))
+#define gcdZONE_EGL_INIT (gcdZONE_API_EGL | (1 << 7))
+#define gcdZONE_EGL_SYNC (gcdZONE_API_EGL | (1 << 8))
+#define gcdZONE_EGL_COMPOSE (gcdZONE_API_EGL | (1 << 9)) /* unused */
+#define gcdZONE_EGL_RENDER_THREAD (gcdZONE_API_EGL | (1 << 10)) /* unused */
+
+/* Subzones of ES11 API */
+#define gcdZONE_ES11_BUFFER (gcdZONE_API_ES11 | (1 << 0))
+#define gcdZONE_ES11_CLEAR (gcdZONE_API_ES11 | (1 << 1))
+#define gcdZONE_ES11_CLIP (gcdZONE_API_ES11 | (1 << 2))
+#define gcdZONE_ES11_CONTEXT (gcdZONE_API_ES11 | (1 << 3))
+#define gcdZONE_ES11_DRAW (gcdZONE_API_ES11 | (1 << 4))
+#define gcdZONE_ES11_ENABLE (gcdZONE_API_ES11 | (1 << 5))
+#define gcdZONE_ES11_EXTENTION (gcdZONE_API_ES11 | (1 << 6))
+#define gcdZONE_ES11_FOG (gcdZONE_API_ES11 | (1 << 7))
+#define gcdZONE_ES11_FRAGMENT (gcdZONE_API_ES11 | (1 << 8))
+#define gcdZONE_ES11_LIGHT (gcdZONE_API_ES11 | (1 << 9))
+#define gcdZONE_ES11_MATRIX (gcdZONE_API_ES11 | (1 << 10))
+#define gcdZONE_ES11_PIXEL (gcdZONE_API_ES11 | (1 << 11))
+#define gcdZONE_ES11_POLIGON (gcdZONE_API_ES11 | (1 << 12))
+#define gcdZONE_ES11_LINE (gcdZONE_API_ES11 | (1 << 13)) /* unused */
+#define gcdZONE_ES11_QUERY (gcdZONE_API_ES11 | (1 << 14))
+#define gcdZONE_ES11_TEXTURE (gcdZONE_API_ES11 | (1 << 15))
+#define gcdZONE_ES11_STATES (gcdZONE_API_ES11 | (1 << 16))
+#define gcdZONE_ES11_STREAM (gcdZONE_API_ES11 | (1 << 17))
+#define gcdZONE_ES11_VIEWPORT (gcdZONE_API_ES11 | (1 << 18))
+#define gcdZONE_ES11_SHADER (gcdZONE_API_ES11 | (1 << 19))
+#define gcdZONE_ES11_HASH (gcdZONE_API_ES11 | (1 << 20))
+#define gcdZONE_ES11_TRACE (gcdZONE_API_ES11 | (1 << 21))
+
+/* Subzones of ES30 API */
+#define gcdZONE_ES30_TRACE (gcdZONE_API_ES30 | (1 << 0))
+#define gcdZONE_ES30_BUFFER (gcdZONE_API_ES30 | (1 << 1))
+#define gcdZONE_ES30_CLEAR (gcdZONE_API_ES30 | (1 << 2))
+#define gcdZONE_ES30_CODEC (gcdZONE_API_ES30 | (1 << 3))
+#define gcdZONE_ES30_CONTEXT (gcdZONE_API_ES30 | (1 << 4))
+#define gcdZONE_ES30_DEPTH (gcdZONE_API_ES30 | (1 << 5))
+#define gcdZONE_ES30_DEVICE (gcdZONE_API_ES30 | (1 << 6))
+#define gcdZONE_ES30_DRAW (gcdZONE_API_ES30 | (1 << 7))
+#define gcdZONE_ES30_FBO (gcdZONE_API_ES30 | (1 << 8))
+#define gcdZONE_ES30_PIXEL (gcdZONE_API_ES30 | (1 << 9))
+#define gcdZONE_ES30_SHADER (gcdZONE_API_ES30 | (1 << 10))
+#define gcdZONE_ES30_STATE (gcdZONE_API_ES30 | (1 << 11))
+#define gcdZONE_ES30_TEXTURE (gcdZONE_API_ES30 | (1 << 12))
+#define gcdZONE_ES30_UTILS (gcdZONE_API_ES30 | (1 << 13))
+#define gcdZONE_ES30_PROFILER (gcdZONE_API_ES30 | (1 << 14))
+#define gcdZONE_ES30_CORE (gcdZONE_API_ES30 | (1 << 15))
+
+/* Subzones of GL40 API */
+#define gcdZONE_GL40_TRACE (gcdZONE_API_GL40 | (1 << 0))
+#define gcdZONE_GL40_BUFFER (gcdZONE_API_GL40 | (1 << 1))
+#define gcdZONE_GL40_CLEAR (gcdZONE_API_GL40 | (1 << 2)) /* unused */
+#define gcdZONE_GL40_CODEC (gcdZONE_API_GL40 | (1 << 3))
+#define gcdZONE_GL40_CONTEXT (gcdZONE_API_GL40 | (1 << 4))
+#define gcdZONE_GL40_DEPTH (gcdZONE_API_GL40 | (1 << 5))
+#define gcdZONE_GL40_DEVICE (gcdZONE_API_GL40 | (1 << 6))
+#define gcdZONE_GL40_DRAW (gcdZONE_API_GL40 | (1 << 7))
+#define gcdZONE_GL40_FBO (gcdZONE_API_GL40 | (1 << 8))
+#define gcdZONE_GL40_PIXEL (gcdZONE_API_GL40 | (1 << 9))
+#define gcdZONE_GL40_SHADER (gcdZONE_API_GL40 | (1 << 10))
+#define gcdZONE_GL40_STATE (gcdZONE_API_GL40 | (1 << 11))
+#define gcdZONE_GL40_TEXTURE (gcdZONE_API_GL40 | (1 << 12))
+#define gcdZONE_GL40_UTILS (gcdZONE_API_GL40 | (1 << 13))
+#define gcdZONE_GL40_PROFILER (gcdZONE_API_GL40 | (1 << 14))
+#define gcdZONE_GL40_CORE (gcdZONE_API_GL40 | (1 << 15))
+#define gcdZONE_GL40_FIXVERTEX (gcdZONE_API_GL40 | (1 << 16))
+#define gcdZONE_GL40_FIXFRAG (gcdZONE_API_GL40 | (1 << 17))
+#define gcdZONE_GL40_HASH (gcdZONE_API_GL40 | (1 << 18))
+
+/* Subzones of VG3D API */
+#define gcdZONE_VG3D_CONTEXT (gcdZONE_API_VG3D | (1 << 0))
+#define gcdZONE_VG3D_DUMP (gcdZONE_API_VG3D | (1 << 1))
+#define gcdZONE_VG3D_EGL (gcdZONE_API_VG3D | (1 << 2))
+#define gcdZONE_VG3D_FONT (gcdZONE_API_VG3D | (1 << 3))
+#define gcdZONE_VG3D_HARDWARE (gcdZONE_API_VG3D | (1 << 4))
+#define gcdZONE_VG3D_IMAGE (gcdZONE_API_VG3D | (1 << 5))
+#define gcdZONE_VG3D_MASK (gcdZONE_API_VG3D | (1 << 6))
+#define gcdZONE_VG3D_MATRIX (gcdZONE_API_VG3D | (1 << 7))
+#define gcdZONE_VG3D_OBJECT (gcdZONE_API_VG3D | (1 << 8))
+#define gcdZONE_VG3D_PAINT (gcdZONE_API_VG3D | (1 << 9))
+#define gcdZONE_VG3D_PATH (gcdZONE_API_VG3D | (1 << 10))
+#define gcdZONE_VG3D_PROFILER (gcdZONE_API_VG3D | (1 << 11))
+#define gcdZONE_VG3D_SCANLINE (gcdZONE_API_VG3D | (1 << 12))
+#define gcdZONE_VG3D_SHADER (gcdZONE_API_VG3D | (1 << 13))
+#define gcdZONE_VG3D_TESSELLATOR (gcdZONE_API_VG3D | (1 << 14))
+#define gcdZONE_VG3D_VGU (gcdZONE_API_VG3D | (1 << 15))
+
+/* Subzones of VG11 API */
+#define gcdZONE_VG_ARC (gcdZONE_API_VG | (1 << 0))
+#define gcdZONE_VG_CONTEXT (gcdZONE_API_VG | (1 << 1))
+#define gcdZONE_VG_DEBUG (gcdZONE_API_VG | (1 << 2))
+#define gcdZONE_VG_FILTER (gcdZONE_API_VG | (1 << 3))
+#define gcdZONE_VG_FORMAT (gcdZONE_API_VG | (1 << 4))
+#define gcdZONE_VG_IMAGE (gcdZONE_API_VG | (1 << 5))
+#define gcdZONE_VG_MAIN (gcdZONE_API_VG | (1 << 6))
+#define gcdZONE_VG_MASK (gcdZONE_API_VG | (1 << 7))
+#define gcdZONE_VG_MATRIX (gcdZONE_API_VG | (1 << 8))
+#define gcdZONE_VG_MEMORYMGR (gcdZONE_API_VG | (1 << 9))
+#define gcdZONE_VG_OBJECT (gcdZONE_API_VG | (1 << 10))
+#define gcdZONE_VG_PAINT (gcdZONE_API_VG | (1 << 11))
+#define gcdZONE_VG_PATH (gcdZONE_API_VG | (1 << 12))
+#define gcdZONE_VG_STATE (gcdZONE_API_VG | (1 << 13))
+#define gcdZONE_VG_STROKE (gcdZONE_API_VG | (1 << 14))
+#define gcdZONE_VG_TEXT (gcdZONE_API_VG | (1 << 15))
+#define gcdZONE_VG_VGU (gcdZONE_API_VG | (1 << 16))
+
+/* Subzones of CL API */
+#define gcdZONE_CL_COMMAND (gcdZONE_API_CL | (1 << 0))
+#define gcdZONE_CL_CONTEXT (gcdZONE_API_CL | (1 << 1))
+#define gcdZONE_CL_DEVICE (gcdZONE_API_CL | (1 << 2))
+#define gcdZONE_CL_ENQUEUE (gcdZONE_API_CL | (1 << 3))
+#define gcdZONE_CL_EVENT (gcdZONE_API_CL | (1 << 4))
+#define gcdZONE_CL_EXT (gcdZONE_API_CL | (1 << 5))
+#define gcdZONE_CL_GL (gcdZONE_API_CL | (1 << 6))
+#define gcdZONE_CL_KERNEL (gcdZONE_API_CL | (1 << 7))
+#define gcdZONE_CL_MEM (gcdZONE_API_CL | (1 << 8))
+#define gcdZONE_CL_PLATFORM (gcdZONE_API_CL | (1 << 9))
+#define gcdZONE_CL_PROFILER (gcdZONE_API_CL | (1 << 10))
+#define gcdZONE_CL_PROGRAM (gcdZONE_API_CL | (1 << 11))
+#define gcdZONE_CL_SAMPLER (gcdZONE_API_CL | (1 << 12))
+
+/* Subzones of VX API */
+#define gcdZONE_VX_ARRAY (gcdZONE_API_VX | (1 << 0))
+#define gcdZONE_VX_BINARY (gcdZONE_API_VX | (1 << 1))
+#define gcdZONE_VX_CONTEXT (gcdZONE_API_VX | (1 << 2))
+#define gcdZONE_VX_CONV (gcdZONE_API_VX | (1 << 3))
+#define gcdZONE_VX_DELAY (gcdZONE_API_VX | (1 << 4))
+#define gcdZONE_VX_DIST (gcdZONE_API_VX | (1 << 5))
+#define gcdZONE_VX_GPULAYER (gcdZONE_API_VX | (1 << 6))
+#define gcdZONE_VX_GRAPH (gcdZONE_API_VX | (1 << 7))
+#define gcdZONE_VX_IMAGE (gcdZONE_API_VX | (1 << 8))
+#define gcdZONE_VX_INTERFACE (gcdZONE_API_VX | (1 << 9))
+#define gcdZONE_VX_KERNEL (gcdZONE_API_VX | (1 << 10))
+#define gcdZONE_VX_LAYER (gcdZONE_API_VX | (1 << 11))
+#define gcdZONE_VX_LUT (gcdZONE_API_VX | (1 << 12))
+#define gcdZONE_VX_MATRIX (gcdZONE_API_VX | (1 << 13))
+#define gcdZONE_VX_MEMORY (gcdZONE_API_VX | (1 << 14))
+#define gcdZONE_VX_METAFMT (gcdZONE_API_VX | (1 << 15))
+#define gcdZONE_VX_NODE (gcdZONE_API_VX | (1 << 16))
+#define gcdZONE_VX_OBJARRAY (gcdZONE_API_VX | (1 << 17))
+#define gcdZONE_VX_PARAM (gcdZONE_API_VX | (1 << 18))
+#define gcdZONE_VX_PROGRAM (gcdZONE_API_VX | (1 << 19))
+#define gcdZONE_VX_PYRAMID (gcdZONE_API_VX | (1 << 20))
+#define gcdZONE_VX_REF (gcdZONE_API_VX | (1 << 21))
+#define gcdZONE_VX_REMAP (gcdZONE_API_VX | (1 << 22))
+#define gcdZONE_VX_SCALAR (gcdZONE_API_VX | (1 << 23))
+#define gcdZONE_VX_TARGET (gcdZONE_API_VX | (1 << 24))
+#define gcdZONE_VX_TENSOR (gcdZONE_API_VX | (1 << 25))
+#define gcdZONE_VX_THRESHOLD (gcdZONE_API_VX | (1 << 26))
+#define gcdZONE_VX_OTHERS (gcdZONE_API_VX | (1 << 27))
+
+/******************************************************************************\
+******************************** Utility Zones *********************************
+\******************************************************************************/
+
+/* Value for Disabling All Subzones */
+#define gcdZONE_NONE 0xF0000000
+
+/* Value for Enabling All Subzones */
+#define gcdZONE_ALL 0x0FFFFFFF
+
+
+/******************************************************************************\
+*********************************** END ****************************************
+\******************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_debug_zones_h_ */
+
+
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
new file mode 100644
index 000000000000..b9f86c9a1970
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver.h
@@ -0,0 +1,1431 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_driver_h_
+#define __gc_hal_driver_h_
+
+#include "gc_hal_enum.h"
+#include "gc_hal_types.h"
+
+#if gcdENABLE_VG
+#include "gc_hal_driver_vg.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************\
+******************************* I/O Control Codes ******************************
+\******************************************************************************/
+
+#define gcvHAL_CLASS "galcore"
+#define IOCTL_GCHAL_INTERFACE 30000
+#define IOCTL_GCHAL_KERNEL_INTERFACE 30001
+#define IOCTL_GCHAL_TERMINATE 30002
+
+#undef CONFIG_ANDROID_RESERVED_MEMORY_ACCOUNT
+/******************************************************************************\
+********************************* Command Codes ********************************
+\******************************************************************************/
+
+typedef enum _gceHAL_COMMAND_CODES
+{
+ /*************** Common ***************/
+
+ /* Chip info: count, type and so on. */
+ gcvHAL_CHIP_INFO,
+
+ /* HAL driver version. */
+ gcvHAL_VERSION,
+
+ /* Query chip id and options. */
+ gcvHAL_QUERY_CHIP_IDENTITY,
+ gcvHAL_QUERY_CHIP_OPTION,
+
+ /* Query chip frequency, used by CL. */
+ gcvHAL_QUERY_CHIP_FREQUENCY,
+
+ /* Query system pool video memory, used by CL. */
+ gcvHAL_QUERY_VIDEO_MEMORY,
+
+ /* Memory management. */
+ gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY,
+ gcvHAL_WRAP_USER_MEMORY,
+ gcvHAL_RELEASE_VIDEO_MEMORY,
+ gcvHAL_LOCK_VIDEO_MEMORY,
+ gcvHAL_UNLOCK_VIDEO_MEMORY,
+ gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY,
+ gcvHAL_MAP_MEMORY,
+ gcvHAL_UNMAP_MEMORY,
+
+ /* Cache operations. */
+ gcvHAL_CACHE,
+
+ /* HAL user attach and detach. */
+ gcvHAL_ATTACH,
+ gcvHAL_DETACH,
+
+ /* Event commit. */
+ gcvHAL_EVENT_COMMIT,
+
+ /* User command commit. */
+ gcvHAL_COMMIT,
+
+ /* Set hardware timeout, used by CL. */
+ gcvHAL_SET_TIMEOUT,
+
+ /* User signal operations. */
+ gcvHAL_USER_SIGNAL,
+
+ /* Event signal, commit stall. */
+ gcvHAL_SIGNAL,
+
+ /* Profile related. */
+ gcvHAL_SET_PROFILE_SETTING,
+ gcvHAL_READ_PROFILER_REGISTER_SETTING,
+ gcvHAL_READ_ALL_PROFILE_REGISTERS_PART1,
+ gcvHAL_READ_ALL_PROFILE_REGISTERS_PART2,
+
+ /* Query process database info when debug trace and proflie. */
+ gcvHAL_DATABASE,
+
+ /* Power managment enable/disable. */
+ gcvHAL_CONFIG_POWER_MANAGEMENT,
+
+ /* Debug/dump feature. */
+ gcvHAL_DEBUG_DUMP,
+
+ /*************** Common end ***************/
+
+ /*************** GPU only ***************/
+ /* Register operations, 2D only. */
+ gcvHAL_READ_REGISTER,
+ gcvHAL_WRITE_REGISTER,
+ gcvHAL_PROFILE_REGISTERS_2D,
+
+ /* Get base address for old mmu. */
+ gcvHAL_GET_BASE_ADDRESS,
+
+ /* Read frame database, 3D only. */
+ gcvHAL_GET_FRAME_INFO,
+
+ /* Set video memory meta data. */
+ gcvHAL_SET_VIDEO_MEMORY_METADATA,
+
+ /* Query command buffer, VG only. */
+ gcvHAL_QUERY_COMMAND_BUFFER,
+
+ /* Reset time stamp. */
+ gcvHAL_QUERY_RESET_TIME_STAMP,
+
+ /* Create native fence. */
+ gcvHAL_CREATE_NATIVE_FENCE,
+
+ /* Wait native fence. */
+ gcvHAL_WAIT_NATIVE_FENCE,
+
+ /* Wait until GPU finishes access to a resource. */
+ gcvHAL_WAIT_FENCE,
+
+ /* Video memory node operations. */
+ gcvHAL_EXPORT_VIDEO_MEMORY,
+ gcvHAL_NAME_VIDEO_MEMORY,
+ gcvHAL_IMPORT_VIDEO_MEMORY,
+
+ /* Mutex Operation. */
+ gcvHAL_DEVICE_MUTEX,
+ /*************** GPU only end ***************/
+
+ /*************** DEC only ***************/
+ /* DEC200 test. */
+ gcvHAL_DEC200_TEST,
+
+ /* DEC300 related operations. */
+ gcvHAL_DEC300_READ,
+ gcvHAL_DEC300_WRITE,
+ gcvHAL_DEC300_FLUSH,
+ gcvHAL_DEC300_FLUSH_WAIT,
+ /*************** DEC only end ***************/
+
+ /*************** OS specific ***************/
+
+ /* Android gralloc: shared buffer operations. */
+ gcvHAL_SHBUF,
+
+ /* Android gralloc: get graphic buffer fd. */
+ gcvHAL_GET_GRAPHIC_BUFFER_FD,
+
+ /* Vsimulator only. */
+ gcvHAL_UPDATE_DEBUG_CALLBACK,
+ gcvHAL_CONFIG_CTX_FRAMEWORK,
+
+ /* Non paged memory management backup compatibility, windows, qnx. */
+ gcvHAL_ALLOCATE_NON_PAGED_MEMORY,
+ gcvHAL_FREE_NON_PAGED_MEMORY,
+
+ /* Write user data, windows only. */
+ gcvHAL_WRITE_DATA,
+
+ /*************** OS specific end ***************/
+
+ /*************** Reserved ***************/
+ gcvHAL_SET_IDLE,
+ gcvHAL_RESET,
+
+ /* Command commit done, kernel event only. */
+ gcvHAL_COMMIT_DONE,
+
+ /* Get video memory file description. */
+ gcvHAL_GET_VIDEO_MEMORY_FD,
+
+ /* Get profile setting. */
+ gcvHAL_GET_PROFILE_SETTING,
+
+ /* Read/Write register ex. */
+ gcvHAL_READ_REGISTER_EX,
+ gcvHAL_WRITE_REGISTER_EX,
+
+ /* Power managment state. */
+ gcvHAL_SET_POWER_MANAGEMENT_STATE,
+ gcvHAL_QUERY_POWER_MANAGEMENT_STATE,
+
+ /* Set debug level. */
+ gcvHAL_SET_DEBUG_LEVEL_ZONE,
+
+ /* Dump info. */
+ gcvHAL_DUMP_GPU_STATE,
+ gcvHAL_DUMP_EVENT,
+ gcvHAL_DUMP_GPU_PROFILE,
+
+ /* Timer. */
+ gcvHAL_TIMESTAMP,
+
+ /* FSCALE_VAL. */
+ gcvHAL_SET_FSCALE_VALUE,
+ gcvHAL_GET_FSCALE_VALUE,
+
+ /* Destory MMU. */
+ gcvHAL_DESTROY_MMU,
+ /*************** Reserved end ***************/
+}
+gceHAL_COMMAND_CODES;
+
+/******************************************************************************\
+****************************** Interface Structure *****************************
+\******************************************************************************/
+
+#define gcdMAX_PROFILE_FILE_NAME 128
+#define gcdMAX_FLAT_MAPPING_COUNT 16
+
+/* gcvHAL_CHIP_INFO */
+typedef struct _gcsHAL_CHIP_INFO
+{
+ /* Chip count. */
+ OUT gctINT32 count;
+
+ /* Chip types. */
+ OUT gceHARDWARE_TYPE types[gcdCHIP_COUNT];
+
+ /* Chip IDs. */
+ OUT gctUINT32 ids[gcvCORE_COUNT];
+}
+gcsHAL_CHIP_INFO;
+
+/* gcvHAL_VERSION */
+typedef struct _gcsHAL_VERSION
+{
+ /* version: <major>.<minor>.<patch>. */
+ OUT gctINT32 major;
+ OUT gctINT32 minor;
+ OUT gctINT32 patch;
+
+ /* Build version. */
+ OUT gctUINT32 build;
+}
+gcsHAL_VERSION;
+
+/* gcvHAL_SET_TIMEOUT. */
+typedef struct _gcsHAL_SET_TIMEOUT
+{
+ gctUINT32 timeOut;
+}
+gcsHAL_SET_TIMEOUT;
+
+/* gcvHAL_QUERY_VIDEO_MEMORY */
+typedef struct _gcsHAL_QUERY_VIDEO_MEMORY
+{
+ /* Physical memory address of internal memory. Just a name. */
+ OUT gctUINT32 internalPhysName;
+ /* Size in bytes of internal memory. */
+ OUT gctUINT64 internalSize;
+
+ /* Physical memory address of external memory. Just a name. */
+ OUT gctUINT32 externalPhysName;
+ /* Size in bytes of external memory.*/
+ OUT gctUINT64 externalSize;
+
+ /* Physical memory address of contiguous memory. Just a name. */
+ OUT gctUINT32 contiguousPhysName;
+ /* Size in bytes of contiguous memory.*/
+ OUT gctUINT64 contiguousSize;
+}
+gcsHAL_QUERY_VIDEO_MEMORY;
+
+enum
+{
+ /* GPU can't issue more that 32bit physical address */
+ gcvPLATFORM_FLAG_LIMIT_4G_ADDRESS = 1 << 0,
+
+ gcvPLATFORM_FLAG_IMX_MM = 1 << 1,
+};
+
+/* gcvHAL_QUERY_CHIP_IDENTITY */
+typedef struct _gcsHAL_QUERY_CHIP_IDENTITY * gcsHAL_QUERY_CHIP_IDENTITY_PTR;
+typedef struct _gcsHAL_QUERY_CHIP_IDENTITY
+{
+
+ /* Chip model. */
+ gceCHIPMODEL chipModel;
+
+ /* Revision value.*/
+ gctUINT32 chipRevision;
+
+ /* Chip date. */
+ gctUINT32 chipDate;
+
+ /* Supported feature fields. */
+ gctUINT32 chipFeatures;
+
+ /* Supported minor feature fields. */
+ gctUINT32 chipMinorFeatures;
+
+ /* Supported minor feature 1 fields. */
+ gctUINT32 chipMinorFeatures1;
+
+ /* Supported minor feature 2 fields. */
+ gctUINT32 chipMinorFeatures2;
+
+ /* Supported minor feature 3 fields. */
+ gctUINT32 chipMinorFeatures3;
+
+ /* Supported minor feature 4 fields. */
+ gctUINT32 chipMinorFeatures4;
+
+ /* Supported minor feature 5 fields. */
+ gctUINT32 chipMinorFeatures5;
+
+ /* Supported minor feature 6 fields. */
+ gctUINT32 chipMinorFeatures6;
+
+ /* Number of streams supported. */
+ gctUINT32 streamCount;
+
+ /* Number of pixel pipes. */
+ gctUINT32 pixelPipes;
+
+ /* Number of resolve pipes. */
+ gctUINT32 resolvePipes;
+
+ /* Number of instructions. */
+ gctUINT32 instructionCount;
+
+ /* Number of constants. */
+ gctUINT32 numConstants;
+
+ /* Number of varyings */
+ gctUINT32 varyingsCount;
+
+ /* Number of 3D GPUs */
+ gctUINT32 gpuCoreCount;
+
+ /* Physical mask of all AVAILABLE clusters in core.*/
+ gctUINT32 clusterAvailMask;
+
+ /* Product ID */
+ gctUINT32 productID;
+
+ /* Special chip flag bits */
+ gceCHIP_FLAG chipFlags;
+
+ /* ECO ID. */
+ gctUINT32 ecoID;
+
+ /* Customer ID. */
+ gctUINT32 customerID;
+
+ /* CPU view physical address and size of SRAMs. */
+ gctUINT64 sRAMBases[gcvSRAM_INTER_COUNT];
+ gctUINT32 sRAMSizes[gcvSRAM_INTER_COUNT];
+
+ gctUINT64 platformFlagBits;
+}
+gcsHAL_QUERY_CHIP_IDENTITY;
+
+/* gcvHAL_QUERY_CHIP_OPTION. */
+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;
+ gctBOOL smallBatch;
+ gctUINT32 uscL1CacheRatio;
+ gctUINT32 uscAttribCacheRatio;
+ gctUINT32 userClusterMask;
+
+ /* Internal SRAM. */
+ gctUINT32 sRAMGPUVirtAddrs[gcvSRAM_INTER_COUNT];
+ gctUINT32 sRAMSizes[gcvSRAM_INTER_COUNT];
+ gctUINT32 sRAMCount;
+
+ /* External SRAM. */
+ gctPHYS_ADDR_T extSRAMCPUPhysAddrs[gcvSRAM_EXT_COUNT];
+ gctPHYS_ADDR_T extSRAMGPUPhysAddrs[gcvSRAM_EXT_COUNT];
+ gctUINT32 extSRAMGPUVirtAddrs[gcvSRAM_EXT_COUNT];
+ gctUINT32 extSRAMGPUPhysNames[gcvSRAM_EXT_COUNT];
+ gctUINT32 extSRAMSizes[gcvSRAM_EXT_COUNT];
+ gctUINT32 extSRAMCount;
+
+ gceSECURE_MODE secureMode;
+ gctBOOL enableNNTPParallel;
+ gctUINT enableSwtilingPhase1;
+}
+gcsHAL_QUERY_CHIP_OPTIONS;
+
+/* gcvHAL_QUERY_CHIP_FREQUENCY. */
+typedef struct _gcsHAL_QUERY_CHIP_FREQUENCY * gcsHAL_QUERY_CHIP_FREQUENCY_PTR;
+typedef struct _gcsHAL_QUERY_CHIP_FREQUENCY
+{
+ OUT gctUINT32 mcClk;
+ OUT gctUINT32 shClk;
+}
+gcsHAL_QUERY_CHIP_FREQUENCY;
+
+/* Obsolete for userpace. */
+/* gcvHAL_ALLOCATE_NON_PAGED_MEMORY */
+typedef struct _gcsHAL_ALLOCATE_NON_PAGED_MEMORY
+{
+ /* Allocation flags. */
+ IN gctUINT32 flags;
+
+ /* Number of bytes to allocate. */
+ IN OUT gctUINT64 bytes;
+
+ /* Physical address of allocation. Just a name. */
+ OUT gctUINT32 physName;
+
+ /* Logical address of allocation. */
+ OUT gctUINT64 logical;
+}
+gcsHAL_ALLOCATE_NON_PAGED_MEMORY;
+
+/* Obsolete for userpace. */
+/* gcvHAL_FREE_NON_PAGED_MEMORY */
+typedef struct _gcsHAL_FREE_NON_PAGED_MEMORY
+{
+ /* Number of bytes allocated. */
+ IN gctUINT64 bytes;
+
+ /* Physical address of allocation. Just a name. */
+ IN gctUINT32 physName;
+
+ /* Logical address of allocation. */
+ IN gctUINT64 logical;
+}
+gcsHAL_FREE_NON_PAGED_MEMORY;
+
+/* Video memory allocation. */
+/* gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY */
+typedef struct _gcsHAL_ALLOCATE_LINEAR_VIDEO_MEMORY
+{
+ /* Number of bytes to allocate. */
+ IN OUT gctUINT64 bytes;
+
+ /* Buffer alignment. */
+ IN gctUINT32 alignment;
+
+ /* Type of allocation, see gceVIDMEM_TYPE. */
+ IN gctUINT32 type;
+
+ /* Flag of allocation. */
+ IN gctUINT32 flag;
+
+ /* Memory pool to allocate from. */
+ IN OUT gctUINT32 pool;
+
+ /* Internal SRAM index. */
+ IN gctINT32 sRAMIndex;
+ /* External SRAM index. */
+ IN gctINT32 extSRAMIndex;
+
+ /* Allocated video memory. */
+ OUT gctUINT32 node;
+}
+gcsHAL_ALLOCATE_LINEAR_VIDEO_MEMORY;
+
+typedef struct _gcsUSER_MEMORY_DESC
+{
+ /* Import flag. */
+ gctUINT32 flag;
+
+ /* gcvALLOC_FLAG_DMABUF */
+ gctUINT32 handle;
+ gctUINT64 dmabuf;
+
+ /* gcvALLOC_FLAG_USERMEMORY */
+ gctUINT64 logical;
+ gctUINT64 physical;
+ gctUINT32 size;
+
+ /* gcvALLOC_FLAG_EXTERNAL_MEMORY */
+ gcsEXTERNAL_MEMORY_INFO externalMemoryInfo;
+}
+gcsUSER_MEMORY_DESC;
+
+/* gcvHAL_WRAP_USER_MEMORY. */
+typedef struct _gcsHAL_WRAP_USER_MEMORY
+{
+ /* Description of user memory. */
+ IN gcsUSER_MEMORY_DESC desc;
+
+ /* Video memory allocation type. */
+ IN gctUINT32 type;
+
+ /* Output video mmory node. */
+ OUT gctUINT32 node;
+
+ /* size of the node in bytes */
+ OUT gctUINT64 bytes;
+}
+gcsHAL_WRAP_USER_MEMORY;
+
+/* gcvHAL_RELEASE_VIDEO_MEMORY */
+typedef struct _gcsHAL_RELEASE_VIDEO_MEMORY
+{
+ /* Allocated video memory. */
+ IN gctUINT32 node;
+
+#ifdef __QNXNTO__
+ /* Mapped logical address to unmap in user space. */
+ OUT gctUINT64 memory;
+
+ /* Number of bytes to allocated. */
+ OUT gctUINT64 bytes;
+#endif
+}
+gcsHAL_RELEASE_VIDEO_MEMORY;
+
+/* gcvHAL_LOCK_VIDEO_MEMORY */
+typedef struct _gcsHAL_LOCK_VIDEO_MEMORY
+{
+ /* Allocated video memory. */
+ IN gctUINT32 node;
+
+ /* Cache configuration. */
+ /* Only gcvPOOL_VIRTUAL can be configured */
+ IN gctBOOL cacheable;
+
+ /* Hardware specific address. */
+ OUT gctUINT32 address;
+
+ /* Mapped logical address. */
+ OUT gctUINT64 memory;
+
+ /* Customer priviate handle*/
+ OUT gctUINT32 gid;
+
+ /* Bus address of a contiguous video node. */
+ OUT gctUINT64 physicalAddress;
+}
+gcsHAL_LOCK_VIDEO_MEMORY;
+
+/* gcvHAL_UNLOCK_VIDEO_MEMORY */
+typedef struct _gcsHAL_UNLOCK_VIDEO_MEMORY
+{
+ /* Allocated video memory. */
+ IN gctUINT64 node;
+
+ /* Video memory allocation type. */
+ IN gctUINT32 type;
+
+ /* Pool of the unlock node */
+ OUT gctUINT32 pool;
+
+ /* Bytes of the unlock node */
+ OUT gctUINT64 bytes;
+
+ /* Flag to unlock surface asynchroneously. */
+ IN OUT gctBOOL asynchroneous;
+}
+gcsHAL_UNLOCK_VIDEO_MEMORY;
+
+/* gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY: */
+typedef struct _gcsHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY
+{
+ /* Allocated video memory. */
+ IN gctUINT32 node;
+
+ /* Video memory allocation type. */
+ IN gctUINT32 type;
+}
+gcsHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY;
+
+/* gcvHAL_EXPORT_VIDEO_MEMORY. */
+typedef struct _gcsHAL_EXPORT_VIDEO_MEMORY
+{
+ /* Allocated video memory. */
+ IN gctUINT32 node;
+
+ /* Export flags */
+ IN gctUINT32 flags;
+
+ /* Exported dma_buf fd */
+ OUT gctINT32 fd;
+}
+gcsHAL_EXPORT_VIDEO_MEMORY;
+
+/* gcvHAL_NAME_VIDEO_MEMORY. */
+typedef struct _gcsHAL_NAME_VIDEO_MEMORY
+{
+ IN gctUINT32 handle;
+ OUT gctUINT32 name;
+}
+gcsHAL_NAME_VIDEO_MEMORY;
+
+/* gcvHAL_IMPORT_VIDEO_MEMORY. */
+typedef struct _gcsHAL_IMPORT_VIDEO_MEMORY
+{
+ IN gctUINT32 name;
+ OUT gctUINT32 handle;
+}
+gcsHAL_IMPORT_VIDEO_MEMORY;
+
+/* gcvHAL_MAP_MEMORY */
+typedef struct _gcsHAL_MAP_MEMORY
+{
+ /* Physical memory address to map. Just a name on Linux/Qnx. */
+ IN gctUINT32 physName;
+
+ /* Number of bytes in physical memory to map. */
+ IN gctUINT64 bytes;
+
+ /* Address of mapped memory. */
+ OUT gctUINT64 logical;
+}
+gcsHAL_MAP_MEMORY;
+
+/* gcvHAL_UNMAP_MEMORY */
+typedef struct _gcsHAL_UNMAP_MEMORY
+{
+ /* Physical memory address to unmap. Just a name on Linux/Qnx. */
+ IN gctUINT32 physName;
+
+ /* Number of bytes in physical memory to unmap. */
+ IN gctUINT64 bytes;
+
+ /* Address of mapped memory to unmap. */
+ IN gctUINT64 logical;
+}
+gcsHAL_UNMAP_MEMORY;
+
+/* gcvHAL_CACHE */
+typedef struct _gcsHAL_CACHE
+{
+ IN gceCACHEOPERATION operation;
+ IN gctUINT64 process;
+ IN gctUINT64 logical;
+ IN gctUINT64 bytes;
+ IN gctUINT32 node;
+}
+gcsHAL_CACHE;
+
+/* gcvHAL_ATTACH */
+typedef struct _gcsHAL_ATTACH
+{
+ /* Handle of context buffer object. */
+ OUT gctUINT32 context;
+
+ /* Maximum state in the buffer. */
+ OUT gctUINT64 maxState;
+
+ /* Number of states in the buffer. */
+ OUT gctUINT32 numStates;
+
+ /* Map context buffer to user or not. */
+ IN gctBOOL map;
+
+ /* Physical of context buffer. */
+ OUT gctUINT64 logicals[2];
+
+ /* Bytes of context buffer. */
+ OUT gctUINT32 bytes;
+}
+gcsHAL_ATTACH;
+
+/* gcvHAL_DETACH */
+typedef struct _gcsHAL_DETACH
+{
+ /* Context buffer object gckCONTEXT. Just a name. */
+ IN gctUINT32 context;
+}
+gcsHAL_DETACH;
+
+
+/* gcvHAL_EVENT_COMMIT. */
+typedef struct _gcsHAL_EVENT_COMMIT
+{
+ /* Event queue in gcsQUEUE. */
+ IN gctUINT64 queue;
+}
+gcsHAL_EVENT_COMMIT;
+
+typedef struct _gcsHAL_COMMAND_LOCATION
+{
+ gctUINT32 priority;
+ gctUINT32 channelId;
+
+ gctUINT32 videoMemNode;
+
+ gctUINT32 address;
+ gctUINT64 logical;
+ gctUINT32 startOffset;
+ /* size includes reservedHead and reservedTail. */
+ gctUINT32 size;
+
+ gctUINT32 reservedHead;
+ gctUINT32 reservedTail;
+
+ /* Pointer to patch list. */
+ gctUINT64 patchHead;
+
+ /*
+ * Location index of exit commands, ie where to put the chipEnable/link back
+ * commands in the reservedTail area.
+ * It's used in fully shared command buffer for multiple cores.
+ */
+ gctUINT32 exitIndex;
+ gctUINT32 entryPipe;
+ gctUINT32 exitPipe;
+
+ /* struct _gcsHAL_COMMAND_LOCATION * next; */
+ gctUINT64 next;
+}
+gcsHAL_COMMAND_LOCATION;
+
+typedef struct _gcsHAL_SUBCOMMIT
+{
+ gctUINT32 coreId;
+
+ /* user gcsSTATE_DELTA_PTR. */
+ gctUINT64 delta;
+
+ /* Kernel gckCONTEXT. */
+ gctUINT64 context;
+
+ /* Event queue in user gcsQUEUE *. */
+ gctUINT64 queue;
+
+ /* Locate the commands. */
+ gcsHAL_COMMAND_LOCATION commandBuffer;
+
+ /* struct _gcsHAL_SUBCOMMIT * next; */
+ gctUINT64 next;
+}
+gcsHAL_SUBCOMMIT;
+
+/* gcvHAL_COMMIT */
+typedef struct _gcsHAL_COMMIT
+{
+ gcsHAL_SUBCOMMIT subCommit;
+
+ gctBOOL shared;
+
+ gctBOOL contextSwitched;
+
+ /* Commit stamp of this commit. */
+ OUT gctUINT64 commitStamp;
+}
+gcsHAL_COMMIT;
+
+#if gcdENABLE_VG
+/* gcvHAL_COMMIT */
+typedef struct _gcsHAL_VGCOMMIT
+{
+ /* Context buffer. gcsVGCONTEXT_PTR */
+ IN gctUINT64 context;
+
+ /* Command queue. gcsVGCMDQUEUE_PTR */
+ IN gctUINT64 queue;
+
+ /* Number of entries in the queue. */
+ IN gctUINT32 entryCount;
+
+ /* Task table. gcsTASK_MASTER_TABLE_PTR */
+ IN gctUINT64 taskTable;
+}
+gcsHAL_VGCOMMIT;
+#endif
+
+typedef struct _gcsHAL_COMMIT_DONE
+{
+ IN gctUINT64 context;
+}
+gcsHAL_COMMIT_DONE;
+
+/* gcvHAL_USER_SIGNAL */
+typedef struct _gcsHAL_USER_SIGNAL
+{
+ /* Command. */
+ gceUSER_SIGNAL_COMMAND_CODES command;
+
+ /* Signal ID. */
+ IN OUT gctINT32 id;
+
+ /* Reset mode. */
+ IN gctBOOL manualReset;
+
+ /* Wait timedout. */
+ IN gctUINT32 wait;
+
+ /* State. */
+ IN gctBOOL state;
+}
+gcsHAL_USER_SIGNAL;
+
+/* gcvHAL_SIGNAL. */
+typedef struct _gcsHAL_SIGNAL
+{
+ /* Signal handle to signal gctSIGNAL. */
+ IN gctUINT64 signal;
+
+ /* Reserved gctSIGNAL. */
+ IN gctUINT64 auxSignal;
+
+ /* Process owning the signal gctHANDLE. */
+ IN gctUINT64 process;
+
+#if defined(__QNXNTO__)
+ /* Client pulse side-channel connection ID. Set by client in gcoOS_CreateSignal. */
+ IN gctINT32 coid;
+
+ /* Set by server. */
+ IN gctINT32 rcvid;
+#endif
+ /* Event generated from where of pipeline */
+ IN gceKERNEL_WHERE fromWhere;
+}
+gcsHAL_SIGNAL;
+
+/* gcvHAL_WRITE_DATA. */
+typedef struct _gcsHAL_WRITE_DATA
+{
+ /* Address to write data to. */
+ IN gctUINT32 address;
+
+ /* Data to write. */
+ IN gctUINT32 data;
+}
+gcsHAL_WRITE_DATA;
+
+/* gcvHAL_READ_REGISTER */
+typedef struct _gcsHAL_READ_REGISTER
+{
+ /* Logical address of memory to write data to. */
+ IN gctUINT32 address;
+
+ /* Data read. */
+ OUT gctUINT32 data;
+}
+gcsHAL_READ_REGISTER;
+
+/* gcvHAL_WRITE_REGISTER */
+typedef struct _gcsHAL_WRITE_REGISTER
+{
+ /* Logical address of memory to write data to. */
+ IN gctUINT32 address;
+
+ /* Data read. */
+ IN gctUINT32 data;
+}
+gcsHAL_WRITE_REGISTER;
+
+/* gcvHAL_READ_REGISTER_EX */
+typedef struct _gcsHAL_READ_REGISTER_EX
+{
+ /* Logical address of memory to write data to. */
+ IN gctUINT32 address;
+
+ IN gctUINT32 coreSelect;
+
+ /* Data read. */
+ OUT gctUINT32 data[4];
+}
+gcsHAL_READ_REGISTER_EX;
+
+/* gcvHAL_WRITE_REGISTER_EX */
+typedef struct _gcsHAL_WRITE_REGISTER_EX
+{
+ /* Logical address of memory to write data to. */
+ IN gctUINT32 address;
+
+ IN gctUINT32 coreSelect;
+
+ /* Data read. */
+ IN gctUINT32 data[4];
+}
+gcsHAL_WRITE_REGISTER_EX;
+
+#if VIVANTE_PROFILER
+/* gcvHAL_GET_PROFILE_SETTING */
+typedef struct _gcsHAL_GET_PROFILE_SETTING
+{
+ /* Enable profiling */
+ OUT gctBOOL enable;
+}
+gcsHAL_GET_PROFILE_SETTING;
+
+/* gcvHAL_SET_PROFILE_SETTING */
+typedef struct _gcsHAL_SET_PROFILE_SETTING
+{
+ /* Enable profiling */
+ IN gctBOOL enable;
+}
+gcsHAL_SET_PROFILE_SETTING;
+
+/* gcvHAL_READ_PROFILER_REGISTER_SETTING */
+typedef struct _gcsHAL_READ_PROFILER_REGISTER_SETTING
+{
+ /*Should Clear Register*/
+ IN gctBOOL bclear;
+}
+gcsHAL_READ_PROFILER_REGISTER_SETTING;
+
+typedef struct _gcsHAL_READ_ALL_PROFILE_REGISTERS_PART1
+{
+ /* Context buffer object gckCONTEXT. Just a name. */
+ IN gctUINT32 context;
+
+ /* Data read. */
+ OUT gcsPROFILER_COUNTERS_PART1 Counters;
+}
+gcsHAL_READ_ALL_PROFILE_REGISTERS_PART1;
+
+typedef struct _gcsHAL_READ_ALL_PROFILE_REGISTERS_PART2
+{
+ /* Context buffer object gckCONTEXT. Just a name. */
+ IN gctUINT32 context;
+
+ /* Data read. */
+ OUT gcsPROFILER_COUNTERS_PART2 Counters;
+}
+gcsHAL_READ_ALL_PROFILE_REGISTERS_PART2;
+
+/* gcvHAL_PROFILE_REGISTERS_2D */
+typedef struct _gcsHAL_PROFILE_REGISTERS_2D
+{
+ /* Data read in gcs2D_PROFILE. */
+ OUT gctUINT64 hwProfile2D;
+}
+gcsHAL_PROFILE_REGISTERS_2D;
+#endif
+
+/* gcvHAL_SET_POWER_MANAGEMENT_STATE */
+typedef struct _gcsHAL_SET_POWER_MANAGEMENT
+{
+ /* Data read. */
+ IN gceCHIPPOWERSTATE state;
+}
+gcsHAL_SET_POWER_MANAGEMENT;
+
+/* gcvHAL_QUERY_POWER_MANAGEMENT_STATE */
+typedef struct _gcsHAL_QUERY_POWER_MANAGEMENT
+{
+ /* Data read. */
+ OUT gceCHIPPOWERSTATE state;
+
+ /* Idle query. */
+ OUT gctBOOL isIdle;
+}
+gcsHAL_QUERY_POWER_MANAGEMENT;
+
+/* gcvHAL_CONFIG_POWER_MANAGEMENT. */
+typedef struct _gcsHAL_CONFIG_POWER_MANAGEMENT
+{
+ IN gctBOOL enable;
+}
+gcsHAL_CONFIG_POWER_MANAGEMENT;
+
+typedef struct _gcsFLAT_MAPPING_RANGE
+{
+ gctUINT64 start;
+ gctUINT64 end;
+ gctUINT32 size;
+ gceFLATMAP_FLAG flag;
+}
+gcsFLAT_MAPPING_RANGE;
+
+/* gcvHAL_GET_BASE_ADDRESS */
+typedef struct _gcsHAL_GET_BASE_ADDRESS
+{
+ /* Physical memory address of internal memory. */
+ OUT gctUINT32 baseAddress;
+
+ OUT gctUINT32 flatMappingRangeCount;
+
+ OUT gcsFLAT_MAPPING_RANGE flatMappingRanges[gcdMAX_FLAT_MAPPING_COUNT];
+}
+gcsHAL_GET_BASE_ADDRESS;
+
+typedef struct _gcsHAL_SET_DEBUG_LEVEL_ZONE
+{
+ IN gctUINT32 level;
+ IN gctUINT32 zones;
+ IN gctBOOL enable;
+}
+gcsHAL_SET_DEBUG_LEVEL_ZONE;
+
+/* gcvHAL_DEBUG_DUMP. */
+typedef struct _gcsHAL_DEBUG_DUMP
+{
+ /* gceDUMP_BUFFER_TYPE type. */
+ IN gctUINT32 type;
+
+ IN gctUINT64 ptr;
+ IN gctUINT32 address;
+ IN gctUINT32 size;
+}
+gcsHAL_DEBUG_DUMP;
+
+
+/* gcvHAL_TIMESTAMP */
+typedef struct _gcsHAL_TIMESTAMP
+{
+ /* Timer select. */
+ IN gctUINT32 timer;
+
+ /* Timer request type (0-stop, 1-start, 2-send delta). */
+ IN gctUINT32 request;
+
+ /* Result of delta time in microseconds. */
+ OUT gctINT32 timeDelta;
+}
+gcsHAL_TIMESTAMP;
+
+/* gcvHAL_DATABASE */
+typedef struct _gcsHAL_DATABASE
+{
+ /* Set to gcvTRUE if you want to query a particular process ID.
+ ** Set to gcvFALSE to query the last detached process. */
+ IN gctBOOL validProcessID;
+
+ /* Process ID to query. */
+ IN gctUINT32 processID;
+
+ /* Information. */
+ OUT gcuDATABASE_INFO vidMem;
+ OUT gcuDATABASE_INFO nonPaged;
+ OUT gcuDATABASE_INFO gpuIdle;
+
+ /* Detail information about video memory. */
+ OUT gcuDATABASE_INFO vidMemPool[3];
+}
+gcsHAL_DATABASE;
+
+/* gcvHAL_GET_FRAME_INFO. */
+typedef struct _gcsHAL_GET_FRAME_INFO
+{
+ /* gcsHAL_FRAME_INFO* */
+ OUT gctUINT64 frameInfo;
+}
+gcsHAL_GET_FRAME_INFO;
+
+#if gcdENABLE_VG
+/* gcvHAL_QUERY_COMMAND_BUFFER */
+typedef struct _gcsHAL_QUERY_COMMAND_BUFFER
+{
+ /* Command buffer attributes. */
+ OUT gcsCOMMAND_BUFFER_INFO information;
+}
+gcsHAL_QUERY_COMMAND_BUFFER;
+#endif
+
+typedef struct _gcsHAL_SET_FSCALE_VALUE
+{
+ IN gctUINT32 value;
+ IN gctUINT32 shValue;
+}
+gcsHAL_SET_FSCALE_VALUE;
+
+typedef struct _gcsHAL_GET_FSCALE_VALUE
+{
+ OUT gctUINT32 value;
+ OUT gctUINT32 minValue;
+ OUT gctUINT32 maxValue;
+}
+gcsHAL_GET_FSCALE_VALUE;
+
+/* gcvHAL_QUERY_RESET_TIME_STAMP. */
+typedef struct _gcsHAL_QUERY_RESET_TIME_STAMP
+{
+ OUT gctUINT64 timeStamp;
+ OUT gctUINT64 contextID;
+}
+gcsHAL_QUERY_RESET_TIME_STAMP;
+
+/* gcvHAL_CREATE_NATIVE_FENCE. */
+typedef struct _gcsHAL_CREATE_NATIVE_FENCE
+{
+ /* Signal id. */
+ IN gctUINT64 signal;
+
+ /* Native fence file descriptor. */
+ OUT gctINT32 fenceFD;
+
+}
+gcsHAL_CREATE_NATIVE_FENCE;
+
+/* gcvHAL_WAIT_NATIVE_FENCE. */
+typedef struct _gcsHAL_WAIT_NATIVE_FENCE
+{
+ /* Native fence file descriptor. */
+ IN gctINT32 fenceFD;
+
+ /* Wait timeout. */
+ IN gctUINT32 timeout;
+}
+gcsHAL_WAIT_NATIVE_FENCE;
+
+/* gcvHAL_SHBUF. */
+typedef struct _gcsHAL_SHBUF
+{
+ gceSHBUF_COMMAND_CODES command;
+
+ /* Shared buffer. */
+ IN OUT gctUINT64 id;
+
+ /* User data to be shared. */
+ IN gctUINT64 data;
+
+ /* Data size. */
+ IN OUT gctUINT32 bytes;
+}
+gcsHAL_SHBUF;
+
+/* gcvHAL_GET_GRAPHIC_BUFFER_FD. */
+/*
+ * 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.
+ */
+typedef 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 gctUINT64 signal;
+
+ OUT gctINT32 fd;
+}
+gcsHAL_GET_GRAPHIC_BUFFER_FD;
+
+typedef struct _gcsHAL_VIDEO_MEMORY_METADATA
+{
+ /* Allocated video memory. */
+ IN gctUINT32 node;
+
+ IN gctUINT32 readback;
+
+ INOUT gctINT32 ts_fd;
+ INOUT gctUINT32 fc_enabled;
+ INOUT gctUINT32 fc_value;
+ INOUT gctUINT32 fc_value_upper;
+
+ INOUT gctUINT32 compressed;
+ INOUT gctUINT32 compress_format;
+}
+gcsHAL_VIDEO_MEMORY_METADATA;
+
+/* gcvHAL_GET_VIDEO_MEMORY_FD. */
+typedef struct _gcsHAL_GET_VIDEO_MEMORY_FD
+{
+ IN gctUINT32 handle;
+ OUT gctINT32 fd;
+}
+gcsHAL_GET_VIDEO_MEMORY_FD;
+
+/* gcvHAL_DESTROY_MMU. */
+typedef struct _gcsHAL_DESTROY_MMU
+{
+ /* Mmu object. */
+ IN gctUINT64 mmu;
+}
+gcsHAL_DESTROY_MMU;
+
+/* gcvHAL_WAIT_FENCE. */
+typedef struct _gcsHAL_WAIT_FENCE
+{
+ IN gctUINT32 handle;
+ IN gctUINT32 timeOut;
+}
+gcsHAL_WAIT_FENCE;
+
+/* gcvHAL_DEVICE_MUTEX: */
+typedef struct _gcsHAL_DEVICE_MUTEX
+{
+ /* Lock or Release device mutex. */
+ gctBOOL isMutexLocked;
+}
+gcsHAL_DEVICE_MUTEX;
+
+
+#if gcdDEC_ENABLE_AHB
+/* gcvHAL_DEC300_READ. */
+typedef struct _gcsHAL_DEC300_READ
+{
+ gctUINT32 enable;
+ gctUINT32 readId;
+ gctUINT32 format;
+ gctUINT32 strides[3];
+ gctUINT32 is3D;
+ gctUINT32 isMSAA;
+ gctUINT32 clearValue;
+ gctUINT32 isTPC;
+ gctUINT32 isTPCCompressed;
+ gctUINT32 surfAddrs[3];
+ gctUINT32 tileAddrs[3];
+}
+DEC300Read;
+
+/* gcvHAL_DEC300_WRITE. */
+typedef struct _gcsHAL_DEC300_WRITE
+{
+ gctUINT32 enable;
+ gctUINT32 readId;
+ gctUINT32 writeId;
+ gctUINT32 format;
+ gctUINT32 surfAddr;
+ gctUINT32 tileAddr;
+}
+DEC300Write;
+
+/* gcvHAL_DEC300_FLUSH. */
+typedef struct _gcsHAL_DEC300_FLUSH
+{
+ IN gctUINT8 useless;
+}
+DEC300Flush;
+
+/* gcvHAL_DEC300_FLUSH_WAIT. */
+typedef struct _gcsHAL_DEC300_FLUSH_WAIT
+{
+ IN gctUINT32 done;
+}
+DEC300FlushWait;
+#endif
+
+
+typedef struct _gcsHAL_INTERFACE
+{
+ /* Command code. */
+ gceHAL_COMMAND_CODES command;
+
+ /* Hardware type. */
+ gceHARDWARE_TYPE hardwareType;
+
+ /* Core index for current hardware type. */
+ gctUINT32 coreIndex;
+
+ /* Status value. */
+ gceSTATUS status;
+
+ /* Engine */
+ gceENGINE engine;
+
+ /* Ignore information from TSL when doing IO control */
+ gctBOOL ignoreTLS;
+
+ /* The mutext already acquired */
+ IN gctBOOL commitMutex;
+
+ /* Union of command structures. */
+ union _u
+ {
+ gcsHAL_CHIP_INFO ChipInfo;
+ gcsHAL_VERSION Version;
+ gcsHAL_SET_TIMEOUT SetTimeOut;
+
+ gcsHAL_QUERY_VIDEO_MEMORY QueryVideoMemory;
+ gcsHAL_QUERY_CHIP_IDENTITY QueryChipIdentity;
+ gcsHAL_QUERY_CHIP_OPTIONS QueryChipOptions;
+ gcsHAL_QUERY_CHIP_FREQUENCY QueryChipFrequency;
+
+ gcsHAL_ALLOCATE_NON_PAGED_MEMORY AllocateNonPagedMemory;
+ gcsHAL_FREE_NON_PAGED_MEMORY FreeNonPagedMemory;
+
+ gcsHAL_ALLOCATE_LINEAR_VIDEO_MEMORY AllocateLinearVideoMemory;
+ gcsHAL_WRAP_USER_MEMORY WrapUserMemory;
+ gcsHAL_RELEASE_VIDEO_MEMORY ReleaseVideoMemory;
+
+ gcsHAL_LOCK_VIDEO_MEMORY LockVideoMemory;
+ gcsHAL_UNLOCK_VIDEO_MEMORY UnlockVideoMemory;
+ gcsHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY BottomHalfUnlockVideoMemory;
+
+ gcsHAL_EXPORT_VIDEO_MEMORY ExportVideoMemory;
+ gcsHAL_NAME_VIDEO_MEMORY NameVideoMemory;
+ gcsHAL_IMPORT_VIDEO_MEMORY ImportVideoMemory;
+
+ gcsHAL_MAP_MEMORY MapMemory;
+ gcsHAL_UNMAP_MEMORY UnmapMemory;
+
+ gcsHAL_CACHE Cache;
+
+ gcsHAL_ATTACH Attach;
+ gcsHAL_DETACH Detach;
+
+ gcsHAL_EVENT_COMMIT Event;
+ gcsHAL_COMMIT Commit;
+#if gcdENABLE_VG
+ gcsHAL_VGCOMMIT VGCommit;
+#endif
+ gcsHAL_COMMIT_DONE CommitDone;
+
+ gcsHAL_USER_SIGNAL UserSignal;
+ gcsHAL_SIGNAL Signal;
+
+ gcsHAL_WRITE_DATA WriteData;
+ gcsHAL_READ_REGISTER ReadRegisterData;
+ gcsHAL_WRITE_REGISTER WriteRegisterData;
+ gcsHAL_READ_REGISTER_EX ReadRegisterDataEx;
+ gcsHAL_WRITE_REGISTER_EX WriteRegisterDataEx;
+
+#if VIVANTE_PROFILER
+ gcsHAL_GET_PROFILE_SETTING GetProfileSetting;
+ gcsHAL_SET_PROFILE_SETTING SetProfileSetting;
+ gcsHAL_READ_PROFILER_REGISTER_SETTING SetProfilerRegisterClear;
+ gcsHAL_READ_ALL_PROFILE_REGISTERS_PART1 RegisterProfileData_part1;
+ gcsHAL_READ_ALL_PROFILE_REGISTERS_PART2 RegisterProfileData_part2;
+ gcsHAL_PROFILE_REGISTERS_2D RegisterProfileData2D;
+#endif
+
+ gcsHAL_SET_POWER_MANAGEMENT SetPowerManagement;
+ gcsHAL_QUERY_POWER_MANAGEMENT QueryPowerManagement;
+ gcsHAL_CONFIG_POWER_MANAGEMENT ConfigPowerManagement;
+
+ gcsHAL_GET_BASE_ADDRESS GetBaseAddress;
+
+ gcsHAL_SET_DEBUG_LEVEL_ZONE DebugLevelZone;
+ gcsHAL_DEBUG_DUMP DebugDump;
+
+ gcsHAL_TIMESTAMP TimeStamp;
+ gcsHAL_DATABASE Database;
+
+ gcsHAL_GET_FRAME_INFO GetFrameInfo;
+
+#if gcdENABLE_VG
+ gcsHAL_QUERY_COMMAND_BUFFER QueryCommandBuffer;
+#endif
+
+ /* gcsHAL_DUMP_GPU_STATE */
+ /* gcsHAL_DUMP_EVENT */
+
+ gcsHAL_SET_FSCALE_VALUE SetFscaleValue;
+ gcsHAL_GET_FSCALE_VALUE GetFscaleValue;
+
+ gcsHAL_QUERY_RESET_TIME_STAMP QueryResetTimeStamp;
+
+ gcsHAL_CREATE_NATIVE_FENCE CreateNativeFence;
+ gcsHAL_WAIT_NATIVE_FENCE WaitNativeFence;
+ gcsHAL_SHBUF ShBuf;
+ gcsHAL_GET_GRAPHIC_BUFFER_FD GetGraphicBufferFd;
+ gcsHAL_VIDEO_MEMORY_METADATA SetVidMemMetadata;
+ gcsHAL_GET_VIDEO_MEMORY_FD GetVideoMemoryFd;
+
+ gcsHAL_DESTROY_MMU DestroyMmu;
+
+ gcsHAL_WAIT_FENCE WaitFence;
+
+ /* gcvHAL_DEVICE_MUTEX: */
+ gcsHAL_DEVICE_MUTEX DeviceMutex;
+
+
+#if gcdDEC_ENABLE_AHB
+ gcsHAL_DEC300_READ DEC300Read;
+ gcsHAL_DEC300_WRITE DEC300Write;
+ gcsHAL_DEC300_FLUSH DEC300Flush;
+ gcsHAL_DEC300_FLUSH_WAIT DEC300FlushWait;
+#endif
+ }
+ u;
+}
+gcsHAL_INTERFACE;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_driver_h_ */
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h
new file mode 100644
index 000000000000..68c9786e43aa
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_driver_vg.h
@@ -0,0 +1,280 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_driver_vg_h_
+#define __gc_hal_driver_vg_h_
+
+
+
+#include "gc_hal_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************\
+******************************* I/O Control Codes ******************************
+\******************************************************************************/
+
+#define gcvHAL_CLASS "galcore"
+#define IOCTL_GCHAL_INTERFACE 30000
+
+/******************************************************************************\
+********************* Command buffer information structure. ********************
+\******************************************************************************/
+
+typedef struct _gcsCOMMAND_BUFFER_INFO * gcsCOMMAND_BUFFER_INFO_PTR;
+typedef struct _gcsCOMMAND_BUFFER_INFO
+{
+ /* FE command buffer interrupt ID. */
+ gctINT32 feBufferInt;
+
+ /* TS overflow interrupt ID. */
+ gctINT32 tsOverflowInt;
+
+ /* Alignment and mask for the buffer address. */
+ gctUINT addressMask;
+ gctUINT32 addressAlignment;
+
+ /* Alignment for each command. */
+ gctUINT32 commandAlignment;
+
+ /* Number of bytes required by the STATE command. */
+ gctUINT32 stateCommandSize;
+
+ /* Number of bytes required by the RESTART command. */
+ gctUINT32 restartCommandSize;
+
+ /* Number of bytes required by the FETCH command. */
+ gctUINT32 fetchCommandSize;
+
+ /* Number of bytes required by the CALL command. */
+ gctUINT32 callCommandSize;
+
+ /* Number of bytes required by the RETURN command. */
+ gctUINT32 returnCommandSize;
+
+ /* Number of bytes required by the EVENT command. */
+ gctUINT32 eventCommandSize;
+
+ /* Number of bytes required by the END command. */
+ gctUINT32 endCommandSize;
+
+ /* Number of bytes reserved at the tail of a static command buffer. */
+ gctUINT32 staticTailSize;
+
+ /* Number of bytes reserved at the tail of a dynamic command buffer. */
+ gctUINT32 dynamicTailSize;
+}
+gcsCOMMAND_BUFFER_INFO;
+
+/******************************************************************************\
+******************************** Task Structures *******************************
+\******************************************************************************/
+
+typedef enum _gceTASK
+{
+ gcvTASK_LINK,
+ gcvTASK_CLUSTER,
+ gcvTASK_INCREMENT,
+ gcvTASK_DECREMENT,
+ gcvTASK_SIGNAL,
+ gcvTASK_LOCKDOWN,
+ gcvTASK_UNLOCK_VIDEO_MEMORY,
+ gcvTASK_FREE_VIDEO_MEMORY,
+ gcvTASK_FREE_CONTIGUOUS_MEMORY,
+}
+gceTASK;
+
+typedef struct _gcsTASK_HEADER * gcsTASK_HEADER_PTR;
+typedef struct _gcsTASK_HEADER
+{
+ /* Task ID. */
+ IN gceTASK id;
+}
+gcsTASK_HEADER;
+
+typedef struct _gcsTASK_LINK * gcsTASK_LINK_PTR;
+typedef struct _gcsTASK_LINK
+{
+ /* Task ID (gcvTASK_LINK). */
+ IN gceTASK id;
+
+ /* Pointer to the next task container. */
+ IN gctPOINTER cotainer;
+
+ /* Pointer to the next task from the next task container. */
+ IN gcsTASK_HEADER_PTR task;
+}
+gcsTASK_LINK;
+
+typedef struct _gcsTASK_CLUSTER * gcsTASK_CLUSTER_PTR;
+typedef struct _gcsTASK_CLUSTER
+{
+ /* Task ID (gcvTASK_CLUSTER). */
+ IN gceTASK id;
+
+ /* Number of tasks in the cluster. */
+ IN gctUINT taskCount;
+}
+gcsTASK_CLUSTER;
+
+typedef struct _gcsTASK_INCREMENT * gcsTASK_INCREMENT_PTR;
+typedef struct _gcsTASK_INCREMENT
+{
+ /* Task ID (gcvTASK_INCREMENT). */
+ IN gceTASK id;
+
+ /* Address of the variable to increment. */
+ IN gctUINT32 address;
+}
+gcsTASK_INCREMENT;
+
+typedef struct _gcsTASK_DECREMENT * gcsTASK_DECREMENT_PTR;
+typedef struct _gcsTASK_DECREMENT
+{
+ /* Task ID (gcvTASK_DECREMENT). */
+ IN gceTASK id;
+
+ /* Address of the variable to decrement. */
+ IN gctUINT32 address;
+}
+gcsTASK_DECREMENT;
+
+typedef struct _gcsTASK_SIGNAL * gcsTASK_SIGNAL_PTR;
+typedef struct _gcsTASK_SIGNAL
+{
+ /* Task ID (gcvTASK_SIGNAL). */
+ IN gceTASK id;
+
+ /* Process owning the signal. */
+ IN gctHANDLE process;
+
+ /* Signal handle to signal. */
+ IN gctSIGNAL signal;
+
+#if defined(__QNXNTO__)
+ IN gctINT32 coid;
+ IN gctINT32 rcvid;
+#endif
+}
+gcsTASK_SIGNAL;
+
+typedef struct _gcsTASK_LOCKDOWN * gcsTASK_LOCKDOWN_PTR;
+typedef struct _gcsTASK_LOCKDOWN
+{
+ /* Task ID (gcvTASK_LOCKDOWN). */
+ IN gceTASK id;
+
+ /* Address of the user space counter. */
+ IN gctUINT32 userCounter;
+
+ /* Address of the kernel space counter. */
+ IN gctUINT32 kernelCounter;
+
+ /* Process owning the signal. */
+ IN gctHANDLE process;
+
+ /* Signal handle to signal. */
+ IN gctSIGNAL signal;
+}
+gcsTASK_LOCKDOWN;
+
+typedef struct _gcsTASK_UNLOCK_VIDEO_MEMORY * gcsTASK_UNLOCK_VIDEO_MEMORY_PTR;
+typedef struct _gcsTASK_UNLOCK_VIDEO_MEMORY
+{
+ /* Task ID (gcvTASK_UNLOCK_VIDEO_MEMORY). */
+ IN gceTASK id;
+
+ /* Allocated video memory. */
+ IN gctUINT64 node;
+}
+gcsTASK_UNLOCK_VIDEO_MEMORY;
+
+typedef struct _gcsTASK_FREE_VIDEO_MEMORY * gcsTASK_FREE_VIDEO_MEMORY_PTR;
+typedef struct _gcsTASK_FREE_VIDEO_MEMORY
+{
+ /* Task ID (gcvTASK_FREE_VIDEO_MEMORY). */
+ IN gceTASK id;
+
+ /* Allocated video memory. */
+ IN gctUINT32 node;
+}
+gcsTASK_FREE_VIDEO_MEMORY;
+
+typedef struct _gcsTASK_FREE_CONTIGUOUS_MEMORY * gcsTASK_FREE_CONTIGUOUS_MEMORY_PTR;
+typedef struct _gcsTASK_FREE_CONTIGUOUS_MEMORY
+{
+ /* Task ID (gcvTASK_FREE_CONTIGUOUS_MEMORY). */
+ IN gceTASK id;
+
+ /* Number of bytes allocated. */
+ IN gctSIZE_T bytes;
+
+ /* Physical address of allocation. */
+ IN gctPHYS_ADDR physical;
+
+ /* Logical address of allocation. */
+ IN gctPOINTER logical;
+}
+gcsTASK_FREE_CONTIGUOUS_MEMORY;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_driver_h_ */
+
+
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..5f1bcf58aa95
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_drm.h
@@ -0,0 +1,195 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __VIVNATE_DRM_H__
+#define __VIVNATE_DRM_H__
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/* creation flag bits. */
+#define DRM_VIV_GEM_CONTIGUOUS (1u << 0)
+#define DRM_VIV_GEM_CACHED (1u << 1)
+#define DRM_VIV_GEM_SECURE (1u << 2)
+#define DRM_VIV_GEM_CMA_LIMIT (1u << 3)
+
+struct drm_viv_gem_create {
+ __u64 size;
+ __u32 flags;
+ __u32 handle;
+};
+
+struct drm_viv_gem_lock {
+ __u32 handle;
+ __u32 cacheable;
+ __u64 logical;
+};
+
+struct drm_viv_gem_unlock {
+ __u32 handle;
+};
+
+
+#define DRM_VIV_GEM_CLEAN_CACHE 0x01
+#define DRM_VIV_GEM_INVALIDATE_CACHE 0x02
+#define DRM_VIV_GEM_FLUSH_CACHE 0x03
+#define DRM_VIV_GEM_MEMORY_BARRIER 0x04
+
+struct drm_viv_gem_cache {
+ __u32 handle;
+ __u32 op;
+ __u64 logical;
+ __u64 bytes;
+};
+
+
+#define DRM_VIV_GEM_PARAM_POOL 0x00
+#define DRM_VIV_GEM_PARAM_SIZE 0x01
+
+struct drm_viv_gem_query {
+ __u32 handle;
+ __u32 param;
+ __u64 value;
+};
+
+
+struct drm_viv_gem_timestamp {
+ __u32 handle;
+ /* inc count, 0 for query current. */
+ __u32 inc;
+ /* output inc'ed timestamp. */
+ __u64 timestamp;
+};
+
+
+/* basic tiling mode. */
+#define DRM_VIV_GEM_TILING_LINEAR 0x01
+#define DRM_VIV_GEM_TILING_TILED 0x02
+#define DRM_VIV_GEM_TILING_SUPERTILED 0x04
+#define DRM_VIV_GEM_TILING_MINORTILED 0x08
+
+/* tiling mode modifiers. */
+#define DRM_VIV_GEM_TILING_SPLIT 0x10
+#define DRM_VIV_GEM_TILING_X_MAJOR 0x20
+#define DRM_VIV_GEM_TILING_Y_MAJOR 0x40
+#define DRM_VIV_GEM_TILING_SWAP 0x80
+
+/* ts mode. */
+#define DRM_VIV_GEM_TS_NONE 0x00
+#define DRM_VIV_GEM_TS_DISABLED 0x01
+#define DRM_VIV_GEM_TS_NORMAL 0x02
+#define DRM_VIV_GEM_TS_COMPRESSED 0x03
+
+struct drm_viv_gem_set_tiling {
+ __u32 handle;
+ __u32 tiling_mode;
+
+ __u32 ts_mode;
+ __u64 clear_value;
+};
+
+struct drm_viv_gem_get_tiling {
+ __u32 handle;
+ __u32 tiling_mode;
+
+ __u32 ts_mode;
+ __u64 clear_value;
+};
+
+
+struct drm_viv_gem_attach_aux {
+ __u32 handle;
+ __u32 ts_handle;
+};
+
+
+struct drm_viv_gem_ref_node {
+ __u32 handle;
+
+ /* output. */
+ __u32 node;
+ __u32 ts_node;
+};
+
+
+#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_QUERY 0x04
+#define DRM_VIV_GEM_TIMESTAMP 0x05
+#define DRM_VIV_GEM_SET_TILING 0x06
+#define DRM_VIV_GEM_GET_TILING 0x07
+#define DRM_VIV_GEM_ATTACH_AUX 0x08
+#define DRM_VIV_GEM_REF_NODE 0x09
+#define DRM_VIV_NUM_IOCTLS 0x0A
+
+#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_QUERY DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_QUERY, struct drm_viv_gem_query)
+#define DRM_IOCTL_VIV_GEM_TIMESTAMP DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_TIMESTAMP, struct drm_viv_gem_timestamp)
+#define DRM_IOCTL_VIV_GEM_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_SET_TILING, struct drm_viv_gem_set_tiling)
+#define DRM_IOCTL_VIV_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_GET_TILING, struct drm_viv_gem_get_tiling)
+#define DRM_IOCTL_VIV_GEM_ATTACH_AUX DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_ATTACH_AUX, struct drm_viv_gem_attach_aux)
+#define DRM_IOCTL_VIV_GEM_REF_NODE DRM_IOWR(DRM_COMMAND_BASE + DRM_VIV_GEM_REF_NODE, struct drm_viv_gem_ref_node)
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __VIVNATE_DRM_H__ */
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h
new file mode 100644
index 000000000000..b8b8c1b484e6
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_dump.h
@@ -0,0 +1,146 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_dump_h_
+#define __gc_hal_dump_h_
+
+/*
+ gcdDUMP_KEY
+
+ Set this to a string that appears in 'cat /proc/<pid>/cmdline'. E.g. 'camera'.
+ HAL will create dumps for the processes matching this key.
+*/
+#ifndef gcdDUMP_KEY
+# define gcdDUMP_KEY "process"
+#endif
+
+/*
+ gcdDUMP_PATH
+
+ The dump file location. Some processes cannot write to the sdcard.
+ Try apps' data dir, e.g. /data/data/com.android.launcher
+*/
+#ifndef gcdDUMP_PATH
+#if defined(ANDROID)
+# define gcdDUMP_PATH "/mnt/sdcard/"
+#else
+# define gcdDUMP_PATH "./"
+#endif
+#endif
+
+/*
+ gcdDUMP_FILE_IN_KERNEL
+
+ Default dump file for gcdDUMP_IN_KERNEL.
+ The file will be writen globally in kernel side.
+ Can be overwriten in runtime by debugfs:/gc/dump/dump_file
+
+ 2 pseudo files:
+ [dmesg]: means dump to kernel debug message.
+ [ignored]: means dump ignored, nothing will be dumpped.
+ */
+#ifndef gcdDUMP_FILE_IN_KERNEL
+# define gcdDUMP_FILE_IN_KERNEL "[dmesg]"
+#endif
+
+/*
+ gcdDUMP_VERIFY_PER_DRAW
+
+ Sub feature of gcdDUMP.
+ When set to 1, verify RT and images(if used) for every single draw to ease simulation debug.
+ Only valid for ES3 driver for now.
+*/
+#ifndef gcdDUMP_VERIFY_PER_DRAW
+# define gcdDUMP_VERIFY_PER_DRAW 0
+#endif
+
+/* Standalone dump features below. */
+
+/*
+ gcdDUMP_FRAMERATE
+ When set to a value other than zero, averaqe frame rate will be dumped.
+ The value set is the starting frame that the average will be calculated.
+ This is needed because sometimes first few frames are too slow to be included
+ in the average. Frame count starts from 1.
+*/
+#ifndef gcdDUMP_FRAMERATE
+# define gcdDUMP_FRAMERATE 0
+#endif
+
+
+/*
+ gcdDUMP_FRAME_TGA
+
+ When set to a value other than 0, a dump of the frame specified by the value,
+ will be done into frame.tga. Frame count starts from 1.
+ */
+#ifndef gcdDUMP_FRAME_TGA
+# define gcdDUMP_FRAME_TGA 0
+#endif
+
+/*
+ gcdDUMP_AHB_ACCESS
+
+ When set to 1, a dump of all AHB register access will be printed to kernel
+ message.
+*/
+#ifndef gcdDUMP_AHB_ACCESS
+# define gcdDUMP_AHB_ACCESS 0
+#endif
+
+#endif /* __gc_hal_dump_h_ */
+
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h
new file mode 100644
index 000000000000..5246100ecd6b
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform.h
@@ -0,0 +1,589 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_eglplatform_h_
+#define __gc_hal_eglplatform_h_
+
+#include "gc_hal_types.h"
+#include "gc_hal_base.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
+#ifndef WIN32_LEAN_AND_MEAN
+/* #define WIN32_LEAN_AND_MEAN 1 */
+#endif
+#include <windows.h>
+
+typedef HDC HALNativeDisplayType;
+typedef HWND HALNativeWindowType;
+typedef HBITMAP HALNativePixmapType;
+
+typedef struct __BITFIELDINFO
+{
+ BITMAPINFO bmi;
+ RGBQUAD bmiColors[2];
+}
+BITFIELDINFO;
+
+#elif /* defined(__APPLE__) || */ defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */
+
+#elif defined(WL_EGL_PLATFORM) || defined(EGL_API_WL) /* Wayland */
+
+#elif defined(__GBM__) /* GBM */
+
+#elif defined(__ANDROID__) || defined(ANDROID)
+
+#elif defined(MIR_EGL_PLATFORM) /* Mir */
+
+#elif defined(__QNXNTO__)
+
+#elif defined(__unix__) || defined(__APPLE__)
+
+#if defined(EGL_API_DFB)
+
+#elif defined(EGL_API_FB)
+
+#elif defined(EGL_API_NULLWS)
+
+
+#else
+
+/* X11 (tetative). */
+#endif
+
+#else
+#error "Platform not recognized"
+#endif
+
+#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
+
+#include "gc_hal_eglplatform_type.h"
+
+/*******************************************************************************
+** Display. ********************************************************************
+*/
+
+gceSTATUS
+gcoOS_GetDisplay(
+ OUT HALNativeDisplayType * Display,
+ IN gctPOINTER Context
+ );
+
+gceSTATUS
+gcoOS_GetDisplayByIndex(
+ IN gctINT DisplayIndex,
+ OUT HALNativeDisplayType * Display,
+ IN gctPOINTER Context
+ );
+
+gceSTATUS
+gcoOS_GetDisplayInfo(
+ IN HALNativeDisplayType Display,
+ OUT gctINT * Width,
+ OUT gctINT * Height,
+ OUT gctSIZE_T * Physical,
+ OUT gctINT * Stride,
+ OUT gctINT * BitsPerPixel
+ );
+
+
+
+gceSTATUS
+gcoOS_GetDisplayInfoEx(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gctUINT DisplayInfoSize,
+ OUT halDISPLAY_INFO * DisplayInfo
+ );
+
+gceSTATUS
+gcoOS_GetDisplayVirtual(
+ IN HALNativeDisplayType Display,
+ OUT gctINT * Width,
+ OUT gctINT * Height
+ );
+
+gceSTATUS
+gcoOS_GetDisplayBackbuffer(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ OUT gctPOINTER * context,
+ OUT gcoSURF * surface,
+ OUT gctUINT * Offset,
+ OUT gctINT * X,
+ OUT gctINT * Y
+ );
+
+gceSTATUS
+gcoOS_SetDisplayVirtual(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gctUINT Offset,
+ IN gctINT X,
+ IN gctINT Y
+ );
+
+gceSTATUS
+gcoOS_SetDisplayVirtualEx(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gctPOINTER Context,
+ IN gcoSURF Surface,
+ IN gctUINT Offset,
+ IN gctINT X,
+ IN gctINT Y
+ );
+
+gceSTATUS
+gcoOS_CancelDisplayBackbuffer(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gctPOINTER Context,
+ IN gcoSURF Surface,
+ IN gctUINT Offset,
+ IN gctINT X,
+ IN gctINT Y
+ );
+
+gceSTATUS
+gcoOS_SetSwapInterval(
+ IN HALNativeDisplayType Display,
+ IN gctINT Interval
+);
+
+gceSTATUS
+gcoOS_SetSwapIntervalEx(
+ IN HALNativeDisplayType Display,
+ IN gctINT Interval,
+ IN gctPOINTER localDisplay);
+
+gceSTATUS
+gcoOS_GetSwapInterval(
+ IN HALNativeDisplayType Display,
+ IN gctINT_PTR Min,
+ IN gctINT_PTR Max
+);
+
+gceSTATUS
+gcoOS_DisplayBufferRegions(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gctINT NumRects,
+ IN gctINT_PTR Rects
+ );
+
+gceSTATUS
+gcoOS_DestroyDisplay(
+ IN HALNativeDisplayType Display
+ );
+
+gceSTATUS
+gcoOS_InitLocalDisplayInfo(
+ IN HALNativeDisplayType Display,
+ IN OUT gctPOINTER * localDisplay
+ );
+
+gceSTATUS
+gcoOS_DeinitLocalDisplayInfo(
+ IN HALNativeDisplayType Display,
+ IN OUT gctPOINTER * localDisplay
+ );
+
+gceSTATUS
+gcoOS_GetDisplayInfoEx2(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gctPOINTER localDisplay,
+ IN gctUINT DisplayInfoSize,
+ OUT halDISPLAY_INFO * DisplayInfo
+ );
+
+gceSTATUS
+gcoOS_GetDisplayBackbufferEx(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gctPOINTER localDisplay,
+ OUT gctPOINTER * context,
+ OUT gcoSURF * surface,
+ OUT gctUINT * Offset,
+ OUT gctINT * X,
+ OUT gctINT * Y
+ );
+
+gceSTATUS
+gcoOS_IsValidDisplay(
+ IN HALNativeDisplayType Display
+ );
+
+gceSTATUS
+gcoOS_GetNativeVisualId(
+ IN HALNativeDisplayType Display,
+ OUT gctINT* nativeVisualId
+ );
+
+gctBOOL
+gcoOS_SynchronousFlip(
+ IN HALNativeDisplayType Display
+ );
+
+/*******************************************************************************
+** Windows. ********************************************************************
+*/
+
+gceSTATUS
+gcoOS_CreateWindow(
+ IN HALNativeDisplayType Display,
+ IN gctINT X,
+ IN gctINT Y,
+ IN gctINT Width,
+ IN gctINT Height,
+ OUT HALNativeWindowType * Window
+ );
+
+gceSTATUS
+gcoOS_GetWindowInfo(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ OUT gctINT * X,
+ OUT gctINT * Y,
+ OUT gctINT * Width,
+ OUT gctINT * Height,
+ OUT gctINT * BitsPerPixel,
+ OUT gctUINT * Offset
+ );
+
+gceSTATUS
+gcoOS_DestroyWindow(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window
+ );
+
+gceSTATUS
+gcoOS_DrawImage(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gctINT Left,
+ IN gctINT Top,
+ IN gctINT Right,
+ IN gctINT Bottom,
+ IN gctINT Width,
+ IN gctINT Height,
+ IN gctINT BitsPerPixel,
+ IN gctPOINTER Bits
+ );
+
+gceSTATUS
+gcoOS_GetImage(
+ IN HALNativeWindowType Window,
+ IN gctINT Left,
+ IN gctINT Top,
+ IN gctINT Right,
+ IN gctINT Bottom,
+ OUT gctINT * BitsPerPixel,
+ OUT gctPOINTER * Bits
+ );
+
+gceSTATUS
+gcoOS_GetWindowInfoEx(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ OUT gctINT * X,
+ OUT gctINT * Y,
+ OUT gctINT * Width,
+ OUT gctINT * Height,
+ OUT gctINT * BitsPerPixel,
+ OUT gctUINT * Offset,
+ OUT gceSURF_FORMAT * Format,
+ OUT gceSURF_TYPE * Type
+ );
+
+gceSTATUS
+gcoOS_DrawImageEx(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gctINT Left,
+ IN gctINT Top,
+ IN gctINT Right,
+ IN gctINT Bottom,
+ IN gctINT Width,
+ IN gctINT Height,
+ IN gctINT BitsPerPixel,
+ IN gctPOINTER Bits,
+ IN gceSURF_FORMAT Format
+ );
+
+/*
+ * Possiable types:
+ * gcvSURF_BITMAP
+ * gcvSURF_RENDER_TARGET
+ * gcvSURF_RENDER_TARGET_NO_COMPRESSION
+ * gcvSURF_RENDER_TARGET_NO_TILE_STATUS
+ */
+gceSTATUS
+gcoOS_SetWindowFormat(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gceSURF_TYPE Type,
+ IN gceSURF_FORMAT Format
+ );
+
+
+/*******************************************************************************
+** Pixmaps. ********************************************************************
+*/
+
+gceSTATUS
+gcoOS_CreatePixmap(
+ IN HALNativeDisplayType Display,
+ IN gctINT Width,
+ IN gctINT Height,
+ IN gctINT BitsPerPixel,
+ OUT HALNativePixmapType * Pixmap
+ );
+
+gceSTATUS
+gcoOS_GetPixmapInfo(
+ IN HALNativeDisplayType Display,
+ IN HALNativePixmapType Pixmap,
+ OUT gctINT * Width,
+ OUT gctINT * Height,
+ OUT gctINT * BitsPerPixel,
+ OUT gctINT * Stride,
+ OUT gctPOINTER * Bits
+ );
+
+gceSTATUS
+gcoOS_DrawPixmap(
+ IN HALNativeDisplayType Display,
+ IN HALNativePixmapType Pixmap,
+ IN gctINT Left,
+ IN gctINT Top,
+ IN gctINT Right,
+ IN gctINT Bottom,
+ IN gctINT Width,
+ IN gctINT Height,
+ IN gctINT BitsPerPixel,
+ IN gctPOINTER Bits
+ );
+
+gceSTATUS
+gcoOS_DestroyPixmap(
+ IN HALNativeDisplayType Display,
+ IN HALNativePixmapType Pixmap
+ );
+
+gceSTATUS
+gcoOS_GetPixmapInfoEx(
+ IN HALNativeDisplayType Display,
+ IN HALNativePixmapType Pixmap,
+ OUT gctINT * Width,
+ OUT gctINT * Height,
+ OUT gctINT * BitsPerPixel,
+ OUT gctINT * Stride,
+ OUT gctPOINTER * Bits,
+ OUT gceSURF_FORMAT * Format
+ );
+
+gceSTATUS
+gcoOS_CopyPixmapBits(
+ IN HALNativeDisplayType Display,
+ IN HALNativePixmapType Pixmap,
+ IN gctUINT DstWidth,
+ IN gctUINT DstHeight,
+ IN gctINT DstStride,
+ IN gceSURF_FORMAT DstFormat,
+ OUT gctPOINTER DstBits
+ );
+
+/*******************************************************************************
+** OS relative. ****************************************************************
+*/
+gceSTATUS
+gcoOS_LoadEGLLibrary(
+ OUT gctHANDLE * Handle
+ );
+
+gceSTATUS
+gcoOS_FreeEGLLibrary(
+ IN gctHANDLE Handle
+ );
+
+gceSTATUS
+gcoOS_ShowWindow(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window
+ );
+
+gceSTATUS
+gcoOS_HideWindow(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window
+ );
+
+gceSTATUS
+gcoOS_SetWindowTitle(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ IN gctCONST_STRING Title
+ );
+
+gceSTATUS
+gcoOS_CapturePointer(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window
+ );
+
+gceSTATUS
+gcoOS_GetEvent(
+ IN HALNativeDisplayType Display,
+ IN HALNativeWindowType Window,
+ OUT halEvent * Event
+ );
+
+gceSTATUS
+gcoOS_CreateClientBuffer(
+ IN gctINT Width,
+ IN gctINT Height,
+ IN gctINT Format,
+ IN gctINT Type,
+ OUT gctPOINTER * ClientBuffer
+ );
+
+gceSTATUS
+gcoOS_GetClientBufferInfo(
+ IN gctPOINTER ClientBuffer,
+ OUT gctINT * Width,
+ OUT gctINT * Height,
+ OUT gctINT * Stride,
+ OUT gctPOINTER * Bits
+ );
+
+gceSTATUS
+gcoOS_DestroyClientBuffer(
+ IN gctPOINTER ClientBuffer
+ );
+
+gceSTATUS
+gcoOS_DestroyContext(
+ IN gctPOINTER Display,
+ IN gctPOINTER Context
+ );
+
+gceSTATUS
+gcoOS_CreateContext(
+ IN gctPOINTER LocalDisplay,
+ IN gctPOINTER Context
+ );
+
+gceSTATUS
+gcoOS_MakeCurrent(
+ IN gctPOINTER LocalDisplay,
+ IN HALNativeWindowType DrawDrawable,
+ IN HALNativeWindowType ReadDrawable,
+ IN gctPOINTER Context,
+ IN gcoSURF ResolveTarget
+ );
+
+gceSTATUS
+gcoOS_CreateDrawable(
+ IN gctPOINTER LocalDisplay,
+ IN HALNativeWindowType Drawable
+ );
+
+gceSTATUS
+gcoOS_DestroyDrawable(
+ IN gctPOINTER LocalDisplay,
+ IN HALNativeWindowType Drawable
+ );
+gceSTATUS
+gcoOS_SwapBuffers(
+ IN gctPOINTER LocalDisplay,
+ IN HALNativeWindowType Drawable,
+ IN gcoSURF RenderTarget,
+ IN gcoSURF ResolveTarget,
+ IN gctPOINTER ResolveBits,
+ OUT gctUINT *Width,
+ OUT gctUINT *Height
+ );
+
+gceSTATUS
+gcoOS_ResizeWindow(
+ IN gctPOINTER localDisplay,
+ IN HALNativeWindowType Drawable,
+ IN gctUINT Width,
+ IN gctUINT Height
+ );
+
+gceSTATUS
+gcoOS_RSForSwap(
+ IN gctPOINTER localDisplay,
+ IN HALNativeWindowType Drawable,
+ IN gctPOINTER resolve
+ );
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_eglplatform_h_ */
+
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h
new file mode 100644
index 000000000000..22d2778f2270
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_eglplatform_type.h
@@ -0,0 +1,326 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_eglplatform_type_h_
+#define __gc_hal_eglplatform_type_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+** Events. *********************************************************************
+*/
+
+typedef enum _halEventType
+{
+ /* Keyboard event. */
+ HAL_KEYBOARD,
+
+ /* Mouse move event. */
+ HAL_POINTER,
+
+ /* Mouse button event. */
+ HAL_BUTTON,
+
+ /* Application close event. */
+ HAL_CLOSE,
+
+ /* Application window has been updated. */
+ HAL_WINDOW_UPDATE
+}
+halEventType;
+
+/* Scancodes for keyboard. */
+typedef enum _halKeys
+{
+ HAL_UNKNOWN = -1,
+
+ HAL_BACKSPACE = 0x08,
+ HAL_TAB,
+ HAL_ENTER = 0x0D,
+ HAL_ESCAPE = 0x1B,
+
+ HAL_SPACE = 0x20,
+ HAL_SINGLEQUOTE = 0x27,
+ HAL_PAD_ASTERISK = 0x2A,
+ HAL_COMMA = 0x2C,
+ HAL_HYPHEN,
+ HAL_PERIOD,
+ HAL_SLASH,
+ HAL_0,
+ HAL_1,
+ HAL_2,
+ HAL_3,
+ HAL_4,
+ HAL_5,
+ HAL_6,
+ HAL_7,
+ HAL_8,
+ HAL_9,
+ HAL_SEMICOLON = 0x3B,
+ HAL_EQUAL = 0x3D,
+ HAL_A = 0x41,
+ HAL_B,
+ HAL_C,
+ HAL_D,
+ HAL_E,
+ HAL_F,
+ HAL_G,
+ HAL_H,
+ HAL_I,
+ HAL_J,
+ HAL_K,
+ HAL_L,
+ HAL_M,
+ HAL_N,
+ HAL_O,
+ HAL_P,
+ HAL_Q,
+ HAL_R,
+ HAL_S,
+ HAL_T,
+ HAL_U,
+ HAL_V,
+ HAL_W,
+ HAL_X,
+ HAL_Y,
+ HAL_Z,
+ HAL_LBRACKET,
+ HAL_BACKSLASH,
+ HAL_RBRACKET,
+ HAL_BACKQUOTE = 0x60,
+
+ HAL_F1 = 0x80,
+ HAL_F2,
+ HAL_F3,
+ HAL_F4,
+ HAL_F5,
+ HAL_F6,
+ HAL_F7,
+ HAL_F8,
+ HAL_F9,
+ HAL_F10,
+ HAL_F11,
+ HAL_F12,
+
+ HAL_LCTRL,
+ HAL_RCTRL,
+ HAL_LSHIFT,
+ HAL_RSHIFT,
+ HAL_LALT,
+ HAL_RALT,
+ HAL_CAPSLOCK,
+ HAL_NUMLOCK,
+ HAL_SCROLLLOCK,
+ HAL_PAD_0,
+ HAL_PAD_1,
+ HAL_PAD_2,
+ HAL_PAD_3,
+ HAL_PAD_4,
+ HAL_PAD_5,
+ HAL_PAD_6,
+ HAL_PAD_7,
+ HAL_PAD_8,
+ HAL_PAD_9,
+ HAL_PAD_HYPHEN,
+ HAL_PAD_PLUS,
+ HAL_PAD_SLASH,
+ HAL_PAD_PERIOD,
+ HAL_PAD_ENTER,
+ HAL_SYSRQ,
+ HAL_PRNTSCRN,
+ HAL_BREAK,
+ HAL_UP,
+ HAL_LEFT,
+ HAL_RIGHT,
+ HAL_DOWN,
+ HAL_HOME,
+ HAL_END,
+ HAL_PGUP,
+ HAL_PGDN,
+ HAL_INSERT,
+ HAL_DELETE,
+ HAL_LWINDOW,
+ HAL_RWINDOW,
+ HAL_MENU,
+ HAL_POWER,
+ HAL_SLEEP,
+ HAL_WAKE
+}
+halKeys;
+
+/* Structure that defined keyboard mapping. */
+typedef struct _halKeyMap
+{
+ /* Normal key. */
+ halKeys normal;
+
+ /* Extended key. */
+ halKeys extended;
+}
+halKeyMap;
+
+/* Event structure. */
+typedef struct _halEvent
+{
+ /* Event type. */
+ halEventType type;
+
+ /* Event data union. */
+ union _halEventData
+ {
+ /* Event data for keyboard. */
+ struct _halKeyboard
+ {
+ /* Scancode. */
+ halKeys scancode;
+
+ /* ASCII characte of the key pressed. */
+ char key;
+
+ /* Flag whether the key was pressed (1) or released (0). */
+ char pressed;
+ }
+ keyboard;
+
+ /* Event data for pointer. */
+ struct _halPointer
+ {
+ /* Current pointer coordinate. */
+ int x;
+ int y;
+ }
+ pointer;
+
+ /* Event data for mouse buttons. */
+ struct _halButton
+ {
+ /* Left button state. */
+ int left;
+
+ /* Middle button state. */
+ int middle;
+
+ /* Right button state. */
+ int right;
+
+ /* Current pointer coordinate. */
+ int x;
+ int y;
+ }
+ button;
+ }
+ data;
+}
+halEvent;
+
+/* VFK_DISPLAY_INFO structure defining information returned by
+ vdkGetDisplayInfoEx. */
+typedef struct _halDISPLAY_INFO
+{
+ /* The size of the display in pixels. */
+ int width;
+ int height;
+
+ /* The stride of the dispay. -1 is returned if the stride is not known
+ ** for the specified display.*/
+ int stride;
+
+ /* The color depth of the display in bits per pixel. */
+ int bitsPerPixel;
+
+ /* The logical pointer to the display memory buffer. NULL is returned
+ ** if the pointer is not known for the specified display. */
+ void * logical;
+
+ /* The physical address of the display memory buffer. ~0 is returned
+ ** if the address is not known for the specified display. */
+ unsigned long physical;
+
+ /* Can be wraped as surface. */
+ int wrapFB;
+
+ /* FB_MULTI_BUFFER support */
+ int multiBuffer;
+ int backBufferY;
+
+ /* Tiled buffer / tile status support. */
+ int tiledBuffer;
+ int tileStatus;
+ int compression;
+
+ /* The color info of the display. */
+ unsigned int alphaLength;
+ unsigned int alphaOffset;
+ unsigned int redLength;
+ unsigned int redOffset;
+ unsigned int greenLength;
+ unsigned int greenOffset;
+ unsigned int blueLength;
+ unsigned int blueOffset;
+
+ /* Display flip support. */
+ int flip;
+}
+halDISPLAY_INFO;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_eglplatform_type_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
new file mode 100644
index 000000000000..3ff5fea61897
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine.h
@@ -0,0 +1,2987 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_engine_h_
+#define __gc_hal_engine_h_
+
+#include "gc_hal_types.h"
+#include "gc_hal_enum.h"
+
+
+#if gcdENABLE_3D && gcdENABLE_VG
+#include "gc_hal_engine_vg.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _gcsSURF_RESOLVE_ARGS
+{
+ gceHAL_ARG_VERSION version;
+
+ union _gcsSURF_RESOLVE_ARGS_UNION
+ {
+
+ struct _gcsSURF_RESOLVE_ARG_v2
+ {
+ gctBOOL yInverted;
+ gctBOOL directCopy;
+ gctBOOL resample;
+ gctBOOL bUploadTex; /* used for upload tex.*/
+ gctBOOL visualizeDepth; /* convert depth to visible color */
+ gcsPOINT srcOrigin;
+ gcsPOINT dstOrigin;
+ gcsPOINT rectSize;
+ gctUINT numSlices;
+ gceENGINE engine; /* 3DBlit engine */
+ gctBOOL gpuOnly; /* need only try HW path.*/
+
+ gctBOOL dump; /* need dump for verify */
+ gctBOOL srcSwizzle; /* src surface format swizzle infomation */
+ gctBOOL dstSwizzle; /* dst surface format swizzle infomation */
+ gctBOOL srcCompressed; /* src compressed format*/
+ gctBOOL dstCompressed; /* dst compressed format*/
+ } v2;
+ } uArgs;
+}
+gcsSURF_RESOLVE_ARGS;
+
+typedef struct _gscBUFFER_VIEW
+{
+ gctUINT32 cmd;
+}gcsBUFFER_VIEW, *gcsBUFFER_VIEW_PTR;
+
+typedef struct _gcsIMAGE_VIEW
+{
+ gctUINT32 cmd;
+}gcsIMAGE_VIEW, *gcsIMAGE_VIEW_PTR;
+
+#if gcdENABLE_3D
+/******************************************************************************\
+****************************** Object Declarations *****************************
+\******************************************************************************/
+
+typedef struct _gcoSTREAM * gcoSTREAM;
+typedef struct _gcoVERTEX * gcoVERTEX;
+typedef struct _gcoTEXTURE * gcoTEXTURE;
+typedef struct _gcoINDEX * gcoINDEX;
+typedef struct _gcsVERTEX_ATTRIBUTES * gcsVERTEX_ATTRIBUTES_PTR;
+typedef struct _gcoVERTEXARRAY * gcoVERTEXARRAY;
+typedef struct _gcoBUFOBJ * gcoBUFOBJ;
+
+#define gcdATTRIBUTE_COUNT 32
+#define gcdVERTEXARRAY_POOL_CAPACITY 32
+
+typedef enum _gcePROGRAM_STAGE
+{
+ gcvPROGRAM_STAGE_VERTEX = 0x0,
+ gcvPROGRAM_STAGE_TCS = 0x1,
+ gcvPROGRAM_STAGE_TES = 0x2,
+ gcvPROGRAM_STAGE_GEOMETRY = 0x3,
+ gcvPROGRAM_STAGE_FRAGMENT = 0x4,
+ gcvPROGRAM_STAGE_GRAPHICS_COUNT = 0x5,
+ gcvPROGRAM_STAGE_COMPUTE = 0x5,
+ gcvPROGRAM_STAGE_OPENCL = 0x6,
+ gcvPROGRAM_STAGE_LAST
+}
+gcePROGRAM_STAGE;
+
+typedef enum _gcePROGRAM_STAGE_BIT
+{
+ gcvPROGRAM_STAGE_VERTEX_BIT = 1 << gcvPROGRAM_STAGE_VERTEX,
+ gcvPROGRAM_STAGE_TCS_BIT = 1 << gcvPROGRAM_STAGE_TCS,
+ gcvPROGRAM_STAGE_TES_BIT = 1 << gcvPROGRAM_STAGE_TES,
+ gcvPROGRAM_STAGE_GEOMETRY_BIT = 1 << gcvPROGRAM_STAGE_GEOMETRY,
+ gcvPROGRAM_STAGE_FRAGMENT_BIT = 1 << gcvPROGRAM_STAGE_FRAGMENT,
+ gcvPROGRAM_STAGE_COMPUTE_BIT = 1 << gcvPROGRAM_STAGE_COMPUTE,
+ gcvPROGRAM_STAGE_OPENCL_BIT = 1 << gcvPROGRAM_STAGE_OPENCL,
+}
+gcePROGRAM_STAGE_BIT;
+
+
+#define gcvPORGRAM_STAGE_GPIPE (gcvPROGRAM_STAGE_VERTEX_BIT | \
+ gcvPROGRAM_STAGE_TCS_BIT | \
+ gcvPROGRAM_STAGE_TES_BIT | \
+ gcvPROGRAM_STAGE_GEOMETRY_BIT)
+
+/******************************************************************************\
+********************************* gcoHAL Object *********************************
+\******************************************************************************/
+
+gceSTATUS
+gcoHAL_QueryShaderCaps(
+ IN gcoHAL Hal,
+ OUT gctUINT * UnifiedUniforms,
+ OUT gctUINT * VertUniforms,
+ OUT gctUINT * FragUniforms,
+ OUT gctUINT * Varyings,
+ OUT gctUINT * ShaderCoreCount,
+ OUT gctUINT * ThreadCount,
+ OUT gctUINT * VertInstructionCount,
+ OUT gctUINT * FragInstructionCount
+ );
+
+gceSTATUS
+gcoHAL_QuerySamplerBase(
+ IN gcoHAL Hal,
+ OUT gctUINT32 * VertexCount,
+ OUT gctINT_PTR VertexBase,
+ OUT gctUINT32 * FragmentCount,
+ OUT gctINT_PTR FragmentBase
+ );
+
+gceSTATUS
+gcoHAL_QueryUniformBase(
+ IN gcoHAL Hal,
+ OUT gctUINT32 * VertexBase,
+ OUT gctUINT32 * FragmentBase
+ );
+
+gceSTATUS
+gcoHAL_QueryTextureCaps(
+ IN gcoHAL Hal,
+ OUT gctUINT * MaxWidth,
+ OUT gctUINT * MaxHeight,
+ OUT gctUINT * MaxDepth,
+ OUT gctBOOL * Cubic,
+ OUT gctBOOL * NonPowerOfTwo,
+ OUT gctUINT * VertexSamplers,
+ OUT gctUINT * PixelSamplers
+ );
+
+gceSTATUS
+gcoHAL_QueryTextureMaxAniso(
+ IN gcoHAL Hal,
+ OUT gctUINT * MaxAnisoValue
+ );
+
+gceSTATUS
+gcoHAL_QueryStreamCaps(
+ IN gcoHAL Hal,
+ OUT gctUINT32 * MaxAttributes,
+ OUT gctUINT32 * MaxStreamStride,
+ OUT gctUINT32 * NumberOfStreams,
+ OUT gctUINT32 * Alignment,
+ OUT gctUINT32 * MaxAttribOffset
+ );
+
+/******************************************************************************\
+********************************* gcoSURF Object ********************************
+\******************************************************************************/
+
+/*----------------------------------------------------------------------------*/
+/*--------------------------------- gcoSURF 3D --------------------------------*/
+typedef enum _gceBLIT_FLAG
+{
+ gcvBLIT_FLAG_SKIP_DEPTH_WRITE = 1 << 0,
+ gcvBLIT_FLAG_SKIP_STENCIL_WRITE = 1 << 1,
+} gceBLIT_FLAG;
+
+typedef struct _gcsSURF_BLIT_ARGS
+{
+ gcoSURF srcSurface;
+ gctINT srcX, srcY, srcZ;
+ gctINT srcWidth, srcHeight, srcDepth;
+ gcoSURF dstSurface;
+ gctINT dstX, dstY, dstZ;
+ gctINT dstWidth, dstHeight, dstDepth;
+ gctBOOL xReverse;
+ gctBOOL yReverse;
+ gctBOOL scissorTest;
+ gcsRECT scissor;
+ gctUINT flags;
+ gctUINT srcNumSlice, dstNumSlice;
+ gctBOOL needDecode;
+}
+gcsSURF_BLIT_ARGS;
+
+
+
+
+/* Clear flags. */
+typedef enum _gceCLEAR
+{
+ gcvCLEAR_COLOR = 0x1,
+ gcvCLEAR_DEPTH = 0x2,
+ gcvCLEAR_STENCIL = 0x4,
+ gcvCLEAR_HZ = 0x8,
+ gcvCLEAR_WITH_GPU_ONLY = 0x100,
+ gcvCLEAR_WITH_CPU_ONLY = 0x200,
+ gcvCLEAR_MULTI_SLICES = 0x400,
+}
+gceCLEAR;
+
+typedef struct _gcsSURF_CLEAR_ARGS
+{
+ /*
+ ** Color to fill the color portion of the framebuffer when clear
+ ** is called.
+ */
+ struct {
+ gcuVALUE r;
+ gcuVALUE g;
+ gcuVALUE b;
+ gcuVALUE a;
+ /* Color has multiple value type so we must specify it. */
+ gceVALUE_TYPE valueType;
+ } color;
+
+ gcuVALUE depth;
+ gctUINT stencil;
+
+ gctUINT8 stencilMask; /* stencil bit-wise mask */
+ gctBOOL depthMask; /* Depth Write Mask */
+ gctUINT8 colorMask; /* 4-bit channel Mask: ABGR:MSB->LSB */
+ gcsRECT_PTR clearRect; /* NULL means full clear */
+ gceCLEAR flags; /* clear flags */
+
+ gctUINT32 offset; /* Offset in surface to cube/array/3D, obsolete in v2 version */
+
+} gcsSURF_CLEAR_ARGS, *gcsSURF_CLEAR_ARGS_PTR;
+
+
+typedef struct _gscSURF_BLITDRAW_BLIT
+{
+ gcoSURF srcSurface;
+ gcoSURF dstSurface;
+ gcsRECT srcRect;
+ gcsRECT dstRect;
+ gceTEXTURE_FILTER filterMode;
+ gctBOOL xReverse;
+ gctBOOL yReverse;
+ gctBOOL scissorEnabled;
+ gcsRECT scissor;
+}gscSURF_BLITDRAW_BLIT;
+
+
+typedef enum _gceBLITDRAW_TYPE
+{
+ gcvBLITDRAW_CLEAR = 0,
+ gcvBLITDRAW_BLIT = 1,
+
+ /* last number, not a real type */
+ gcvBLITDRAW_NUM_TYPE
+ }
+gceBLITDRAW_TYPE;
+
+typedef enum _gceSPLIT_DRAW_TYPE
+{
+ gcvSPLIT_DRAW_UNKNOWN = 0x0,
+ gcvSPLIT_DRAW_1,
+ gcvSPLIT_DRAW_2,
+ gcvSPLIT_DRAW_3,
+ gcvSPLIT_DRAW_4,
+ gcvSPLIT_DRAW_XFB,
+ gcvSPLIT_DRAW_INDEX_FETCH,
+ gcvSPLIT_DRAW_TCS,
+ gcvSPLIT_DRAW_STIPPLE,
+ gcvSPLIT_DRAW_WIDE_LINE,
+ gcvSPLIT_DRAW_LAST
+}
+gceSPLIT_DRAW_TYPE;
+
+typedef gceSTATUS (* gctSPLIT_DRAW_FUNC_PTR)(
+ IN gctPOINTER gc,
+ IN gctPOINTER instantDraw,
+ IN gctPOINTER splitDrawInfo
+ );
+
+typedef struct _gcsSPLIT_DRAW_INFO
+{
+ gceSPLIT_DRAW_TYPE splitDrawType;
+ gctSPLIT_DRAW_FUNC_PTR splitDrawFunc;
+
+ union _gcsSPLIT_DRAW_UNION
+ {
+ /* This path will split many draw.*/
+ struct __gcsSPLIT_DRAW_INFO_TCS
+ {
+ gctPOINTER indexPtr;
+ gctUINT indexPerPatch;
+ }info_tcs;
+
+ /* This path split into two draw at most.
+ ** es11 path follow the old code, es30 path
+ ** add more info parameter to record
+ */
+ struct __gcsSPLIT_DRAW_INFO_INDEX_FETCH
+ {
+ gctSIZE_T instanceCount;
+ gctSIZE_T splitCount;
+ gcePRIMITIVE splitPrimMode;
+ gctSIZE_T splitPrimCount;
+ }info_index_fetch;
+ }u;
+} gcsSPLIT_DRAW_INFO,
+*gcsSPLIT_DRAW_INFO_PTR;
+
+typedef struct _gscSURF_BLITDRAW_ARGS
+{
+ /* always the fist member */
+ gceHAL_ARG_VERSION version;
+
+ union _gcsSURF_BLITDRAW_ARGS_UNION
+ {
+ struct _gscSURF_BLITDRAW_ARG_v1
+ {
+ /* Whether it's clear or blit operation, can be extended. */
+ gceBLITDRAW_TYPE type;
+
+ union _gscSURF_BLITDRAW_UNION
+ {
+ gscSURF_BLITDRAW_BLIT blit;
+
+ struct _gscSURF_BLITDRAW_CLEAR
+ {
+ gcsSURF_CLEAR_ARGS clearArgs;
+ gcoSURF rtSurface;
+ gcoSURF dsSurface;
+ } clear;
+ } u;
+ } v1;
+ } uArgs;
+}
+gcsSURF_BLITDRAW_ARGS;
+
+typedef struct _gcsSURF_BLITBLT_ARGS
+{
+ gctCONST_POINTER buf;
+ gceSURF_FORMAT format;
+ gctUINT32 stride;
+ gcoSURF dstSurf;
+ gcsPOINT dstOrigin;
+ gcsPOINT rectSize;
+ gctUINT32 dstOffset;
+}
+gcsSURF_BLITBLT_ARGS;
+
+
+/* CPU Blit with format (including linear <-> tile) conversion*/
+gceSTATUS
+gcoSURF_BlitCPU(
+ gcsSURF_BLIT_ARGS* args
+ );
+
+/* Copy a rectangular area with format conversion. */
+gceSTATUS
+gcoSURF_CopyPixels(
+ IN gcsSURF_VIEW *SrcView,
+ IN gcsSURF_VIEW *DstView,
+ IN gcsSURF_RESOLVE_ARGS *Args
+ );
+
+/* Clear surface function. */
+gceSTATUS
+gcoSURF_Clear(
+ IN gcsSURF_VIEW *SurfView,
+ IN gcsSURF_CLEAR_ARGS_PTR ClearArgs
+ );
+
+/* Preserve pixels from source. */
+gceSTATUS
+gcoSURF_Preserve(
+ IN gcoSURF SrcSurf,
+ IN gcoSURF DstSurf,
+ IN gcsRECT_PTR MaskRect
+ );
+
+/* TO BE REMOVED */
+gceSTATUS
+depr_gcoSURF_Resolve(
+ IN gcoSURF SrcSurface,
+ IN gcoSURF DestSurface,
+ IN gctUINT32 DestAddress,
+ IN gctPOINTER DestBits,
+ IN gctINT DestStride,
+ IN gceSURF_TYPE DestType,
+ IN gceSURF_FORMAT DestFormat,
+ IN gctUINT DestWidth,
+ IN gctUINT DestHeight
+ );
+
+gceSTATUS
+depr_gcoSURF_ResolveRect(
+ IN gcoSURF SrcSurface,
+ IN gcoSURF DstSurface,
+ IN gctUINT32 DstAddress,
+ IN gctPOINTER DstBits,
+ IN gctINT DstStride,
+ IN gceSURF_TYPE DstType,
+ IN gceSURF_FORMAT DstFormat,
+ IN gctUINT DstWidth,
+ IN gctUINT DstHeight,
+ IN gcsPOINT_PTR SrcOrigin,
+ IN gcsPOINT_PTR gcoSURF,
+ IN gcsPOINT_PTR RectSize
+ );
+
+/* Resample surface. */
+gceSTATUS
+gcoSURF_Resample(
+ IN gcoSURF SrcSurf,
+ IN gcoSURF DstSurf,
+ IN gctBOOL sRGBDecode
+ );
+
+/* Resolve rectangular area of a surface. */
+gceSTATUS
+gcoSURF_ResolveRect(
+ IN gcsSURF_VIEW *SrcView,
+ IN gcsSURF_VIEW *DstView,
+ IN gcsSURF_RESOLVE_ARGS *Args
+ );
+
+gceSTATUS
+gcoSURF_GetResolveAlignment(
+ IN gcoSURF Surface,
+ OUT gctUINT *originX,
+ OUT gctUINT *originY,
+ OUT gctUINT *sizeX,
+ OUT gctUINT *sizeY
+ );
+
+gceSTATUS
+gcoSURF_IsHWResolveable(
+ IN gcoSURF SrcSurf,
+ IN gcoSURF DstSurf,
+ IN gcsPOINT_PTR SrcOrigin,
+ IN gcsPOINT_PTR DstOrigin,
+ IN gcsPOINT_PTR RectSize
+ );
+
+/* Set surface resolvability. */
+gceSTATUS
+gcoSURF_SetResolvability(
+ IN gcoSURF Surface,
+ IN gctBOOL Resolvable
+ );
+
+gceSTATUS
+gcoSURF_IsRenderable(
+ IN gcoSURF Surface
+ );
+
+gceSTATUS
+gcoSURF_IsFormatRenderableAsRT(
+ IN gcoSURF Surface
+ );
+
+gceSTATUS
+gcoBUFOBJ_GetFence(
+ IN gcoBUFOBJ BufObj,
+ IN gceFENCE_TYPE Type
+ );
+
+gceSTATUS
+gcoBUFOBJ_WaitFence(
+ IN gcoBUFOBJ BufObj,
+ IN gceFENCE_TYPE Type
+ );
+
+gceSTATUS
+gcoBUFOBJ_IsFenceEnabled(
+ IN gcoBUFOBJ BufObj
+ );
+
+gceSTATUS
+gcoSURF_GetFence(
+ IN gcoSURF Surface,
+ IN gceFENCE_TYPE Type
+ );
+
+gceSTATUS
+gcoSURF_WaitFence(
+ IN gcoSURF Surface
+ );
+
+gceSTATUS
+gcoSTREAM_GetFence(
+ IN gcoSTREAM stream
+ );
+
+gceSTATUS
+gcoSTREAM_WaitFence(
+ IN gcoSTREAM stream
+ );
+
+gceSTATUS
+gcoINDEX_GetFence(
+ IN gcoINDEX Index
+ );
+
+gceSTATUS
+gcoINDEX_WaitFence(
+ IN gcoINDEX Index,
+ IN gceFENCE_TYPE Type
+ );
+
+gceSTATUS
+gcoSURF_DrawBlit(
+ gcsSURF_VIEW *SrcView,
+ gcsSURF_VIEW *DstView,
+ gscSURF_BLITDRAW_BLIT *Args
+ );
+
+
+/******************************************************************************\
+******************************** gcoINDEX Object *******************************
+\******************************************************************************/
+
+/* Construct a new gcoINDEX object. */
+gceSTATUS
+gcoINDEX_Construct(
+ IN gcoHAL Hal,
+ OUT gcoINDEX * Index
+ );
+
+/* Destroy a gcoINDEX object. */
+gceSTATUS
+gcoINDEX_Destroy(
+ IN gcoINDEX Index
+ );
+
+/* Lock index in memory. */
+gceSTATUS
+gcoINDEX_Lock(
+ IN gcoINDEX Index,
+ OUT gctUINT32 * Address,
+ OUT gctPOINTER * Memory
+ );
+
+/* Unlock index that was previously locked with gcoINDEX_Lock. */
+gceSTATUS
+gcoINDEX_Unlock(
+ IN gcoINDEX Index
+ );
+
+/* Upload index data into the memory. */
+gceSTATUS
+gcoINDEX_Load(
+ IN gcoINDEX Index,
+ IN gceINDEX_TYPE IndexType,
+ IN gctUINT32 IndexCount,
+ IN gctPOINTER IndexBuffer
+ );
+
+/* Bind an index object to the hardware. */
+gceSTATUS
+gcoINDEX_Bind(
+ IN gcoINDEX Index,
+ IN gceINDEX_TYPE Type
+ );
+
+/* Bind an index object to the hardware. */
+gceSTATUS
+gcoINDEX_BindOffset(
+ IN gcoINDEX Index,
+ IN gceINDEX_TYPE Type,
+ IN gctUINT32 Offset
+ );
+
+/* Free existing index buffer. */
+gceSTATUS
+gcoINDEX_Free(
+ IN gcoINDEX Index
+ );
+
+/* Upload data into an index buffer. */
+gceSTATUS
+gcoINDEX_Upload(
+ IN gcoINDEX Index,
+ IN gctCONST_POINTER Buffer,
+ IN gctSIZE_T Bytes
+ );
+
+/* Upload data into an index buffer starting at an offset. */
+gceSTATUS
+gcoINDEX_UploadOffset(
+ IN gcoINDEX Index,
+ IN gctSIZE_T Offset,
+ IN gctCONST_POINTER Buffer,
+ IN gctSIZE_T Bytes
+ );
+
+/*Merge index2 to index1 from 0, index2 must subset of inex1*/
+gceSTATUS
+gcoINDEX_Merge(
+ IN gcoINDEX Index1,
+ IN gcoINDEX Index2
+ );
+
+/*check if index buffer is enough for this draw*/
+gctBOOL
+gcoINDEX_CheckRange(
+ IN gcoINDEX Index,
+ IN gceINDEX_TYPE Type,
+ IN gctINT Count,
+ IN gctUINT32 Indices
+ );
+
+/* Query the index capabilities. */
+gceSTATUS
+gcoINDEX_QueryCaps(
+ OUT gctBOOL * Index8,
+ OUT gctBOOL * Index16,
+ OUT gctBOOL * Index32,
+ OUT gctUINT * MaxIndex
+ );
+
+/* Determine the index range in the current index buffer. */
+gceSTATUS
+gcoINDEX_GetIndexRange(
+ IN gcoINDEX Index,
+ IN gceINDEX_TYPE Type,
+ IN gctSIZE_T Offset,
+ IN gctUINT32 Count,
+ OUT gctUINT32 * MinimumIndex,
+ OUT gctUINT32 * MaximumIndex
+ );
+
+/* Dynamic buffer management. */
+gceSTATUS
+gcoINDEX_SetDynamic(
+ IN gcoINDEX Index,
+ IN gctSIZE_T Bytes,
+ IN gctUINT Buffers
+ );
+
+gceSTATUS
+gcoCLHardware_Construct(void);
+/******************************************************************************\
+********************************** gco3D Object *********************************
+\******************************************************************************/
+
+/* Blending targets. */
+typedef enum _gceBLEND_UNIT
+{
+ gcvBLEND_SOURCE,
+ gcvBLEND_TARGET,
+}
+gceBLEND_UNIT;
+
+/* Construct a new gco3D object. */
+gceSTATUS
+gco3D_Construct(
+ IN gcoHAL Hal,
+ IN gctBOOL Robust,
+ OUT gco3D * Engine
+ );
+
+/* Destroy an gco3D object. */
+gceSTATUS
+gco3D_Destroy(
+ IN gco3D Engine
+ );
+
+/* Set 3D API type. */
+gceSTATUS
+gco3D_SetAPI(
+ IN gco3D Engine,
+ IN gceAPI ApiType
+ );
+
+/* Get 3D API type. */
+gceSTATUS
+gco3D_GetAPI(
+ IN gco3D Engine,
+ OUT gceAPI * ApiType
+ );
+
+gceSTATUS
+gco3D_SetTarget(
+ IN gco3D Engine,
+ IN gctUINT32 TargetIndex,
+ IN gcsSURF_VIEW *SurfView,
+ IN gctUINT32 LayerIndex
+ );
+
+gceSTATUS
+gco3D_UnsetTarget(
+ IN gco3D Engine,
+ IN gctUINT32 TargetIndex,
+ IN gcoSURF Surface
+ );
+
+gceSTATUS
+gco3D_SetPSOutputMapping(
+ IN gco3D Engine,
+ IN gctINT32 * psOutputMapping
+ );
+
+gceSTATUS
+gco3D_SetRenderLayered(
+ IN gco3D Engine,
+ IN gctBOOL Enable,
+ IN gctUINT MaxLayers
+ );
+
+gceSTATUS
+gco3D_SetShaderLayered(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gco3D_IsProgramSwitched(
+ IN gco3D Engine
+ );
+
+/* Set depth buffer. */
+gceSTATUS
+gco3D_SetDepth(
+ IN gco3D Engine,
+ IN gcsSURF_VIEW *SurfView
+ );
+
+/* Unset depth buffer. */
+gceSTATUS
+gco3D_UnsetDepth(
+ IN gco3D Engine,
+ IN gcoSURF Surface
+ );
+
+/* Set viewport. */
+gceSTATUS
+gco3D_SetViewport(
+ IN gco3D Engine,
+ IN gctINT32 Left,
+ IN gctINT32 Top,
+ IN gctINT32 Right,
+ IN gctINT32 Bottom
+ );
+
+/* Set scissors. */
+gceSTATUS
+gco3D_SetScissors(
+ IN gco3D Engine,
+ IN gctINT32 Left,
+ IN gctINT32 Top,
+ IN gctINT32 Right,
+ IN gctINT32 Bottom
+ );
+
+/* Set clear color. */
+gceSTATUS
+gco3D_SetClearColor(
+ IN gco3D Engine,
+ IN gctUINT8 Red,
+ IN gctUINT8 Green,
+ IN gctUINT8 Blue,
+ IN gctUINT8 Alpha
+ );
+
+/* Set fixed point clear color. */
+gceSTATUS
+gco3D_SetClearColorX(
+ IN gco3D Engine,
+ IN gctFIXED_POINT Red,
+ IN gctFIXED_POINT Green,
+ IN gctFIXED_POINT Blue,
+ IN gctFIXED_POINT Alpha
+ );
+
+/* Set floating point clear color. */
+gceSTATUS
+gco3D_SetClearColorF(
+ IN gco3D Engine,
+ IN gctFLOAT Red,
+ IN gctFLOAT Green,
+ IN gctFLOAT Blue,
+ IN gctFLOAT Alpha
+ );
+
+/* Set fixed point clear depth. */
+gceSTATUS
+gco3D_SetClearDepthX(
+ IN gco3D Engine,
+ IN gctFIXED_POINT Depth
+ );
+
+/* Set floating point clear depth. */
+gceSTATUS
+gco3D_SetClearDepthF(
+ IN gco3D Engine,
+ IN gctFLOAT Depth
+ );
+
+/* Set clear stencil. */
+gceSTATUS
+gco3D_SetClearStencil(
+ IN gco3D Engine,
+ IN gctUINT32 Stencil
+ );
+
+/* Set shading mode. */
+gceSTATUS
+gco3D_SetShading(
+ IN gco3D Engine,
+ IN gceSHADING Shading
+ );
+
+/* Set blending mode. */
+gceSTATUS
+gco3D_EnableBlending(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+/* Set blending function. */
+gceSTATUS
+gco3D_SetBlendFunction(
+ IN gco3D Engine,
+ IN gceBLEND_UNIT Unit,
+ IN gceBLEND_FUNCTION FunctionRGB,
+ IN gceBLEND_FUNCTION FunctionAlpha
+ );
+
+/* Set blending mode. */
+gceSTATUS
+gco3D_SetBlendMode(
+ IN gco3D Engine,
+ IN gceBLEND_MODE ModeRGB,
+ IN gceBLEND_MODE ModeAlpha
+ );
+
+/* Set blending mode for separate rt control */
+gceSTATUS
+gco3D_EnableBlendingIndexed(
+ IN gco3D Engine,
+ IN gctUINT Index,
+ IN gctBOOL Enable
+ );
+
+/* Set blending function for separate rt control */
+gceSTATUS
+gco3D_SetBlendFunctionIndexed(
+ IN gco3D Engine,
+ IN gctUINT Index,
+ IN gceBLEND_UNIT Unit,
+ IN gceBLEND_FUNCTION FunctionRGB,
+ IN gceBLEND_FUNCTION FunctionAlpha
+ );
+
+/* Set blending mode for separate rt control*/
+gceSTATUS
+gco3D_SetBlendModeIndexed(
+ IN gco3D Engine,
+ IN gctUINT Index,
+ IN gceBLEND_MODE ModeRGB,
+ IN gceBLEND_MODE ModeAlpha
+ );
+
+/* Set blending color. */
+gceSTATUS
+gco3D_SetBlendColor(
+ IN gco3D Engine,
+ IN gctUINT Red,
+ IN gctUINT Green,
+ IN gctUINT Blue,
+ IN gctUINT Alpha
+ );
+
+/* Set fixed point blending color. */
+gceSTATUS
+gco3D_SetBlendColorX(
+ IN gco3D Engine,
+ IN gctFIXED_POINT Red,
+ IN gctFIXED_POINT Green,
+ IN gctFIXED_POINT Blue,
+ IN gctFIXED_POINT Alpha
+ );
+
+/* Set floating point blending color. */
+gceSTATUS
+gco3D_SetBlendColorF(
+ IN gco3D Engine,
+ IN gctFLOAT Red,
+ IN gctFLOAT Green,
+ IN gctFLOAT Blue,
+ IN gctFLOAT Alpha
+ );
+
+/* Set culling mode. */
+gceSTATUS
+gco3D_SetCulling(
+ IN gco3D Engine,
+ IN gceCULL Mode
+ );
+
+/* Enable point size */
+gceSTATUS
+gco3D_SetPointSizeEnable(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+/* Set point sprite */
+gceSTATUS
+gco3D_SetPointSprite(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+
+/* Enable/Disable primitive-id. */
+gceSTATUS
+gco3D_SetPrimitiveIdEnable(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+/* Set fill mode. */
+gceSTATUS
+gco3D_SetFill(
+ IN gco3D Engine,
+ IN gceFILL Mode
+ );
+
+/* Set depth compare mode. */
+gceSTATUS
+gco3D_SetDepthCompare(
+ IN gco3D Engine,
+ IN gceCOMPARE Compare
+ );
+
+/* Enable depth writing. */
+gceSTATUS
+gco3D_EnableDepthWrite(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+/* Set depth mode. */
+gceSTATUS
+gco3D_SetDepthMode(
+ IN gco3D Engine,
+ IN gceDEPTH_MODE Mode
+ );
+
+/* Set depth range. */
+gceSTATUS
+gco3D_SetDepthRangeX(
+ IN gco3D Engine,
+ IN gceDEPTH_MODE Mode,
+ IN gctFIXED_POINT Near,
+ IN gctFIXED_POINT Far
+ );
+
+/* Set depth range. */
+gceSTATUS
+gco3D_SetDepthRangeF(
+ IN gco3D Engine,
+ IN gceDEPTH_MODE Mode,
+ IN gctFLOAT Near,
+ IN gctFLOAT Far
+ );
+
+/* Set last pixel enable */
+gceSTATUS
+gco3D_SetLastPixelEnable(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+/* Set depth Bias and Scale */
+gceSTATUS
+gco3D_SetDepthScaleBiasX(
+ IN gco3D Engine,
+ IN gctFIXED_POINT DepthScale,
+ IN gctFIXED_POINT DepthBias
+ );
+
+gceSTATUS
+gco3D_SetDepthScaleBiasF(
+ IN gco3D Engine,
+ IN gctFLOAT DepthScale,
+ IN gctFLOAT DepthBias
+ );
+
+/* Set depth near and far clipping plane. */
+gceSTATUS
+gco3D_SetDepthPlaneF(
+ IN gco3D Engine,
+ IN gctFLOAT Near,
+ IN gctFLOAT Far
+ );
+
+/* Enable or disable dithering. */
+gceSTATUS
+gco3D_EnableDither(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+/* Set color write enable bits. */
+gceSTATUS
+gco3D_SetColorWrite(
+ IN gco3D Engine,
+ IN gctUINT8 Enable
+ );
+
+/* Set color write enable bits for separate rt control */
+gceSTATUS
+gco3D_SetColorWriteIndexed(
+ IN gco3D Engine,
+ IN gctUINT Index,
+ IN gctUINT8 Enable
+ );
+
+/* Enable or disable early depth. */
+gceSTATUS
+gco3D_SetEarlyDepth(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+/* Deprecated: Enable or disable all early depth operations. */
+gceSTATUS
+gco3D_SetAllEarlyDepthModes(
+ IN gco3D Engine,
+ IN gctBOOL Disable
+ );
+
+
+gceSTATUS
+gco3D_SetEarlyDepthFromAPP(
+ IN gco3D Engine,
+ IN gctBOOL EarlyDepthFromAPP
+ );
+
+gceSTATUS
+gco3D_SetRADepthWrite(
+ IN gco3D Engine,
+ IN gctBOOL Disable,
+ IN gctBOOL psReadZ,
+ IN gctBOOL psReadW
+ );
+
+gceSTATUS
+gco3D_SetPatchVertices(
+ IN gco3D Engine,
+ IN gctINT PatchVertices
+ );
+
+
+/* Switch dynamic early mode */
+gceSTATUS
+gco3D_SwitchDynamicEarlyDepthMode(
+ IN gco3D Engine
+ );
+
+/* Set dynamic early mode */
+gceSTATUS
+gco3D_DisableDynamicEarlyDepthMode(
+ IN gco3D Engine,
+ IN gctBOOL Disable
+ );
+
+/* Enable or disable depth-only mode. */
+gceSTATUS
+gco3D_SetDepthOnly(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+typedef struct _gcsSTENCIL_INFO * gcsSTENCIL_INFO_PTR;
+typedef struct _gcsSTENCIL_INFO
+{
+ gceSTENCIL_MODE mode;
+
+ gctUINT8 maskFront;
+ gctUINT8 maskBack;
+ gctUINT8 writeMaskFront;
+ gctUINT8 writeMaskBack;
+
+ gctUINT8 referenceFront;
+
+ gceCOMPARE compareFront;
+ gceSTENCIL_OPERATION passFront;
+ gceSTENCIL_OPERATION failFront;
+ gceSTENCIL_OPERATION depthFailFront;
+
+ gctUINT8 referenceBack;
+ gceCOMPARE compareBack;
+ gceSTENCIL_OPERATION passBack;
+ gceSTENCIL_OPERATION failBack;
+ gceSTENCIL_OPERATION depthFailBack;
+}
+gcsSTENCIL_INFO;
+
+/* Set stencil mode. */
+gceSTATUS
+gco3D_SetStencilMode(
+ IN gco3D Engine,
+ IN gceSTENCIL_MODE Mode
+ );
+
+/* Set stencil mask. */
+gceSTATUS
+gco3D_SetStencilMask(
+ IN gco3D Engine,
+ IN gctUINT8 Mask
+ );
+
+/* Set stencil back mask. */
+gceSTATUS
+gco3D_SetStencilMaskBack(
+ IN gco3D Engine,
+ IN gctUINT8 Mask
+ );
+
+/* Set stencil write mask. */
+gceSTATUS
+gco3D_SetStencilWriteMask(
+ IN gco3D Engine,
+ IN gctUINT8 Mask
+ );
+
+/* Set stencil back write mask. */
+gceSTATUS
+gco3D_SetStencilWriteMaskBack(
+ IN gco3D Engine,
+ IN gctUINT8 Mask
+ );
+
+/* Set stencil reference. */
+gceSTATUS
+gco3D_SetStencilReference(
+ IN gco3D Engine,
+ IN gctUINT8 Reference,
+ IN gctBOOL Front
+ );
+
+/* Set stencil compare. */
+gceSTATUS
+gco3D_SetStencilCompare(
+ IN gco3D Engine,
+ IN gceSTENCIL_WHERE Where,
+ IN gceCOMPARE Compare
+ );
+
+/* Set stencil operation on pass. */
+gceSTATUS
+gco3D_SetStencilPass(
+ IN gco3D Engine,
+ IN gceSTENCIL_WHERE Where,
+ IN gceSTENCIL_OPERATION Operation
+ );
+
+/* Set stencil operation on fail. */
+gceSTATUS
+gco3D_SetStencilFail(
+ IN gco3D Engine,
+ IN gceSTENCIL_WHERE Where,
+ IN gceSTENCIL_OPERATION Operation
+ );
+
+/* Set stencil operation on depth fail. */
+gceSTATUS
+gco3D_SetStencilDepthFail(
+ IN gco3D Engine,
+ IN gceSTENCIL_WHERE Where,
+ IN gceSTENCIL_OPERATION Operation
+ );
+
+/* Set all stencil states in one blow. */
+gceSTATUS
+gco3D_SetStencilAll(
+ IN gco3D Engine,
+ IN gcsSTENCIL_INFO_PTR Info
+ );
+
+typedef struct _gcsALPHA_INFO * gcsALPHA_INFO_PTR;
+typedef struct _gcsALPHA_INFO
+{
+ /* Alpha test states. */
+ gctBOOL test;
+ gceCOMPARE compare;
+ gctUINT8 reference;
+ gctFLOAT floatReference;
+
+ /* Alpha blending states. */
+ gctBOOL blend[gcdMAX_DRAW_BUFFERS];
+
+ gceBLEND_FUNCTION srcFuncColor[gcdMAX_DRAW_BUFFERS];
+ gceBLEND_FUNCTION srcFuncAlpha[gcdMAX_DRAW_BUFFERS];
+ gceBLEND_FUNCTION trgFuncColor[gcdMAX_DRAW_BUFFERS];
+ gceBLEND_FUNCTION trgFuncAlpha[gcdMAX_DRAW_BUFFERS];
+
+ gceBLEND_MODE modeColor[gcdMAX_DRAW_BUFFERS];
+ gceBLEND_MODE modeAlpha[gcdMAX_DRAW_BUFFERS];
+
+ gctUINT32 color;
+
+ gctBOOL anyBlendEnabled;
+}
+gcsALPHA_INFO;
+
+
+/* Enable or disable alpha test. */
+gceSTATUS
+gco3D_SetAlphaTest(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+/* Set alpha test compare. */
+gceSTATUS
+gco3D_SetAlphaCompare(
+ IN gco3D Engine,
+ IN gceCOMPARE Compare
+ );
+
+/* Set alpha test reference in unsigned integer. */
+gceSTATUS
+gco3D_SetAlphaReference(
+ IN gco3D Engine,
+ IN gctUINT8 Reference,
+ IN gctFLOAT FloatReference
+ );
+
+/* Set alpha test reference in fixed point. */
+gceSTATUS
+gco3D_SetAlphaReferenceX(
+ IN gco3D Engine,
+ IN gctFIXED_POINT Reference
+ );
+
+/* Set alpha test reference in floating point. */
+gceSTATUS
+gco3D_SetAlphaReferenceF(
+ IN gco3D Engine,
+ IN gctFLOAT Reference
+ );
+
+#if gcdALPHA_KILL_IN_SHADER
+gceSTATUS
+gco3D_SetAlphaKill(
+ IN gco3D Engine,
+ IN gctBOOL AlphaKill,
+ IN gctBOOL ColorKill
+ );
+#endif
+
+/* Enable/Disable anti-alias line. */
+gceSTATUS
+gco3D_SetAntiAliasLine(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+/* Set texture slot for anti-alias line. */
+gceSTATUS
+gco3D_SetAALineTexSlot(
+ IN gco3D Engine,
+ IN gctUINT TexSlot
+ );
+
+/* Set anti-alias line width scale. */
+gceSTATUS
+gco3D_SetAALineWidth(
+ IN gco3D Engine,
+ IN gctFLOAT Width
+ );
+
+/* Draw a number of primitives. */
+gceSTATUS
+gco3D_DrawPrimitives(
+ IN gco3D Engine,
+ IN gcePRIMITIVE Type,
+ IN gctSIZE_T StartVertex,
+ IN gctSIZE_T PrimitiveCount
+ );
+
+gceSTATUS
+gco3D_DrawIndirectPrimitives(
+ IN gco3D Engine,
+ IN gcePRIMITIVE Type,
+ IN gctBOOL DrawIndex,
+ IN gctINT BaseOffset,
+ IN gcoBUFOBJ BufObj
+ );
+
+gceSTATUS
+gco3D_MultiDrawIndirectPrimitives(
+ IN gco3D Engine,
+ IN gcePRIMITIVE Type,
+ IN gctBOOL DrawIndex,
+ IN gctINT BaseOffset,
+ IN gctINT DrawCount,
+ IN gctINT Stride,
+ IN gcoBUFOBJ BufObj
+ );
+
+gceSTATUS
+gco3D_DrawInstancedPrimitives(
+ IN gco3D Engine,
+ IN gcePRIMITIVE Type,
+ IN gctBOOL DrawIndex,
+ IN gctINT StartVertex,
+ IN gctSIZE_T StartIndex,
+ IN gctSIZE_T PrimitiveCount,
+ IN gctSIZE_T VertexCount,
+ IN gctSIZE_T InstanceCount
+ );
+
+gceSTATUS
+gco3D_DrawNullPrimitives(
+ IN gco3D Engine
+ );
+
+gceSTATUS
+gco3D_DrawPrimitivesCount(
+ IN gco3D Engine,
+ IN gcePRIMITIVE Type,
+ IN gctINT* StartVertex,
+ IN gctSIZE_T* VertexCount,
+ IN gctSIZE_T PrimitiveCount
+ );
+
+
+/* Draw a number of primitives using offsets. */
+gceSTATUS
+gco3D_DrawPrimitivesOffset(
+ IN gco3D Engine,
+ IN gcePRIMITIVE Type,
+ IN gctINT32 StartOffset,
+ IN gctSIZE_T PrimitiveCount
+ );
+
+/* Draw a number of indexed primitives. */
+gceSTATUS
+gco3D_DrawIndexedPrimitives(
+ IN gco3D Engine,
+ IN gcePRIMITIVE Type,
+ IN gctSIZE_T BaseVertex,
+ IN gctSIZE_T StartIndex,
+ IN gctSIZE_T PrimitiveCount
+ );
+
+/* Draw a number of indexed primitives using offsets. */
+gceSTATUS
+gco3D_DrawIndexedPrimitivesOffset(
+ IN gco3D Engine,
+ IN gcePRIMITIVE Type,
+ IN gctINT32 BaseOffset,
+ IN gctINT32 StartOffset,
+ IN gctSIZE_T PrimitiveCount
+ );
+
+/* Draw a element from pattern */
+gceSTATUS
+gco3D_DrawPattern(
+ IN gco3D Engine,
+ IN gcsFAST_FLUSH_PTR FastFlushInfo
+ );
+
+/* Enable or disable anti-aliasing. */
+gceSTATUS
+gco3D_SetAntiAlias(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+/* Set msaa samples */
+gceSTATUS
+gco3D_SetSamples(
+ IN gco3D Engine,
+ IN gctUINT32 Samples
+ );
+
+
+/* Write data into the command buffer. */
+gceSTATUS
+gco3D_WriteBuffer(
+ IN gco3D Engine,
+ IN gctCONST_POINTER Data,
+ IN gctSIZE_T Bytes,
+ IN gctBOOL Aligned
+ );
+
+/* Send sempahore and stall until sempahore is signalled. */
+gceSTATUS
+gco3D_Semaphore(
+ IN gco3D Engine,
+ IN gceWHERE From,
+ IN gceWHERE To,
+ IN gceHOW How);
+
+
+/* Explicitly flush shader L1 cache */
+gceSTATUS
+gco3D_FlushSHL1Cache(
+ IN gco3D Engine
+ );
+
+/* Set the subpixels center. */
+gceSTATUS
+gco3D_SetCentroids(
+ IN gco3D Engine,
+ IN gctUINT32 Index,
+ IN gctPOINTER Centroids
+ );
+
+/* query msaa sample coordinates */
+gceSTATUS
+gco3D_GetSampleCoords(
+ IN gco3D Engine,
+ IN gctUINT32 SampleIndex,
+ IN gctBOOL yInverted,
+ OUT gctFLOAT_PTR Coords
+ );
+
+gceSTATUS
+gco3D_SetLogicOp(
+ IN gco3D Engine,
+ IN gctUINT8 Rop
+ );
+
+typedef enum _gceXfbCmd
+{
+ gcvXFBCMD_BEGIN = 0,
+ gcvXFBCMD_PAUSE = 1,
+ gcvXFBCMD_RESUME = 2,
+ gcvXFBCMD_END = 3,
+ gcvXFBCMD_PAUSE_INCOMMIT = 4,
+ gcvXFBCMD_RESUME_INCOMMIT = 5,
+ gcvXFBCMD_INVALID = 6,
+}
+gceXfbCmd;
+
+typedef enum _gceXfbStatus
+{
+ gcvXFB_Disabled = 0,
+ gcvXFB_Paused,
+ gcvXFB_Enabled,
+}
+gceXfbStatus;
+
+typedef enum _gceQueryStatus
+{
+ gcvQUERY_Disabled = 0,
+ gcvQUERY_Paused = 1,
+ gcvQUERY_Enabled = 2,
+}
+gceQueryStatus;
+
+typedef enum _gceQueryCmd
+{
+ gcvQUERYCMD_BEGIN = 0,
+ gcvQUERYCMD_PAUSE = 1,
+ gcvQUERYCMD_RESUME = 2,
+ gcvQUERYCMD_END = 3,
+ gcvQUERYCMD_INVALID = 4,
+}
+gceQueryCmd;
+
+typedef enum _gceQueryType
+{
+ gcvQUERY_OCCLUSION = 0,
+ gcvQUERY_XFB_WRITTEN = 1,
+ gcvQUERY_PRIM_GENERATED = 2,
+ gcvQUERY_MAX_NUM = 3,
+}
+gceQueryType;
+
+gceSTATUS
+gco3D_SetQuery(
+ IN gco3D Engine,
+ IN gctUINT32 QueryHeader,
+ IN gceQueryType Type,
+ IN gctBOOL Enable,
+ IN gctUINT32 Index
+ );
+
+gceSTATUS
+gco3D_GetQuery(
+ IN gco3D Engine,
+ IN gceQueryType Type,
+ IN gcsSURF_NODE_PTR Node,
+ IN gctUINT32 Size,
+ IN gctPOINTER Locked,
+ OUT gctINT32 * Index
+ );
+
+gceSTATUS
+gco3D_SetXfbHeader(
+ IN gco3D Engine,
+ IN gctUINT32 Physical
+ );
+
+gceSTATUS
+gco3D_SetXfbBuffer(
+ IN gco3D Engine,
+ IN gctUINT32 Index,
+ IN gctUINT32 BufferAddr,
+ IN gctUINT32 BufferStride,
+ IN gctUINT32 BufferSize
+ );
+
+gceSTATUS
+gco3D_SetXfbCmd(
+ IN gco3D Engine,
+ IN gceXfbCmd Cmd
+ );
+
+gceSTATUS
+gco3D_SetRasterDiscard(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gco3D_SetColorOutCount(
+ IN gco3D Engine,
+ IN gctUINT32 ColorOutCount
+ );
+
+gceSTATUS
+gco3D_SetColorCacheMode(
+ IN gco3D Engine
+ );
+
+gceSTATUS
+gco3D_Set3DEngine(
+ IN gco3D Engine
+ );
+
+gceSTATUS
+gco3D_UnSet3DEngine(
+ IN gco3D Engine
+ );
+
+gceSTATUS
+gco3D_Get3DEngine(
+ OUT gco3D * Engine
+ );
+
+gceSTATUS
+gco3D_QueryReset(
+ IN gco3D Engine,
+ OUT gctBOOL_PTR Innocent
+ );
+
+/* OCL thread walker information. */
+typedef struct _gcsTHREAD_WALKER_INFO * gcsTHREAD_WALKER_INFO_PTR;
+typedef struct _gcsTHREAD_WALKER_INFO
+{
+ gctUINT32 dimensions;
+ gctUINT32 traverseOrder;
+ gctUINT32 enableSwathX;
+ gctUINT32 enableSwathY;
+ gctUINT32 enableSwathZ;
+ gctUINT32 swathSizeX;
+ gctUINT32 swathSizeY;
+ gctUINT32 swathSizeZ;
+ gctUINT32 valueOrder;
+
+ gctUINT32 globalSizeX;
+ gctUINT32 globalOffsetX;
+ gctUINT32 globalSizeY;
+ gctUINT32 globalOffsetY;
+ gctUINT32 globalSizeZ;
+ gctUINT32 globalOffsetZ;
+
+ gctUINT32 globalScaleX;
+ gctUINT32 globalScaleY;
+ gctUINT32 globalScaleZ;
+
+ gctUINT32 workGroupSizeX;
+ gctUINT32 workGroupCountX;
+ gctUINT32 workGroupSizeY;
+ gctUINT32 workGroupCountY;
+ gctUINT32 workGroupSizeZ;
+ gctUINT32 workGroupCountZ;
+
+ gctUINT32 threadAllocation;
+ gctBOOL barrierUsed;
+ gctUINT32 memoryAccessFlag; /* same as gceMEMORY_ACCESS_FLAG */
+ gctBOOL indirect;
+ gctUINT32 groupNumberUniformIdx;
+ gctUINT32 baseAddress;
+ gctBOOL bDual16;
+}
+gcsTHREAD_WALKER_INFO;
+
+#if gcdENABLE_3D && gcdUSE_VX
+/* VX thread walker parameters. */
+typedef struct _gcsVX_THREAD_WALKER_PARAMETERS * gcsVX_THREAD_WALKER_PARAMETERS_PTR;
+
+typedef struct _gcsVX_THREAD_WALKER_PARAMETERS
+{
+ gctUINT32 valueOrder;
+ gctUINT32 workDim;
+
+ gctUINT32 workGroupSizeX;
+ gctUINT32 workGroupCountX;
+
+ gctUINT32 workGroupSizeY;
+ gctUINT32 workGroupCountY;
+
+ gctUINT32 globalOffsetX;
+ gctUINT32 globalScaleX;
+
+ gctUINT32 globalOffsetY;
+ gctUINT32 globalScaleY;
+
+#if gcdVX_OPTIMIZER > 1
+ gctBOOL tileMode;
+#endif
+}
+gcsVX_THREAD_WALKER_PARAMETERS;
+
+typedef struct _gcsVX_IMAGE_INFO * gcsVX_IMAGE_INFO_PTR;
+
+typedef struct _gcsVX_IMAGE_INFO
+{
+ gctUINT32 format;
+ gctUINT32 rect[4];
+ gctUINT32 width;
+ gctUINT32 height;
+
+ /*arraySize, sliceSize is for imageArray / image3D */
+ gctUINT32 arraySize;
+ gctUINT32 sliceSize;
+
+ gctUINT32 bpp;
+ gctUINT32 planes;
+ gctUINT32 componentCount;
+ gctBOOL isFloat;
+
+ gctUINT32 uPixels;
+ gctUINT32 vPixels;
+ gceSURF_FORMAT internalFormat;
+ gctUINT32 border;
+
+ /*vx_imagepatch_addressing_t == (gctUINT32 * 8) */
+ gctUINT32 imagepatch[8 * 3];
+ void *base_addr[3];
+
+ gctUINT32 stride[3];
+
+ gctPOINTER logicals[3];
+ gctUINT32 physicals[3];
+ gctUINT32 bytes;
+
+ gcsSURF_NODE_PTR nodes[3];
+
+ gctBOOL isVXC;
+#if gcdVX_OPTIMIZER
+ gctUINT32 uniformData[3][4];
+#endif
+}
+gcsVX_IMAGE_INFO;
+typedef struct _gcsVX_DISTRIBUTION_INFO * gcsVX_DISTRIBUTION_INFO_PTR;
+
+typedef struct _gcsVX_DISTRIBUTION_INFO
+{
+
+ gctUINT32 logical;
+ gctUINT32 physical;
+ gctUINT32 bytes;
+
+ gcsSURF_NODE_PTR node;
+}
+gcsVX_DISTRIBUTION_INFO;
+#endif
+
+/* Start OCL thread walker. */
+gceSTATUS
+gco3D_InvokeThreadWalker(
+ IN gco3D Engine,
+ IN gcsTHREAD_WALKER_INFO_PTR Info
+ );
+
+gceSTATUS
+gco3D_GetClosestRenderFormat(
+ IN gco3D Engine,
+ IN gceSURF_FORMAT InFormat,
+ OUT gceSURF_FORMAT* OutFormat
+ );
+
+/* Set w clip and w plane limit value. */
+gceSTATUS
+gco3D_SetWClipEnable(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gco3D_GetWClipEnable(
+ IN gco3D Engine,
+ OUT gctBOOL * Enable
+ );
+
+gceSTATUS
+gco3D_SetWPlaneLimitF(
+ IN gco3D Engine,
+ IN gctFLOAT Value
+ );
+
+gceSTATUS
+gco3D_SetWPlaneLimitX(
+ IN gco3D Engine,
+ IN gctFIXED_POINT Value
+ );
+
+gceSTATUS
+gco3D_SetWPlaneLimit(
+ IN gco3D Engine,
+ IN gctFLOAT Value
+ );
+
+gceSTATUS
+gco3D_PrimitiveRestart(
+ IN gco3D Engine,
+ IN gctBOOL PrimitiveRestart
+ );
+
+gceSTATUS
+gco3D_LoadProgram(
+ IN gco3D Engine,
+ IN gcePROGRAM_STAGE_BIT StageBits,
+ IN gctPOINTER ProgramState
+ );
+
+gceSTATUS
+gco3D_EnableAlphaToCoverage(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gco3D_EnableSampleCoverage(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gco3D_SetSampleCoverageValue(
+ IN gco3D Engine,
+ IN gctFLOAT CoverageValue,
+ IN gctBOOL Invert
+ );
+
+gceSTATUS
+gco3D_EnableSampleMask(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gco3D_SetSampleMask(
+ IN gco3D Engine,
+ IN gctUINT32 SampleMask
+ );
+
+gceSTATUS
+gco3D_EnableSampleShading(
+ IN gco3D Engine,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gco3D_SetMinSampleShadingValue(
+ IN gco3D Engine,
+ IN gctFLOAT MinSampleShadingValue
+ );
+
+gceSTATUS
+gco3D_SetSampleShading(
+ IN gco3D Engine,
+ IN gctBOOL Enable,
+ IN gctBOOL IsSampleIn,
+ IN gctFLOAT SampleShadingValue
+ );
+
+gceSTATUS
+gco3D_EnableSampleMaskOut(
+ IN gco3D Engine,
+ IN gctBOOL Enable,
+ IN gctINT SampleMaskLoc
+ );
+
+/*----------------------------------------------------------------------------*/
+/*-------------------------- gco3D Fragment Processor ------------------------*/
+
+/* Set the fragment processor configuration. */
+gceSTATUS
+gco3D_SetFragmentConfiguration(
+ IN gco3D Engine,
+ IN gctBOOL ColorFromStream,
+ IN gctBOOL EnableFog,
+ IN gctBOOL EnableSmoothPoint,
+ IN gctUINT32 ClipPlanes
+ );
+
+/* Enable/disable texture stage operation. */
+gceSTATUS
+gco3D_EnableTextureStage(
+ IN gco3D Engine,
+ IN gctINT Stage,
+ IN gctBOOL Enable
+ );
+
+/* Program the channel enable masks for the color texture function. */
+gceSTATUS
+gco3D_SetTextureColorMask(
+ IN gco3D Engine,
+ IN gctINT Stage,
+ IN gctBOOL ColorEnabled,
+ IN gctBOOL AlphaEnabled
+ );
+
+/* Program the channel enable masks for the alpha texture function. */
+gceSTATUS
+gco3D_SetTextureAlphaMask(
+ IN gco3D Engine,
+ IN gctINT Stage,
+ IN gctBOOL ColorEnabled,
+ IN gctBOOL AlphaEnabled
+ );
+
+/* Program the constant fragment color. */
+gceSTATUS
+gco3D_SetFragmentColorX(
+ IN gco3D Engine,
+ IN gctFIXED_POINT Red,
+ IN gctFIXED_POINT Green,
+ IN gctFIXED_POINT Blue,
+ IN gctFIXED_POINT Alpha
+ );
+
+gceSTATUS
+gco3D_SetFragmentColorF(
+ IN gco3D Engine,
+ IN gctFLOAT Red,
+ IN gctFLOAT Green,
+ IN gctFLOAT Blue,
+ IN gctFLOAT Alpha
+ );
+
+/* Program the constant fog color. */
+gceSTATUS
+gco3D_SetFogColorX(
+ IN gco3D Engine,
+ IN gctFIXED_POINT Red,
+ IN gctFIXED_POINT Green,
+ IN gctFIXED_POINT Blue,
+ IN gctFIXED_POINT Alpha
+ );
+
+gceSTATUS
+gco3D_SetFogColorF(
+ IN gco3D Engine,
+ IN gctFLOAT Red,
+ IN gctFLOAT Green,
+ IN gctFLOAT Blue,
+ IN gctFLOAT Alpha
+ );
+
+/* Program the constant texture color. */
+gceSTATUS
+gco3D_SetTetxureColorX(
+ IN gco3D Engine,
+ IN gctINT Stage,
+ IN gctFIXED_POINT Red,
+ IN gctFIXED_POINT Green,
+ IN gctFIXED_POINT Blue,
+ IN gctFIXED_POINT Alpha
+ );
+
+gceSTATUS
+gco3D_SetTetxureColorF(
+ IN gco3D Engine,
+ IN gctINT Stage,
+ IN gctFLOAT Red,
+ IN gctFLOAT Green,
+ IN gctFLOAT Blue,
+ IN gctFLOAT Alpha
+ );
+
+/* Configure color texture function. */
+gceSTATUS
+gco3D_SetColorTextureFunction(
+ IN gco3D Engine,
+ IN gctINT Stage,
+ IN gceTEXTURE_FUNCTION Function,
+ IN gceTEXTURE_SOURCE Source0,
+ IN gceTEXTURE_CHANNEL Channel0,
+ IN gceTEXTURE_SOURCE Source1,
+ IN gceTEXTURE_CHANNEL Channel1,
+ IN gceTEXTURE_SOURCE Source2,
+ IN gceTEXTURE_CHANNEL Channel2,
+ IN gctINT Scale
+ );
+
+/* Configure alpha texture function. */
+gceSTATUS
+gco3D_SetAlphaTextureFunction(
+ IN gco3D Engine,
+ IN gctINT Stage,
+ IN gceTEXTURE_FUNCTION Function,
+ IN gceTEXTURE_SOURCE Source0,
+ IN gceTEXTURE_CHANNEL Channel0,
+ IN gceTEXTURE_SOURCE Source1,
+ IN gceTEXTURE_CHANNEL Channel1,
+ IN gceTEXTURE_SOURCE Source2,
+ IN gceTEXTURE_CHANNEL Channel2,
+ IN gctINT Scale
+ );
+
+/******************************************************************************\
+******************************* gcoTEXTURE Object *******************************
+\******************************************************************************/
+
+/* Cube faces. */
+typedef enum _gceTEXTURE_FACE
+{
+ gcvFACE_NONE = 0,
+ gcvFACE_POSITIVE_X,
+ gcvFACE_NEGATIVE_X,
+ gcvFACE_POSITIVE_Y,
+ gcvFACE_NEGATIVE_Y,
+ gcvFACE_POSITIVE_Z,
+ gcvFACE_NEGATIVE_Z,
+}
+gceTEXTURE_FACE;
+
+typedef struct _gcsTEXTURE
+{
+ /* Addressing modes. */
+ gceTEXTURE_ADDRESSING s;
+ gceTEXTURE_ADDRESSING t;
+ gceTEXTURE_ADDRESSING r;
+
+ gceTEXTURE_SWIZZLE swizzle[gcvTEXTURE_COMPONENT_NUM];
+
+ /* Border color. */
+ gctUINT8 border[gcvTEXTURE_COMPONENT_NUM];
+
+ /* Filters. */
+ gceTEXTURE_FILTER minFilter;
+ gceTEXTURE_FILTER magFilter;
+ gceTEXTURE_FILTER mipFilter;
+ gctUINT anisoFilter;
+
+ /* Level of detail. */
+ gctFLOAT lodBias;
+ gctFLOAT lodMin;
+ gctFLOAT lodMax;
+
+ /* base/max level */
+ gctINT32 baseLevel;
+ gctINT32 maxLevel;
+
+ /* depth texture comparison */
+ gceTEXTURE_COMPARE_MODE compareMode;
+ gceCOMPARE compareFunc;
+
+ gceTEXTURE_DS_MODE dsMode;
+
+ /* sRGB decode */
+ gceTEXTURE_SRGBDECODE sRGB;
+
+ gcuVALUE borderColor[4];
+ gctBOOL descDirty;
+}
+gcsTEXTURE, * gcsTEXTURE_PTR;
+
+typedef struct _gcsTEXTURE_BINDTEXTS_ARGS
+{
+ /* must be the first member */
+ gceHAL_ARG_VERSION version;
+
+}
+gcsTEXTURE_BINDTEXTS_ARGS;
+
+/* Construct a new gcoTEXTURE object. */
+gceSTATUS
+gcoTEXTURE_Construct(
+ IN gcoHAL Hal,
+ OUT gcoTEXTURE * Texture
+ );
+
+/* Construct a new gcoTEXTURE object with type information. */
+gceSTATUS
+gcoTEXTURE_ConstructEx(
+ IN gcoHAL Hal,
+ IN gceTEXTURE_TYPE Type,
+ OUT gcoTEXTURE * Texture
+ );
+
+
+/* Construct a new sized gcoTEXTURE object. */
+gceSTATUS
+gcoTEXTURE_ConstructSized(
+ IN gcoHAL Hal,
+ IN gceSURF_FORMAT Format,
+ IN gctUINT Width,
+ IN gctUINT Height,
+ IN gctUINT Depth,
+ IN gctUINT Faces,
+ IN gctUINT MipMapCount,
+ IN gcePOOL Pool,
+ OUT gcoTEXTURE * Texture
+ );
+
+/* Destroy an gcoTEXTURE object. */
+gceSTATUS
+gcoTEXTURE_Destroy(
+ IN gcoTEXTURE Texture
+ );
+
+/* Upload data to an gcoTEXTURE object. */
+gceSTATUS
+gcoTEXTURE_Upload(
+ IN gcoTEXTURE Texture,
+ IN gctINT MipMap,
+ IN gceTEXTURE_FACE Face,
+ IN gctSIZE_T Width,
+ IN gctSIZE_T Height,
+ IN gctUINT Slice,
+ IN gctCONST_POINTER Memory,
+ IN gctSIZE_T Stride,
+ IN gceSURF_FORMAT Format,
+ IN gceSURF_COLOR_SPACE SrcColorSpace
+ );
+
+/* Upload data to an gcoTEXTURE object. */
+gceSTATUS
+gcoTEXTURE_UploadSub(
+ IN gcoTEXTURE Texture,
+ IN gctINT MipMap,
+ IN gceTEXTURE_FACE Face,
+ IN gctSIZE_T X,
+ IN gctSIZE_T Y,
+ IN gctSIZE_T Width,
+ IN gctSIZE_T Height,
+ IN gctUINT Slice,
+ IN gctCONST_POINTER Memory,
+ IN gctSIZE_T Stride,
+ IN gceSURF_FORMAT Format,
+ IN gceSURF_COLOR_SPACE SrcColorSpace,
+ IN gctUINT32 PhysicalAddress
+ );
+
+
+/* Upload YUV data to an gcoTEXTURE object. */
+gceSTATUS
+gcoTEXTURE_UploadYUV(
+ IN gcoTEXTURE Texture,
+ IN gceTEXTURE_FACE Face,
+ IN gctUINT Width,
+ IN gctUINT Height,
+ IN gctUINT Slice,
+ IN gctPOINTER Memory[3],
+ IN gctINT Stride[3],
+ IN gceSURF_FORMAT Format
+ );
+
+/* Upload compressed data to an gcoTEXTURE object. */
+gceSTATUS
+gcoTEXTURE_UploadCompressed(
+ IN gcoTEXTURE Texture,
+ IN gctINT MipMap,
+ IN gceTEXTURE_FACE Face,
+ IN gctSIZE_T Width,
+ IN gctSIZE_T Height,
+ IN gctUINT Slice,
+ IN gctCONST_POINTER Memory,
+ IN gctSIZE_T Bytes
+ );
+
+/* Upload compressed sub data to an gcoTEXTURE object. */
+gceSTATUS
+gcoTEXTURE_UploadCompressedSub(
+ IN gcoTEXTURE Texture,
+ IN gctINT MipMap,
+ IN gceTEXTURE_FACE Face,
+ IN gctSIZE_T XOffset,
+ IN gctSIZE_T YOffset,
+ IN gctSIZE_T Width,
+ IN gctSIZE_T Height,
+ IN gctUINT Slice,
+ IN gctCONST_POINTER Memory,
+ IN gctSIZE_T Size
+ );
+
+/* Get gcoSURF object for a mipmap level. */
+gceSTATUS
+gcoTEXTURE_GetMipMap(
+ IN gcoTEXTURE Texture,
+ IN gctUINT MipMap,
+ OUT gcoSURF * Surface
+ );
+
+/* Get gcoSURF object for a mipmap level and face offset. */
+gceSTATUS
+gcoTEXTURE_GetMipMapFace(
+ IN gcoTEXTURE Texture,
+ IN gctUINT MipMap,
+ IN gceTEXTURE_FACE Face,
+ OUT gcoSURF * Surface,
+ OUT gctSIZE_T_PTR Offset
+ );
+
+gceSTATUS
+gcoTEXTURE_GetMipMapSlice(
+ IN gcoTEXTURE Texture,
+ IN gctUINT MipMap,
+ IN gctUINT Slice,
+ OUT gcoSURF * Surface,
+ OUT gctSIZE_T_PTR Offset
+ );
+
+gceSTATUS
+gcoTEXTURE_AddMipMap(
+ IN gcoTEXTURE Texture,
+ IN gctINT Level,
+ IN gctINT InternalFormat,
+ IN gceSURF_FORMAT Format,
+ IN gctSIZE_T Width,
+ IN gctSIZE_T Height,
+ IN gctSIZE_T Depth,
+ IN gctUINT Faces,
+ IN gcePOOL Pool,
+ IN gctBOOL Filterable,
+ OUT gcoSURF * Surface
+ );
+
+gceSTATUS
+gcoTEXTURE_AddMipMapEx(
+ IN gcoTEXTURE Texture,
+ IN gctINT Level,
+ IN gctINT InternalFormat,
+ IN gceSURF_FORMAT Format,
+ IN gctSIZE_T Width,
+ IN gctSIZE_T Height,
+ IN gctSIZE_T Depth,
+ IN gctUINT Faces,
+ IN gcePOOL Pool,
+ IN gctUINT32 Samples,
+ IN gctBOOL Protected,
+ IN gctBOOL Filterable,
+ OUT gcoSURF * Surface
+ );
+
+gceSTATUS
+gcoTEXTURE_AddMipMapFromClient(
+ IN gcoTEXTURE Texture,
+ IN gctINT Level,
+ IN gcoSURF Surface
+ );
+
+gceSTATUS
+gcoTEXTURE_AddMipMapFromSurface(
+ IN gcoTEXTURE Texture,
+ IN gctINT Level,
+ IN gcoSURF Surface
+ );
+
+gceSTATUS
+gcoTEXTURE_LockMipMap(
+ IN gcoTEXTURE Texture,
+ IN gctUINT MipMap,
+ OPTIONAL OUT gctUINT32 * Address,
+ OPTIONAL OUT gctPOINTER * Memory
+ );
+
+gceSTATUS
+gcoTEXTURE_SetEndianHint(
+ IN gcoTEXTURE Texture,
+ IN gceENDIAN_HINT EndianHint
+ );
+
+gceSTATUS
+gcoTEXTURE_Disable(
+ IN gcoHAL Hal,
+ IN gctINT Sampler,
+ IN gctBOOL DefaultInteger
+ );
+
+gceSTATUS
+gcoTEXTURE_Flush(
+ IN gcoTEXTURE Texture
+ );
+
+gceSTATUS
+gcoTEXTURE_FlushVS(
+ IN gcoTEXTURE Texture
+ );
+
+gceSTATUS
+gcoTEXTURE_QueryCaps(
+ IN gcoHAL Hal,
+ OUT gctUINT * MaxWidth,
+ OUT gctUINT * MaxHeight,
+ OUT gctUINT * MaxDepth,
+ OUT gctBOOL * Cubic,
+ OUT gctBOOL * NonPowerOfTwo,
+ OUT gctUINT * VertexSamplers,
+ OUT gctUINT * PixelSamplers
+ );
+
+gceSTATUS
+gcoTEXTURE_GetClosestFormat(
+ IN gcoHAL Hal,
+ IN gceSURF_FORMAT InFormat,
+ OUT gceSURF_FORMAT* OutFormat
+ );
+
+gceSTATUS
+gcoTEXTURE_GetClosestFormatEx(
+ IN gcoHAL Hal,
+ IN gceSURF_FORMAT InFormat,
+ IN gceTEXTURE_TYPE TextureType,
+ OUT gceSURF_FORMAT* OutFormat
+ );
+
+gceSTATUS
+gcoTEXTURE_GetFormatInfo(
+ IN gcoTEXTURE Texture,
+ IN gctINT preferLevel,
+ OUT gcsSURF_FORMAT_INFO_PTR * TxFormatInfo
+ );
+
+gceSTATUS
+gcoTEXTURE_GetTextureFormatName(
+ IN gcsSURF_FORMAT_INFO_PTR TxFormatInfo,
+ OUT gctCONST_STRING * TxName
+ );
+
+gceSTATUS
+gcoTEXTURE_RenderIntoMipMap(
+ IN gcoTEXTURE Texture,
+ IN gctINT Level
+ );
+
+gceSTATUS
+gcoTEXTURE_RenderIntoMipMap2(
+ IN gcoTEXTURE Texture,
+ IN gctINT Level,
+ IN gctBOOL Sync
+ );
+
+gceSTATUS
+gcoTEXTURE_IsRenderable(
+ IN gcoTEXTURE Texture,
+ IN gctUINT Level
+ );
+
+gceSTATUS
+gcoTEXTURE_IsComplete(
+ IN gcoTEXTURE Texture,
+ IN gcsTEXTURE_PTR Info,
+ IN gctINT BaseLevel,
+ IN gctINT MaxLevel
+ );
+
+gceSTATUS
+gcoTEXTURE_CheckTexLevel0Attrib(
+ IN gcoTEXTURE Texture,
+ IN gctINT MaxLevel,
+ IN gctINT usedLevel
+ );
+
+gceSTATUS
+gcoTEXTURE_BindTexture(
+ IN gcoTEXTURE Texture,
+ IN gctINT Target,
+ IN gctINT Sampler,
+ IN gcsTEXTURE_PTR Info
+ );
+
+gceSTATUS
+gcoTEXTURE_BindTextureEx(
+ IN gcoTEXTURE Texture,
+ IN gctINT Target,
+ IN gctINT Sampler,
+ IN gcsTEXTURE_PTR Info,
+ IN gctINT textureLayer
+ );
+
+gceSTATUS
+gcoTEXTURE_BindTextureDesc(
+ IN gcoTEXTURE Texture,
+ IN gctINT Sampler,
+ IN gcsTEXTURE_PTR Info,
+ IN gctINT TextureLayer
+ );
+
+gceSTATUS
+gcoTEXTURE_SetDescDirty(
+ IN gcoTEXTURE Texture
+ );
+
+gceSTATUS
+gcoTEXTURE_InitParams(
+ IN gcoHAL Hal,
+ IN gcsTEXTURE_PTR TexParams
+ );
+
+gceSTATUS
+gcoTEXTURE_SetDepthTextureFlag(
+ IN gcoTEXTURE Texture,
+ IN gctBOOL unsized
+ );
+
+gceSTATUS
+gcoTEXTURE_BindTextureTS(
+ IN gcsTEXTURE_BINDTEXTS_ARGS * args
+ );
+
+gceSTATUS
+gcoTEXTURE_GenerateMipMap(
+ IN gcoTEXTURE Texture,
+ IN gctINT BaseLevel,
+ IN gctINT MaxLevel,
+ IN gctBOOL sRGBDecode
+ );
+
+/******************************************************************************\
+******************************* gcoSTREAM Object ******************************
+\******************************************************************************/
+
+typedef enum _gceVERTEX_FORMAT
+{
+ gcvVERTEX_BYTE,
+ gcvVERTEX_UNSIGNED_BYTE,
+ gcvVERTEX_SHORT,
+ gcvVERTEX_UNSIGNED_SHORT,
+ gcvVERTEX_INT,
+ gcvVERTEX_UNSIGNED_INT,
+ gcvVERTEX_FIXED,
+ gcvVERTEX_HALF,
+ gcvVERTEX_FLOAT,
+ gcvVERTEX_DOUBLE,
+ gcvVERTEX_UNSIGNED_INT_10_10_10_2,
+ gcvVERTEX_INT_10_10_10_2,
+ gcvVERTEX_UNSIGNED_INT_2_10_10_10_REV,
+ gcvVERTEX_INT_2_10_10_10_REV,
+ /* integer format */
+ gcvVERTEX_INT8,
+ gcvVERTEX_INT16,
+ gcvVERTEX_INT32,
+}
+gceVERTEX_FORMAT;
+
+/* What the SW converting scheme to create temp attrib */
+typedef enum _gceATTRIB_SCHEME
+{
+ gcvATTRIB_SCHEME_KEEP = 0,
+ gcvATTRIB_SCHEME_2_10_10_10_REV_TO_FLOAT,
+ gcvATTRIB_SCHEME_BYTE_TO_IVEC4,
+ gcvATTRIB_SCHEME_SHORT_TO_IVEC4,
+ gcvATTRIB_SCHEME_INT_TO_IVEC4,
+ gcvATTRIB_SCHEME_UBYTE_TO_UVEC4,
+ gcvATTRIB_SCHEME_USHORT_TO_UVEC4,
+ gcvATTRIB_SCHEME_UINT_TO_UVEC4,
+ gcvATTRIB_SCHEME_DOUBLE_TO_FLOAT,
+} gceATTRIB_SCHEME;
+
+gceSTATUS
+gcoSTREAM_Construct(
+ IN gcoHAL Hal,
+ OUT gcoSTREAM * Stream
+ );
+
+gceSTATUS
+gcoSTREAM_Destroy(
+ IN gcoSTREAM Stream
+ );
+
+gceSTATUS
+gcoSTREAM_Upload(
+ IN gcoSTREAM Stream,
+ IN gctCONST_POINTER Buffer,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ IN gctBOOL Dynamic
+ );
+
+gceSTATUS
+gcoSTREAM_ReAllocBufNode(
+ IN gcoSTREAM Stream
+ );
+
+gceSTATUS
+gcoSTREAM_SetStride(
+ IN gcoSTREAM Stream,
+ IN gctUINT32 Stride
+ );
+
+gceSTATUS
+gcoSTREAM_Node(
+ IN gcoSTREAM Stream,
+ OUT gcsSURF_NODE_PTR * Node
+ );
+
+gceSTATUS
+gcoSTREAM_Lock(
+ IN gcoSTREAM Stream,
+ OUT gctPOINTER * Logical,
+ OUT gctUINT32 * Physical
+ );
+
+gceSTATUS
+gcoSTREAM_Unlock(
+ IN gcoSTREAM Stream
+ );
+
+gceSTATUS
+gcoSTREAM_Reserve(
+ IN gcoSTREAM Stream,
+ IN gctSIZE_T Bytes
+ );
+
+gceSTATUS
+gcoSTREAM_Flush(
+ IN gcoSTREAM Stream
+ );
+
+typedef struct _gcsSTREAM_INFO
+{
+ gctUINT index;
+ gceVERTEX_FORMAT format;
+ gctBOOL normalized;
+ gctUINT components;
+ gctSIZE_T size;
+ gctCONST_POINTER data;
+ gctUINT stride;
+}
+gcsSTREAM_INFO, * gcsSTREAM_INFO_PTR;
+
+gceSTATUS
+gcoSTREAM_CPUCacheOperation(
+ IN gcoSTREAM Stream,
+ IN gceCACHEOPERATION Operation
+ );
+
+gceSTATUS
+gcoSTREAM_CPUCacheOperation_Range(
+ IN gcoSTREAM Stream,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Length,
+ IN gceCACHEOPERATION Operation
+ );
+
+/******************************************************************************\
+******************************** gcoVERTEX Object ******************************
+\******************************************************************************/
+
+typedef struct _gcsVERTEX_ATTRIBUTES
+{
+ gceVERTEX_FORMAT format;
+ gctBOOL normalized;
+ gctUINT32 components;
+ gctSIZE_T size;
+ gctUINT32 stream;
+ gctUINT32 offset;
+ gctUINT32 stride;
+}
+gcsVERTEX_ATTRIBUTES;
+
+gceSTATUS
+gcoVERTEX_Construct(
+ IN gcoHAL Hal,
+ OUT gcoVERTEX * Vertex
+ );
+
+gceSTATUS
+gcoVERTEX_Destroy(
+ IN gcoVERTEX Vertex
+ );
+
+gceSTATUS
+gcoVERTEX_Reset(
+ IN gcoVERTEX Vertex
+ );
+
+gceSTATUS
+gcoVERTEX_EnableAttribute(
+ IN gcoVERTEX Vertex,
+ IN gctUINT32 Index,
+ IN gceVERTEX_FORMAT Format,
+ IN gctBOOL Normalized,
+ IN gctUINT32 Components,
+ IN gcoSTREAM Stream,
+ IN gctUINT32 Offset,
+ IN gctUINT32 Stride
+ );
+
+gceSTATUS
+gcoVERTEX_DisableAttribute(
+ IN gcoVERTEX Vertex,
+ IN gctUINT32 Index
+ );
+
+gceSTATUS
+gcoVERTEX_Bind(
+ IN gcoVERTEX Vertex
+ );
+
+/*******************************************************************************
+***** gcoVERTEXARRAY Object ***************************************************/
+
+typedef struct _gcsATTRIBUTE
+{
+ /* Enabled. */
+ gctBOOL enable;
+
+ /* Number of components. */
+ gctINT size;
+
+ /* Attribute format. */
+ gceVERTEX_FORMAT format;
+
+ /* Flag whether the attribute is normalized or not. */
+ gctBOOL normalized;
+
+ /* Stride of the component. */
+ gctSIZE_T stride;
+
+ /* Divisor of the attribute */
+ gctUINT divisor;
+
+ /* Pointer to the attribute data. */
+ gctCONST_POINTER pointer;
+
+ /* Stream object owning the attribute data. */
+ gcoBUFOBJ stream;
+
+ /* Generic values for attribute. */
+ gctFLOAT genericValue[4];
+
+ /* Generic size for attribute. */
+ gctINT genericSize;
+
+ /* Vertex shader linkage. */
+ gctUINT linkage;
+
+#if gcdUSE_WCLIP_PATCH
+ /* Does it hold positions? */
+ gctBOOL isPosition;
+#endif
+
+ /* Index to vertex array */
+ gctINT arrayIdx;
+
+ gceATTRIB_SCHEME convertScheme;
+
+ /* Pointer to the temporary buffer to be freed */
+ gcoBUFOBJ tempStream;
+
+ /* Pointer to the temporary memory to be freed */
+ gctCONST_POINTER tempMemory;
+}
+gcsATTRIBUTE,
+* gcsATTRIBUTE_PTR;
+
+typedef struct _gcsVERTEXARRAY
+{
+ /* Enabled. */
+ gctBOOL enable;
+
+ /* Number of components. */
+ gctINT size;
+
+ /* Attribute format. */
+ gceVERTEX_FORMAT format;
+
+ /* Flag whether the attribute is normalized or not. */
+ gctBOOL normalized;
+
+ /* Stride of the component. */
+ gctUINT stride;
+
+ /* Divisor of the attribute */
+ gctUINT divisor;
+
+ /* Pointer to the attribute data. */
+ gctCONST_POINTER pointer;
+
+ /* Stream object owning the attribute data. */
+ gcoSTREAM stream;
+
+ /* Generic values for attribute. */
+ gctFLOAT genericValue[4];
+
+ /* Generic size for attribute. */
+ gctINT genericSize;
+
+ /* Vertex shader linkage. */
+ gctUINT linkage;
+
+ gctBOOL isPosition;
+}
+gcsVERTEXARRAY,
+* gcsVERTEXARRAY_PTR;
+
+gceSTATUS
+gcoVERTEXARRAY_Construct(
+ IN gcoHAL Hal,
+ OUT gcoVERTEXARRAY * Vertex
+ );
+
+gceSTATUS
+gcoVERTEXARRAY_Destroy(
+ IN gcoVERTEXARRAY Vertex
+ );
+
+/* If don't consider isolation, STREAM_INFO / INDEX_INFO could be
+** include in the struct of instantDraw in chip level.*/
+typedef struct _gcsVERTEXARRAY_STREAM_INFO
+{
+ gctUINT attribMask;
+ gctSIZE_T first;
+ gctSIZE_T count;
+ gcePRIMITIVE primMode;
+ gctSIZE_T primCount;
+ gctINT vertexInstIndex;
+ gctBOOL instanced;
+ gctSIZE_T instanceCount;
+
+ union _gcsVERTEXARRAY_STREAM_INFO_UNION
+ {
+ struct _gcsVERTEXARRAY_STREAM_ES11_INFO
+ {
+ gcsVERTEXARRAY_PTR attributes;
+ }es11;
+
+ struct _gcsVERTEXARRAY_STREAM_ES30_INFO
+ {
+ gcsATTRIBUTE_PTR attributes;
+ }es30;
+ }u;
+}gcsVERTEXARRAY_STREAM_INFO,
+*gcsVERTEXARRAY_STREAM_INFO_PTR;
+
+typedef const struct _gcsVERTEXARRAY_STREAM_INFO* gcsVERTEXARRAY_STREAM_INFO_CONST_PTR;
+
+typedef struct _gcsVERTEXARRAY_INDEX_INFO
+{
+ gctSIZE_T count;
+ gceINDEX_TYPE indexType;
+ gctPOINTER indexMemory;
+ gctUINT restartElement;
+
+ union _gcsVERTEXARRAY_INDEX_INFO_UNION
+ {
+ struct _gcsVERTEXARRAY_INDEX_ES11_INFO
+ {
+ gcoINDEX indexBuffer;
+ }es11;
+
+ struct _gcsVERTEXARRAY_INDEX_ES30_INFO
+ {
+ gcoBUFOBJ indexBuffer;
+ }es30;
+ }u;
+}gcsVERTEXARRAY_INDEX_INFO,
+*gcsVERTEXARRAY_INDEX_INFO_PTR;
+
+typedef const struct _gcsVERTEXARRAY_INDEX_INFO* gcsVERTEXARRAY_INDEX_INFO_CONST_PTR;
+
+gceSTATUS
+gcoVERTEXARRAY_IndexBind(
+ IN gcoVERTEXARRAY Vertex,
+ IN gcsVERTEXARRAY_INDEX_INFO_PTR IndexInfo
+ );
+
+gceSTATUS
+gcoVERTEXARRAY_StreamBind(
+ IN gcoVERTEXARRAY Vertex,
+#if gcdUSE_WCLIP_PATCH
+ IN OUT gctFLOAT * WLimitRms,
+ IN OUT gctBOOL * WLimitRmsDirty,
+#endif
+ IN gcsVERTEXARRAY_STREAM_INFO_CONST_PTR StreamInfo,
+ IN gcsVERTEXARRAY_INDEX_INFO_CONST_PTR IndexInfo
+ );
+
+gceSTATUS
+gcoVERTEXARRAY_IndexBind_Ex(
+ IN gcoVERTEXARRAY Vertex,
+ IN OUT gcsVERTEXARRAY_STREAM_INFO_PTR StreamInfo,
+ IN gcsVERTEXARRAY_INDEX_INFO_PTR IndexInfo
+ );
+
+gceSTATUS
+gcoVERTEXARRAY_StreamBind_Ex(
+ IN gcoVERTEXARRAY Vertex,
+#if gcdUSE_WCLIP_PATCH
+ IN OUT gctFLOAT * WLimitRms,
+ IN OUT gctBOOL * WLimitRmsDirty,
+#endif
+ IN OUT gcsVERTEXARRAY_STREAM_INFO_PTR StreamInfo,
+ IN gcsVERTEXARRAY_INDEX_INFO_PTR IndexInfo
+ );
+
+gceSTATUS
+gcoVERTEXARRAY_Bind(
+ IN gcoVERTEXARRAY Vertex,
+ IN gctUINT32 EnableBits,
+ IN gcsVERTEXARRAY_PTR VertexArray,
+ IN gctUINT First,
+ IN gctSIZE_T * Count,
+ IN gceINDEX_TYPE IndexType,
+ IN gcoINDEX IndexObject,
+ IN gctPOINTER IndexMemory,
+ IN OUT gcePRIMITIVE * PrimitiveType,
+#if gcdUSE_WCLIP_PATCH
+ IN OUT gctUINT * PrimitiveCount,
+ IN OUT gctFLOAT * wLimitRms,
+ IN OUT gctBOOL * wLimitDirty
+#else
+ IN OUT gctUINT * PrimitiveCount
+#endif
+ );
+
+/* Frame Database */
+gceSTATUS
+gcoHAL_AddFrameDB(
+ void
+ );
+
+gceSTATUS
+gcoHAL_DumpFrameDB(
+ gctCONST_STRING Filename OPTIONAL
+ );
+
+gceSTATUS
+gcoHAL_InitGPUProfile(
+ void
+ );
+
+gceSTATUS
+gcoHAL_DumpGPUProfile(
+ void
+ );
+
+/******************************************************************************
+**********************gcoBUFOBJ object*****************************************
+*******************************************************************************/
+typedef enum _gceBUFOBJ_TYPE
+{
+ gcvBUFOBJ_TYPE_ARRAY_BUFFER = 1,
+ gcvBUFOBJ_TYPE_ELEMENT_ARRAY_BUFFER = 2,
+ gcvBUFOBJ_TYPE_GENERIC_BUFFER = 100
+
+} gceBUFOBJ_TYPE;
+
+typedef enum _gceBUFOBJ_USAGE
+{
+ gcvBUFOBJ_USAGE_STREAM_DRAW = 1,
+ gcvBUFOBJ_USAGE_STREAM_READ,
+ gcvBUFOBJ_USAGE_STREAM_COPY,
+ gcvBUFOBJ_USAGE_STATIC_DRAW,
+ gcvBUFOBJ_USAGE_STATIC_READ,
+ gcvBUFOBJ_USAGE_STATIC_COPY,
+ gcvBUFOBJ_USAGE_DYNAMIC_DRAW,
+ gcvBUFOBJ_USAGE_DYNAMIC_READ,
+ gcvBUFOBJ_USAGE_DYNAMIC_COPY,
+
+ /* special patch for optimaize performance,
+ ** no fence and duplicate stream to ensure data correct
+ */
+ gcvBUFOBJ_USAGE_DISABLE_FENCE_DYNAMIC_STREAM = 256
+} gceBUFOBJ_USAGE;
+
+/* Construct a new gcoBUFOBJ object. */
+gceSTATUS
+gcoBUFOBJ_Construct(
+ IN gcoHAL Hal,
+ IN gceBUFOBJ_TYPE Type,
+ OUT gcoBUFOBJ * BufObj
+ );
+
+/* Destroy a gcoBUFOBJ object. */
+gceSTATUS
+gcoBUFOBJ_Destroy(
+ IN gcoBUFOBJ BufObj
+ );
+
+/* Lock pbo in memory. */
+gceSTATUS
+gcoBUFOBJ_Lock(
+ IN gcoBUFOBJ BufObj,
+ OUT gctUINT32 * Address,
+ OUT gctPOINTER * Memory
+ );
+
+/* Lock pbo in memory. */
+gceSTATUS
+gcoBUFOBJ_FastLock(
+ IN gcoBUFOBJ BufObj,
+ OUT gctUINT32 * Address,
+ OUT gctPOINTER * Memory
+ );
+
+/* Unlock pbo that was previously locked with gcoBUFOBJ_Lock. */
+gceSTATUS
+gcoBUFOBJ_Unlock(
+ IN gcoBUFOBJ BufObj
+ );
+
+/* Free existing pbo buffer. */
+gceSTATUS
+gcoBUFOBJ_Free(
+ IN gcoBUFOBJ BufObj
+ );
+
+/* Upload data into an pbo buffer. */
+gceSTATUS
+gcoBUFOBJ_Upload(
+ IN gcoBUFOBJ BufObj,
+ IN gctCONST_POINTER Buffer,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ IN gceBUFOBJ_USAGE Usage
+ );
+
+/* Bind an index object to the hardware. */
+gceSTATUS
+gcoBUFOBJ_IndexBind (
+ IN gcoBUFOBJ Index,
+ IN gceINDEX_TYPE Type,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Count,
+ IN gctUINT RestartElement
+ );
+
+/* Find min and max index for the index buffer */
+gceSTATUS
+gcoBUFOBJ_IndexGetRange(
+ IN gcoBUFOBJ Index,
+ IN gceINDEX_TYPE Type,
+ IN gctSIZE_T Offset,
+ IN gctUINT32 Count,
+ OUT gctUINT32 * MinimumIndex,
+ OUT gctUINT32 * MaximumIndex
+ );
+
+/* Sets a buffer object as dirty */
+gceSTATUS
+gcoBUFOBJ_SetDirty(
+ IN gcoBUFOBJ BufObj
+ );
+
+/* Creates a new buffer if needed */
+gceSTATUS
+gcoBUFOBJ_AlignIndexBufferWhenNeeded(
+ IN gcoBUFOBJ BufObj,
+ IN gctSIZE_T Offset,
+ OUT gcoBUFOBJ * AlignedBufObj
+ );
+
+/* Cache operations on whole range */
+gceSTATUS
+gcoBUFOBJ_CPUCacheOperation(
+ IN gcoBUFOBJ BufObj,
+ IN gceCACHEOPERATION Operation
+ );
+
+/* Cache operations on a specified range */
+gceSTATUS
+gcoBUFOBJ_CPUCacheOperation_Range(
+ IN gcoBUFOBJ BufObj,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Length,
+ IN gceCACHEOPERATION Operation
+ );
+
+/* Return size of the bufobj */
+gceSTATUS
+gcoBUFOBJ_GetSize(
+ IN gcoBUFOBJ BufObj,
+ OUT gctSIZE_T_PTR Size
+ );
+
+/* Return memory node of the bufobj */
+gceSTATUS
+gcoBUFOBJ_GetNode(
+ IN gcoBUFOBJ BufObj,
+ OUT gcsSURF_NODE_PTR * Node
+ );
+
+gceSTATUS
+gcoBUFOBJ_ReAllocBufNode(
+ IN gcoBUFOBJ BufObj
+ );
+
+/* Handle GPU cache operations */
+gceSTATUS
+gcoBUFOBJ_SetCPUWrite(
+ gcoBUFOBJ BufObj,
+ gctBOOL Value
+ );
+
+/* Dump buffer. */
+void
+gcoBUFOBJ_Dump(
+ IN gcoBUFOBJ BufObj
+ );
+
+#endif /* gcdENABLE_3D */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_engine_h_ */
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h
new file mode 100644
index 000000000000..6c4f1c43b17a
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_engine_vg.h
@@ -0,0 +1,1369 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_engine_vg_h_
+#define __gc_hal_engine_vg_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "gc_hal_types.h"
+
+/******************************************************************************\
+******************************** VG Enumerations *******************************
+\******************************************************************************/
+
+/**
+** @ingroup gcoVG
+**
+** @brief Tiling mode for painting and imagig.
+**
+** This enumeration defines the tiling modes supported by the HAL. This is
+** in fact a one-to-one mapping of the OpenVG 1.1 tile modes.
+*/
+typedef enum _gceTILE_MODE
+{
+ gcvTILE_FILL,
+ gcvTILE_PAD,
+ gcvTILE_REPEAT,
+ gcvTILE_REFLECT
+}
+gceTILE_MODE;
+
+/******************************************************************************/
+/** @ingroup gcoVG
+**
+** @brief The different paint modes.
+**
+** This enumeration lists the available paint modes.
+*/
+typedef enum _gcePAINT_TYPE
+{
+ /** Solid color. */
+ gcvPAINT_MODE_SOLID,
+
+ /** Linear gradient. */
+ gcvPAINT_MODE_LINEAR,
+
+ /** Radial gradient. */
+ gcvPAINT_MODE_RADIAL,
+
+ /** Pattern. */
+ gcvPAINT_MODE_PATTERN,
+
+ /** Mode count. */
+ gcvPAINT_MODE_COUNT
+}
+gcePAINT_TYPE;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Types of path data supported by HAL.
+**
+** This enumeration defines the types of path data supported by the HAL.
+** This is in fact a one-to-one mapping of the OpenVG 1.1 path types.
+*/
+typedef enum _gcePATHTYPE
+{
+ gcePATHTYPE_UNKNOWN = -1,
+ gcePATHTYPE_INT8,
+ gcePATHTYPE_INT16,
+ gcePATHTYPE_INT32,
+ gcePATHTYPE_FLOAT
+}
+gcePATHTYPE;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Supported path segment commands.
+**
+** This enumeration defines the path segment commands supported by the HAL.
+*/
+typedef enum _gceVGCMD
+{
+ gcvVGCMD_END, /* 0: 0x00 */
+ gcvVGCMD_CLOSE, /* 1: 0x01 */
+ gcvVGCMD_MOVE, /* 2: 0x02 */
+ gcvVGCMD_MOVE_REL, /* 3: 0x03 */
+ gcvVGCMD_LINE, /* 4: 0x04 */
+ gcvVGCMD_LINE_REL, /* 5: 0x05 */
+ gcvVGCMD_QUAD, /* 6: 0x06 */
+ gcvVGCMD_QUAD_REL, /* 7: 0x07 */
+ gcvVGCMD_CUBIC, /* 8: 0x08 */
+ gcvVGCMD_CUBIC_REL, /* 9: 0x09 */
+ gcvVGCMD_BREAK, /* 10: 0x0A */
+ gcvVGCMD_HLINE, /* 11: ******* R E S E R V E D *******/
+ gcvVGCMD_HLINE_REL, /* 12: ******* R E S E R V E D *******/
+ gcvVGCMD_VLINE, /* 13: ******* R E S E R V E D *******/
+ gcvVGCMD_VLINE_REL, /* 14: ******* R E S E R V E D *******/
+ gcvVGCMD_SQUAD, /* 15: ******* R E S E R V E D *******/
+ gcvVGCMD_SQUAD_REL, /* 16: ******* R E S E R V E D *******/
+ gcvVGCMD_SCUBIC, /* 17: ******* R E S E R V E D *******/
+ gcvVGCMD_SCUBIC_REL, /* 18: ******* R E S E R V E D *******/
+ gcvVGCMD_SCCWARC, /* 19: ******* R E S E R V E D *******/
+ gcvVGCMD_SCCWARC_REL, /* 20: ******* R E S E R V E D *******/
+ gcvVGCMD_SCWARC, /* 21: ******* R E S E R V E D *******/
+ gcvVGCMD_SCWARC_REL, /* 22: ******* R E S E R V E D *******/
+ gcvVGCMD_LCCWARC, /* 23: ******* R E S E R V E D *******/
+ gcvVGCMD_LCCWARC_REL, /* 24: ******* R E S E R V E D *******/
+ gcvVGCMD_LCWARC, /* 25: ******* R E S E R V E D *******/
+ gcvVGCMD_LCWARC_REL, /* 26: ******* R E S E R V E D *******/
+
+ /* The width of the command recognized by the hardware on bits. */
+ gcvVGCMD_WIDTH = 5,
+
+ /* Hardware command mask. */
+ gcvVGCMD_MASK = (1 << gcvVGCMD_WIDTH) - 1,
+
+ /* Command modifiers. */
+ gcvVGCMD_H_MOD = 1 << gcvVGCMD_WIDTH, /* = 32 */
+ gcvVGCMD_V_MOD = 2 << gcvVGCMD_WIDTH, /* = 64 */
+ gcvVGCMD_S_MOD = 3 << gcvVGCMD_WIDTH, /* = 96 */
+ gcvVGCMD_ARC_MOD = 4 << gcvVGCMD_WIDTH, /* = 128 */
+
+ /* Emulated LINE commands. */
+ gcvVGCMD_HLINE_EMUL = gcvVGCMD_H_MOD | gcvVGCMD_LINE, /* = 36 */
+ gcvVGCMD_HLINE_EMUL_REL = gcvVGCMD_H_MOD | gcvVGCMD_LINE_REL, /* = 37 */
+ gcvVGCMD_VLINE_EMUL = gcvVGCMD_V_MOD | gcvVGCMD_LINE, /* = 68 */
+ gcvVGCMD_VLINE_EMUL_REL = gcvVGCMD_V_MOD | gcvVGCMD_LINE_REL, /* = 69 */
+
+ /* Emulated SMOOTH commands. */
+ gcvVGCMD_SQUAD_EMUL = gcvVGCMD_S_MOD | gcvVGCMD_QUAD, /* = 102 */
+ gcvVGCMD_SQUAD_EMUL_REL = gcvVGCMD_S_MOD | gcvVGCMD_QUAD_REL, /* = 103 */
+ gcvVGCMD_SCUBIC_EMUL = gcvVGCMD_S_MOD | gcvVGCMD_CUBIC, /* = 104 */
+ gcvVGCMD_SCUBIC_EMUL_REL = gcvVGCMD_S_MOD | gcvVGCMD_CUBIC_REL, /* = 105 */
+
+ /* Emulation ARC commands. */
+ gcvVGCMD_ARC_LINE = gcvVGCMD_ARC_MOD | gcvVGCMD_LINE, /* = 132 */
+ gcvVGCMD_ARC_LINE_REL = gcvVGCMD_ARC_MOD | gcvVGCMD_LINE_REL, /* = 133 */
+ gcvVGCMD_ARC_QUAD = gcvVGCMD_ARC_MOD | gcvVGCMD_QUAD, /* = 134 */
+ gcvVGCMD_ARC_QUAD_REL = gcvVGCMD_ARC_MOD | gcvVGCMD_QUAD_REL /* = 135 */
+}
+gceVGCMD;
+typedef enum _gceVGCMD * gceVGCMD_PTR;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Blending modes supported by the HAL.
+**
+** This enumeration defines the blending modes supported by the HAL. This is
+** in fact a one-to-one mapping of the OpenVG 1.1 blending modes.
+*/
+typedef enum _gceVG_BLEND
+{
+ gcvVG_BLEND_SRC,
+ gcvVG_BLEND_SRC_OVER,
+ gcvVG_BLEND_DST_OVER,
+ gcvVG_BLEND_SRC_IN,
+ gcvVG_BLEND_DST_IN,
+ gcvVG_BLEND_MULTIPLY,
+ gcvVG_BLEND_SCREEN,
+ gcvVG_BLEND_DARKEN,
+ gcvVG_BLEND_LIGHTEN,
+ gcvVG_BLEND_ADDITIVE,
+ gcvVG_BLEND_SUBTRACT,
+ gcvVG_BLEND_FILTER
+}
+gceVG_BLEND;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Image modes supported by the HAL.
+**
+** This enumeration defines the image modes supported by the HAL. This is
+** in fact a one-to-one mapping of the OpenVG 1.1 image modes with the addition
+** of NO IMAGE.
+*/
+typedef enum _gceVG_IMAGE
+{
+ gcvVG_IMAGE_NONE,
+ gcvVG_IMAGE_NORMAL,
+ gcvVG_IMAGE_MULTIPLY,
+ gcvVG_IMAGE_STENCIL,
+ gcvVG_IMAGE_FILTER
+}
+gceVG_IMAGE;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Filter mode patterns and imaging.
+**
+** This enumeration defines the filter modes supported by the HAL.
+*/
+typedef enum _gceIMAGE_FILTER
+{
+ gcvFILTER_POINT,
+ gcvFILTER_LINEAR,
+ gcvFILTER_BI_LINEAR
+}
+gceIMAGE_FILTER;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Primitive modes supported by the HAL.
+**
+** This enumeration defines the primitive modes supported by the HAL.
+*/
+typedef enum _gceVG_PRIMITIVE
+{
+ gcvVG_SCANLINE,
+ gcvVG_RECTANGLE,
+ gcvVG_TESSELLATED,
+ gcvVG_TESSELLATED_TILED
+}
+gceVG_PRIMITIVE;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Rendering quality modes supported by the HAL.
+**
+** This enumeration defines the rendering quality modes supported by the HAL.
+*/
+typedef enum _gceRENDER_QUALITY
+{
+ gcvVG_NONANTIALIASED,
+ gcvVG_2X2_MSAA,
+ gcvVG_2X4_MSAA,
+ gcvVG_4X4_MSAA
+}
+gceRENDER_QUALITY;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Fill rules supported by the HAL.
+**
+** This enumeration defines the fill rules supported by the HAL.
+*/
+typedef enum _gceFILL_RULE
+{
+ gcvVG_EVEN_ODD,
+ gcvVG_NON_ZERO
+}
+gceFILL_RULE;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Cap styles supported by the HAL.
+**
+** This enumeration defines the cap styles supported by the HAL.
+*/
+typedef enum _gceCAP_STYLE
+{
+ gcvCAP_BUTT,
+ gcvCAP_ROUND,
+ gcvCAP_SQUARE
+}
+gceCAP_STYLE;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Join styles supported by the HAL.
+**
+** This enumeration defines the join styles supported by the HAL.
+*/
+typedef enum _gceJOIN_STYLE
+{
+ gcvJOIN_MITER,
+ gcvJOIN_ROUND,
+ gcvJOIN_BEVEL
+}
+gceJOIN_STYLE;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Channel mask values.
+**
+** This enumeration defines the values for channel mask used in image
+** filtering.
+*/
+
+/* Base values for channel mask definitions. */
+#define gcvCHANNEL_X (0)
+#define gcvCHANNEL_R (1 << 0)
+#define gcvCHANNEL_G (1 << 1)
+#define gcvCHANNEL_B (1 << 2)
+#define gcvCHANNEL_A (1 << 3)
+
+typedef enum _gceCHANNEL
+{
+ gcvCHANNEL_XXXX = (gcvCHANNEL_X | gcvCHANNEL_X | gcvCHANNEL_X | gcvCHANNEL_X),
+ gcvCHANNEL_XXXA = (gcvCHANNEL_X | gcvCHANNEL_X | gcvCHANNEL_X | gcvCHANNEL_A),
+ gcvCHANNEL_XXBX = (gcvCHANNEL_X | gcvCHANNEL_X | gcvCHANNEL_B | gcvCHANNEL_X),
+ gcvCHANNEL_XXBA = (gcvCHANNEL_X | gcvCHANNEL_X | gcvCHANNEL_B | gcvCHANNEL_A),
+
+ gcvCHANNEL_XGXX = (gcvCHANNEL_X | gcvCHANNEL_G | gcvCHANNEL_X | gcvCHANNEL_X),
+ gcvCHANNEL_XGXA = (gcvCHANNEL_X | gcvCHANNEL_G | gcvCHANNEL_X | gcvCHANNEL_A),
+ gcvCHANNEL_XGBX = (gcvCHANNEL_X | gcvCHANNEL_G | gcvCHANNEL_B | gcvCHANNEL_X),
+ gcvCHANNEL_XGBA = (gcvCHANNEL_X | gcvCHANNEL_G | gcvCHANNEL_B | gcvCHANNEL_A),
+
+ gcvCHANNEL_RXXX = (gcvCHANNEL_R | gcvCHANNEL_X | gcvCHANNEL_X | gcvCHANNEL_X),
+ gcvCHANNEL_RXXA = (gcvCHANNEL_R | gcvCHANNEL_X | gcvCHANNEL_X | gcvCHANNEL_A),
+ gcvCHANNEL_RXBX = (gcvCHANNEL_R | gcvCHANNEL_X | gcvCHANNEL_B | gcvCHANNEL_X),
+ gcvCHANNEL_RXBA = (gcvCHANNEL_R | gcvCHANNEL_X | gcvCHANNEL_B | gcvCHANNEL_A),
+
+ gcvCHANNEL_RGXX = (gcvCHANNEL_R | gcvCHANNEL_G | gcvCHANNEL_X | gcvCHANNEL_X),
+ gcvCHANNEL_RGXA = (gcvCHANNEL_R | gcvCHANNEL_G | gcvCHANNEL_X | gcvCHANNEL_A),
+ gcvCHANNEL_RGBX = (gcvCHANNEL_R | gcvCHANNEL_G | gcvCHANNEL_B | gcvCHANNEL_X),
+ gcvCHANNEL_RGBA = (gcvCHANNEL_R | gcvCHANNEL_G | gcvCHANNEL_B | gcvCHANNEL_A),
+}
+gceCHANNEL;
+
+/******************************************************************************\
+******************************** VG Structures *******************************
+\******************************************************************************/
+
+/**
+** @ingroup gcoVG
+**
+** @brief Definition of the color ramp used by the gradient paints.
+**
+** The gcsCOLOR_RAMP structure defines the layout of one single color inside
+** a color ramp which is used by gradient paints.
+*/
+typedef struct _gcsCOLOR_RAMP
+{
+ /** Value for the color stop. */
+ gctFLOAT stop;
+
+ /** Red color channel value for the color stop. */
+ gctFLOAT red;
+
+ /** Green color channel value for the color stop. */
+ gctFLOAT green;
+
+ /** Blue color channel value for the color stop. */
+ gctFLOAT blue;
+
+ /** Alpha color channel value for the color stop. */
+ gctFLOAT alpha;
+}
+gcsCOLOR_RAMP, * gcsCOLOR_RAMP_PTR;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Definition of the color ramp used by the gradient paints in fixed form.
+**
+** The gcsCOLOR_RAMP structure defines the layout of one single color inside
+** a color ramp which is used by gradient paints.
+*/
+typedef struct _gcsFIXED_COLOR_RAMP
+{
+ /** Value for the color stop. */
+ gctFIXED_POINT stop;
+
+ /** Red color channel value for the color stop. */
+ gctFIXED_POINT red;
+
+ /** Green color channel value for the color stop. */
+ gctFIXED_POINT green;
+
+ /** Blue color channel value for the color stop. */
+ gctFIXED_POINT blue;
+
+ /** Alpha color channel value for the color stop. */
+ gctFIXED_POINT alpha;
+}
+gcsFIXED_COLOR_RAMP, * gcsFIXED_COLOR_RAMP_PTR;
+
+
+/**
+** @ingroup gcoVG
+**
+** @brief Rectangle structure used by the gcoVG object.
+**
+** This structure defines the layout of a rectangle. Make sure width and
+** height are larger than 0.
+*/
+typedef struct _gcsVG_RECT * gcsVG_RECT_PTR;
+typedef struct _gcsVG_RECT
+{
+ /** Left location of the rectangle. */
+ gctINT x;
+
+ /** Top location of the rectangle. */
+ gctINT y;
+
+ /** Width of the rectangle. */
+ gctINT width;
+
+ /** Height of the rectangle. */
+ gctINT height;
+}
+gcsVG_RECT;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Path command buffer attribute structure.
+**
+** The gcsPATH_BUFFER_INFO structure contains the specifics about
+** the layout of the path data command buffer.
+*/
+typedef struct _gcsPATH_BUFFER_INFO * gcsPATH_BUFFER_INFO_PTR;
+typedef struct _gcsPATH_BUFFER_INFO
+{
+ gctUINT reservedForHead;
+ gctUINT reservedForTail;
+}
+gcsPATH_BUFFER_INFO;
+
+/**
+** @ingroup gcoVG
+**
+** @brief Definition of the path data container structure.
+**
+** The gcsPATH structure defines the layout of the path data container.
+*/
+typedef struct _gcsPATH_DATA * gcsPATH_DATA_PTR;
+typedef struct _gcsPATH_DATA
+{
+ /* Data container in command buffer format. */
+ gcsCMDBUFFER data;
+
+ /* Path data type. */
+ gcePATHTYPE dataType;
+}
+gcsPATH_DATA;
+
+
+/******************************************************************************\
+********************************* gcoHAL Object ********************************
+\******************************************************************************/
+
+/* Query path data storage attributes. */
+gceSTATUS
+gcoHAL_QueryPathStorage(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ OUT gcsPATH_BUFFER_INFO_PTR Information
+ );
+
+/* Associate a completion signal with the command buffer. */
+gceSTATUS
+gcoHAL_AssociateCompletion(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcsPATH_DATA_PTR PathData
+ );
+
+/* Release the current command buffer completion signal. */
+gceSTATUS
+gcoHAL_DeassociateCompletion(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcsPATH_DATA_PTR PathData
+ );
+
+/* Verify whether the command buffer is still in use. */
+gceSTATUS
+gcoHAL_CheckCompletion(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcsPATH_DATA_PTR PathData
+ );
+
+/* Wait until the command buffer is no longer in use. */
+gceSTATUS
+gcoHAL_WaitCompletion(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcsPATH_DATA_PTR PathData
+ );
+
+/* Flush the pixel cache. */
+gceSTATUS
+gcoHAL_Flush(
+#if gcdGC355_PROFILER
+ IN gcoHAL Hal,
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth
+#else
+ IN gcoHAL Hal
+#endif
+ );
+
+/* Split a harwdare address into pool and offset. */
+gceSTATUS
+gcoHAL_SplitAddress(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctUINT32 Address,
+ OUT gcePOOL * Pool,
+ OUT gctUINT32 * Offset
+ );
+
+/* Combine pool and offset into a harwdare address. */
+gceSTATUS
+gcoHAL_CombineAddress(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcePOOL Pool,
+ IN gctUINT32 Offset,
+ OUT gctUINT32 * Address
+ );
+
+/* Schedule to free linear video memory allocated. */
+gceSTATUS
+gcoHAL_ScheduleVideoMemory(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctUINT32 Node
+ );
+
+/* Free linear video memory allocated with gcoHAL_AllocateLinearVideoMemory. */
+gceSTATUS
+gcoHAL_FreeVideoMemory(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctUINT32 Node,
+ IN gctBOOL asynchroneous
+ );
+
+/* Query command buffer attributes. */
+gceSTATUS
+gcoHAL_QueryCommandBuffer(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ OUT gcsCOMMAND_BUFFER_INFO_PTR Information
+ );
+/* Allocate and lock linear video memory. */
+gceSTATUS
+gcoHAL_AllocateLinearVideoMemory(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctUINT Size,
+ IN gctUINT Alignment,
+ IN gcePOOL Pool,
+ OUT gctUINT32 * Node,
+ OUT gctUINT32 * Address,
+ OUT gctPOINTER * Memory
+ );
+
+/* Align the specified size accordingly to the hardware requirements. */
+gceSTATUS
+gcoHAL_GetAlignedSurfaceSize(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gceSURF_TYPE Type,
+ IN OUT gctUINT32_PTR Width,
+ IN OUT gctUINT32_PTR Height
+ );
+
+gceSTATUS
+gcoHAL_ReserveTask(
+ IN gcoHAL Hal,
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gceBLOCK Block,
+ IN gctUINT TaskCount,
+ IN gctUINT32 Bytes,
+ OUT gctPOINTER * Memory
+ );
+/******************************************************************************\
+********************************** gcoVG Object ********************************
+\******************************************************************************/
+
+/** @defgroup gcoVG gcoVG
+**
+** The gcoVG object abstracts the VG hardware pipe.
+*/
+#if gcdGC355_PROFILER
+void
+gcoVG_ProfilerEnableDisable(
+ IN gcoVG Vg,
+ IN gctUINT enableGetAPITimes,
+ IN gctFILE apiTimeFile
+ );
+
+void
+gcoVG_ProfilerTreeDepth(
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth
+ );
+
+void
+gcoVG_ProfilerSetStates(
+ IN gcoVG Vg,
+ IN gctUINT treeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth
+ );
+#endif
+
+gctBOOL
+gcoVG_IsMaskSupported(
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gceSURF_FORMAT Format
+ );
+
+gctBOOL
+gcoVG_IsTargetSupported(
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gceSURF_FORMAT Format
+ );
+
+gctBOOL
+gcoVG_IsImageSupported(
+#if gcdGC355_PROFILER
+ IN gcoVG Vg,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gceSURF_FORMAT Format
+ );
+
+gctUINT8 gcoVG_PackColorComponent(
+#if gcdGC355_PROFILER
+ gcoVG Vg,
+ gctUINT TreeDepth,
+ gctUINT saveLayerTreeDepth,
+ gctUINT varTreeDepth,
+#endif
+ gctFLOAT Value
+ );
+
+gceSTATUS
+gcoVG_Construct(
+ IN gcoHAL Hal,
+ OUT gcoVG * Vg
+ );
+
+gceSTATUS
+gcoVG_Destroy(
+ IN gcoVG Vg
+#if gcdGC355_PROFILER
+,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth
+#endif
+ );
+
+void
+gcoVG_SetTesselationSize(
+ IN gcoVG Vg,
+ IN gctUINT Width,
+ IN gctUINT Height
+ );
+
+gceSTATUS
+gcoVG_SetTarget(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF Target,
+ IN gceORIENTATION orientation
+ );
+
+gceSTATUS
+gcoVG_UnsetTarget(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF Surface
+ );
+
+gceSTATUS
+gcoVG_SetUserToSurface(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctFLOAT UserToSurface[9]
+ );
+
+gceSTATUS
+gcoVG_SetSurfaceToImage(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctFLOAT SurfaceToImage[9]
+ );
+
+gceSTATUS
+gcoVG_EnableMask(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gcoVG_SetMask(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF Mask
+ );
+
+gceSTATUS
+gcoVG_UnsetMask(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF Surface
+ );
+
+gceSTATUS
+gcoVG_FlushMask(
+ IN gcoVG Vg
+#if gcdGC355_PROFILER
+,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth
+#endif
+ );
+
+gceSTATUS
+gcoVG_EnableScissor(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gcoVG_SetScissor(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctSIZE_T RectangleCount,
+ IN gcsVG_RECT_PTR Rectangles
+ );
+
+gceSTATUS
+gcoVG_EnableColorTransform(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gcoVG_SetColorTransform(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctFLOAT ColorTransform[8]
+ );
+
+gceSTATUS
+gcoVG_SetTileFillColor(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctFLOAT Red,
+ IN gctFLOAT Green,
+ IN gctFLOAT Blue,
+ IN gctFLOAT Alpha
+ );
+
+gceSTATUS
+gcoVG_SetSolidPaint(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctUINT8 Red,
+ IN gctUINT8 Green,
+ IN gctUINT8 Blue,
+ IN gctUINT8 Alpha
+ );
+
+gceSTATUS
+gcoVG_SetLinearPaint(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctFLOAT Constant,
+ IN gctFLOAT StepX,
+ IN gctFLOAT StepY
+ );
+
+gceSTATUS
+gcoVG_SetRadialPaint(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctFLOAT LinConstant,
+ IN gctFLOAT LinStepX,
+ IN gctFLOAT LinStepY,
+ IN gctFLOAT RadConstant,
+ IN gctFLOAT RadStepX,
+ IN gctFLOAT RadStepY,
+ IN gctFLOAT RadStepXX,
+ IN gctFLOAT RadStepYY,
+ IN gctFLOAT RadStepXY
+ );
+
+gceSTATUS
+gcoVG_SetPatternPaint(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctFLOAT UConstant,
+ IN gctFLOAT UStepX,
+ IN gctFLOAT UStepY,
+ IN gctFLOAT VConstant,
+ IN gctFLOAT VStepX,
+ IN gctFLOAT VStepY,
+ IN gctBOOL Linear
+ );
+
+gceSTATUS
+gcoVG_SetColorRamp(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF ColorRamp,
+ IN gceTILE_MODE ColorRampSpreadMode
+ );
+
+gceSTATUS
+gcoVG_SetPattern(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctINT32 width,
+ IN gctINT32 height,
+ IN gcoSURF Pattern,
+ IN gceTILE_MODE TileMode,
+ IN gceIMAGE_FILTER Filter
+ );
+
+gceSTATUS
+gcoVG_SetImageMode(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gceVG_IMAGE Mode
+ );
+
+gceSTATUS
+gcoVG_SetBlendMode(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gceVG_BLEND Mode
+ );
+
+gceSTATUS
+gcoVG_SetRenderingQuality(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gceRENDER_QUALITY Quality
+ );
+
+gceSTATUS
+gcoVG_SetFillRule(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gceFILL_RULE FillRule
+ );
+
+gceSTATUS
+gcoVG_FinalizePath(
+ IN gcoVG Vg,
+ IN gcsPATH_DATA_PTR PathData
+ );
+
+gceSTATUS
+gcoVG_Clear(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctINT X,
+ IN gctINT Y,
+ IN gctINT Width,
+ IN gctINT Height
+ );
+
+gceSTATUS
+gcoVG_DrawPath(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcsPATH_DATA_PTR PathData,
+ IN gctFLOAT Scale,
+ IN gctFLOAT Bias,
+#if gcdMOVG
+ IN gctUINT32 Width,
+ IN gctUINT32 Height,
+ IN gctFLOAT *Bounds,
+#endif
+ IN gctBOOL SoftwareTesselation
+ );
+
+gceSTATUS
+gcoVG_DrawImage(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gceORIENTATION orientation,
+ IN gcoSURF Source,
+ IN gcsPOINT_PTR SourceOrigin,
+ IN gcsPOINT_PTR TargetOrigin,
+ IN gcsSIZE_PTR SourceSize,
+ IN gctINT SourceX,
+ IN gctINT SourceY,
+ IN gctINT TargetX,
+ IN gctINT TargetY,
+ IN gctINT Width,
+ IN gctINT Height,
+ IN gctBOOL Mask,
+ IN gctBOOL isDrawImage
+ );
+
+gceSTATUS
+gcoVG_TesselateImage(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF Image,
+ IN gcsVG_RECT_PTR Rectangle,
+ IN gceIMAGE_FILTER Filter,
+ IN gctBOOL Mask,
+#if gcdMOVG
+ IN gctBOOL SoftwareTesselation,
+ IN gceVG_BLEND BlendMode,
+ IN gctINT Width,
+ IN gctINT Height
+#else
+ IN gctBOOL SoftwareTesselation
+#endif
+ );
+
+gceSTATUS
+gcoVG_DrawSurfaceToImage(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF Image,
+ IN const gcsVG_RECT_PTR SrcRectangle,
+ IN const gctFLOAT DstBounds[4],
+ IN const gctFLOAT DstPoints[8],
+ IN const gctFLOAT ImgMatrix[9],
+ IN const gctFLOAT RectMatrix[9],
+ IN gceIMAGE_FILTER Filter,
+ IN gctBOOL Mask,
+ IN gctBOOL FirstTime
+#if gcdMOVG
+,
+ IN gctINT TSWidth,
+ IN gctINT TSHeight
+#endif
+ );
+
+gceSTATUS
+gcoVG_DrawSurfaceToImageMasked(
+ IN gcoVG Vg,
+ IN gcoSURF Image,
+ IN gcsVG_RECT_PTR SrcRect,
+ IN gctINT X,
+ IN gctINT Y,
+ IN gctINT Width,
+ IN gctINT Height,
+ IN const gctFLOAT Matrix[9]
+ );
+
+gceSTATUS
+gcoVG_Blit(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF Source,
+ IN gcoSURF Target,
+ IN gcsVG_RECT_PTR SrcRect,
+ IN gcsVG_RECT_PTR TrgRect,
+ IN gceIMAGE_FILTER Filter,
+ IN gceVG_BLEND Mode
+ );
+
+gceSTATUS
+gcoVG_ColorMatrix(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF Source,
+ IN gcoSURF Target,
+ IN const gctFLOAT * Matrix,
+ IN gceCHANNEL ColorChannels,
+ IN gctBOOL FilterLinear,
+ IN gctBOOL FilterPremultiplied,
+ IN gcsPOINT_PTR SourceOrigin,
+ IN gcsPOINT_PTR TargetOrigin,
+ IN gctINT Width,
+ IN gctINT Height
+ );
+
+gceSTATUS
+gcoVG_SeparableConvolve(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF Source,
+ IN gcoSURF Target,
+ IN gctINT KernelWidth,
+ IN gctINT KernelHeight,
+ IN gctINT ShiftX,
+ IN gctINT ShiftY,
+ IN const gctINT16 * KernelX,
+ IN const gctINT16 * KernelY,
+ IN gctFLOAT Scale,
+ IN gctFLOAT Bias,
+ IN gceTILE_MODE TilingMode,
+ IN gctFLOAT_PTR FillColor,
+ IN gceCHANNEL ColorChannels,
+ IN gctBOOL FilterLinear,
+ IN gctBOOL FilterPremultiplied,
+ IN gcsPOINT_PTR SourceOrigin,
+ IN gcsPOINT_PTR TargetOrigin,
+ IN gcsSIZE_PTR SourceSize,
+ IN gctINT Width,
+ IN gctINT Height
+ );
+
+gceSTATUS
+gcoVG_GaussianBlur(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gcoSURF Source,
+ IN gcoSURF Target,
+ IN gctFLOAT StdDeviationX,
+ IN gctFLOAT StdDeviationY,
+ IN gceTILE_MODE TilingMode,
+ IN gctFLOAT_PTR FillColor,
+ IN gceCHANNEL ColorChannels,
+ IN gctBOOL FilterLinear,
+ IN gctBOOL FilterPremultiplied,
+ IN gcsPOINT_PTR SourceOrigin,
+ IN gcsPOINT_PTR TargetOrigin,
+ IN gcsSIZE_PTR SourceSize,
+ IN gctINT Width,
+ IN gctINT Height
+ );
+
+gceSTATUS
+gcoVG_EnableDither(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctBOOL Enable
+ );
+
+/* Color Key States. */
+gceSTATUS
+gcoVG_SetColorKey(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gcsPROFILERFUNCNODE *DList,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctUINT32* Values,
+ IN gctBOOL * Enables
+);
+
+/* Index Color States. */
+gceSTATUS
+gcoVG_SetColorIndexTable(
+ IN gcoVG Vg,
+#if gcdGC355_PROFILER
+ IN gcsPROFILERFUNCNODE *DList,
+ IN gctUINT TreeDepth,
+ IN gctUINT saveLayerTreeDepth,
+ IN gctUINT varTreeDepth,
+#endif
+ IN gctUINT32* Values,
+ IN gctINT32 Count
+);
+
+gceSTATUS
+gcoVG_SetYUV2RGBStdCust(
+ IN gcoVG Vg,
+ IN gctBOOL YUV2RGBStdCust
+ );
+
+gceSTATUS
+gcoVG_SetYUV2RGB(
+ IN gcoVG Vg,
+ IN gctFLOAT *coef,
+ IN gctFLOAT *offset,
+ IN gctBOOL *cfg
+);
+
+gceSTATUS
+gcoVG_SetRGB2YUVParameters(
+ IN gcoVG Vg,
+ IN gctFLOAT *coef,
+ IN gctFLOAT *offset,
+ IN gctBOOL *cfg
+);
+
+/* VG RS feature support: YUV format conversion. */
+gceSTATUS
+gcoVG_Resolve(
+ IN gcoVG Vg,
+ IN gcoSURF Source,
+ IN gcoSURF Target,
+ IN gctINT SX,
+ IN gctINT SY,
+ IN gctINT DX,
+ IN gctINT DY,
+ IN gctINT Width,
+ IN gctINT Height,
+ IN gctINT Src_uv,
+ IN gctINT Src_standard,
+ IN gctINT Dst_uv,
+ IN gctINT Dst_standard,
+ IN gctINT Dst_alpha,
+ IN gctBOOL Dst_standard_cust
+);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_vg_h_ */
+
+
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
new file mode 100644
index 000000000000..34ff83df9f95
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_enum.h
@@ -0,0 +1,2409 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_enum_h_
+#define __gc_hal_enum_h_
+
+#include "gc_hal_options.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Chip models. */
+typedef enum _gceCHIPMODEL
+{
+ gcv200 = 0x0200,
+ gcv300 = 0x0300,
+ gcv320 = 0x0320,
+ gcv328 = 0x0328,
+ gcv350 = 0x0350,
+ gcv355 = 0x0355,
+ gcv400 = 0x0400,
+ gcv410 = 0x0410,
+ gcv420 = 0x0420,
+ gcv428 = 0x0428,
+ gcv450 = 0x0450,
+ gcv500 = 0x0500,
+ gcv520 = 0x0520,
+ gcv530 = 0x0530,
+ gcv600 = 0x0600,
+ gcv620 = 0x0620,
+ gcv700 = 0x0700,
+ gcv800 = 0x0800,
+ gcv860 = 0x0860,
+ gcv880 = 0x0880,
+ gcv900 = 0x0900,
+ gcv1000 = 0x1000,
+ gcv1500 = 0x1500,
+ gcv2000 = 0x2000,
+ gcv2100 = 0x2100,
+ gcv2200 = 0x2200,
+ gcv2500 = 0x2500,
+ gcv3000 = 0x3000,
+ gcv4000 = 0x4000,
+ gcv5000 = 0x5000,
+ gcv5200 = 0x5200,
+ gcv6400 = 0x6400,
+ gcv7000 = 0x7000,
+ gcv7400 = 0x7400,
+ gcv8000 = 0x8000,
+}
+gceCHIPMODEL;
+
+/* Chip features. */
+typedef enum _gceFEATURE
+{
+ gcvFEATURE_PIPE_2D = 0,
+ gcvFEATURE_PIPE_3D,
+ gcvFEATURE_PIPE_VG,
+ gcvFEATURE_DC,
+ gcvFEATURE_HIGH_DYNAMIC_RANGE,
+ gcvFEATURE_MODULE_CG,
+ gcvFEATURE_MIN_AREA,
+ gcvFEATURE_BUFFER_INTERLEAVING,
+ gcvFEATURE_BYTE_WRITE_2D,
+ gcvFEATURE_ENDIANNESS_CONFIG,
+ gcvFEATURE_DUAL_RETURN_BUS,
+ gcvFEATURE_DEBUG_MODE,
+ gcvFEATURE_YUY2_RENDER_TARGET,
+ gcvFEATURE_FRAGMENT_PROCESSOR,
+ gcvFEATURE_2DPE20,
+ gcvFEATURE_FAST_CLEAR,
+ gcvFEATURE_YUV420_TILER,
+ gcvFEATURE_YUY2_AVERAGING,
+ gcvFEATURE_FLIP_Y,
+ gcvFEATURE_EARLY_Z,
+ gcvFEATURE_COMPRESSION,
+ gcvFEATURE_MSAA,
+ gcvFEATURE_SPECIAL_ANTI_ALIASING,
+ gcvFEATURE_SPECIAL_MSAA_LOD,
+ gcvFEATURE_422_TEXTURE_COMPRESSION,
+ gcvFEATURE_DXT_TEXTURE_COMPRESSION,
+ gcvFEATURE_ETC1_TEXTURE_COMPRESSION,
+ gcvFEATURE_CORRECT_TEXTURE_CONVERTER,
+ gcvFEATURE_TEXTURE_8K,
+ gcvFEATURE_SCALER,
+ gcvFEATURE_YUV420_SCALER,
+ gcvFEATURE_SHADER_HAS_W,
+ gcvFEATURE_SHADER_HAS_SIGN,
+ gcvFEATURE_SHADER_HAS_FLOOR,
+ gcvFEATURE_SHADER_HAS_CEIL,
+ gcvFEATURE_SHADER_HAS_SQRT,
+ gcvFEATURE_SHADER_HAS_TRIG,
+ gcvFEATURE_HZ,
+ gcvFEATURE_CORRECT_STENCIL,
+ gcvFEATURE_VG20,
+ gcvFEATURE_VG_FILTER,
+ gcvFEATURE_VG21,
+ gcvFEATURE_VG_DOUBLE_BUFFER,
+ gcvFEATURE_VG_RESOLUTION_8K,
+ gcvFEATURE_MC20,
+ gcvFEATURE_SUPER_TILED,
+ gcvFEATURE_FAST_CLEAR_FLUSH,
+ gcvFEATURE_2D_FILTERBLIT_PLUS_ALPHABLEND,
+ gcvFEATURE_2D_DITHER,
+ gcvFEATURE_2D_A8_TARGET,
+ gcvFEATURE_2D_A8_NO_ALPHA,
+ gcvFEATURE_2D_FILTERBLIT_FULLROTATION,
+ gcvFEATURE_2D_BITBLIT_FULLROTATION,
+ gcvFEATURE_WIDE_LINE,
+ gcvFEATURE_FC_FLUSH_STALL,
+ gcvFEATURE_FULL_DIRECTFB,
+ gcvFEATURE_HALF_FLOAT_PIPE,
+ gcvFEATURE_LINE_LOOP,
+ gcvFEATURE_2D_YUV_BLIT,
+ gcvFEATURE_2D_TILING,
+ gcvFEATURE_NON_POWER_OF_TWO,
+ gcvFEATURE_3D_TEXTURE,
+ gcvFEATURE_TEXTURE_ARRAY,
+ gcvFEATURE_TILE_FILLER,
+ gcvFEATURE_LOGIC_OP,
+ gcvFEATURE_MIXED_STREAMS,
+ gcvFEATURE_2D_MULTI_SOURCE_BLT,
+ gcvFEATURE_END_EVENT,
+ gcvFEATURE_VERTEX_10_10_10_2,
+ gcvFEATURE_TEXTURE_10_10_10_2,
+ gcvFEATURE_TEXTURE_ANISOTROPIC_FILTERING,
+ gcvFEATURE_TEXTURE_FLOAT_HALF_FLOAT,
+ gcvFEATURE_2D_ROTATION_STALL_FIX,
+ gcvFEATURE_2D_MULTI_SOURCE_BLT_EX,
+ gcvFEATURE_BUG_FIXES10,
+ gcvFEATURE_2D_MINOR_TILING,
+ gcvFEATURE_TEX_COMPRRESSION_SUPERTILED, /* Supertiled compressed textures are supported. */
+ gcvFEATURE_FAST_MSAA,
+ gcvFEATURE_BUG_FIXED_INDEXED_TRIANGLE_STRIP,
+ gcvFEATURE_TEXTURE_TILE_STATUS_READ,
+ gcvFEATURE_DEPTH_BIAS_FIX,
+ gcvFEATURE_RECT_PRIMITIVE,
+ gcvFEATURE_BUG_FIXES11,
+ gcvFEATURE_SUPERTILED_TEXTURE,
+ gcvFEATURE_2D_NO_COLORBRUSH_INDEX8,
+ gcvFEATURE_RS_YUV_TARGET,
+ gcvFEATURE_2D_FC_SOURCE, /* For tilestatus compression feature*/
+ gcvFEATURE_2D_CC_NOAA_SOURCE,
+ gcvFEATURE_PE_DITHER_FIX,
+ gcvFEATURE_2D_YUV_SEPARATE_STRIDE,
+ gcvFEATURE_FRUSTUM_CLIP_FIX,
+ gcvFEATURE_TEXTURE_SWIZZLE,
+ gcvFEATURE_PRIMITIVE_RESTART,
+ gcvFEATURE_TEXTURE_LINEAR,
+ gcvFEATURE_TEXTURE_YUV_ASSEMBLER,
+ gcvFEATURE_LINEAR_RENDER_TARGET,
+ gcvFEATURE_SHADER_HAS_ATOMIC,
+ gcvFEATURE_SHADER_HAS_INSTRUCTION_CACHE,
+ gcvFEATURE_SHADER_ENHANCEMENTS2,
+ gcvFEATURE_BUG_FIXES7,
+ gcvFEATURE_SHADER_HAS_RTNE,
+ gcvFEATURE_SHADER_HAS_EXTRA_INSTRUCTIONS2,
+ gcvFEATURE_SHADER_ENHANCEMENTS3,
+ gcvFEATURE_DYNAMIC_FREQUENCY_SCALING,
+ gcvFEATURE_SINGLE_BUFFER,
+ gcvFEATURE_OCCLUSION_QUERY,
+ gcvFEATURE_2D_GAMMA,
+ gcvFEATURE_2D_COLOR_SPACE_CONVERSION,
+ gcvFEATURE_2D_SUPER_TILE_VERSION,
+ gcvFEATURE_HALTI0,
+ gcvFEATURE_HALTI1,
+ gcvFEATURE_HALTI2,
+ gcvFEATURE_SUPPORT_GCREGTX,
+ gcvFEATURE_2D_MIRROR_EXTENSION,
+ gcvFEATURE_TEXTURE_ASTC,
+ gcvFEATURE_TEXTURE_ASTC_DECODE_FIX,
+ gcvFEATURE_TEXTURE_ASTC_BASE_LOD_FIX,
+ gcvFEATURE_2D_SUPER_TILE_V1,
+ gcvFEATURE_2D_SUPER_TILE_V2,
+ gcvFEATURE_2D_SUPER_TILE_V3,
+ gcvFEATURE_2D_MULTI_SOURCE_BLT_EX2,
+ gcvFEATURE_NEW_RA,
+ gcvFEATURE_BUG_FIXED_IMPLICIT_PRIMITIVE_RESTART,
+ gcvFEATURE_PE_MULTI_RT_BLEND_ENABLE_CONTROL,
+ gcvFEATURE_SMALL_MSAA, /* An upgraded version of Fast MSAA */
+ gcvFEATURE_VERTEX_INST_ID_AS_ATTRIBUTE,
+ gcvFEATURE_DUAL_16,
+ gcvFEATURE_BRANCH_ON_IMMEDIATE_REG,
+ gcvFEATURE_2D_COMPRESSION,
+ gcvFEATURE_TPC_COMPRESSION,
+ gcvFEATURE_TPCV11_COMPRESSION,
+ gcvFEATURE_DEC_COMPRESSION,
+ gcvFEATURE_DEC300_COMPRESSION,
+ gcvFEATURE_DEC400_COMPRESSION,
+ gcvFEATURE_DEC_TPC_COMPRESSION,
+ gcvFEATURE_DEC_COMPRESSION_TILE_NV12_8BIT,
+ gcvFEATURE_DEC_COMPRESSION_TILE_NV12_10BIT,
+ gcvFEATURE_2D_OPF_YUV_OUTPUT,
+ gcvFEATURE_2D_FILTERBLIT_A8_ALPHA,
+ gcvFEATURE_2D_MULTI_SRC_BLT_TO_UNIFIED_DST_RECT,
+ gcvFEATURE_2D_MULTI_SRC_BLT_BILINEAR_FILTER,
+ gcvFEATURE_2D_MULTI_SRC_BLT_1_5_ENHANCEMENT,
+ gcvFEATURE_V2_COMPRESSION_Z16_FIX,
+ gcvFEATURE_VERTEX_INST_ID_AS_INTEGER,
+ gcvFEATURE_2D_YUV_MODE,
+ gcvFEATURE_2D_CACHE_128B256BPERLINE,
+ gcvFEATURE_2D_SEPARATE_CACHE,
+ gcvFEATURE_2D_MAJOR_SUPER_TILE,
+ gcvFEATURE_2D_V4COMPRESSION,
+ gcvFEATURE_2D_VMSAA,
+ gcvFEATURE_2D_10BIT_OUTPUT_LINEAR,
+ gcvFEATURE_2D_YUV420_OUTPUT_LINEAR,
+ gcvFEATURE_ACE,
+ gcvFEATURE_COLOR_COMPRESSION,
+ gcvFEATURE_32BPP_COMPONENT_TEXTURE_CHANNEL_SWIZZLE,
+ gcvFEATURE_64BPP_HW_CLEAR_SUPPORT,
+ gcvFEATURE_TX_LERP_PRECISION_FIX,
+ gcvFEATURE_COMPRESSION_V2,
+ gcvFEATURE_MMU,
+ gcvFEATURE_COMPRESSION_V3,
+ gcvFEATURE_TX_DECOMPRESSOR,
+ gcvFEATURE_MRT_TILE_STATUS_BUFFER,
+ gcvFEATURE_COMPRESSION_V1,
+ gcvFEATURE_V1_COMPRESSION_Z16_DECOMPRESS_FIX,
+ gcvFEATURE_RTT,
+ gcvFEATURE_GENERIC_ATTRIB,
+ gcvFEATURE_2D_ONE_PASS_FILTER,
+ gcvFEATURE_2D_ONE_PASS_FILTER_TAP,
+ gcvFEATURE_2D_POST_FLIP,
+ gcvFEATURE_2D_PIXEL_ALIGNMENT,
+ gcvFEATURE_CORRECT_AUTO_DISABLE_COUNT,
+ gcvFEATURE_CORRECT_AUTO_DISABLE_COUNT_WIDTH,
+ gcvFEATURE_8K_RT,
+ gcvFEATURE_HALTI3,
+ gcvFEATURE_EEZ,
+ gcvFEATURE_INTEGER_SIGNEXT_FIX,
+ gcvFEATURE_PSOUTPUT_MAPPING,
+ gcvFEATURE_8K_RT_FIX,
+ gcvFEATURE_TX_TILE_STATUS_MAPPING,
+ gcvFEATURE_SRGB_RT_SUPPORT,
+ gcvFEATURE_TEXTURE_16K,
+ gcvFEATURE_PA_FARZCLIPPING_FIX,
+ gcvFEATURE_PE_DITHER_COLORMASK_FIX,
+ gcvFEATURE_ZSCALE_FIX,
+ gcvFEATURE_MULTI_PIXELPIPES,
+ gcvFEATURE_PIPE_CL,
+ gcvFEATURE_BUG_FIXES18,
+ gcvFEATURE_UNIFIED_SAMPLERS,
+ gcvFEATURE_CL_PS_WALKER,
+ gcvFEATURE_NEW_HZ,
+ gcvFEATURE_TX_FRAC_PRECISION_6BIT,
+ gcvFEATURE_SH_INSTRUCTION_PREFETCH,
+ gcvFEATURE_PROBE,
+ gcvFEATURE_SINGLE_PIPE_HALTI1,
+ gcvFEATURE_BUG_FIXES8, /* This HW feature is wrong, we can't use this to check integer branch!!!*/
+ gcvFEATURE_2D_ALL_QUAD,
+ gcvFEATURE_SEPARATE_SRC_DST,
+ gcvFEATURE_TX_HOR_ALIGN_SEL,
+ gcvFEATURE_HALTI4,
+ gcvFEATURE_MRT_FC_FIX,
+ gcvFEATURE_TESSELLATION,
+ gcvFEATURE_DRAW_INDIRECT,
+ gcvFEATURE_COMPUTE_INDIRECT,
+ gcvFEATURE_MSAA_TEXTURE,
+ gcvFEATURE_STENCIL_TEXTURE,
+ gcvFEATURE_S8_ONLY_RENDERING,
+ gcvFEATURE_D24S8_SAMPLE_STENCIL,
+ gcvFEATURE_ADVANCED_BLEND_MODE_PART0,
+ gcvFEATURE_RA_DEPTH_WRITE,
+ gcvFEATURE_RS_DS_DOWNSAMPLE_NATIVE_SUPPORT,
+ gcvFEATURE_S8_MSAA_COMPRESSION,
+ gcvFEATURE_MSAA_FRAGMENT_OPERATION,
+ gcvFEATURE_FE_START_VERTEX_SUPPORT,
+ gcvFEATURE_DIVISOR_STREAM_ADDR_FIX,
+ gcvFEATURE_ZERO_ATTRIB_SUPPORT,
+ gcvFEATURE_DANGLING_VERTEX_FIX,
+ gcvFEATURE_PE_DISABLE_COLOR_PIPE,
+ gcvFEATURE_FE_12bit_stride,
+ gcvFEATURE_TX_LOD_GUARDBAND,
+ gcvFEATURE_HAS_PRODUCTID,
+ gcvFEATURE_INTEGER32_FIX,
+ gcvFEATURE_TEXTURE_GATHER,
+ gcvFEATURE_IMG_INSTRUCTION,
+ gcvFEATURE_HELPER_INVOCATION,
+ gcvFEATURE_NO_USER_CSC,
+ gcvFEATURE_ANDROID_ONLY,
+ gcvFEATURE_V2_MSAA_COHERENCY_FIX,
+ gcvFEATURE_BLOCK_SIZE_16x16,
+ gcvFEATURE_TX_SUPPORT_DEC,
+ gcvFEATURE_RSBLT_MSAA_DECOMPRESSION,
+ gcvFEATURE_TILEFILLER_32TILE_ALIGNED,
+ gcvFEATURE_GEOMETRY_SHADER,
+ gcvFEATURE_HALTI5,
+ gcvFEATURE_PIPELINE_32_ATTRIBUTES,
+ gcvFEATURE_USC,
+ gcvFEATURE_CUBEMAP_ARRAY,
+ gcvFEATURE_TX_DESCRIPTOR,
+ gcvFEATURE_SEPARATE_RT_CTRL,
+ gcvFEATURE_RENDER_ARRAY,
+ gcvFEATURE_BLT_ENGINE,
+ gcvFEATURE_TEXTURE_BUFFER,
+ gcvFEATURE_GS_SUPPORT_EMIT,
+ gcvFEATURE_SAMPLER_BASE_OFFSET,
+ gcvFEATURE_IMAGE_OUT_BOUNDARY_FIX,
+ gcvFEATURE_TX_BORDER_CLAMP,
+ gcvFEATURE_MSAA_SHADING,
+ gcvFEATURE_ADVANCED_SH_INST,
+ gcvFEATURE_LOD_FIX_FOR_BASELEVEL,
+ gcvFEATURE_MULTIDRAW_INDIRECT,
+ gcvFEATURE_DRAW_ELEMENTS_BASE_VERTEX,
+ gcvFEATURE_NEW_STEERING_AND_ICACHE_FLUSH, /* Steering base on register base. Trigger-style Icache flush state. */
+ gcvFEATURE_PE_DITHER_FIX2,
+ gcvFEATURE_INDEX_FETCH_FIX,
+ gcvFEATURE_TEX_BASELOD,
+ gcvFEATURE_TEX_SEAMLESS_CUBE,
+ gcvFEATURE_TEX_ETC2,
+ gcvFEATURE_TEX_CUBE_BORDER_LOD,
+ gcvFEATURE_FE_ALLOW_STALL_PREFETCH_ENG,
+ gcvFEATURE_TX_8BPP_TS_FIX,
+ gcvFEATURE_HW_TFB,
+ gcvFEATURE_COMPRESSION_V4,
+ gcvFEATURE_FENCE_32BIT,
+ gcvFEATURE_FENCE_64BIT,
+ gcvFEATURE_R8_UNORM,
+ gcvFEATURE_TX_DEFAULT_VALUE_FIX,
+ gcvFEATURE_TX_8bit_UVFrac,
+ gcvFEATURE_TX_MIPFILTER_NONE_FIX,
+ gcvFEATURE_MC_STENCIL_CTRL,
+ gcvFEATURE_DEPTH_MATH_FIX,
+ gcvFEATURE_PE_B2B_PIXEL_FIX,
+ gcvFEATURE_TEXTURE_GATHER_OFFSETS,
+ gcvFEATURE_TEX_CACHE_FLUSH_FIX,
+ gcvFEATURE_WIDELINE_HELPER_FIX,
+ gcvFEATURE_LINE_DIAMOND_RULE_FIX,
+ gcvFEATURE_MULTIGPU_SYNC_V2,
+ gcvFEATURE_DRAW_ID,
+ gcvFEATURE_SNAPPAGE_CMD,
+ gcvFEATURE_COMMAND_PREFETCH,
+ gcvFEATURE_SAMPLEPOS_SWIZZLE_FIX,
+ gcvFEATURE_SELECTMAP_SRC0_SWIZZLE_FIX,
+ gcvFEATURE_LOADATTR_OOB_FIX,
+ gcvFEATURE_RA_DEPTH_WRITE_MSAA1X_FIX,
+ gcvFEATURE_MRT_8BIT_DUAL_PIPE_FIX,
+ gcvFEATURE_BUG_FIXES1,
+ gcvFEATURE_MULTI_SOURCE_BLT,
+ gcvFEATURE_ZCOMPRESSION,
+ gcvFEATURE_DITHER_AND_FILTER_PLUS_ALPHA_2D,
+ gcvFEATURE_ONE_PASS_2D_FILTER,
+ gcvFEATURE_TX_FILTER,
+ gcvFEATURE_CHIPENABLE_LINK,
+ gcvFEATURE_TEXTURE_BIAS_LOD_FIX,
+ gcvFEATURE_USE_GL_Z,
+ gcvFEATURE_SUPPORT_INTEGER,
+ /* PARTLY_SUPPORT_INTEGER_BRANCH:
+ ** chips can support all integer types for compare instructions, e.g, CMP, SELECT.
+ ** FULLLY_SUPPORT_INTEGER_BRANCH:
+ ** chips can support all integer types for JMP instruction.
+ ** If PARTLY_SUPPORT_INTEGER_BRANCH is TRUE but FULLLY_SUPPORT_INTEGER_BRANCH is FALSE,
+ ** then this chip can only support INT32/UINT32 JMP instruction.
+ */
+ gcvFEATURE_PARTLY_SUPPORT_INTEGER_BRANCH,
+ gcvFEATURE_FULLLY_SUPPORT_INTEGER_BRANCH,
+ gcvFEATURE_SUPPORT_INTEGER_ATTRIBUTE,
+ gcvFEATURE_SUPPORT_MOVAI,
+ gcvFEATURE_NEED_FIX_FOR_CL_X,
+ gcvFEATURE_NEED_FIX_FOR_CL_XE,
+ gcvFEATURE_HAS_OUTPUT_COUNT_FIX,
+ gcvFEATURE_VARYING_PACKING_LIMITATION,
+ gcvFEATURE_HIGHP_VARYING_SHIFT,
+ gcvFEATURE_BUG_FIXES2,
+ gcvFEATURE_64K_L2_CACHE,
+ gcvFEATURE_128BTILE,
+ gcvFEATURE_ADVANCED_BLEND_OPT,
+ gcvFEATURE_SNAPPAGE_CMD_FIX,
+ gcvFEATURE_L2_CACHE_FOR_2D_420,
+ gcvFEATURE_TILE_STATUS_2BITS,
+ gcvFEATURE_EXTRA_SHADER_INSTRUCTIONS0,
+ gcvFEATURE_EXTRA_SHADER_INSTRUCTIONS1,
+ gcvFEATURE_EXTRA_SHADER_INSTRUCTIONS2,
+ gcvFEATURE_MEDIUM_PRECISION,
+ gcvFEATURE_FE20_BIT_INDEX,
+ gcvFEATURE_BUG_FIXES4,
+ gcvFEATURE_BUG_FIXES12,
+ gcvFEATURE_VMSAA,
+ gcvFEATURE_ROBUST_ATOMIC,
+ gcvFEATURE_32F_COLORMASK_FIX,
+ gcvFEATURE_NEW_GPIPE,
+ gcvFEATURE_RS_NEW_BASEADDR,
+ gcvFEATURE_TX_DXT,
+ gcvFEATURE_SH_FLAT_INTERPOLATION_DUAL16_FIX,
+ gcvFEATURE_EVIS,
+ gcvFEATURE_SH_SUPPORT_V4,
+ gcvFEATURE_SH_SUPPORT_ALPHA_KILL,
+ gcvFEATURE_PE_NO_ALPHA_TEST,
+ gcvFEATURE_SH_SNAP2PAGE_MAXPAGES_FIX,
+ gcvFEATURE_USC_FULLCACHE_FIX,
+ gcvFEATURE_PE_64bit_FENCE_FIX,
+ gcvFEATURE_BLT_8bit_256TILE_FC_FIX,
+ gcvFEATURE_PE_RGBA16I_FIX,
+ gcvFEATURE_BLT_64bpp_MASKED_CLEAR_FIX,
+ gcvFEATURE_SH_PSO_MSAA1x_FIX,
+ gcvFEATURE_USC_ATOMIC_FIX,
+ gcvFEATURE_INDEX_CONST_ON_B0,
+ gcvFEATURE_SH_NO_ONECONST_LIMIT,
+ gcvFEATURE_EVIS_NO_ABSDIFF,
+ gcvFEATURE_EVIS_NO_BITREPLACE,
+ gcvFEATURE_EVIS_NO_BOXFILTER,
+ gcvFEATURE_EVIS_NO_CORDIAC,
+ gcvFEATURE_EVIS_NO_DP32,
+ gcvFEATURE_EVIS_NO_FILTER,
+ gcvFEATURE_EVIS_NO_IADD,
+ gcvFEATURE_EVIS_NO_SELECTADD,
+ gcvFEATURE_EVIS_LERP_7OUTPUT,
+ gcvFEATURE_EVIS_ACCSQ_8OUTPUT,
+ gcvFEATURE_ROBUSTNESS,
+ gcvFEATURE_SECURITY,
+ gcvFEATURE_TX_YUV_ASSEMBLER_10BIT,
+ gcvFEATURE_USC_GOS_ADDR_FIX,
+ gcvFEATURE_SUPPORT_MSAA2X,
+ gcvFEATURE_TX_DESC_CACHE_CLOCKGATE_FIX,
+ gcvFEATURE_TX_INTEGER_COORDINATE,
+ gcvFEATURE_PSIO_SAMPLEMASK_IN_R0ZW_FIX,
+ gcvFEATURE_MULTI_CORE_BLOCK_SET_CONFIG,
+ gcvFEATURE_SH_IMG_LDST_ON_TEMP,
+ gcvFEATURE_TX_INTEGER_COORDINATE_V2,
+ gcvFEATURE_COMPUTE_ONLY,
+ gcvFEATURE_SH_IMG_LDST_CLAMP,
+ gcvFEATURE_SH_ICACHE_ALLOC_COUNT_FIX,
+ gcvFEATURE_MSAA_OQ_FIX,
+ gcvFEATURE_PE_ENHANCEMENTS2,
+ gcvFEATURE_PSIO_MSAA_CL_FIX,
+ gcvFEATURE_FE_NEED_DUMMYDRAW,
+ gcvFEATURE_MULTI_CLUSTER,
+ gcvFEATURE_PSIO_INTERLOCK,
+ gcvFEATURE_BLIT_COMPRESS_DEST,
+ gcvFEATURE_SH_MULTI_WG_PACK,
+ gcvFEATURE_FE_ROBUST_FIX,
+ gcvFEATURE_TX_ASTC_MULTISLICE_FIX,
+ gcvFEATURE_PSIO_DUAL16_32bpc_FIX,
+ gcvFEATURE_LS_SUPPORT_PER_COMP_DEPENDENCY,
+ gcvFEATURE_COMPRESSION_DEC400,
+ gcvFEATURE_SH_TEXLD_U_FIX,
+ gcvFEATURE_TX_FLUSH_L1CACHE,
+ gcvFEATURE_USC_DEFER_FILL_FIX,
+ gcvFEATURE_MC_FCCACHE_BYTEMASK,
+ gcvFEATURE_SH_MULTI_WG_PACK_FIX,
+ gcvFEATURE_FE_PATCHLIST_FETCH_FIX,
+ gcvFEATURE_RA_CG_FIX,
+ gcvFEATURE_EVIS_VX2,
+ gcvFEATURE_SH_HALF_DEPENDENCY_FIX,
+ gcvFEATURE_FE_BASEINSTANCE,
+ gcvFEATURE_FE_COMPUREINDIRECT_SKIP_UNIFORM,
+ gcvFEATURE_SH_CLOCK_GATE_FIX,
+ gcvFEATURE_GPIPE_CLOCK_GATE_FIX,
+ gcvFEATURE_TP_ENGINE,
+ gcvFEATURE_TX_BORDER_CLAMP_FIX,
+ gcvFEATURE_SH_IMAGE_LD_LAST_PIXEL_FIX,
+ gcvFEATURE_MULTI_CORE_BLOCK_SET_CONFIG2,
+ gcvFEATURE_MULTIGPU_SYNC_V3,
+ gcvFEATURE_PE_VMSAA_COVERAGE_CACHE_FIX,
+ gcvFEATURE_SECURITY_AHB,
+ gcvFEATURE_TX_LERP_LESS_BIT,
+ gcvFEATURE_SMALL_BATCH,
+ gcvFEATURE_SH_IDIV0_SWZL_EHS,
+ gcvFEATURE_SH_CMPLX,
+ gcvFEATURE_VIP_V7,
+ gcvFEATURE_SH_GM_ENDIAN,
+ gcvFEATURE_SH_GM_USC_UNALLOC,
+ gcvFEATURE_SH_END_OF_BB,
+ gcvFEATURE_ASYNC_BLIT,
+ gcvFEATURE_ASYNC_FE_FENCE_FIX,
+ gcvFEATURE_PSCS_THROTTLE,
+ gcvFEATURE_SEPARATE_LS,
+ gcvFEATURE_PA_VARYING_COMPONENT_TOGGLE_FIX,
+ gcvFEATURE_TX_MULTISAMPLER_FC_FIX,
+ gcvFEATURE_WIDELINE_TRIANGLE_EMU,
+ gcvFEATURE_FENCE,
+ gcvFEATURE_MCFE,
+ gcvFEATURE_NN_INTERLEAVE8,
+ gcvFEATURE_TP_REORDER,
+ gcvFEATURE_TP_RTNE,
+ gcvFEATURE_TP_LRN,
+ gcvFEATURE_TP_ROI_POOLING,
+ gcvFEATURE_TP_MAX_POOLING_STRIDE1,
+ gcvFEATURE_NN_BRICK_MODE,
+ gcvFEATURE_NN_BORDER_MODE,
+ gcvFEATURE_NN_FP16_ALU,
+ gcvFEATURE_NN_BF16_ALU,
+ gcvFEATURE_NN_INT16_ALU,
+ gcvFEATURE_NN_ZDP3,
+ gcvFEATURE_NN_ZDP6,
+ gcvFEATURE_PE_DEPTH_ONLY_OQFIX,
+ gcvFEATURE_TX_SNORM_SUPPORT,
+ gcvFEATURE_HWMANAGED_LS,
+ gcvFEATURE_SH_SCATTER_GATHER,
+ gcvFEATURE_NN_POWER_ISOLATION,
+ gcvFEATURE_SWTILING_PHASE1,
+ gcvFEATURE_SWTILING_PHASE2,
+ gcvFEATURE_SWTILING_PHASE3,
+ gcvFEATURE_TF_QUANTIZATION,
+ gcvFEATURE_NN_XYDP9,
+ gcvFEATURE_TP_SIMPLE_INT16,
+ gcvFEATURE_TP_REAL_INT16,
+ gcvFEATURE_NN_FIRST_PIXEL_POOLING,
+ gcvFEATURE_NN_STRIDE_SUPPORT,
+ gcvFEATURE_NN_XYDP6,
+ gcvFEATURE_NN_XYDP0,
+ gcvFEATURE_TP_REORDER_FIX,
+ gcvFEATURE_NN_CONV1x1_PERF_FIX,
+ gcvFEATURE_NN_CACHELINE_MODE_PERF_FIX,
+ gcvFEATURE_NN_PER3DTILE_BUBBLE_FIX,
+ gcvFEATURE_SH_IO_CG_FIX,
+ gcvFEATURE_USC_STAY_LRU,
+ gcvFEATURE_NN_NONZERO_MIRROR_BORDER,
+ gcvFEATURE_NN_COEF_DECOMPRESS_PERF2X,
+ gcvFEATURE_4BIT_INPUT,
+ gcvFEATURE_COEF_COMPRESSION_ENHANCEMENT,
+ gcvFEATURE_NN_ZDP3_NO_COMPRESS_FIX,
+ gcvFEATURE_NN_ASYNC_COPY_PERF_FIX,
+ gcvFEATURE_OCB_COUNTER,
+ gcvFEATURE_NN_ZXDP3_KERNEL_READ_CONFLICT_FIX,
+ gcvFEATURE_NN_FULLCACHE_KERNEL_INTERLEAVE_FIX,
+ gcvFEATURE_DR_JD_DIFF_CONDITION_FOR_CACHELINE_MODE_PRE_FIX,
+ gcvFEATURE_USC_BOTTLENECK_FIX,
+ gcvFEATURE_OCB_REMAP_PHYSICAL_ADDRESS,
+ gcvFEATURE_NN_SLICE_PADDING_TO_64BYTE_ALIGN,
+ gcvFEATURE_NN_DW_1x1_CONV_MERGE,
+ gcvFEATURE_TP_REORDER_LAYER_SUSPEND_FIX,
+ gcvFEATURE_KERNEL_VIP_SRAM_READ_BW_LIMITATION_FIX,
+ gcvFEATURE_IMG_POP_PIPELINE_PAUSE_FIX,
+ gcvFEATURE_NN_SLOW_OUTPUT,
+ gcvFEATURE_NO_NARROW_POST_PROCESS_PIPE,
+ gcvFEATURE_TP_NN_PROBE,
+ gcvFEATURE_TP_23BITS_POST_MULTIPLIER,
+ gcvFEATURE_NN_TRANSPOSE,
+ gcvFEATURE_OUTIMAGE_X_BITWIDTH_LIMIT_FOR_NN_TRANSPOSE_FIX,
+ gcvFEATURE_TP_BFLOAT16,
+ gcvFEATURE_EVIS2_FLOP_RESET_FIX,
+ gcvFEATURE_USC_ASYNC_CP_RTN_FLOP_RESET_FIX,
+ gcvFEATURE_USC_EVICT_CTRL_FIFO_FLOP_RESET_FIX,
+
+ gcvFEATURE_IMAGE_LS_NO_FULLMASK_FIX,
+ gcvFEATURE_BLT_YUV_OUTPUT,
+ gcvFEATURE_PE_TILE_CACHE_FLUSH_FIX,
+ gcvFEATURE_SH_ROBUSTNESS_FIX,
+ gcvFEATURE_USC_ATOMIC_FIX2,
+ gcvFEATURE_MULTIVIEW_RENDER,
+ gcvFEATURE_FE_DRAW_DIRECT,
+ gcvFEATURE_TX_VKBORDER_MODE,
+ gcvFEATURE_TX_UNNORMALIZED_COORD,
+ gcvFEATURE_VG_IMAGE_16K,
+ gcvFEATURE_MULTICORE_CONFIG,
+ gcvFEATURE_PA_LINECLIP_FIX,
+ gcvFEATURE_NN_ENGINE,
+ gcvFEATURE_NN_ASYNC_COPY_MERGE_FIX,
+ gcvFEATURE_NN_CONVOUT_FIFO_DEPTH_FIX,
+ gcvFEATURE_NN_SMALLBATCH_PHASE1,
+ gcvFEATURE_TP_SMALLBATCH_PHASE1,
+ gcvFEATURE_VIP_SCALER,
+ gcvFEATURE_TX_8bit_UVFrac_ROUNDING_FIX,
+ gcvFEATURE_NN_REQ_SLOWARBITRATION_FIX,
+ gcvFEATUER_IMAGE_PARTIAL_CACHE,
+ gcvFEATURE_FULLCACHE_KERNELHEAD_FIX,
+ gcvFEATURE_NN_SINGLEPORT_ACCUMBUFFER,
+ gcvFEATURE_NN_SMALLBATCH,
+ gcvFEATURE_TP_SMALLBATCH,
+ gcvFEATURE_NN_ZDP_INIMAGE_SIZE_FIX,
+ gcvFEATURE_HI_REORDER_FIX,
+ gcvFEATURE_TP_COEF_COMPRESSION_ENHANCEMENT,
+ gcvFEATURE_NN_DEPTHWISE_SUPPORT,
+ gcvFEATURE_IMAGE_NOT_PACKED_IN_SRAM_FIX,
+ gcvFEATURE_IDLE_BEFORE_FLUSH_COMPLETE_FIX,
+ gcvFEATURE_NO_FLUSH_USC_FIX,
+ gcvFEATURE_COEF_DELTA_CORD_OVERFLOW_ZRL_8BIT_FIX,
+ gcvFEATURE_XY_OFFSET_LIMITATION_FIX,
+ gcvFEATURE_USC_INVALIDATE_CACHE_LINE_FIX,
+ gcvFEATURE_LOW_EFFICIENCY_OF_ID_WRITE_IMGBUF_FIX,
+ gcvFEATURE_KERNEL_PER_CORE_LESS_THAN_THIRD_COEF_BUFF_DEPTH_FIX,
+ gcvFEATURE_NN_PER_CHANNEL_POST_MULTIPLY,
+ gcvFEATURE_NN_NO_Z_LOCATION_OFFSET,
+ gcvFEATURE_NN_PRELU,
+ gcvFEATURE_NN_KERNEL_SIZE_WASTE_IN_PARTIAL_MODE_FIX,
+ gcvFEATURE_INCORRECT_WR_REQ_TO_USC_BETWEEN_REORDER_AND_NORMAL_LAYER_FIX,
+ gcvFEATURE_VIP_DEC400,
+ gcvFEATURE_MAX_POINTSIZE_CLAMP,
+ gcvFEATURE_2D_FAST_CLEAR, /* For tilestatus Fast Clear feature*/
+
+ /* Insert features above this comment only. */
+ gcvFEATURE_COUNT /* Not a feature. */
+}
+gceFEATURE;
+
+/* dummy draw type.*/
+typedef enum _gceDUMMY_DRAW_TYPE
+{
+ gcvDUMMY_DRAW_INVALID = 0,
+ gcvDUMMY_DRAW_GC400,
+ gcvDUMMY_DRAW_V60,
+}
+gceDUMMY_DRAW_TYPE;
+
+/* Option Set*/
+typedef enum _gceOPTION
+{
+ /* HW setting. */
+ gcvOPTION_PREFER_ZCONVERT_BYPASS = 0,
+ gcvOPTION_PREFER_TILED_DISPLAY_BUFFER = 1,
+ gcvOPTION_PREFER_GUARDBAND = 2,
+ gcvOPTION_PREFER_TPG_TRIVIALMODEL = 3,
+ gcvOPTION_PREFER_RA_DEPTH_WRITE = 4,
+ gcvOPTION_PREFER_USC_RECONFIG = 5,
+ gcvOPTION_PREFER_DISALBE_HZ = 6,
+
+ /* SW options */
+ gcvOPTION_HW_NULL = 50,
+ gcvOPTION_PRINT_OPTION = 51,
+ gcvOPTION_KERNEL_FENCE = 52,
+ gcvOPTION_ASYNC_PIPE = 53,
+ gcvOPTION_FBO_PREFER_MEM = 54,
+ gcvOPTION_GPU_TEX_UPLOAD = 55,
+ gcvOPTION_GPU_BUFOBJ_UPLOAD = 56,
+ gcvOPTION_NO_Y_INVERT = 60,
+
+ /* OCL option */
+ gcvOPTION_OCL_ASYNC_BLT = 200,
+ gcvOPTION_OCL_IN_THREAD,
+ gcvOPTION_COMPRESSION_DEC400,
+ gcvOPTION_OCL_VIR_SHADER,
+ gcvOPTION_OCL_USE_MULTI_DEVICES,
+
+#if gcdUSE_VX
+ /* OVX options that HAL could access */
+ gcvOPTION_OVX_ENABLE_NN_ZDP3 = 500,
+ gcvOPTION_OVX_ENABLE_NN_ZDP6,
+ gcvOPTION_OVX_ENABLE_NN_STRIDE,
+ gcvOPTION_OVX_USE_MULTI_DEVICES,
+ gcvOPTION_OVX_ENABLE_NN_DDR_BURST_SIZE_256B,
+#endif
+ /* Insert option above this comment only */
+ gcvOPTION_COUNT /* Not a OPTION*/
+}
+gceOPTION;
+
+typedef enum _gceFRAMEINFO
+{
+ /* Total frame count in one run */
+ gcvFRAMEINFO_FRAME_NUM = 0,
+ /* Total draw count in current frame, including draw/compute */
+ gcvFRAMEINFO_DRAW_NUM = 1,
+ /* Total compute count in current frame, subset of drawNum */
+ gcvFRAMEINFO_COMPUTE_NUM = 2,
+ /* Total dual16 draw/compute count in current frame, subset of drawNum */
+ gcvFRAMEINFO_DUAL16_NUM = 3,
+ /* Current programID is being set. only valid for ES20 driver right now */
+ gcvFRAMEINFO_PROGRAM_ID = 4,
+
+ gcvFRAMEINFO_COUNT,
+}
+gceFRAMEINFO;
+
+typedef enum _gceFRAMEINFO_OP
+{
+ gcvFRAMEINFO_OP_INC = 0,
+ gcvFRAMEINFO_OP_DEC = 1,
+ gcvFRAMEINFO_OP_ZERO = 2,
+ gcvFRAMEINFO_OP_GET = 3,
+ gcvFRAMEINFO_OP_SET = 4,
+ gcvFRAMEINFO_OP_COUNT,
+}
+gceFRAMEINFO_OP;
+
+
+/* Chip Power Status. */
+typedef enum _gceCHIPPOWERSTATE
+{
+ gcvPOWER_INVALID = -1,
+
+ /* Global/base states. */
+ gcvPOWER_ON = 0,
+ gcvPOWER_IDLE,
+ gcvPOWER_SUSPEND,
+ gcvPOWER_OFF,
+
+ /* Power on but not global or broadcast. */
+ gcvPOWER_ON_AUTO,
+
+ /* Broadcast states. */
+ gcvPOWER_FLAG_BROADCAST = 0x10,
+ gcvPOWER_IDLE_BROADCAST = gcvPOWER_IDLE | gcvPOWER_FLAG_BROADCAST,
+ gcvPOWER_SUSPEND_BROADCAST = gcvPOWER_SUSPEND | gcvPOWER_FLAG_BROADCAST,
+ gcvPOWER_OFF_BROADCAST = gcvPOWER_OFF | gcvPOWER_FLAG_BROADCAST,
+
+
+ /* Timeout states. */
+ gcvPOWER_FLAG_TIMEOUT = 0x20,
+ gcvPOWER_IDLE_TIMEOUT = gcvPOWER_IDLE | gcvPOWER_FLAG_TIMEOUT,
+ gcvPOWER_SUSPEND_TIMEOUT = gcvPOWER_SUSPEND | gcvPOWER_FLAG_TIMEOUT,
+ gcvPOWER_OFF_TIMEOUT = gcvPOWER_OFF | gcvPOWER_FLAG_TIMEOUT,
+
+}
+gceCHIPPOWERSTATE;
+
+/* CPU cache operations */
+typedef enum _gceCACHEOPERATION
+{
+ gcvCACHE_CLEAN = 0x01, /* Flush CPU cache to mem */
+ gcvCACHE_INVALIDATE = 0x02, /* Invalidte CPU cache */
+ gcvCACHE_FLUSH = gcvCACHE_CLEAN | gcvCACHE_INVALIDATE, /* Both flush & invalidate */
+ gcvCACHE_MEMORY_BARRIER = 0x04
+}
+gceCACHEOPERATION;
+
+/* Surface types. */
+typedef enum _gceSURF_TYPE
+{
+ gcvSURF_TYPE_UNKNOWN = 0,
+ gcvSURF_INDEX,
+ gcvSURF_VERTEX,
+ gcvSURF_TEXTURE,
+ gcvSURF_RENDER_TARGET,
+ gcvSURF_DEPTH,
+ gcvSURF_BITMAP,
+ gcvSURF_TILE_STATUS,
+ gcvSURF_IMAGE,
+ gcvSURF_MASK,
+ gcvSURF_SCISSOR,
+ gcvSURF_HIERARCHICAL_DEPTH,
+ gcvSURF_ICACHE,
+ gcvSURF_TXDESC,
+ gcvSURF_FENCE,
+ gcvSURF_TFBHEADER,
+ gcvSURF_NUM_TYPES, /* Make sure this is the last one! */
+
+ /* Combinations. */
+ gcvSURF_CMA_LIMIT = 0x80000000,
+ gcvSURF_NO_TILE_STATUS = 0x100,
+ gcvSURF_NO_VIDMEM = 0x200, /* Used to allocate surfaces with no underlying vidmem node.
+ In Android, vidmem node is allocated by another process. */
+ gcvSURF_CACHEABLE = 0x400, /* Used to allocate a cacheable surface */
+ gcvSURF_TILE_RLV_FENCE = 0x800, /* create texture fence as tile */
+ gcvSURF_TILE_STATUS_DIRTY = 0x1000, /* Init tile status to all dirty */
+ gcvSURF_LINEAR = 0x2000,
+ gcvSURF_CREATE_AS_TEXTURE = 0x4000, /* create it as a texture */
+ gcvSURF_PROTECTED_CONTENT = 0x8000, /* create it as content protected */
+ gcvSURF_CREATE_AS_DISPLAYBUFFER = 0x10000, /*create it as a display buffer surface */
+ gcvSURF_CONTIGUOUS = 0x20000, /*create it as contiguous */
+ gcvSURF_NO_COMPRESSION = 0x40000, /* Create it as no compression, valid on when it has tile status. */
+ gcvSURF_DEC = 0x80000, /* Surface is DEC compressed */
+ gcvSURF_NO_HZ = 0x100000,
+ gcvSURF_3D = 0x200000, /* It's 3d surface */
+ gcvSURF_DMABUF_EXPORTABLE = 0x400000, /* master node can be exported as dma-buf fd */
+ gcvSURF_CACHE_MODE_128 = 0x800000,
+
+ gcvSURF_TEXTURE_LINEAR = gcvSURF_TEXTURE
+ | gcvSURF_LINEAR,
+
+ gcvSURF_RENDER_TARGET_LINEAR = gcvSURF_RENDER_TARGET
+ | gcvSURF_LINEAR,
+
+ gcvSURF_RENDER_TARGET_NO_TILE_STATUS = gcvSURF_RENDER_TARGET
+ | gcvSURF_NO_TILE_STATUS,
+
+ gcvSURF_RENDER_TARGET_NO_COMPRESSION = gcvSURF_RENDER_TARGET
+ | gcvSURF_NO_COMPRESSION,
+
+ gcvSURF_RENDER_TARGET_TS_DIRTY = gcvSURF_RENDER_TARGET
+ | gcvSURF_TILE_STATUS_DIRTY,
+
+ gcvSURF_DEPTH_NO_TILE_STATUS = gcvSURF_DEPTH
+ | gcvSURF_NO_TILE_STATUS,
+
+ gcvSURF_DEPTH_TS_DIRTY = gcvSURF_DEPTH
+ | gcvSURF_TILE_STATUS_DIRTY,
+
+ /* Supported surface types with no vidmem node. */
+ gcvSURF_BITMAP_NO_VIDMEM = gcvSURF_BITMAP
+ | gcvSURF_NO_VIDMEM,
+
+ gcvSURF_TEXTURE_NO_VIDMEM = gcvSURF_TEXTURE
+ | gcvSURF_NO_VIDMEM,
+
+ /* Cacheable surface types with no vidmem node. */
+ gcvSURF_CACHEABLE_BITMAP_NO_VIDMEM = gcvSURF_BITMAP_NO_VIDMEM
+ | gcvSURF_CACHEABLE,
+
+ gcvSURF_CACHEABLE_BITMAP = gcvSURF_BITMAP
+ | gcvSURF_CACHEABLE,
+
+ gcvSURF_TEXTURE_3D = gcvSURF_TEXTURE
+ | gcvSURF_3D
+}
+gceSURF_TYPE;
+
+typedef enum _gceSURF_USAGE
+{
+ gcvSURF_USAGE_UNKNOWN,
+ gcvSURF_USAGE_RESOLVE_AFTER_CPU,
+ gcvSURF_USAGE_RESOLVE_AFTER_3D
+}
+gceSURF_USAGE;
+
+typedef enum _gceSURF_COLOR_SPACE
+{
+ gcvSURF_COLOR_SPACE_UNKNOWN,
+ gcvSURF_COLOR_SPACE_LINEAR,
+ gcvSURF_COLOR_SPACE_NONLINEAR,
+}
+gceSURF_COLOR_SPACE;
+
+typedef enum _gceSURF_COLOR_TYPE
+{
+ gcvSURF_COLOR_UNKNOWN = 0,
+ gcvSURF_COLOR_LINEAR = 0x01,
+ gcvSURF_COLOR_ALPHA_PRE = 0x02,
+}
+gceSURF_COLOR_TYPE;
+
+/* Rotation. */
+typedef enum _gceSURF_ROTATION
+{
+ gcvSURF_0_DEGREE = 0,
+ gcvSURF_90_DEGREE,
+ gcvSURF_180_DEGREE,
+ gcvSURF_270_DEGREE,
+ gcvSURF_FLIP_X,
+ gcvSURF_FLIP_Y,
+
+ gcvSURF_POST_FLIP_X = 0x40000000,
+ gcvSURF_POST_FLIP_Y = 0x80000000,
+}
+gceSURF_ROTATION;
+
+/* Surface flag */
+typedef enum _gceSURF_FLAG
+{
+ /* None flag */
+ gcvSURF_FLAG_NONE = 0x0,
+ /* content is preserved after swap */
+ gcvSURF_FLAG_CONTENT_PRESERVED = 0x1,
+ /* content is updated after swap*/
+ gcvSURF_FLAG_CONTENT_UPDATED = 0x2,
+ /* content is y inverted */
+ gcvSURF_FLAG_CONTENT_YINVERTED = 0x4,
+ /* surface has multiple nodes */
+ gcvSURF_FLAG_MULTI_NODE = 0x8,
+ /* surface no need do dither when resovle*/
+ gcvSURF_FLAG_DITHER_DISABLED = 0x10,
+}
+gceSURF_FLAG;
+
+typedef enum _gceMIPMAP_IMAGE_FORMAT
+{
+ gcvUNKNOWN_MIPMAP_IMAGE_FORMAT = -2
+}
+gceMIPMAP_IMAGE_FORMAT;
+
+/* Surface formats.
+** Name rules is from MSB->LSB.
+*/
+typedef enum _gceSURF_FORMAT
+{
+ /* Unknown format. */
+ gcvSURF_UNKNOWN = 0,
+
+ /* Palettized formats. */
+ gcvSURF_INDEX1 = 100,
+ gcvSURF_INDEX4,
+ gcvSURF_INDEX8,
+#if gcdVG_ONLY
+ gcvSURF_INDEX2,
+#endif
+
+ /* RGB formats. */
+ gcvSURF_A2R2G2B2 = 200,
+ gcvSURF_R3G3B2,
+ gcvSURF_A8R3G3B2,
+ gcvSURF_X4R4G4B4,
+ gcvSURF_A4R4G4B4,
+ gcvSURF_R4G4B4A4,
+ gcvSURF_X1R5G5B5,
+ gcvSURF_A1R5G5B5,
+ gcvSURF_R5G5B5A1,
+ gcvSURF_R5G6B5,
+ gcvSURF_R8G8B8,
+ gcvSURF_X8R8G8B8,
+ gcvSURF_A8R8G8B8,
+ gcvSURF_R8G8B8A8,
+ gcvSURF_G8R8G8B8,
+ gcvSURF_R8G8B8G8,
+ gcvSURF_X2R10G10B10,
+ gcvSURF_A2R10G10B10,
+ gcvSURF_R10G10B10A2,
+ gcvSURF_X12R12G12B12,
+ gcvSURF_A12R12G12B12,
+ gcvSURF_X16R16G16B16,
+ gcvSURF_A16R16G16B16,
+ gcvSURF_A32R32G32B32,
+ gcvSURF_R8G8B8X8,
+ gcvSURF_R5G5B5X1,
+ gcvSURF_R4G4B4X4,
+ gcvSURF_X16R16G16B16_2_A8R8G8B8,
+ gcvSURF_A16R16G16B16_2_A8R8G8B8,
+ gcvSURF_A32R32G32B32_2_G32R32F,
+ gcvSURF_A32R32G32B32_4_A8R8G8B8,
+ /* BGR formats. */
+ gcvSURF_A4B4G4R4 = 300,
+ gcvSURF_A1B5G5R5,
+ gcvSURF_B5G6R5,
+ gcvSURF_B8G8R8,
+ gcvSURF_B16G16R16,
+ gcvSURF_X8B8G8R8,
+ gcvSURF_A8B8G8R8,
+ gcvSURF_A2B10G10R10,
+ gcvSURF_X16B16G16R16,
+ gcvSURF_A16B16G16R16,
+ gcvSURF_B32G32R32,
+ gcvSURF_X32B32G32R32,
+ gcvSURF_A32B32G32R32,
+ gcvSURF_B4G4R4A4,
+ gcvSURF_B5G5R5A1,
+ gcvSURF_B8G8R8X8,
+ gcvSURF_B8G8R8A8,
+ gcvSURF_B10G10R10A2,
+ gcvSURF_X4B4G4R4,
+ gcvSURF_X1B5G5R5,
+ gcvSURF_B4G4R4X4,
+ gcvSURF_B5G5R5X1,
+ gcvSURF_X2B10G10R10,
+ gcvSURF_B8G8R8_SNORM,
+ gcvSURF_X8B8G8R8_SNORM,
+ gcvSURF_A8B8G8R8_SNORM,
+ gcvSURF_A8B12G12R12_2_A8R8G8B8,
+
+ /* Compressed formats. */
+ gcvSURF_DXT1 = 400,
+ gcvSURF_DXT2,
+ gcvSURF_DXT3,
+ gcvSURF_DXT4,
+ gcvSURF_DXT5,
+ gcvSURF_CXV8U8,
+ gcvSURF_ETC1,
+ gcvSURF_R11_EAC,
+ gcvSURF_SIGNED_R11_EAC,
+ gcvSURF_RG11_EAC,
+ gcvSURF_SIGNED_RG11_EAC,
+ gcvSURF_RGB8_ETC2,
+ gcvSURF_SRGB8_ETC2,
+ gcvSURF_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
+ gcvSURF_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
+ gcvSURF_RGBA8_ETC2_EAC,
+ gcvSURF_SRGB8_ALPHA8_ETC2_EAC,
+
+ /* YUV formats. */
+ gcvSURF_YUY2 = 500,
+ gcvSURF_UYVY,
+ gcvSURF_YV12,
+ gcvSURF_I420,
+ gcvSURF_NV12,
+ gcvSURF_NV21,
+ gcvSURF_NV16,
+ gcvSURF_NV61,
+ gcvSURF_YVYU,
+ gcvSURF_VYUY,
+ gcvSURF_AYUV,
+ gcvSURF_YUV420_10_ST,
+ gcvSURF_YUV420_TILE_ST,
+ gcvSURF_YUV420_TILE_10_ST,
+ gcvSURF_NV12_10BIT,
+ gcvSURF_NV21_10BIT,
+ gcvSURF_NV16_10BIT,
+ gcvSURF_NV61_10BIT,
+ gcvSURF_P010,
+#if gcdVG_ONLY
+ gcvSURF_AYUY2,
+ gcvSURF_ANV12,
+ gcvSURF_ANV16,
+ gcvSURF_AUYVY,
+ gcvSURF_YV16,
+#endif
+
+ /* Depth formats. */
+ gcvSURF_D16 = 600,
+ gcvSURF_D24S8,
+ gcvSURF_D32,
+ gcvSURF_D24X8,
+ gcvSURF_D32F,
+ gcvSURF_S8D32F,
+ gcvSURF_S8D32F_1_G32R32F,
+ gcvSURF_S8D32F_2_A8R8G8B8,
+ gcvSURF_D24S8_1_A8R8G8B8,
+ gcvSURF_S8,
+ gcvSURF_X24S8,
+ gcvSURF_X24S8_1_A8R8G8B8,
+
+ /* Alpha formats. */
+ gcvSURF_A4 = 700,
+ gcvSURF_A8,
+ gcvSURF_A12,
+ gcvSURF_A16,
+ gcvSURF_A32,
+ gcvSURF_A1,
+
+ /* Luminance formats. */
+ gcvSURF_L4 = 800,
+ gcvSURF_L8,
+ gcvSURF_L12,
+ gcvSURF_L16,
+ gcvSURF_L32,
+ gcvSURF_L1,
+ gcvSURF_L8_RAW,
+
+ /* Alpha/Luminance formats. */
+ gcvSURF_A4L4 = 900,
+ gcvSURF_A2L6,
+ gcvSURF_A8L8,
+ gcvSURF_A4L12,
+ gcvSURF_A12L12,
+ gcvSURF_A16L16,
+
+ gcvSURF_A8L8_1_A8R8G8B8,
+
+ gcvSURF_A8L8_RAW,
+
+ /* Bump formats. */
+ gcvSURF_L6V5U5 = 1000,
+ gcvSURF_V8U8,
+ gcvSURF_X8L8V8U8,
+ gcvSURF_Q8W8V8U8,
+ gcvSURF_A2W10V10U10,
+ gcvSURF_V16U16,
+ gcvSURF_Q16W16V16U16,
+
+ /* R/RG/RA formats. */
+ gcvSURF_R8 = 1100,
+ gcvSURF_X8R8,
+ gcvSURF_G8R8,
+ gcvSURF_X8G8R8,
+ gcvSURF_A8R8,
+ gcvSURF_R16,
+ gcvSURF_X16R16,
+ gcvSURF_G16R16,
+ gcvSURF_X16G16R16,
+ gcvSURF_A16R16,
+ gcvSURF_R32,
+ gcvSURF_X32R32,
+ gcvSURF_G32R32,
+ gcvSURF_X32G32R32,
+ gcvSURF_A32R32,
+ gcvSURF_RG16,
+ gcvSURF_R8_SNORM,
+ gcvSURF_G8R8_SNORM,
+
+ gcvSURF_R8_1_X8R8G8B8,
+ gcvSURF_G8R8_1_X8R8G8B8,
+
+ /* Floating point formats. */
+ gcvSURF_R16F = 1200,
+ gcvSURF_X16R16F,
+ gcvSURF_G16R16F,
+ gcvSURF_X16G16R16F,
+ gcvSURF_B16G16R16F,
+ gcvSURF_X16B16G16R16F,
+ gcvSURF_A16B16G16R16F,
+ gcvSURF_R32F,
+ gcvSURF_X32R32F,
+ gcvSURF_G32R32F,
+ gcvSURF_X32G32R32F,
+ gcvSURF_B32G32R32F,
+ gcvSURF_X32B32G32R32F,
+ gcvSURF_A32B32G32R32F,
+ gcvSURF_A16F,
+ gcvSURF_L16F,
+ gcvSURF_A16L16F,
+ gcvSURF_A16R16F,
+ gcvSURF_A32F,
+ gcvSURF_L32F,
+ gcvSURF_A32L32F,
+ gcvSURF_A32R32F,
+ gcvSURF_E5B9G9R9,
+ gcvSURF_B10G11R11F,
+
+ gcvSURF_X16B16G16R16F_2_A8R8G8B8,
+ gcvSURF_A16B16G16R16F_2_A8R8G8B8,
+ gcvSURF_A16B16G16R16F_2_G16R16F,
+ gcvSURF_G32R32F_2_A8R8G8B8,
+ gcvSURF_X32B32G32R32F_2_G32R32F,
+ gcvSURF_A32B32G32R32F_2_G32R32F,
+ gcvSURF_X32B32G32R32F_4_A8R8G8B8,
+ gcvSURF_A32B32G32R32F_4_A8R8G8B8,
+
+ gcvSURF_R16F_1_A4R4G4B4,
+ gcvSURF_G16R16F_1_A8R8G8B8,
+ gcvSURF_B16G16R16F_2_A8R8G8B8,
+
+ gcvSURF_R32F_1_A8R8G8B8,
+ gcvSURF_B32G32R32F_3_A8R8G8B8,
+ gcvSURF_B10G11R11F_1_A8R8G8B8,
+
+ gcvSURF_A32F_1_R32F,
+ gcvSURF_L32F_1_R32F,
+ gcvSURF_A32L32F_1_G32R32F,
+
+
+
+ /* sRGB format. */
+ gcvSURF_SBGR8 = 1400,
+ gcvSURF_A8_SBGR8,
+ gcvSURF_X8_SBGR8,
+ gcvSURF_A8_SRGB8,
+ gcvSURF_X8_SRGB8,
+
+ /* Integer formats. */
+ gcvSURF_R8I = 1500,
+ gcvSURF_R8UI,
+ gcvSURF_R16I,
+ gcvSURF_R16UI,
+ gcvSURF_R32I,
+ gcvSURF_R32UI,
+ gcvSURF_X8R8I,
+ gcvSURF_G8R8I,
+ gcvSURF_X8R8UI,
+ gcvSURF_G8R8UI,
+ gcvSURF_X16R16I,
+ gcvSURF_G16R16I,
+ gcvSURF_X16R16UI,
+ gcvSURF_G16R16UI,
+ gcvSURF_X32R32I,
+ gcvSURF_G32R32I,
+ gcvSURF_X32R32UI,
+ gcvSURF_G32R32UI,
+ gcvSURF_X8G8R8I,
+ gcvSURF_B8G8R8I,
+ gcvSURF_X8G8R8UI,
+ gcvSURF_B8G8R8UI,
+ gcvSURF_X16G16R16I,
+ gcvSURF_B16G16R16I,
+ gcvSURF_X16G16R16UI,
+ gcvSURF_B16G16R16UI,
+ gcvSURF_X32G32R32I,
+ gcvSURF_B32G32R32I,
+ gcvSURF_X32G32R32UI,
+ gcvSURF_B32G32R32UI,
+ gcvSURF_X8B8G8R8I,
+ gcvSURF_A8B8G8R8I,
+ gcvSURF_X8B8G8R8UI,
+ gcvSURF_A8B8G8R8UI,
+ gcvSURF_X16B16G16R16I,
+ gcvSURF_A16B16G16R16I,
+ gcvSURF_X16B16G16R16UI,
+ gcvSURF_A16B16G16R16UI,
+ gcvSURF_X32B32G32R32I,
+ gcvSURF_A32B32G32R32I,
+ gcvSURF_X32B32G32R32UI,
+ gcvSURF_A32B32G32R32UI,
+ gcvSURF_A2B10G10R10UI,
+ gcvSURF_G32R32I_2_A8R8G8B8,
+ gcvSURF_G32R32I_1_G32R32F,
+ gcvSURF_G32R32UI_2_A8R8G8B8,
+ gcvSURF_G32R32UI_1_G32R32F,
+ gcvSURF_X16B16G16R16I_2_A8R8G8B8,
+ gcvSURF_X16B16G16R16I_1_G32R32F,
+ gcvSURF_A16B16G16R16I_2_A8R8G8B8,
+ gcvSURF_A16B16G16R16I_1_G32R32F,
+ gcvSURF_X16B16G16R16UI_2_A8R8G8B8,
+ gcvSURF_X16B16G16R16UI_1_G32R32F,
+ gcvSURF_A16B16G16R16UI_2_A8R8G8B8,
+ gcvSURF_A16B16G16R16UI_1_G32R32F,
+ gcvSURF_X32B32G32R32I_2_G32R32I,
+ gcvSURF_A32B32G32R32I_2_G32R32I,
+ gcvSURF_A32B32G32R32I_2_G32R32F,
+ gcvSURF_X32B32G32R32I_3_A8R8G8B8,
+ gcvSURF_A32B32G32R32I_4_A8R8G8B8,
+ gcvSURF_X32B32G32R32UI_2_G32R32UI,
+ gcvSURF_A32B32G32R32UI_2_G32R32UI,
+ gcvSURF_A32B32G32R32UI_2_G32R32F,
+ gcvSURF_X32B32G32R32UI_3_A8R8G8B8,
+ gcvSURF_A32B32G32R32UI_4_A8R8G8B8,
+ gcvSURF_A2B10G10R10UI_1_A8R8G8B8,
+ gcvSURF_A8B8G8R8I_1_A8R8G8B8,
+ gcvSURF_A8B8G8R8UI_1_A8R8G8B8,
+ gcvSURF_R8I_1_A4R4G4B4,
+ gcvSURF_R8UI_1_A4R4G4B4,
+ gcvSURF_R16I_1_A4R4G4B4,
+ gcvSURF_R16UI_1_A4R4G4B4,
+ gcvSURF_R32I_1_A8R8G8B8,
+ gcvSURF_R32UI_1_A8R8G8B8,
+ gcvSURF_X8R8I_1_A4R4G4B4,
+ gcvSURF_X8R8UI_1_A4R4G4B4,
+ gcvSURF_G8R8I_1_A4R4G4B4,
+ gcvSURF_G8R8UI_1_A4R4G4B4,
+ gcvSURF_X16R16I_1_A4R4G4B4,
+ gcvSURF_X16R16UI_1_A4R4G4B4,
+ gcvSURF_G16R16I_1_A8R8G8B8,
+ gcvSURF_G16R16UI_1_A8R8G8B8,
+ gcvSURF_X32R32I_1_A8R8G8B8,
+ gcvSURF_X32R32UI_1_A8R8G8B8,
+ gcvSURF_X8G8R8I_1_A4R4G4B4,
+ gcvSURF_X8G8R8UI_1_A4R4G4B4,
+ gcvSURF_B8G8R8I_1_A8R8G8B8,
+ gcvSURF_B8G8R8UI_1_A8R8G8B8,
+ gcvSURF_B16G16R16I_2_A8R8G8B8,
+ gcvSURF_B16G16R16I_1_G32R32F,
+ gcvSURF_B16G16R16UI_2_A8R8G8B8,
+ gcvSURF_B16G16R16UI_1_G32R32F,
+ gcvSURF_B32G32R32I_3_A8R8G8B8,
+ gcvSURF_B32G32R32UI_3_A8R8G8B8,
+ gcvSURF_A16B16G16R16_2_A8R8G8B8,
+ gcvSURF_R8G8B8_1_A8R8G8B8,
+ gcvSURF_G16R16_1_A8R8G8B8,
+ gcvSURF_A2B10G10R10_1_A8R8G8B8,
+ gcvSURF_A2R10G10B10_1_A8R8G8B8,
+ gcvSURF_A2W10V10U10_1_A8R8G8B8,
+
+ /* ASTC formats. */
+ gcvSURF_ASTC4x4 = 1600,
+ gcvSURF_ASTC5x4,
+ gcvSURF_ASTC5x5,
+ gcvSURF_ASTC6x5,
+ gcvSURF_ASTC6x6,
+ gcvSURF_ASTC8x5,
+ gcvSURF_ASTC8x6,
+ gcvSURF_ASTC8x8,
+ gcvSURF_ASTC10x5,
+ gcvSURF_ASTC10x6,
+ gcvSURF_ASTC10x8,
+ gcvSURF_ASTC10x10,
+ gcvSURF_ASTC12x10,
+ gcvSURF_ASTC12x12,
+ gcvSURF_ASTC4x4_SRGB,
+ gcvSURF_ASTC5x4_SRGB,
+ gcvSURF_ASTC5x5_SRGB,
+ gcvSURF_ASTC6x5_SRGB,
+ gcvSURF_ASTC6x6_SRGB,
+ gcvSURF_ASTC8x5_SRGB,
+ gcvSURF_ASTC8x6_SRGB,
+ gcvSURF_ASTC8x8_SRGB,
+ gcvSURF_ASTC10x5_SRGB,
+ gcvSURF_ASTC10x6_SRGB,
+ gcvSURF_ASTC10x8_SRGB,
+ gcvSURF_ASTC10x10_SRGB,
+ gcvSURF_ASTC12x10_SRGB,
+ gcvSURF_ASTC12x12_SRGB,
+
+ /* Recompile format*/
+ gcvSURF_L16_1_A4R4G4B4 = 1700,
+ gcvSURF_V16U16_1_A8R8G8B8,
+ gcvSURF_Q8W8V8U8_1_A8R8G8B8,
+ gcvSURF_X8L8V8U8_1_A8R8G8B8,
+ gcvSURF_R3G3B2_1_A8R8G8B8,
+ gcvSURF_A8R3G3B2_1_A8R8G8B8,
+ gcvSURF_W11V11U10_1_A8R8G8B8,
+ gcvSURF_Q16W16V16U16_2_A8R8G8B8,
+ gcvSURF_W11V11U10,
+ gcvSURF_V8U8_1_A4R4G4B4,
+ gcvSURF_A8B8G8R8_1_A8R8G8B8,
+ gcvSURF_A32R32G32B32_1_A8R8G8B8,
+ gcvSURF_X16B16G16R16F_1_A8R8G8B8,
+ gcvSURF_A16B16G16R16F_1_A8R8G8B8,
+ gcvSURF_G32R32F_1_A8R8G8B8,
+ gcvSURF_X32B32G32R32F_1_A8R8G8B8,
+ gcvSURF_A32B32G32R32F_1_A8R8G8B8,
+ gcvSURF_G32R32I_1_A8R8G8B8,
+ gcvSURF_G32R32UI_1_A8R8G8B8,
+ gcvSURF_A32B32G32R32I_1_A8R8G8B8,
+ gcvSURF_A32B32G32R32UI_1_A8R8G8B8,
+ gcvSURF_Q16W16V16U16_1_A8R8G8B8,
+ gcvSURF_A16B16G16R16_1_A8R8G8B8,
+
+ /* GL4 formats */
+ gcvSURF_G8 = 1800,
+ gcvSURF_B8,
+ gcvSURF_G32F
+}
+gceSURF_FORMAT;
+
+typedef enum _gceIMAGE_MEM_TYPE
+{
+ gcvIMAGE_MEM_DEFAULT,
+ gcvIMAGE_MEM_HOST_PTR,
+ gcvIMAGE_MEM_HOST_PTR_UNCACHED,
+ gcvIMAGE_MEM_HOST_PHY_PTR,
+ gcvIMAGE_MEM_HOST_PHY_PTR_UNCACHED,
+}
+gceIMAGE_MEM_TYPE;
+
+typedef enum _gceSURF_YUV_COLOR_SPACE
+{
+ gcvSURF_ITU_REC601,
+ gcvSURF_ITU_REC709,
+ gcvSURF_ITU_REC2020,
+}
+gceSURF_YUV_COLOR_SPACE;
+
+typedef enum _gceSURF_YUV_SAMPLE_RANGE
+{
+ gcvSURF_YUV_FULL_RANGE,
+ gcvSURF_YUV_NARROW_RANGE,
+}
+gceSURF_YUV_SAMPLE_RANGE;
+
+typedef enum _gceSURF_YUV_CHROMA_SITING
+{
+ gcvSURF_YUV_CHROMA_SITING_0,
+ gcvSURF_YUV_CHROMA_SITING_0_5,
+}
+gceSURF_YUV_CHROMA_SITING;
+
+typedef enum _gceSURF_INFO_TYPE
+{
+ gcvSURF_INFO_UNKNOWN = 0,
+ gcvSURF_INFO_LAYERSIZE = 1,
+ gcvSURF_INFO_SLICESIZE = 2,
+}
+gceSURF_INFO_TYPE;
+
+/* Format modifiers. */
+typedef enum _gceSURF_FORMAT_MODE
+{
+ gcvSURF_FORMAT_OCL = 0x80000000,
+ gcvSURF_FORMAT_PATCH_BORDER = 0x40000000,
+}
+gceSURF_FORMAT_MODE;
+
+/* Pixel swizzle modes. */
+typedef enum _gceSURF_SWIZZLE
+{
+ gcvSURF_NOSWIZZLE = 0,
+ gcvSURF_ARGB,
+ gcvSURF_ABGR,
+ gcvSURF_RGBA,
+ gcvSURF_BGRA
+}
+gceSURF_SWIZZLE;
+
+/* Transparency modes. */
+typedef enum _gceSURF_TRANSPARENCY
+{
+ /* Valid only for PE 1.0 */
+ gcvSURF_OPAQUE = 0,
+ gcvSURF_SOURCE_MATCH,
+ gcvSURF_SOURCE_MASK,
+ gcvSURF_PATTERN_MASK,
+}
+gceSURF_TRANSPARENCY;
+
+/* Surface Alignment. */
+typedef enum _gceSURF_ALIGNMENT
+{
+ gcvSURF_FOUR = 0,
+ gcvSURF_SIXTEEN,
+ gcvSURF_SUPER_TILED,
+ gcvSURF_SPLIT_TILED,
+ gcvSURF_SPLIT_SUPER_TILED
+}
+gceSURF_ALIGNMENT;
+
+/* Surface Addressing. */
+typedef enum _gceSURF_ADDRESSING
+{
+ gcvSURF_NO_STRIDE_TILED = 0,
+ gcvSURF_NO_STRIDE_LINEAR,
+ gcvSURF_STRIDE_TILED,
+ gcvSURF_STRIDE_LINEAR
+}
+gceSURF_ADDRESSING;
+
+/* Transparency modes. */
+typedef enum _gce2D_TRANSPARENCY
+{
+ /* Valid only for PE 2.0 */
+ gcv2D_OPAQUE = 0,
+ gcv2D_KEYED,
+ gcv2D_MASKED
+}
+gce2D_TRANSPARENCY;
+
+/* Mono packing modes. */
+typedef enum _gceSURF_MONOPACK
+{
+ gcvSURF_PACKED8 = 0,
+ gcvSURF_PACKED16,
+ gcvSURF_PACKED32,
+ gcvSURF_UNPACKED,
+}
+gceSURF_MONOPACK;
+
+/* Blending modes. */
+typedef enum _gceSURF_BLEND_MODE
+{
+ /* Porter-Duff blending modes. */
+ /* Fsrc Fdst */
+ gcvBLEND_CLEAR = 0, /* 0 0 */
+ gcvBLEND_SRC, /* 1 0 */
+ gcvBLEND_DST, /* 0 1 */
+ gcvBLEND_SRC_OVER_DST, /* 1 1 - Asrc */
+ gcvBLEND_DST_OVER_SRC, /* 1 - Adst 1 */
+ gcvBLEND_SRC_IN_DST, /* Adst 0 */
+ gcvBLEND_DST_IN_SRC, /* 0 Asrc */
+ gcvBLEND_SRC_OUT_DST, /* 1 - Adst 0 */
+ gcvBLEND_DST_OUT_SRC, /* 0 1 - Asrc */
+ gcvBLEND_SRC_ATOP_DST, /* Adst 1 - Asrc */
+ gcvBLEND_DST_ATOP_SRC, /* 1 - Adst Asrc */
+ gcvBLEND_SRC_XOR_DST, /* 1 - Adst 1 - Asrc */
+
+ /* Special blending modes. */
+ gcvBLEND_SET, /* DST = 1 */
+ gcvBLEND_SUB /* DST = DST * (1 - SRC) */
+}
+gceSURF_BLEND_MODE;
+
+/* Per-pixel alpha modes. */
+typedef enum _gceSURF_PIXEL_ALPHA_MODE
+{
+ gcvSURF_PIXEL_ALPHA_STRAIGHT = 0,
+ gcvSURF_PIXEL_ALPHA_INVERSED
+}
+gceSURF_PIXEL_ALPHA_MODE;
+
+/* Global alpha modes. */
+typedef enum _gceSURF_GLOBAL_ALPHA_MODE
+{
+ gcvSURF_GLOBAL_ALPHA_OFF = 0,
+ gcvSURF_GLOBAL_ALPHA_ON,
+ gcvSURF_GLOBAL_ALPHA_SCALE
+}
+gceSURF_GLOBAL_ALPHA_MODE;
+
+/* Color component modes for alpha blending. */
+typedef enum _gceSURF_PIXEL_COLOR_MODE
+{
+ gcvSURF_COLOR_STRAIGHT = 0,
+ gcvSURF_COLOR_MULTIPLY
+}
+gceSURF_PIXEL_COLOR_MODE;
+
+/* Color component modes for alpha blending. */
+typedef enum _gce2D_PIXEL_COLOR_MULTIPLY_MODE
+{
+ gcv2D_COLOR_MULTIPLY_DISABLE = 0,
+ gcv2D_COLOR_MULTIPLY_ENABLE
+}
+gce2D_PIXEL_COLOR_MULTIPLY_MODE;
+
+/* Color component modes for alpha blending. */
+typedef enum _gce2D_GLOBAL_COLOR_MULTIPLY_MODE
+{
+ gcv2D_GLOBAL_COLOR_MULTIPLY_DISABLE = 0,
+ gcv2D_GLOBAL_COLOR_MULTIPLY_ALPHA,
+ gcv2D_GLOBAL_COLOR_MULTIPLY_COLOR
+}
+gce2D_GLOBAL_COLOR_MULTIPLY_MODE;
+
+/* Alpha blending factor modes. */
+typedef enum _gceSURF_BLEND_FACTOR_MODE
+{
+ gcvSURF_BLEND_ZERO = 0,
+ gcvSURF_BLEND_ONE,
+ gcvSURF_BLEND_STRAIGHT,
+ gcvSURF_BLEND_INVERSED,
+ gcvSURF_BLEND_COLOR,
+ gcvSURF_BLEND_COLOR_INVERSED,
+ gcvSURF_BLEND_SRC_ALPHA_SATURATED,
+ gcvSURF_BLEND_STRAIGHT_NO_CROSS,
+ gcvSURF_BLEND_INVERSED_NO_CROSS,
+ gcvSURF_BLEND_COLOR_NO_CROSS,
+ gcvSURF_BLEND_COLOR_INVERSED_NO_CROSS,
+ gcvSURF_BLEND_SRC_ALPHA_SATURATED_CROSS
+}
+gceSURF_BLEND_FACTOR_MODE;
+
+/* Alpha blending porter duff rules. */
+typedef enum _gce2D_PORTER_DUFF_RULE
+{
+ gcvPD_CLEAR = 0,
+ gcvPD_SRC,
+ gcvPD_SRC_OVER,
+ gcvPD_DST_OVER,
+ gcvPD_SRC_IN,
+ gcvPD_DST_IN,
+ gcvPD_SRC_OUT,
+ gcvPD_DST_OUT,
+ gcvPD_SRC_ATOP,
+ gcvPD_DST_ATOP,
+ gcvPD_ADD,
+ gcvPD_XOR,
+ gcvPD_DST
+}
+gce2D_PORTER_DUFF_RULE;
+
+/* Alpha blending factor modes. */
+typedef enum _gce2D_YUV_COLOR_MODE
+{
+ gcv2D_YUV_601= 0,
+ gcv2D_YUV_709,
+ gcv2D_YUV_USER_DEFINED,
+ gcv2D_YUV_USER_DEFINED_CLAMP,
+
+ /* Default setting is for src. gcv2D_YUV_DST
+ can be ORed to set dst.
+ */
+ gcv2D_YUV_DST = 0x80000000,
+}
+gce2D_YUV_COLOR_MODE;
+
+/* Nature rotation rules. */
+typedef enum _gce2D_NATURE_ROTATION
+{
+ gcvNR_0_DEGREE = 0,
+ gcvNR_LEFT_90_DEGREE,
+ gcvNR_RIGHT_90_DEGREE,
+ gcvNR_180_DEGREE,
+ gcvNR_FLIP_X,
+ gcvNR_FLIP_Y,
+ gcvNR_TOTAL_RULE,
+}
+gce2D_NATURE_ROTATION;
+
+typedef enum _gce2D_COMMAND
+{
+ gcv2D_CLEAR = 0,
+ gcv2D_LINE,
+ gcv2D_BLT,
+ gcv2D_STRETCH,
+ gcv2D_HOR_FILTER,
+ gcv2D_VER_FILTER,
+ gcv2D_MULTI_SOURCE_BLT,
+ gcv2D_FILTER_BLT,
+}
+gce2D_COMMAND;
+
+typedef enum _gce2D_TILE_STATUS_CONFIG
+{
+ gcv2D_TSC_DISABLE = 0,
+ gcv2D_TSC_ENABLE = 0x00000001,
+ gcv2D_TSC_COMPRESSED = 0x00000002,
+ gcv2D_TSC_DOWN_SAMPLER = 0x00000004,
+ gcv2D_TSC_2D_COMPRESSED = 0x00000008,
+
+ gcv2D_TSC_DEC_COMPRESSED = 0x00000020,
+ gcv2D_TSC_DEC_TPC = 0x00000040,
+ gcv2D_TSC_DEC_TPC_COMPRESSED = 0x00000080,
+
+ gcv2D_TSC_V4_COMPRESSED = 0x00000100,
+ gcv2D_TSC_V4_COMPRESSED_256B = 0x00000200 | gcv2D_TSC_V4_COMPRESSED,
+
+ gcv2D_TSC_DEC_TPC_TILED = gcv2D_TSC_DEC_COMPRESSED | gcv2D_TSC_DEC_TPC,
+ gcv2D_TSC_DEC_TPC_TILED_COMPRESSED = gcv2D_TSC_DEC_TPC_TILED | gcv2D_TSC_DEC_TPC_COMPRESSED,
+
+ gcv2D_TSC_TPC_COMPRESSED = 0x00001000,
+ gcv2D_TSC_TPC_COMPRESSED_V10 = gcv2D_TSC_TPC_COMPRESSED | 0x00000400,
+ gcv2D_TSC_TPC_COMPRESSED_V11 = gcv2D_TSC_TPC_COMPRESSED | 0x00000800,
+}
+gce2D_TILE_STATUS_CONFIG;
+
+typedef enum _gce2D_QUERY
+{
+ gcv2D_QUERY_RGB_ADDRESS_MIN_ALIGN = 0,
+ gcv2D_QUERY_RGB_STRIDE_MIN_ALIGN,
+ gcv2D_QUERY_YUV_ADDRESS_MIN_ALIGN,
+ gcv2D_QUERY_YUV_STRIDE_MIN_ALIGN,
+}
+gce2D_QUERY;
+
+typedef enum _gce2D_SUPER_TILE_VERSION
+{
+ gcv2D_SUPER_TILE_VERSION_V1 = 1,
+ gcv2D_SUPER_TILE_VERSION_V2 = 2,
+ gcv2D_SUPER_TILE_VERSION_V3 = 3,
+}
+gce2D_SUPER_TILE_VERSION;
+
+typedef enum _gce2D_STATE
+{
+ gcv2D_STATE_SPECIAL_FILTER_MIRROR_MODE = 1,
+ gcv2D_STATE_SUPER_TILE_VERSION,
+ gcv2D_STATE_EN_GAMMA,
+ gcv2D_STATE_DE_GAMMA,
+ gcv2D_STATE_MULTI_SRC_BLIT_UNIFIED_DST_RECT,
+ gcv2D_STATE_MULTI_SRC_BLIT_BILINEAR_FILTER,
+ gcv2D_STATE_PROFILE_ENABLE,
+ gcv2D_STATE_XRGB_ENABLE,
+
+ gcv2D_STATE_ARRAY_EN_GAMMA = 0x10001,
+ gcv2D_STATE_ARRAY_DE_GAMMA,
+ gcv2D_STATE_ARRAY_CSC_YUV_TO_RGB,
+ gcv2D_STATE_ARRAY_CSC_RGB_TO_YUV,
+
+ gcv2D_STATE_DEC_TPC_NV12_10BIT = 0x20001,
+ gcv2D_STATE_ARRAY_YUV_SRC_TILE_STATUS_ADDR,
+ gcv2D_STATE_ARRAY_YUV_DST_TILE_STATUS_ADDR,
+}
+gce2D_STATE;
+
+typedef enum _gce2D_STATE_PROFILE
+{
+ gcv2D_STATE_PROFILE_NONE = 0x0,
+ gcv2D_STATE_PROFILE_COMMAND = 0x1,
+ gcv2D_STATE_PROFILE_SURFACE = 0x2,
+ gcv2D_STATE_PROFILE_ALL = 0xFFFF,
+}
+gce2D_STATE_PROFILE;
+
+/* Texture object types */
+typedef enum _gceTEXTURE_TYPE
+{
+ gcvTEXTURE_UNKNOWN = 0,
+ gcvTEXTURE_1D,
+ gcvTEXTURE_2D,
+ gcvTEXTURE_3D,
+ gcvTEXTURE_CUBEMAP,
+ gcvTEXTURE_1D_ARRAY,
+ gcvTEXTURE_2D_ARRAY,
+ gcvTEXTURE_2D_MS,
+ gcvTEXTURE_2D_MS_ARRAY,
+ gcvTEXTURE_CUBEMAP_ARRAY,
+ gcvTEXTURE_EXTERNAL
+}
+gceTEXTURE_TYPE;
+
+#if gcdENABLE_3D
+/* Texture functions. */
+typedef enum _gceTEXTURE_FUNCTION
+{
+ gcvTEXTURE_DUMMY = 0,
+ gcvTEXTURE_REPLACE = 0,
+ gcvTEXTURE_MODULATE,
+ gcvTEXTURE_ADD,
+ gcvTEXTURE_ADD_SIGNED,
+ gcvTEXTURE_INTERPOLATE,
+ gcvTEXTURE_SUBTRACT,
+ gcvTEXTURE_DOT3
+}
+gceTEXTURE_FUNCTION;
+
+/* Texture sources. */
+typedef enum _gceTEXTURE_SOURCE
+{
+ gcvCOLOR_FROM_TEXTURE = 0,
+ gcvCOLOR_FROM_CONSTANT_COLOR,
+ gcvCOLOR_FROM_PRIMARY_COLOR,
+ gcvCOLOR_FROM_PREVIOUS_COLOR
+}
+gceTEXTURE_SOURCE;
+
+/* Texture source channels. */
+typedef enum _gceTEXTURE_CHANNEL
+{
+ gcvFROM_COLOR = 0,
+ gcvFROM_ONE_MINUS_COLOR,
+ gcvFROM_ALPHA,
+ gcvFROM_ONE_MINUS_ALPHA
+}
+gceTEXTURE_CHANNEL;
+#endif /* gcdENABLE_3D */
+
+/* Filter types. */
+typedef enum _gceFILTER_TYPE
+{
+ gcvFILTER_SYNC = 0,
+ gcvFILTER_BLUR,
+ gcvFILTER_USER
+}
+gceFILTER_TYPE;
+
+/* Filter pass types. */
+typedef enum _gceFILTER_PASS_TYPE
+{
+ gcvFILTER_HOR_PASS = 0,
+ gcvFILTER_VER_PASS
+}
+gceFILTER_PASS_TYPE;
+
+/* Endian hints. */
+typedef enum _gceENDIAN_HINT
+{
+ gcvENDIAN_NO_SWAP = 0,
+ gcvENDIAN_SWAP_WORD = 1,
+ gcvENDIAN_SWAP_DWORD = 2,
+ gcvENDIAN_SWAP_QWORD = 3,
+}
+gceENDIAN_HINT;
+
+/* Tiling modes. */
+typedef enum _gceTILING
+{
+ gcvINVALIDTILED = 0x0, /* Invalid tiling */
+ /* Tiling basic modes enum'ed in power of 2. */
+ gcvLINEAR = 0x1, /* No tiling. */
+ gcvTILED = 0x2, /* 4x4 tiling. */
+ gcvSUPERTILED = 0x4, /* 64x64 tiling. */
+ gcvMINORTILED = 0x8, /* 2x2 tiling. */
+
+ /* Tiling special layouts. */
+ gcvTILING_SPLIT_BUFFER = 0x10,
+ gcvTILING_X_MAJOR = 0x20,
+ gcvTILING_Y_MAJOR = 0x40,
+ gcvTILING_SWAP = 0x80,
+
+ /* Tiling combination layouts. */
+ gcvMULTI_TILED = gcvTILED
+ | gcvTILING_SPLIT_BUFFER,
+
+ gcvMULTI_SUPERTILED = gcvSUPERTILED
+ | gcvTILING_SPLIT_BUFFER,
+
+ gcvYMAJOR_SUPERTILED = gcvSUPERTILED
+ | gcvTILING_Y_MAJOR,
+
+ gcvTILED_8X4 = 0x0100,
+ gcvTILED_4X8 = 0x0100 | gcvTILING_SWAP,
+ gcvTILED_8X8 = 0x0200,
+ gcvTILED_16X4 = 0x0400,
+ gcvTILED_32X4 = 0x0800,
+ gcvTILED_64X4 = 0x1000,
+
+ gcvTILED_8X8_XMAJOR = gcvTILED_8X8 | gcvTILING_X_MAJOR,
+ gcvTILED_8X8_YMAJOR = gcvTILED_8X8 | gcvTILING_Y_MAJOR,
+
+ gcvSUPERTILED_128B = 0x10000 | gcvSUPERTILED,
+ gcvSUPERTILED_256B = 0x20000 | gcvSUPERTILED,
+}
+gceTILING;
+
+typedef enum _gceCACHE_MODE
+{
+ gcvCACHE_NONE,
+ gcvCACHE_128,
+ gcvCACHE_256,
+}
+gceCACHE_MODE;
+
+#define DEFAULT_CACHE_MODE gcvCACHE_256
+
+/* 2D pattern type. */
+typedef enum _gce2D_PATTERN
+{
+ gcv2D_PATTERN_SOLID = 0,
+ gcv2D_PATTERN_MONO,
+ gcv2D_PATTERN_COLOR,
+ gcv2D_PATTERN_INVALID
+}
+gce2D_PATTERN;
+
+/* 2D source type. */
+typedef enum _gce2D_SOURCE
+{
+ gcv2D_SOURCE_MASKED = 0,
+ gcv2D_SOURCE_MONO,
+ gcv2D_SOURCE_COLOR,
+ gcv2D_SOURCE_INVALID
+}
+gce2D_SOURCE;
+
+/* Pipes. */
+typedef enum _gcePIPE_SELECT
+{
+ gcvPIPE_INVALID = ~0,
+ gcvPIPE_3D = 0,
+ gcvPIPE_2D
+}
+gcePIPE_SELECT;
+
+/* Hardware type. */
+typedef enum _gceHARDWARE_TYPE
+{
+ gcvHARDWARE_INVALID,
+ gcvHARDWARE_3D,
+ gcvHARDWARE_2D,
+ gcvHARDWARE_VG,
+ gcvHARDWARE_3D2D,
+ gcvHARDWARE_NUM_TYPES,
+}
+gceHARDWARE_TYPE;
+
+#define gcdCHIP_COUNT gcvCORE_COUNT
+
+typedef enum _gceMMU_MODE
+{
+ gcvMMU_MODE_1K,
+ gcvMMU_MODE_4K,
+} gceMMU_MODE;
+
+/* User signal command codes. */
+typedef enum _gceUSER_SIGNAL_COMMAND_CODES
+{
+ gcvUSER_SIGNAL_CREATE,
+ gcvUSER_SIGNAL_DESTROY,
+ gcvUSER_SIGNAL_SIGNAL,
+ gcvUSER_SIGNAL_WAIT,
+ gcvUSER_SIGNAL_MAP,
+ gcvUSER_SIGNAL_UNMAP,
+}
+gceUSER_SIGNAL_COMMAND_CODES;
+
+/* Shared buffer command codes. */
+typedef enum _gceSHBUF_COMMAND_CODES
+{
+ gcvSHBUF_CREATE,
+ gcvSHBUF_DESTROY,
+ gcvSHBUF_MAP,
+ gcvSHBUF_WRITE,
+ gcvSHBUF_READ,
+}
+gceSHBUF_COMMAND_CODES;
+
+/* Event locations. */
+typedef enum _gceKERNEL_WHERE
+{
+ gcvKERNEL_COMMAND,
+ gcvKERNEL_VERTEX,
+ gcvKERNEL_TRIANGLE,
+ gcvKERNEL_TEXTURE,
+ gcvKERNEL_PIXEL,
+ gcvKERNEL_BLT,
+}
+gceKERNEL_WHERE;
+
+#if gcdENABLE_VG
+/* Hardware blocks. */
+typedef enum _gceBLOCK
+{
+ gcvBLOCK_COMMAND,
+ gcvBLOCK_TESSELLATOR,
+ gcvBLOCK_TESSELLATOR2,
+ gcvBLOCK_TESSELLATOR3,
+ gcvBLOCK_RASTER,
+ gcvBLOCK_VG,
+ gcvBLOCK_VG2,
+ gcvBLOCK_VG3,
+ gcvBLOCK_PIXEL,
+
+ /* Number of defined blocks. */
+ gcvBLOCK_COUNT
+}
+gceBLOCK;
+#endif
+
+/* gcdDUMP message type. */
+typedef enum _gceDEBUG_MESSAGE_TYPE
+{
+ gcvMESSAGE_TEXT,
+ gcvMESSAGE_DUMP
+}
+gceDEBUG_MESSAGE_TYPE;
+
+/* Shading format. */
+typedef enum _gceSHADING
+{
+ gcvSHADING_SMOOTH,
+ gcvSHADING_FLAT_D3D,
+ gcvSHADING_FLAT_OPENGL,
+}
+gceSHADING;
+
+/* Culling modes. */
+typedef enum _gceCULL
+{
+ gcvCULL_NONE,
+ gcvCULL_CCW,
+ gcvCULL_CW,
+}
+gceCULL;
+
+/* Fill modes. */
+typedef enum _gceFILL
+{
+ gcvFILL_POINT,
+ gcvFILL_WIRE_FRAME,
+ gcvFILL_SOLID,
+}
+gceFILL;
+
+/* Compare modes. */
+typedef enum _gceCOMPARE
+{
+ gcvCOMPARE_INVALID = 0,
+ gcvCOMPARE_NEVER,
+ gcvCOMPARE_NOT_EQUAL,
+ gcvCOMPARE_LESS,
+ gcvCOMPARE_LESS_OR_EQUAL,
+ gcvCOMPARE_EQUAL,
+ gcvCOMPARE_GREATER,
+ gcvCOMPARE_GREATER_OR_EQUAL,
+ gcvCOMPARE_ALWAYS,
+}
+gceCOMPARE;
+
+/* Stencil modes. */
+typedef enum _gceSTENCIL_MODE
+{
+ gcvSTENCIL_NONE,
+ gcvSTENCIL_SINGLE_SIDED,
+ gcvSTENCIL_DOUBLE_SIDED,
+}
+gceSTENCIL_MODE;
+
+/* Stencil operations. */
+typedef enum _gceSTENCIL_OPERATION
+{
+ gcvSTENCIL_KEEP,
+ gcvSTENCIL_REPLACE,
+ gcvSTENCIL_ZERO,
+ gcvSTENCIL_INVERT,
+ gcvSTENCIL_INCREMENT,
+ gcvSTENCIL_DECREMENT,
+ gcvSTENCIL_INCREMENT_SATURATE,
+ gcvSTENCIL_DECREMENT_SATURATE,
+ gcvSTENCIL_OPERATION_INVALID = -1
+}
+gceSTENCIL_OPERATION;
+
+/* Stencil selection. */
+typedef enum _gceSTENCIL_WHERE
+{
+ gcvSTENCIL_FRONT,
+ gcvSTENCIL_BACK,
+}
+gceSTENCIL_WHERE;
+
+/* Texture addressing selection. */
+typedef enum _gceTEXTURE_WHICH
+{
+ gcvTEXTURE_S,
+ gcvTEXTURE_T,
+ gcvTEXTURE_R,
+}
+gceTEXTURE_WHICH;
+
+/* Texture addressing modes. */
+typedef enum _gceTEXTURE_ADDRESSING
+{
+ gcvTEXTURE_INVALID = 0,
+ gcvTEXTURE_CLAMP,
+ gcvTEXTURE_WRAP,
+ gcvTEXTURE_MIRROR,
+ gcvTEXTURE_BORDER,
+ gcvTEXTURE_MIRROR_ONCE,
+}
+gceTEXTURE_ADDRESSING;
+
+/* Texture filters. */
+typedef enum _gceTEXTURE_FILTER
+{
+ gcvTEXTURE_NONE,
+ gcvTEXTURE_POINT,
+ gcvTEXTURE_LINEAR,
+ gcvTEXTURE_ANISOTROPIC,
+}
+gceTEXTURE_FILTER;
+
+typedef enum _gceTEXTURE_COMPONENT
+{
+ gcvTEXTURE_COMPONENT_R,
+ gcvTEXTURE_COMPONENT_G,
+ gcvTEXTURE_COMPONENT_B,
+ gcvTEXTURE_COMPONENT_A,
+
+ gcvTEXTURE_COMPONENT_NUM,
+} gceTEXTURE_COMPONENT;
+
+/* Texture swizzle modes. */
+typedef enum _gceTEXTURE_SWIZZLE
+{
+ gcvTEXTURE_SWIZZLE_R = 0,
+ gcvTEXTURE_SWIZZLE_G,
+ gcvTEXTURE_SWIZZLE_B,
+ gcvTEXTURE_SWIZZLE_A,
+ gcvTEXTURE_SWIZZLE_0,
+ gcvTEXTURE_SWIZZLE_1,
+
+ gcvTEXTURE_SWIZZLE_INVALID,
+} gceTEXTURE_SWIZZLE;
+
+typedef enum _gceTEXTURE_SRGBDECODE
+{
+ gcvTEXTURE_SRGB_INVALID = 0,
+ gcvTEXTURE_DECODE,
+ gcvTEXTURE_SKIP_DECODE,
+}gceTEXTURE_SRGBDECODE;
+
+typedef enum _gceTEXTURE_COMPARE_MODE
+{
+ gcvTEXTURE_COMPARE_MODE_INVALID = 0,
+ gcvTEXTURE_COMPARE_MODE_NONE,
+ gcvTEXTURE_COMPARE_MODE_REF,
+} gceTEXTURE_COMPARE_MODE;
+
+typedef enum _gceTEXTURE_DS_MODE
+{
+ gcvTEXTURE_DS_MODE_INVALID = 0,
+ gcvTEXTURE_DS_MODE_DEPTH = 1,
+ gcvTEXTURE_DS_MODE_STENCIL = 2,
+}gceTEXTURE_DS_MODE;
+
+
+/* Pixel output swizzle modes. */
+typedef enum _gcePIXEL_SWIZZLE
+{
+ gcvPIXEL_SWIZZLE_R = gcvTEXTURE_SWIZZLE_R,
+ gcvPIXEL_SWIZZLE_G = gcvTEXTURE_SWIZZLE_G,
+ gcvPIXEL_SWIZZLE_B = gcvTEXTURE_SWIZZLE_B,
+ gcvPIXEL_SWIZZLE_A = gcvTEXTURE_SWIZZLE_A,
+
+ gcvPIXEL_SWIZZLE_INVALID,
+} gcePIXEL_SWIZZLE;
+
+/* Primitive types. */
+typedef enum _gcePRIMITIVE
+{
+ gcvPRIMITIVE_POINT_LIST,
+ gcvPRIMITIVE_LINE_LIST,
+ gcvPRIMITIVE_LINE_STRIP,
+ gcvPRIMITIVE_LINE_LOOP,
+ gcvPRIMITIVE_TRIANGLE_LIST,
+ gcvPRIMITIVE_TRIANGLE_STRIP,
+ gcvPRIMITIVE_TRIANGLE_FAN,
+ gcvPRIMITIVE_RECTANGLE,
+ gcvPRIMITIVE_LINES_ADJACENCY,
+ gcvPRIMITIVE_LINE_STRIP_ADJACENCY,
+ gcvPRIMITIVE_TRIANGLES_ADJACENCY,
+ gcvPRIMITIVE_TRIANGLE_STRIP_ADJACENCY,
+ gcvPRIMITIVE_PATCH_LIST,
+}
+gcePRIMITIVE;
+
+/* Index types. */
+typedef enum _gceINDEX_TYPE
+{
+ gcvINDEX_8,
+ gcvINDEX_16,
+ gcvINDEX_32,
+}
+gceINDEX_TYPE;
+
+/* Multi GPU rendering modes. */
+typedef enum _gceMULTI_GPU_RENDERING_MODE
+{
+ gcvMULTI_GPU_RENDERING_MODE_OFF,
+ gcvMULTI_GPU_RENDERING_MODE_SPLIT_WIDTH,
+ gcvMULTI_GPU_RENDERING_MODE_SPLIT_HEIGHT,
+ gcvMULTI_GPU_RENDERING_MODE_INTERLEAVED_64x64,
+ gcvMULTI_GPU_RENDERING_MODE_INTERLEAVED_128x64,
+ gcvMULTI_GPU_RENDERING_MODE_INTERLEAVED_128x128,
+ gcvMULTI_GPU_RENDERING_MODE_INVALID
+}
+gceMULTI_GPU_RENDERING_MODE;
+
+typedef enum _gceCORE_3D_MASK
+{
+ gcvCORE_3D_0_MASK = (1 << 0),
+ gcvCORE_3D_1_MASK = (1 << 1),
+
+ gcvCORE_3D_ALL_MASK = (0xFFFF)
+}
+gceCORE_3D_MASK;
+
+typedef enum _gceCORE_3D_ID
+{
+ gcvCORE_3D_0_ID = 0,
+ gcvCORE_3D_1_ID = 1,
+
+ gcvCORE_3D_ID_INVALID = ~0UL
+}
+gceCORE_3D_ID;
+
+typedef enum _gceMULTI_GPU_MODE
+{
+ gcvMULTI_GPU_MODE_COMBINED = 0,
+ gcvMULTI_GPU_MODE_INDEPENDENT = 1
+}
+gceMULTI_GPU_MODE;
+
+typedef enum _gceMACHINECODE
+{
+ gcvMACHINECODE_ANTUTU0 = 0x0,
+
+ gcvMACHINECODE_GLB27_RELEASE_0,
+
+ gcvMACHINECODE_GLB25_RELEASE_0,
+ gcvMACHINECODE_GLB25_RELEASE_1,
+
+ /* keep it as the last enum */
+ gcvMACHINECODE_COUNT
+}
+gceMACHINECODE;
+
+typedef enum _gceUNIFORMCVT
+{
+ gcvUNIFORMCVT_NONE = 0,
+ gcvUNIFORMCVT_TO_BOOL,
+ gcvUNIFORMCVT_TO_FLOAT,
+} gceUNIFORMCVT;
+
+typedef enum _gceHAL_ARG_VERSION
+{
+ gcvHAL_ARG_VERSION_V1 = 0x0,
+ gcvHAL_ARG_VERSION_V2,
+}
+gceHAL_ARG_VERSION;
+
+
+typedef enum _gceCHIP_FLAG
+{
+ gcvCHIP_FLAG_MSAA_COHERENCEY_ECO_FIX = 1 << 0,
+ gcvCHIP_FLAG_GC2000_R2 = 1 << 1,
+ gcvCHIP_AXI_BUS128_BITS = 1 << 2,
+}
+gceCHIP_FLAG;
+
+/* If different, choose render engine */
+#define PRIORITY_ENGINE(a, b) gcmMIN(a,b)
+
+typedef enum
+{
+ gcvENGINE_RENDER = 0,
+ gcvENGINE_BLT = 1,
+ gcvENGINE_GPU_ENGINE_COUNT = 2,
+ gcvENGINE_CPU = gcvENGINE_GPU_ENGINE_COUNT,
+ gcvENGINE_ALL_COUNT = gcvENGINE_CPU + 1,
+ gcvENGINE_INVALID = gcvENGINE_ALL_COUNT + 0x100
+}
+gceENGINE;
+
+/* CORE enum. */
+typedef enum _gceCORE
+{
+ gcvCORE_MAJOR,
+ gcvCORE_3D1,
+ gcvCORE_3D2,
+ gcvCORE_3D3,
+ gcvCORE_3D4,
+ gcvCORE_3D5,
+ gcvCORE_3D6,
+ gcvCORE_3D7,
+ gcvCORE_3D_MAX = gcvCORE_3D7,
+ gcvCORE_2D,
+ gcvCORE_VG,
+#if gcdDEC_ENABLE_AHB
+ gcvCORE_DEC,
+#endif
+ gcvCORE_COUNT
+}
+gceCORE;
+
+
+typedef enum _gceSECURE_MODE
+{
+ /* For cores without gcvFEATURE_SECURITY. */
+ gcvSECURE_NONE,
+
+ /* Use registers added in gcvFEATURE_SECURITY in normal driver,
+ ** In this mode, GPU always works under non secure mode and
+ ** should not touch secure buffer. It is used to test basic function.
+ */
+ gcvSECURE_IN_NORMAL,
+
+ /* Make use of gcvFEATURE_SECURITY in trust application. */
+ gcvSECURE_IN_TA
+}
+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;
+
+typedef enum _gceHW_FE_TYPE
+{
+ gcvHW_FE_WAIT_LINK,
+ gcvHW_FE_ASYNC,
+ gcvHW_FE_MULTI_CHANNEL,
+}
+gceHW_FE_TYPE;
+
+typedef enum _gceMCFE_CHANNEL_TYPE
+{
+ gcvMCFE_CHANNEL_NONE = 0,
+ gcvMCFE_CHANNEL_SYSTEM,
+ gcvMCFE_CHANNEL_SHADER,
+ gcvMCFE_CHANNEL_NN,
+ gcvMCFE_CHANNEL_TP,
+
+ gcvMCFE_CHANNEL_3DBLIT = 128,
+}
+gceMCFE_CHANNEL_TYPE;
+
+typedef enum _gceSRAM_INTERNAL
+{
+ gcvSRAM_INTERNAL0 = 0,
+ gcvSRAM_INTERNAL1,
+
+ gcvSRAM_INTER_COUNT
+}
+gceSRAM_INTERNAL;
+
+typedef enum _gceSRAM_EXTERNAL
+{
+ gcvSRAM_EXTERNAL0 = 0,
+ gcvSRAM_EXTERNAL1,
+
+ gcvSRAM_EXT_COUNT
+}
+gceSRAM_EXTERNAL;
+
+typedef enum _gceFLATMAP_FLAG
+{
+ gcvFLATMAP_DIRECT,
+ gcvFLATMAP_SHIFT,
+}
+gceFLATMAP_FLAG;
+
+typedef enum _gcePAGE_TYPE
+{
+ gcvPAGE_TYPE_1M,
+ gcvPAGE_TYPE_4K,
+}
+gcePAGE_TYPE;
+
+typedef enum _gceAREA_TYPE
+{
+ gcvAREA_TYPE_UNKNOWN = 0,
+ gcvAREA_TYPE_FLATMAP,
+ gcvAREA_TYPE_1M,
+ gcvAREA_TYPE_4K,
+}
+gceAREA_TYPE;
+
+/* Video memory alloation type. */
+typedef enum _gceVIDMEM_TYPE
+{
+ gcvVIDMEM_TYPE_GENERIC = gcvSURF_TYPE_UNKNOWN,
+ gcvVIDMEM_TYPE_INDEX_BUFFER = gcvSURF_INDEX,
+ gcvVIDMEM_TYPE_VERTEX_BUFFER = gcvSURF_VERTEX,
+ gcvVIDMEM_TYPE_TEXTURE = gcvSURF_TEXTURE,
+ gcvVIDMEM_TYPE_COLOR_BUFFER = gcvSURF_RENDER_TARGET,
+ gcvVIDMEM_TYPE_DEPTH_BUFFER = gcvSURF_DEPTH,
+ gcvVIDMEM_TYPE_BITMAP = gcvSURF_BITMAP,
+ gcvVIDMEM_TYPE_TILE_STATUS = gcvSURF_TILE_STATUS,
+ gcvVIDMEM_TYPE_IMAGE = gcvSURF_IMAGE,
+ gcvVIDMEM_TYPE_MASK = gcvSURF_MASK,
+ gcvVIDMEM_TYPE_SCISSOR = gcvSURF_SCISSOR,
+ gcvVIDMEM_TYPE_HZ_BUFFER = gcvSURF_HIERARCHICAL_DEPTH,
+ gcvVIDMEM_TYPE_ICACHE = gcvSURF_ICACHE,
+ gcvVIDMEM_TYPE_TXDESC = gcvSURF_TXDESC,
+ gcvVIDMEM_TYPE_FENCE = gcvSURF_FENCE,
+ gcvVIDMEM_TYPE_TFBHEADER = gcvSURF_TFBHEADER,
+ gcvVIDMEM_TYPE_COMMAND,
+ gcvVIDMEM_TYPE_COUNT
+}
+gceVIDMEM_TYPE;
+
+/* No special needs. */
+#define gcvALLOC_FLAG_NONE 0x00000000
+
+/* Physical contiguous. */
+#define gcvALLOC_FLAG_CONTIGUOUS 0x00000001
+/* Physical non contiguous. */
+#define gcvALLOC_FLAG_NON_CONTIGUOUS 0x00000002
+
+/* Should not swap out. */
+#define gcvALLOC_FLAG_NON_PAGED 0x00000004
+
+/* CPU access explicitly needed. */
+#define gcvALLOC_FLAG_CPU_ACCESS 0x00000008
+/* Can be remapped as cacheable. */
+#define gcvALLOC_FLAG_CACHEABLE 0x00000010
+
+/* Need 32bit address. */
+#define gcvALLOC_FLAG_4GB_ADDR 0x00000020
+
+/* Secure buffer. */
+#define gcvALLOC_FLAG_SECURITY 0x00000040
+/* Can be exported as dmabuf-fd */
+#define gcvALLOC_FLAG_DMABUF_EXPORTABLE 0x00000080
+/* Do not try slow pools (gcvPOOL_VIRTUAL) */
+#define gcvALLOC_FLAG_FAST_POOLS 0x00000100
+
+/* Import DMABUF. */
+#define gcvALLOC_FLAG_DMABUF 0x00001000
+/* Import USERMEMORY. */
+#define gcvALLOC_FLAG_USERMEMORY 0x00002000
+/* Import an External Buffer. */
+#define gcvALLOC_FLAG_EXTERNAL_MEMORY 0x00004000
+/* Import linux reserved memory. */
+#define gcvALLOC_FLAG_LINUX_RESERVED_MEM 0x00008000
+
+/* 1M pages unit allocation. */
+#define gcvALLOC_FLAG_1M_PAGES 0x00010000
+
+/* Non 1M pages unit allocation. */
+#define gcvALLOC_FLAG_4K_PAGES 0x00020000
+
+/* Real allocation happens when GPU page fault. */
+#define gcvALLOC_FLAG_ALLOC_ON_FAULT 0x01000000
+/* Alloc with memory limit. */
+#define gcvALLOC_FLAG_MEMLIMIT 0x02000000
+
+/* CMA allocator only */
+#define gcvALLOC_FLAG_CMA_LIMIT 0x04000000
+
+#define gcvALLOC_FLAG_CMA_PREEMPT 0x08000000
+
+/* GL_VIV internal usage */
+#ifndef GL_MAP_BUFFER_OBJ_VIV
+#define GL_MAP_BUFFER_OBJ_VIV 0x10000
+#endif
+
+/* Command buffer usage. */
+#define gcvCOMMAND_2D (1 << 0)
+#define gcvCOMMAND_3D (1 << 1)
+
+/* Default chip ID means chip ID same as core index. */
+#define gcvCHIP_ID_DEFAULT (~0U)
+
+/******************************************************************************\
+****************************** Object Declarations *****************************
+\******************************************************************************/
+
+typedef struct _gckCONTEXT * gckCONTEXT;
+typedef struct _gcoCMDBUF * gcoCMDBUF;
+
+typedef struct _gcsSTATE_DELTA * gcsSTATE_DELTA_PTR;
+typedef struct _gcsQUEUE * gcsQUEUE_PTR;
+typedef struct _gcoQUEUE * gcoQUEUE;
+typedef struct _gcsHAL_INTERFACE * gcsHAL_INTERFACE_PTR;
+typedef struct _gcs2D_PROFILE * gcs2D_PROFILE_PTR;
+
+
+#if gcdENABLE_VG
+typedef struct _gcoVGHARDWARE * gcoVGHARDWARE;
+typedef struct _gcoVGBUFFER * gcoVGBUFFER;
+typedef struct _gckVGHARDWARE * gckVGHARDWARE;
+typedef struct _gcsVGCONTEXT * gcsVGCONTEXT_PTR;
+typedef struct _gcsVGCONTEXT_MAP * gcsVGCONTEXT_MAP_PTR;
+typedef struct _gcsVGCMDQUEUE * gcsVGCMDQUEUE_PTR;
+typedef struct _gcsTASK_MASTER_TABLE * gcsTASK_MASTER_TABLE_PTR;
+typedef struct _gckVGKERNEL * gckVGKERNEL;
+typedef void * gctTHREAD;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_enum_h_ */
+
+
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
new file mode 100644
index 000000000000..fb8c5c75a160
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_kernel_buffer.h
@@ -0,0 +1,326 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_buffer_h_
+#define __gc_hal_kernel_buffer_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************\
+************************ Command Buffer and Event Objects **********************
+\******************************************************************************/
+
+/* The number of context buffers per user. */
+#define gcdCONTEXT_BUFFER_COUNT 2
+
+#define gcdRENDER_FENCE_LENGTH (6 * gcmSIZEOF(gctUINT32))
+#define gcdBLT_FENCE_LENGTH (10 * gcmSIZEOF(gctUINT32))
+#define gcdRESERVED_FLUSHCACHE_LENGTH (2 * gcmSIZEOF(gctUINT32))
+#define gcdRESERVED_PAUSE_OQ_LENGTH (2 * gcmSIZEOF(gctUINT32))
+#define gcdRESERVED_PAUSE_XFBWRITTEN_QUERY_LENGTH (4 * gcmSIZEOF(gctUINT32))
+#define gcdRESERVED_PAUSE_PRIMGEN_QUERY_LENGTH (4 * gcmSIZEOF(gctUINT32))
+#define gcdRESERVED_PAUSE_XFB_LENGTH (2 * gcmSIZEOF(gctUINT32))
+#define gcdRESERVED_HW_FENCE_32BIT (4 * gcmSIZEOF(gctUINT32))
+#define gcdRESERVED_HW_FENCE_64BIT (6 * gcmSIZEOF(gctUINT32))
+#define gcdRESERVED_PAUSE_PROBE_LENGTH (TOTAL_PROBE_NUMBER * 2 * gcmSIZEOF(gctUINT32))
+
+#define gcdRESUME_OQ_LENGTH (2 * gcmSIZEOF(gctUINT32))
+#define gcdRESUME_XFBWRITTEN_QUERY_LENGTH (4 * gcmSIZEOF(gctUINT32))
+#define gcdRESUME_PRIMGEN_QUERY_LENGTH (4 * gcmSIZEOF(gctUINT32))
+#define gcdRESUME_XFB_LENGH (2 * gcmSIZEOF(gctUINT32))
+#define gcdRESUME_PROBE_LENGH (TOTAL_PROBE_NUMBER * 2 * gcmSIZEOF(gctUINT32))
+
+
+/* State delta record. */
+typedef struct _gcsSTATE_DELTA_RECORD * gcsSTATE_DELTA_RECORD_PTR;
+typedef struct _gcsSTATE_DELTA_RECORD
+{
+ /* State address. */
+ gctUINT address;
+
+ /* State mask. */
+ gctUINT32 mask;
+
+ /* State data. */
+ gctUINT32 data;
+}
+gcsSTATE_DELTA_RECORD;
+
+/* State delta. */
+typedef struct _gcsSTATE_DELTA
+{
+ /* For debugging: the number of delta in the order of creation. */
+ gctUINT num;
+
+ /* Main state delta ID. Every time state delta structure gets reinitialized,
+ main ID is incremented. If main state ID overflows, all map entry IDs get
+ reinitialized to make sure there is no potential erroneous match after
+ the overflow.*/
+ gctUINT id;
+
+ /* Vertex element count for the delta buffer. */
+ gctUINT elementCount;
+
+ /* Number of states currently stored in the record array. */
+ gctUINT recordCount;
+
+ /* Record array; holds all modified states in gcsSTATE_DELTA_RECORD. */
+ gctUINT64 recordArray;
+ gctUINT recordSize;
+
+ /* Map entry ID is used for map entry validation. If map entry ID does not
+ match the main state delta ID, the entry and the corresponding state are
+ considered not in use. */
+ gctUINT64 mapEntryID;
+ gctUINT mapEntryIDSize;
+
+ /* If the map entry ID matches the main state delta ID, index points to
+ the state record in the record array. */
+ gctUINT64 mapEntryIndex;
+}
+gcsSTATE_DELTA;
+
+#define FENCE_NODE_LIST_INIT_COUNT 100
+
+typedef struct _gcsFENCE_APPEND_NODE
+{
+ gcsSURF_NODE_PTR node;
+ gceFENCE_TYPE type;
+
+}gcsFENCE_APPEND_NODE;
+
+typedef gcsFENCE_APPEND_NODE * gcsFENCE_APPEND_NODE_PTR;
+
+typedef struct _gcsFENCE_LIST * gcsFENCE_LIST_PTR;
+
+typedef struct _gcsFENCE_LIST
+{
+ /* Resource that need get fence, but command used this resource not generated */
+ gcsFENCE_APPEND_NODE_PTR pendingList;
+ gctUINT pendingCount;
+ gctUINT pendingAllocCount;
+
+ /* Resoure that already generated command in this command buffer but not get fence */
+ gcsFENCE_APPEND_NODE_PTR onIssueList;
+ gctUINT onIssueCount;
+ gctUINT onIssueAllocCount;
+}
+gcsFENCE_LIST;
+
+/* Command buffer object. */
+/*
+ * Initial (before put commands):
+ *
+ * +-------------------------------------------
+ * ...|reservedHead|
+ * +-------------------------------------------
+ * ^ ^
+ * | |
+ * startOffset offset
+ *
+ *
+ * After put command, in commit:
+ *
+ * +------------------------------------------+
+ * .. |reservedHead| .. commands .. |reservedTail| ..
+ * +------------------------------------------+
+ * ^ ^
+ * | |
+ * startOffset offset
+ *
+ *
+ * Commit done, becomes initial state:
+ *
+ * +------------------------------------------+-----------------
+ * .. |reservedHead| .. commands .. |reservedTail|reservedHead| ..
+ * +------------------------------------------+-----------------
+ * ^ ^
+ * | |
+ * startOffset offset
+ *
+ * reservedHead:
+ * Select pipe commands.
+ *
+ * reservedTail:
+ * Link, Fence, ChipEnable
+ *
+ */
+struct _gcoCMDBUF
+{
+ /* The object. */
+ gcsOBJECT object;
+
+ /* Commit count. */
+ gctUINT64 commitCount;
+
+ /* Command buffer entry and exit pipes. */
+ gcePIPE_SELECT entryPipe;
+ gcePIPE_SELECT exitPipe;
+
+ /* Feature usage flags. */
+ gctBOOL using2D;
+ gctBOOL using3D;
+
+ /* Size of reserved head and tail for each commit. */
+ gctUINT32 reservedHead;
+ gctUINT32 reservedTail;
+
+ /* Video memory handle of command buffer. */
+ gctUINT32 videoMemNode;
+
+ /* GPU address of command buffer. */
+ gctUINT32 address;
+
+ /* Logical address of command buffer. */
+ gctUINT64 logical;
+
+ /* Number of bytes in command buffer. */
+ gctUINT32 bytes;
+
+ /* Start offset into the command buffer. */
+ gctUINT32 startOffset;
+
+ /* Current offset into the command buffer. */
+ gctUINT32 offset;
+
+ /* Number of free bytes in command buffer. */
+ gctUINT32 free;
+
+ /* Location of the last reserved area. */
+ gctUINT64 lastReserve;
+ gctUINT32 lastOffset;
+
+ /* Last load state command location and hardware address. */
+ gctUINT64 lastLoadStatePtr;
+ gctUINT32 lastLoadStateAddress;
+ gctUINT32 lastLoadStateCount;
+
+ /*
+ * Put pointer type member after this line.
+ */
+
+ /* Completion signal. */
+ gctSIGNAL signal;
+
+ /* Link to the siblings. */
+ gcoCMDBUF prev;
+ gcoCMDBUF next;
+
+ /* Mirror command buffer(s). */
+ gcoCMDBUF *mirrors;
+ gctUINT32 mirrorCount;
+};
+
+typedef struct _gcsQUEUE
+{
+ /* Pointer to next gcsQUEUE structure in gcsQUEUE. */
+ gctUINT64 next;
+
+ /* Event information. */
+ gcsHAL_INTERFACE iface;
+}
+gcsQUEUE;
+
+/* A record chunk include multiple records to save allocation. */
+typedef struct _gcsQUEUE_CHUNK
+{
+ struct _gcsQUEUE_CHUNK * next;
+
+ gcsQUEUE record[16];
+}
+gcsQUEUE_CHUNK;
+
+/* Event queue. */
+struct _gcoQUEUE
+{
+ /* The object. */
+ gcsOBJECT object;
+
+ /* Pointer to current event queue. */
+ gcsQUEUE_PTR head;
+ gcsQUEUE_PTR tail;
+
+ /* List of free records. */
+ gcsQUEUE_PTR freeList;
+
+ /* chunks of the records. */
+ gcsQUEUE_CHUNK * chunks;
+
+ #define gcdIN_QUEUE_RECORD_LIMIT 16
+ /* Number of records currently in queue */
+ gctUINT32 recordCount;
+ /* Number of records which release resource currently in queue */
+ gctUINT32 tmpBufferRecordCount;
+
+ /* Max size of pending unlock node in vidmem pool not committed */
+ gctUINT maxUnlockBytes;
+
+ gceENGINE engine;
+};
+
+struct _gcsTEMPCMDBUF
+{
+ gctUINT32 currentByteSize;
+ gctPOINTER buffer;
+ gctBOOL inUse;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_kernel_buffer_h_ */
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h
new file mode 100644
index 000000000000..c13297bf53d4
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_mem.h
@@ -0,0 +1,566 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+/*
+** Include file for the local memory management.
+*/
+
+#ifndef __gc_hal_mem_h_
+#define __gc_hal_mem_h_
+#if (gcdENABLE_3D || gcdENABLE_VG)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************
+** Usage:
+
+ The macros to declare MemPool type and functions are
+ gcmMEM_DeclareFSMemPool (Type, TypeName, Prefix)
+ gcmMEM_DeclareVSMemPool (Type, TypeName, Prefix)
+ gcmMEM_DeclareAFSMemPool(Type, TypeName, Prefix)
+
+ The data structures for MemPool are
+ typedef struct _gcsMEM_FS_MEM_POOL * gcsMEM_FS_MEM_POOL;
+ typedef struct _gcsMEM_VS_MEM_POOL * gcsMEM_VS_MEM_POOL;
+ typedef struct _gcsMEM_AFS_MEM_POOL * gcsMEM_AFS_MEM_POOL;
+
+ The MemPool constructor and destructor functions are
+ gcfMEM_InitFSMemPool(gcsMEM_FS_MEM_POOL *, gcoOS, gctUINT, gctUINT);
+ gcfMEM_FreeFSMemPool(gcsMEM_FS_MEM_POOL *);
+ gcfMEM_InitVSMemPool(gcsMEM_VS_MEM_POOL *, gcoOS, gctUINT, gctBOOL);
+ gcfMEM_FreeVSMemPool(gcsMEM_VS_MEM_POOL *);
+ gcfMEM_InitAFSMemPool(gcsMEM_AFS_MEM_POOL *, gcoOS, gctUINT);
+ gcfMEM_FreeAFSMemPool(gcsMEM_AFS_MEM_POOL *);
+
+ FS: for Fixed-Size data structures
+ VS: for Variable-size data structures
+ AFS: for Array of Fixed-Size data structures
+
+
+ // Example 1: For a fixed-size data structure, struct gcsNode.
+ // It is used locally in a file, so the functions are static without prefix.
+ // At top level, declear allocate and free functions.
+ // The first argument is the data type.
+ // The second armument is the short name used in the fuctions.
+ gcmMEM_DeclareFSMemPool(struct gcsNode, Node, );
+
+ // The previous macro creates two inline functions,
+ // _AllocateNode and _FreeNode.
+
+ // In function or struct
+ gcsMEM_FS_MEM_POOL nodeMemPool;
+
+ // In function,
+ struct gcsNode * node;
+ gceSTATUS status;
+
+ // Before using the memory pool, initialize it.
+ // The second argument is the gcoOS object.
+ // The third argument is the number of data structures to allocate for each chunk.
+ status = gcfMEM_InitFSMemPool(&nodeMemPool, os, 100, sizeof(struct gcsNode));
+ ...
+
+ // Allocate a node.
+ status = _AllocateNode(nodeMemPool, &node);
+ ...
+ // Free a node.
+ _FreeNode(nodeMemPool, node);
+
+ // After using the memory pool, free it.
+ gcfMEM_FreeFSMemPool(&nodeMemPool);
+
+
+ // Example 2: For array of fixed-size data structures, struct gcsNode.
+ // It is used in several files, so the functions are extern with prefix.
+ // At top level, declear allocate and free functions.
+ // The first argument is the data type, and the second one is the short name
+ // used in the fuctions.
+ gcmMEM_DeclareAFSMemPool(struct gcsNode, NodeArray, gcfOpt);
+
+ // The previous macro creates two inline functions,
+ // gcfOpt_AllocateNodeArray and gcfOpt_FreeNodeArray.
+
+ // In function or struct
+ gcsMEM_AFS_MEM_POOL nodeArrayMemPool;
+
+ // In function,
+ struct gcsNode * nodeArray;
+ gceSTATUS status;
+
+ // Before using the array memory pool, initialize it.
+ // The second argument is the gcoOS object, the third is the number of data
+ // structures to allocate for each chunk.
+ status = gcfMEM_InitAFSMemPool(&nodeArrayMemPool, os, sizeof(struct gcsNode));
+ ...
+
+ // Allocate a node array of size 100.
+ status = gcfOpt_AllocateNodeArray(nodeArrayMemPool, &nodeArray, 100);
+ ...
+ // Free a node array.
+ gcfOpt_FreeNodeArray(&nodeArrayMemPool, nodeArray);
+
+ // After using the array memory pool, free it.
+ gcfMEM_FreeAFSMemPool(&nodeArrayMemPool);
+
+*******************************************************************************/
+
+/*******************************************************************************
+** To switch back to use gcoOS_Allocate and gcoOS_Free, add
+** #define USE_LOCAL_MEMORY_POOL 0
+** before including this file.
+*******************************************************************************/
+#ifndef USE_LOCAL_MEMORY_POOL
+/*
+ USE_LOCAL_MEMORY_POOL
+
+ This define enables the local memory management to improve performance.
+*/
+#define USE_LOCAL_MEMORY_POOL 1
+#endif
+
+/*******************************************************************************
+** Memory Pool Data Structures
+*******************************************************************************/
+#if USE_LOCAL_MEMORY_POOL
+ typedef struct _gcsMEM_FS_MEM_POOL * gcsMEM_FS_MEM_POOL;
+ typedef struct _gcsMEM_VS_MEM_POOL * gcsMEM_VS_MEM_POOL;
+ typedef struct _gcsMEM_AFS_MEM_POOL * gcsMEM_AFS_MEM_POOL;
+#else
+ typedef gcoOS gcsMEM_FS_MEM_POOL;
+ typedef gcoOS gcsMEM_VS_MEM_POOL;
+ typedef gcoOS gcsMEM_AFS_MEM_POOL;
+#endif
+
+/*******************************************************************************
+** Memory Pool Macros
+*******************************************************************************/
+#if USE_LOCAL_MEMORY_POOL
+#define gcmMEM_DeclareFSMemPool(Type, TypeName, Prefix) \
+gceSTATUS \
+Prefix##_Allocate##TypeName(\
+ gcsMEM_FS_MEM_POOL MemPool, \
+ Type ** Pointer \
+ ) \
+{ \
+ return(gcfMEM_FSMemPoolGetANode(MemPool, (gctPOINTER *) Pointer)); \
+} \
+ \
+gceSTATUS \
+Prefix##_CAllocate##TypeName(\
+ gcsMEM_FS_MEM_POOL MemPool, \
+ Type ** Pointer \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x", MemPool, Pointer); \
+ gcmERR_RETURN(gcfMEM_FSMemPoolGetANode(MemPool, (gctPOINTER *) Pointer)); \
+ gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, gcmSIZEOF(Type)); \
+ gcmFOOTER(); \
+ return gcvSTATUS_OK; \
+} \
+ \
+gceSTATUS \
+Prefix##_Free##TypeName(\
+ gcsMEM_FS_MEM_POOL MemPool, \
+ Type * Pointer \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x", MemPool, Pointer); \
+ status = gcfMEM_FSMemPoolFreeANode(MemPool, (gctPOINTER) Pointer); \
+ gcmFOOTER(); \
+ return status; \
+} \
+ \
+gceSTATUS \
+Prefix##_Free##TypeName##List(\
+ gcsMEM_FS_MEM_POOL MemPool, \
+ Type * FirstPointer, \
+ Type * LastPointer \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x FirstPointer=0x%x LastPointer=0x%x", MemPool, FirstPointer, LastPointer); \
+ status = gcfMEM_FSMemPoolFreeAList(MemPool, (gctPOINTER) FirstPointer, (gctPOINTER) LastPointer); \
+ gcmFOOTER(); \
+ return status; \
+}
+
+#define gcmMEM_DeclareVSMemPool(Type, TypeName, Prefix) \
+gceSTATUS \
+Prefix##_Allocate##TypeName(\
+ gcsMEM_FS_MEM_POOL MemPool, \
+ Type ** Pointer, \
+ gctUINT Size \
+ ) \
+{ \
+ gceSTATUS status;\
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x Size=%u", MemPool, Pointer, Size); \
+ status = gcfMEM_VSMemPoolGetANode(MemPool, Size, (gctPOINTER *) Pointer); \
+ gcmFOOTER(); \
+ return status; \
+} \
+ \
+gceSTATUS \
+ Prefix##_CAllocate##TypeName(\
+ gcsMEM_FS_MEM_POOL MemPool, \
+ Type ** Pointer, \
+ gctUINT Size \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x Size=%u", MemPool, Pointer, Size); \
+ gcmERR_RETURN(gcfMEM_VSMemPoolGetANode(MemPool, Size, (gctPOINTER *) Pointer)); \
+ gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, size); \
+ gcmFOOTER(); \
+ return gcvSTATUS_OK; \
+} \
+ \
+gceSTATUS \
+Prefix##_Free##TypeName(\
+ gcsMEM_FS_MEM_POOL MemPool, \
+ Type * Pointer \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x", MemPool, Pinter); \
+ status = gcfMEM_VSMemPoolFreeANode(MemPool, (gctPOINTER) Pointer); \
+ gcmFOOTER(); \
+ return status; \
+}
+
+#define gcmMEM_DeclareAFSMemPool(Type, TypeName, Prefix) \
+gceSTATUS \
+Prefix##_Allocate##TypeName(\
+ gcsMEM_AFS_MEM_POOL MemPool, \
+ Type ** Pointer, \
+ gctUINT Count \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x Count=%u", MemPool, Pointer, Count); \
+ status = gcfMEM_AFSMemPoolGetANode(MemPool, Count, (gctPOINTER *) Pointer); \
+ gcmFOOTER(); \
+ return status; \
+} \
+ \
+gceSTATUS \
+Prefix##_CAllocate##TypeName(\
+ gcsMEM_AFS_MEM_POOL MemPool, \
+ Type ** Pointer, \
+ gctUINT Count \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x Count=%u", MemPool, Pointer, Count); \
+ gcmERR_RETURN(gcfMEM_AFSMemPoolGetANode(MemPool, Count, (gctPOINTER *) Pointer)); \
+ gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, Count * gcmSIZEOF(Type)); \
+ gcmFOOTER(); \
+ return gcvSTATUS_OK; \
+} \
+ \
+gceSTATUS \
+Prefix##_Free##TypeName(\
+ gcsMEM_AFS_MEM_POOL MemPool, \
+ Type * Pointer \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x", MemPool, Pointer); \
+ status = gcfMEM_AFSMemPoolFreeANode(MemPool, (gctPOINTER) Pointer); \
+ gcmFOOTER(); \
+ return status; \
+}
+
+#else
+
+#define gcmMEM_DeclareFSMemPool(Type, TypeName, Prefix) \
+gceSTATUS \
+Prefix##_Allocate##TypeName(\
+ gcsMEM_FS_MEM_POOL MemPool, \
+ Type ** Pointer \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x", MemPool, Pointer); \
+ status = gcoOS_Allocate(MemPool, \
+ gcmSIZEOF(Type), \
+ (gctPOINTER *) Pointer); \
+ gcmFOOTER(); \
+ return status; \
+} \
+ \
+gceSTATUS \
+Prefix##_CAllocate##TypeName(\
+ gcsMEM_FS_MEM_POOL MemPool, \
+ Type ** Pointer \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x", MemPool, Pointer); \
+ gcmERR_RETURN(gcoOS_Allocate(MemPool, \
+ gcmSIZEOF(Type), \
+ (gctPOINTER *) Pointer)); \
+ gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, gcmSIZEOF(Type)); \
+ gcmFOOTER(); \
+ return gcvSTATUS_OK; \
+} \
+ \
+gceSTATUS \
+Prefix##_Free##TypeName(\
+ gcsMEM_FS_MEM_POOL MemPool, \
+ Type * Pointer \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x", MemPool, Pointer); \
+ status = gcmOS_SAFE_FREE(MemPool, Pointer); \
+ gcmFOOTER(); \
+ return status; \
+}
+
+#define gcmMEM_DeclareVSMemPool(Type, TypeName, Prefix) \
+gceSTATUS \
+Prefix##_Allocate##TypeName(\
+ gcsMEM_VS_MEM_POOL MemPool, \
+ Type ** Pointer, \
+ gctUINT Size \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x Size=%u", MemPool, Pointer, Size); \
+ status = gcoOS_Allocate(MemPool, \
+ Size, \
+ (gctPOINTER *) Pointer); \
+ gcmFOOTER(); \
+ return status; \
+} \
+ \
+gceSTATUS \
+Prefix##_CAllocate##TypeName(\
+ gcsMEM_VS_MEM_POOL MemPool, \
+ Type ** Pointer, \
+ gctUINT Size \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x Size=%u", MemPool, Pointer, Size); \
+ gcmERR_RETURN(gcoOS_Allocate(MemPool, \
+ Size, \
+ (gctPOINTER *) Pointer)); \
+ gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, Size); \
+ gcmFOOTER(); \
+ return gcvSTATUS_OK; \
+} \
+ \
+gceSTATUS \
+Prefix##_Free##TypeName(\
+ gcsMEM_VS_MEM_POOL MemPool, \
+ Type * Pointer \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x", MemPool, Pointer); \
+ status = gcmOS_SAFE_FREE(MemPool, Pointer); \
+ gcmFOOTER(); \
+ return status; \
+}
+
+#define gcmMEM_DeclareAFSMemPool(Type, TypeName, Prefix) \
+gceSTATUS \
+Prefix##_Allocate##TypeName(\
+ gcsMEM_AFS_MEM_POOL MemPool, \
+ Type ** Pointer, \
+ gctUINT Count \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x Count=%u", MemPool, Pointer, Count); \
+ status = gcoOS_Allocate(MemPool, \
+ Count * gcmSIZEOF(Type), \
+ (gctPOINTER *) Pointer); \
+ gcmFOOTER(); \
+ return status; \
+} \
+ \
+gceSTATUS \
+Prefix##_CAllocate##TypeName(\
+ gcsMEM_AFS_MEM_POOL MemPool, \
+ Type ** Pointer, \
+ gctUINT Count \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x Count=%u", MemPool, Pointer, Count); \
+ gcmERR_RETURN(gcoOS_Allocate(MemPool, \
+ Count * gcmSIZEOF(Type), \
+ (gctPOINTER *) Pointer)); \
+ gcoOS_ZeroMemory(*(gctPOINTER *) Pointer, Count * gcmSIZEOF(Type)); \
+ gcmFOOTER(); \
+ return gcvSTATUS_OK; \
+} \
+ \
+gceSTATUS \
+Prefix##_Free##TypeName(\
+ gcsMEM_AFS_MEM_POOL MemPool, \
+ Type * Pointer \
+ ) \
+{ \
+ gceSTATUS status; \
+ gcmHEADER_ARG("MemPool=0x%x Pointer=0x%x", MemPool, Pointer); \
+ status = gcmOS_SAFE_FREE(MemPool, Pointer); \
+ gcmFOOTER(); \
+ return status; \
+}
+#endif
+
+/*******************************************************************************
+** Memory Pool Data Functions
+*******************************************************************************/
+gceSTATUS
+gcfMEM_InitFSMemPool(
+ IN gcsMEM_FS_MEM_POOL * MemPool,
+ IN gcoOS OS,
+ IN gctUINT NodeCount,
+ IN gctUINT NodeSize
+ );
+
+gceSTATUS
+gcfMEM_FreeFSMemPool(
+ IN gcsMEM_FS_MEM_POOL * MemPool
+ );
+
+gceSTATUS
+gcfMEM_FSMemPoolGetANode(
+ IN gcsMEM_FS_MEM_POOL MemPool,
+ OUT gctPOINTER * Node
+ );
+
+gceSTATUS
+gcfMEM_FSMemPoolFreeANode(
+ IN gcsMEM_FS_MEM_POOL MemPool,
+ IN gctPOINTER Node
+ );
+
+gceSTATUS
+gcfMEM_FSMemPoolFreeAList(
+ IN gcsMEM_FS_MEM_POOL MemPool,
+ IN gctPOINTER FirstNode,
+ IN gctPOINTER LastNode
+ );
+
+gceSTATUS
+gcfMEM_InitVSMemPool(
+ IN gcsMEM_VS_MEM_POOL * MemPool,
+ IN gcoOS OS,
+ IN gctUINT BlockSize,
+ IN gctBOOL RecycleFreeNode
+ );
+
+gceSTATUS
+gcfMEM_FreeVSMemPool(
+ IN gcsMEM_VS_MEM_POOL * MemPool
+ );
+
+gceSTATUS
+gcfMEM_VSMemPoolGetANode(
+ IN gcsMEM_VS_MEM_POOL MemPool,
+ IN gctUINT Size,
+ IN gctUINT Alignment,
+ OUT gctPOINTER * Node
+ );
+
+gceSTATUS
+gcfMEM_VSMemPoolFreeANode(
+ IN gcsMEM_VS_MEM_POOL MemPool,
+ IN gctPOINTER Node
+ );
+
+gceSTATUS
+gcfMEM_InitAFSMemPool(
+ IN gcsMEM_AFS_MEM_POOL *MemPool,
+ IN gcoOS OS,
+ IN gctUINT NodeCount,
+ IN gctUINT NodeSize
+ );
+
+gceSTATUS
+gcfMEM_FreeAFSMemPool(
+ IN gcsMEM_AFS_MEM_POOL *MemPool
+ );
+
+gceSTATUS
+gcfMEM_AFSMemPoolGetANode(
+ IN gcsMEM_AFS_MEM_POOL MemPool,
+ IN gctUINT Count,
+ OUT gctPOINTER * Node
+ );
+
+gceSTATUS
+gcfMEM_AFSMemPoolFreeANode(
+ IN gcsMEM_AFS_MEM_POOL MemPool,
+ IN gctPOINTER Node
+ );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* (gcdENABLE_3D || gcdENABLE_VG) */
+#endif /* __gc_hal_mem_h_ */
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_metadata.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_metadata.h
new file mode 100644
index 000000000000..c59b03eac812
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_metadata.h
@@ -0,0 +1,121 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_metadata_h_
+#define __gc_hal_kernel_metadata_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Macro to combine four characters into a Character Code. */
+#define __FOURCC(a, b, c, d) \
+ ((uint32_t)(a) | ((uint32_t)(b) << 8) | ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24))
+
+#define VIV_VIDMEM_METADATA_MAGIC __FOURCC('v', 'i', 'v', 'm')
+
+/* Compressed format now was defined same as dec400d, should be general. */
+typedef enum _VIV_COMPRESS_FMT
+{
+ _VIV_CFMT_ARGB8 = 0,
+ _VIV_CFMT_XRGB8,
+ _VIV_CFMT_AYUV,
+ _VIV_CFMT_UYVY,
+ _VIV_CFMT_YUY2,
+ _VIV_CFMT_YUV_ONLY,
+ _VIV_CFMT_UV_MIX,
+ _VIV_CFMT_ARGB4,
+ _VIV_CFMT_XRGB4,
+ _VIV_CFMT_A1R5G5B5,
+ _VIV_CFMT_X1R5G5B5,
+ _VIV_CFMT_R5G6B5,
+ _VIV_CFMT_Z24S8,
+ _VIV_CFMT_Z24,
+ _VIV_CFMT_Z16,
+ _VIV_CFMT_A2R10G10B10,
+ _VIV_CFMT_BAYER,
+ _VIV_CFMT_SIGNED_BAYER,
+ _VIV_CFMT_VAA16,
+ _VIV_CFMT_S8,
+
+ _VIV_CFMT_MAX,
+} _VIV_COMPRESS_FMT;
+
+/* Metadata for cross-device fd share with additional (ts) info. */
+typedef struct _VIV_VIDMEM_METADATA
+{
+ uint32_t magic;
+
+ int32_t ts_fd;
+ void * ts_dma_buf;
+#ifdef gcdANDROID
+ dma_addr_t ts_address;
+#endif
+
+ uint32_t fc_enabled;
+ uint32_t fc_value;
+ uint32_t fc_value_upper;
+
+ uint32_t compressed;
+ uint32_t compress_format;
+} _VIV_VIDMEM_METADATA;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_kernel_metadata_h_ */
+
+
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
new file mode 100644
index 000000000000..997742fb173b
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_options.h
@@ -0,0 +1,1359 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_options_h_
+#define __gc_hal_options_h_
+
+/*
+ gcdSECURITY
+
+*/
+#ifndef gcdSECURITY
+# define gcdSECURITY 0
+#endif
+
+/*
+ gcdPRINT_VERSION
+
+ Print HAL version.
+*/
+#ifndef gcdPRINT_VERSION
+# define gcdPRINT_VERSION 0
+#endif
+
+/*
+USE_KERNEL_VIRTUAL_BUFFERS
+
+This define enables the use of VM for gckCommand and fence buffers.
+*/
+#ifndef USE_KERNEL_VIRTUAL_BUFFERS
+#if defined(UNDER_CE)
+# define USE_KERNEL_VIRTUAL_BUFFERS 1
+#else
+# define USE_KERNEL_VIRTUAL_BUFFERS 1
+#endif
+#endif
+
+/*
+ USE_NEW_LINUX_SIGNAL
+
+ This define enables the Linux kernel signaling between kernel and user.
+*/
+#ifndef USE_NEW_LINUX_SIGNAL
+# define USE_NEW_LINUX_SIGNAL 0
+#endif
+
+/*
+ USE_LINUX_PCIE
+
+ This define enables galcore as a Linux PCIE driver.
+*/
+#ifndef USE_LINUX_PCIE
+# define USE_LINUX_PCIE 0
+#endif
+
+/*
+ VIVANTE_PROFILER
+
+ This define enables the profiler for hardware counters.
+*/
+#ifndef VIVANTE_PROFILER
+# define VIVANTE_PROFILER 1
+#endif
+
+/*
+ gcdUSE_VG
+
+ Enable VG HAL layer (only for GC350).
+*/
+#ifndef gcdUSE_VG
+# define gcdUSE_VG 0
+#endif
+
+/*
+ gcdUSE_VX
+
+ Enable VX HAL layer.
+*/
+#ifndef gcdUSE_VX
+# define gcdUSE_VX 1
+#endif
+
+/*
+ PROFILE_HAL_COUNTERS
+
+ This define enables HAL counter profiling support. HW and SHADER
+ counter profiling depends on this.
+*/
+#ifndef PROFILE_HAL_COUNTERS
+# define PROFILE_HAL_COUNTERS 1
+#endif
+
+/*
+ PROFILE_HW_COUNTERS
+
+ This define enables HW counter profiling support.
+*/
+#ifndef PROFILE_HW_COUNTERS
+# define PROFILE_HW_COUNTERS 1
+#endif
+
+/*
+ PROFILE_SHADER_COUNTERS
+
+ This define enables SHADER counter profiling support.
+*/
+#ifndef PROFILE_SHADER_COUNTERS
+# define PROFILE_SHADER_COUNTERS 1
+#endif
+
+/*
+ COMMAND_PROCESSOR_VERSION
+
+ The version of the command buffer and task manager.
+*/
+#define COMMAND_PROCESSOR_VERSION 1
+
+/*
+ gcdDUMP
+
+ Dump for hw capture.
+ When set to 1, a dump of all states and memory uploads, as well as other
+ hardware related execution will be printed to the debug console. This
+ data can be used for playing back applications.
+
+ When set to 2, for vxc, all output memory will be dump.
+
+ Please get tweak settings in gc_hal_dump.h.
+*/
+#ifndef gcdDUMP
+# define gcdDUMP 0
+#endif
+
+/*
+ gcdDUMP_IN_KERNEL
+
+ Enhanced feature for hw capture capture.
+ Required for MCFE.
+ When set to 1, all dumps will happen in the kernel. This is handy if
+ you want the kernel to dump its command buffers as well and the data
+ needs to be in sync.
+
+ Dump in kernel implies kernel command dump.
+ See debugfs:/gc/dump/ for runtime configuration.
+*/
+#ifndef gcdDUMP_IN_KERNEL
+# define gcdDUMP_IN_KERNEL 0
+#endif
+
+/*
+ gcdDUMP_2D
+
+ Dump for 2D capture.
+ When set to non-zero, it will dump the 2D command and surface.
+
+ Please get tweak settings in gc_hal_dump.h.
+*/
+#ifndef gcdDUMP_2D
+# define gcdDUMP_2D 0
+#endif
+
+/*
+ gcdDUMP_API
+
+ Dump driver level API.
+ When set to 1, a high level dump of the EGL and GL/VG APs's are
+ captured.
+
+ Please get tweak settings in gc_hal_dump.h.
+*/
+#ifndef gcdDUMP_API
+# define gcdDUMP_API 0
+#endif
+
+/*
+ gcdDUMP_PER_OPERATION
+
+ Operation based dump.
+
+ Dump the block as below.
+ 1. Multiple operations belong to the same SW tiling block.
+ 2. Single operation which is NOT in any SW tiling block.
+*/
+#ifndef gcdDUMP_PER_OPERATION
+# define gcdDUMP_PER_OPERATION 0
+#endif
+
+/*
+ gcdDEBUG_OPTION
+ When set to 1, the debug options are enabled. We must set other MACRO to enable
+ sub case.
+*/
+#ifndef gcdDEBUG_OPTION
+# define gcdDEBUG_OPTION 0
+
+#if gcdDEBUG_OPTION
+/*
+ gcdDEBUG_OPTION_KEY
+ The process name of debug application.
+*/
+#ifndef gcdDEBUG_OPTION_KEY
+# define gcdDEBUG_OPTION_KEY "process"
+# endif
+/*
+ gcdDEBUG_OPTION_NO_GL_DRAWS
+ When set to 1, all glDrawArrays and glDrawElements will be skip.
+*/
+#ifndef gcdDEBUG_OPTION_NO_GL_DRAWS
+# define gcdDEBUG_OPTION_NO_GL_DRAWS 0
+# endif
+/*
+ gcdDEBUG_OPTION_NO_DRAW_PRIMITIVES
+ When set to 1, all DrawPrimitives will be skip.
+*/
+#ifndef gcdDEBUG_OPTION_NO_DRAW_PRIMITIVES
+# define gcdDEBUG_OPTION_NO_DRAW_PRIMITIVES 0
+# endif
+/*
+ gcdDEBUG_OPTION_SKIP_SWAP
+ When set to 1, just one out of gcdDEBUG_OPTION_SKIP_FRAMES(such as 1/10) eglSwapBuffers will be resolve,
+ others skip.
+*/
+#ifndef gcdDEBUG_OPTION_SKIP_SWAP
+# define gcdDEBUG_OPTION_SKIP_SWAP 0
+# define gcdDEBUG_OPTION_SKIP_FRAMES 10
+# endif
+/*
+ gcdDEBUG_OPTION_FORCE_16BIT_RENDER_TARGET
+ When set to 1, the format of render target will force to RGB565.
+*/
+#ifndef gcdDEBUG_OPTION_FORCE_16BIT_RENDER_TARGET
+# define gcdDEBUG_OPTION_FORCE_16BIT_RENDER_TARGET 0
+# endif
+/*
+ gcdDEBUG_OPTION_NONE_TEXTURE
+ When set to 1, the type of texture will be set to 0x0.
+*/
+#ifndef gcdDEBUG_OPTION_NONE_TEXTURE
+# define gcdDEBUG_OPTION_NONE_TEXTURE 0
+# endif
+/*
+ gcdDEBUG_OPTION_NONE_DEPTH
+ When set to 1, the depth format of surface will be set to gcvSURF_UNKNOWN.
+*/
+#ifndef gcdDEBUG_OPTION_NONE_DEPTH
+# define gcdDEBUG_OPTION_NONE_DEPTH 0
+# endif
+
+/*
+ gcdDEBUG_FORCE_CONTEXT_UPDATE
+ When set to 1, context will be updated before every commit.
+*/
+#ifndef gcdDEBUG_FORCE_CONTEXT_UPDATE
+# define gcdDEBUG_FORCE_CONTEXT_UPDATE 0
+# endif
+
+
+/*
+ gcdDEBUG_FORCE_CONTEXT_UPDATE
+ When set to 1, pool of each type surface can be specified by
+ changing poolPerType[] in gcsSURF_NODE_Construct.
+*/
+#ifndef gcdDEBUG_OPTION_SPECIFY_POOL
+# define gcdDEBUG_OPTION_SPECIFY_POOL 0
+# endif
+
+# endif
+#endif
+
+/*
+ gcdENABLE_FSCALE_VAL_ADJUST
+ When non-zero, FSCALE_VAL when gcvPOWER_ON can be adjusted externally.
+ */
+#ifndef gcdENABLE_FSCALE_VAL_ADJUST
+# define gcdENABLE_FSCALE_VAL_ADJUST 1
+#endif
+
+/*
+ gcdNULL_DRIVER
+
+ Set to 1 for infinite speed hardware.
+ Set to 2 for bypassing the HAL.
+*/
+#ifndef gcdNULL_DRIVER
+# define gcdNULL_DRIVER 0
+#endif
+
+/*
+ gcdENABLE_TIMEOUT_DETECTION
+
+ Enable timeout detection.
+*/
+#ifndef gcdENABLE_TIMEOUT_DETECTION
+# define gcdENABLE_TIMEOUT_DETECTION 0
+#endif
+
+/*
+ gcdCMD_BUFFER_SIZE
+
+ Number of bytes in a command buffer.
+*/
+#ifndef gcdCMD_BUFFER_SIZE
+# define gcdCMD_BUFFER_SIZE (128 << 10)
+#endif
+
+/*
+ gcdCMD_BLT_BUFFER_SIZE
+
+ Number of bytes in a command buffer.
+*/
+#ifndef gcdCMD_BLT_BUFFER_SIZE
+# define gcdCMD_BLT_BUFFER_SIZE (1 << 10)
+#endif
+
+/*
+ gcdCMD_BUFFERS
+
+ Number of command buffers to use per client.
+*/
+#ifndef gcdCMD_BUFFERS
+# define gcdCMD_BUFFERS 2
+#endif
+
+/*
+ gcdMAX_CMD_BUFFERS
+
+ Maximum number of command buffers to use per client.
+*/
+#ifndef gcdMAX_CMD_BUFFERS
+# define gcdMAX_CMD_BUFFERS 8
+#endif
+
+/*
+ gcdCOMMAND_QUEUES
+
+ Number of command queues in the kernel.
+*/
+#ifndef gcdCOMMAND_QUEUES
+# define gcdCOMMAND_QUEUES 2
+#endif
+
+/*
+ gcdPOWER_CONTROL_DELAY
+
+ The delay in milliseconds required to wait until the GPU has woke up
+ from a suspend or power-down state. This is system dependent because
+ the bus clock also needs to stabalize.
+*/
+#ifndef gcdPOWER_CONTROL_DELAY
+# define gcdPOWER_CONTROL_DELAY 0
+#endif
+
+/*
+ gcdMMU_SIZE
+
+ Size of the MMU page table in bytes. Each 4 bytes can hold 4kB worth of
+ virtual data.
+*/
+#ifndef gcdMMU_SIZE
+# define gcdMMU_SIZE (2048 << 10)
+#endif
+
+#ifndef gcdGC355_VGMMU_MEMORY_SIZE_KB
+# define gcdGC355_VGMMU_MEMORY_SIZE_KB 32
+#endif
+
+/*
+ gcdREGISTER_READ_FROM_USER
+ gcdREGISTER_WRITE_FROM_USER
+
+ Set to 1 to allow IOCTL calls to get through from user land. This
+ should only be in debug or development drops.
+*/
+#ifndef gcdREGISTER_READ_FROM_USER
+# define gcdREGISTER_READ_FROM_USER 1
+#endif
+
+#ifndef gcdREGISTER_WRITE_FROM_USER
+# define gcdREGISTER_WRITE_FROM_USER 0
+#endif
+
+/*
+ gcdHEAP_SIZE
+
+ Set the allocation size for the internal heaps. Each time a heap is
+ full, a new heap will be allocated with this minmimum amount of bytes.
+ The bigger this size, the fewer heaps there are to allocate, the better
+ the performance. However, heaps won't be freed until they are
+ completely free, so there might be some more memory waste if the size is
+ too big.
+*/
+#ifndef gcdHEAP_SIZE
+# define gcdHEAP_SIZE (64 << 10)
+#endif
+
+/*
+ gcdPOWER_SUSPEND_WHEN_IDLE
+
+ Set to 1 to make GPU enter gcvPOWER_SUSPEND when idle detected,
+ otherwise GPU will enter gcvPOWER_IDLE.
+*/
+#ifndef gcdPOWER_SUSPEND_WHEN_IDLE
+# define gcdPOWER_SUSPEND_WHEN_IDLE 1
+#endif
+
+#ifndef gcdFPGA_BUILD
+# define gcdFPGA_BUILD 0
+#endif
+
+/*
+ gcdGPU_TIMEOUT
+
+ This define specified the number of milliseconds the system will wait
+ before it broadcasts the GPU is stuck. In other words, it will define
+ the timeout of any operation that needs to wait for the GPU.
+
+ If the value is 0, no timeout will be checked for.
+*/
+#ifndef gcdGPU_TIMEOUT
+#if gcdFPGA_BUILD
+# define gcdGPU_TIMEOUT 2000000
+#else
+# define gcdGPU_TIMEOUT 20000
+#endif
+#endif
+
+/*
+ gcdGPU_2D_TIMEOUT
+
+ This define specified the number of milliseconds the system will wait
+ before it broadcasts the 2D GPU is stuck. In other words, it will define
+ the timeout of any operation that needs to wait for the GPU.
+
+ If the value is 0, no timeout will be checked for.
+*/
+#ifndef gcdGPU_2D_TIMEOUT
+# define gcdGPU_2D_TIMEOUT 4000
+#endif
+
+
+/*
+ gcdGPU_ADVANCETIMER
+
+ it is advance timer.
+*/
+#ifndef gcdGPU_ADVANCETIMER
+# define gcdGPU_ADVANCETIMER 250
+#endif
+
+/*
+ gcdSTATIC_LINK
+
+ This define disalbes static linking;
+*/
+#ifndef gcdSTATIC_LINK
+# define gcdSTATIC_LINK 0
+#endif
+
+/*
+ gcdUSE_NEW_HEAP
+
+ Setting this define to 1 enables new heap.
+*/
+#ifndef gcdUSE_NEW_HEAP
+# define gcdUSE_NEW_HEAP 0
+#endif
+
+/*
+ gcdCMD_NO_2D_CONTEXT
+
+ This define enables no-context 2D command buffer.
+*/
+#ifndef gcdCMD_NO_2D_CONTEXT
+# define gcdCMD_NO_2D_CONTEXT 1
+#endif
+
+/*
+ gcdENABLE_BUFFER_ALIGNMENT
+
+ When enabled, video memory is allocated with atleast 16KB aligment
+ between multiple sub-buffers.
+*/
+#ifndef gcdENABLE_BUFFER_ALIGNMENT
+# define gcdENABLE_BUFFER_ALIGNMENT 1
+#endif
+
+/*
+ gcdENABLE_BANK_ALIGNMENT
+
+ When enabled, video memory is allocated bank aligned. The vendor can modify
+ _GetSurfaceBankAlignment() and _GetBankOffsetBytes() to define how
+ different types of allocations are bank and channel aligned.
+ When disabled (default), no bank alignment is done.
+*/
+#ifndef gcdENABLE_BANK_ALIGNMENT
+# define gcdENABLE_BANK_ALIGNMENT 0
+#endif
+
+/*
+ gcdBANK_BIT_START
+
+ Specifies the start bit of the bank (inclusive).
+*/
+#ifndef gcdBANK_BIT_START
+# define gcdBANK_BIT_START 12
+#endif
+
+/*
+ gcdBANK_BIT_END
+
+ Specifies the end bit of the bank (inclusive).
+*/
+#ifndef gcdBANK_BIT_END
+# define gcdBANK_BIT_END 14
+#endif
+
+/*
+ gcdBANK_CHANNEL_BIT
+
+ When set, video memory when allocated bank aligned is allocated such that
+ render and depth buffer addresses alternate on the channel bit specified.
+ This option has an effect only when gcdENABLE_BANK_ALIGNMENT is enabled.
+ When disabled (default), no alteration is done.
+*/
+#ifndef gcdBANK_CHANNEL_BIT
+# define gcdBANK_CHANNEL_BIT 7
+#endif
+
+/*
+ gcdDYNAMIC_SPEED
+
+ When non-zero, it informs the kernel driver to use the speed throttling
+ broadcasting functions to inform the system the GPU should be spet up or
+ slowed down. It will send a broadcast for slowdown each "interval"
+ specified by this define in milliseconds
+ (gckOS_BroadcastCalibrateSpeed).
+*/
+#ifndef gcdDYNAMIC_SPEED
+# define gcdDYNAMIC_SPEED 2000
+#endif
+
+/*
+ gcdDYNAMIC_EVENT_THRESHOLD
+
+ When non-zero, it specifies the maximum number of available events at
+ which the kernel driver will issue a broadcast to speed up the GPU
+ (gckOS_BroadcastHurry).
+*/
+#ifndef gcdDYNAMIC_EVENT_THRESHOLD
+# define gcdDYNAMIC_EVENT_THRESHOLD 5
+#endif
+
+/*
+ gcdENABLE_PROFILING
+
+ Enable profiling macros.
+*/
+#ifndef gcdENABLE_PROFILING
+# define gcdENABLE_PROFILING 0
+#endif
+
+/*
+ gcdENABLE_128B_MERGE
+
+ Enable 128B merge for the BUS control.
+*/
+#ifndef gcdENABLE_128B_MERGE
+# define gcdENABLE_128B_MERGE 0
+#endif
+
+/*
+ gcdFRAME_DB
+
+ When non-zero, it specified the number of frames inside the frame
+ database. The frame DB will collect per-frame timestamps and hardware
+ counters.
+*/
+#ifndef gcdFRAME_DB
+# define gcdFRAME_DB 0
+# define gcdFRAME_DB_RESET 0
+# define gcdFRAME_DB_NAME "/var/log/frameDB.log"
+#endif
+
+/*
+ gcdENABLE_CACHEABLE_COMMAND_BUFFER
+
+ When non-zero, command buffer will be cacheable.
+*/
+#ifndef gcdENABLE_CACHEABLE_COMMAND_BUFFER
+# define gcdENABLE_CACHEABLE_COMMAND_BUFFER 0
+#endif
+
+/*
+ gcdENABLE_BUFFERABLE_VIDEO_MEMORY
+
+ When non-zero, all video memory will be bufferable by default.
+*/
+#ifndef gcdENABLE_BUFFERABLE_VIDEO_MEMORY
+# define gcdENABLE_BUFFERABLE_VIDEO_MEMORY 1
+#endif
+
+/*
+ gcdENABLE_INFINITE_SPEED_HW
+ enable the Infinte HW, this is for 2D openVG
+*/
+#ifndef gcdENABLE_INFINITE_SPEED_HW
+# define gcdENABLE_INFINITE_SPEED_HW 0
+#endif
+
+/*
+ gcdPOWEROFF_TIMEOUT
+
+ When non-zero, GPU will power off automatically from
+ idle state, and gcdPOWEROFF_TIMEOUT is also the default
+ timeout in milliseconds.
+ */
+#ifndef gcdPOWEROFF_TIMEOUT
+# define gcdPOWEROFF_TIMEOUT 300
+#endif
+
+/*
+ QNX_SINGLE_THREADED_DEBUGGING
+*/
+#ifndef QNX_SINGLE_THREADED_DEBUGGING
+# define QNX_SINGLE_THREADED_DEBUGGING 0
+#endif
+
+/*
+ gcdSHARED_RESOLVE_BUFFER_ENABLED
+
+ Use shared resolve buffer for all app buffers.
+*/
+#ifndef gcdSHARED_RESOLVE_BUFFER_ENABLED
+# define gcdSHARED_RESOLVE_BUFFER_ENABLED 0
+#endif
+
+/*
+ gcdUSE_TRIANGLE_STRIP_PATCH
+ */
+#ifndef gcdUSE_TRIANGLE_STRIP_PATCH
+# define gcdUSE_TRIANGLE_STRIP_PATCH 1
+#endif
+
+/*
+ gcdSHARED_PAGETABLE
+
+ When non-zero, multiple GPUs in one chip with same MMU use
+ one shared pagetable. So that when accessing same surface,
+ they can use same GPU virtual address.
+*/
+#ifndef gcdSHARED_PAGETABLE
+# define gcdSHARED_PAGETABLE 0
+#endif
+
+#ifndef gcdUSE_PVR
+# define gcdUSE_PVR 1
+#endif
+
+/*
+ gcdSMALL_BLOCK_SIZE
+
+ When non-zero, a part of VIDMEM will be reserved for requests
+ whose requesting size is less than gcdSMALL_BLOCK_SIZE.
+
+ For Linux, it's the size of a page. If this requeset fallbacks
+ to gcvPOOL_VIRTUAL, memory will be wasted
+ because they allocate a page at least.
+*/
+#ifndef gcdSMALL_BLOCK_SIZE
+# define gcdSMALL_BLOCK_SIZE 4096
+# define gcdRATIO_FOR_SMALL_MEMORY 32
+#endif
+
+/*
+ gcdENABLE_GPU_1M_PAGE
+ When non-zero, GPU page size will be 1M until the pool is out of memory
+ and low-level to 4K pages. When zero, it uses 4k GPU pages.
+*/
+#ifndef gcdENABLE_GPU_1M_PAGE
+#if !gcdSECURITY && defined(LINUX)
+# define gcdENABLE_GPU_1M_PAGE 1
+#else
+# define gcdENABLE_GPU_1M_PAGE 0
+#endif
+#endif
+
+/*
+ gcdCONTIGUOUS_SIZE_LIMIT
+ When non-zero, size of video node from gcvPOOL_VIRTUAL contiguous is
+ limited by gcdCONTIGUOUS_SIZE_LIMIT.
+*/
+#ifndef gcdCONTIGUOUS_SIZE_LIMIT
+# define gcdCONTIGUOUS_SIZE_LIMIT 0
+#endif
+
+/*
+ gcdLINK_QUEUE_SIZE
+
+ When non-zero, driver maintains a queue to record information of
+ latest lined context buffer and command buffer. Data in this queue
+ is be used to debug.
+*/
+#ifndef gcdLINK_QUEUE_SIZE
+# define gcdLINK_QUEUE_SIZE 64
+#endif
+
+/* gcdALPHA_KILL_IN_SHADER
+
+ Enable alpha kill inside the shader. This will be set automatically by the
+ HAL if certain states match a criteria.
+*/
+#ifndef gcdALPHA_KILL_IN_SHADER
+# define gcdALPHA_KILL_IN_SHADER 1
+#endif
+
+
+#ifndef gcdPRINT_SWAP_TIME
+# define gcdPRINT_SWAP_TIME 0
+#endif
+
+/*
+ gcdDVFS
+
+ When non-zero, software will make use of dynamic voltage and
+ frequency feature.
+ */
+#ifndef gcdDVFS
+# define gcdDVFS 0
+# define gcdDVFS_ANAYLSE_WINDOW 4
+# define gcdDVFS_POLLING_TIME (gcdDVFS_ANAYLSE_WINDOW * 4)
+#endif
+
+#ifndef gcdSYNC
+# define gcdSYNC 1
+#endif
+
+#ifndef gcdSHADER_SRC_BY_MACHINECODE
+# define gcdSHADER_SRC_BY_MACHINECODE 1
+#endif
+
+#ifndef gcdGLB27_SHADER_REPLACE_OPTIMIZATION
+# define gcdGLB27_SHADER_REPLACE_OPTIMIZATION 1
+#endif
+
+
+/*
+ gcdSUPPORT_SWAP_RECTANGLE
+
+ Support swap with a specific rectangle.
+
+ Set the rectangle with eglSetSwapRectangleVIV api.
+ Android only.
+*/
+#ifndef gcdSUPPORT_SWAP_RECTANGLE
+# define gcdSUPPORT_SWAP_RECTANGLE 1
+#endif
+
+/*
+ gcdGPU_LINEAR_BUFFER_ENABLED
+
+ Use linear buffer for GPU apps so HWC can do 2D composition.
+ Android only.
+*/
+#ifndef gcdGPU_LINEAR_BUFFER_ENABLED
+# define gcdGPU_LINEAR_BUFFER_ENABLED 1
+#endif
+
+/*
+ gcdENABLE_RENDER_INTO_WINDOW
+
+ Enable Render-Into-Window (ie, No-Resolve) feature on android.
+ NOTE that even if enabled, it still depends on hardware feature and
+ android application behavior. When hardware feature or application
+ behavior can not support render into window mode, it will fail back
+ to normal mode.
+ When Render-Into-Window is finally used, window back buffer of android
+ applications will be allocated matching render target tiling format.
+ Otherwise buffer tiling is decided by the above option
+ 'gcdGPU_LINEAR_BUFFER_ENABLED'.
+ Android only for now.
+*/
+#ifndef gcdENABLE_RENDER_INTO_WINDOW
+# define gcdENABLE_RENDER_INTO_WINDOW 1
+#endif
+
+/*
+ gcdENABLE_RENDER_INTO_WINDOW_WITH_FC
+
+ Enable Direct-rendering (ie, No-Resolve) with tile status.
+ This is expremental and in development stage.
+ This will dynamically check if color compression is available.
+*/
+#ifndef gcdENABLE_RENDER_INTO_WINDOW_WITH_FC
+# define gcdENABLE_RENDER_INTO_WINDOW_WITH_FC 1
+#endif
+
+/*
+ gcdENABLE_BLIT_BUFFER_PRESERVE
+
+ Render-Into-Window (ie, No-Resolve) does not include preserved swap
+ behavior. This feature can enable buffer preserve in No-Resolve mode.
+ When enabled, previous buffer (may be part of ) will be resolve-blitted
+ to current buffer.
+*/
+#ifndef gcdENABLE_BLIT_BUFFER_PRESERVE
+# define gcdENABLE_BLIT_BUFFER_PRESERVE 1
+#endif
+
+/*
+ gcdANDROID_NATIVE_FENCE_SYNC
+
+ Enable android native fence sync. It is introduced since jellybean-4.2.
+ Depends on linux kernel option: CONFIG_SYNC.
+
+ 0: Disabled
+ 1: Build framework for native fence sync feature, and EGL extension
+ 2: Enable async swap buffers for client
+ * Native fence sync for client 'queueBuffer' in EGL, which is
+ 'acquireFenceFd' for layer in compositor side.
+ 3. Enable async hwcomposer composition.
+ * 'releaseFenceFd' for layer in compositor side, which is native
+ fence sync when client 'dequeueBuffer'
+ * Native fence sync for compositor 'queueBuffer' in EGL, which is
+ 'acquireFenceFd' for framebuffer target for DC
+ */
+#ifndef gcdANDROID_NATIVE_FENCE_SYNC
+# define gcdANDROID_NATIVE_FENCE_SYNC 0
+#endif
+
+#ifndef gcdLINUX_SYNC_FILE
+# define gcdLINUX_SYNC_FILE 0
+#endif
+
+/*
+ gcdANDROID_IMPLICIT_NATIVE_BUFFER_SYNC
+
+ Enable implicit android native buffer sync.
+
+ For non-HW_RENDER buffer, CPU (or other hardware) and GPU can access
+ the buffer at the same time. This is to add implicit synchronization
+ between CPU (or the hardware) and GPU.
+
+ Eventually, please do not use implicit native buffer sync, but use
+ "fence sync" or "android native fence sync" instead in libgui, which
+ can be enabled in frameworks/native/libs/gui/Android.mk. This kind
+ of synchronization should be done by app but not driver itself.
+
+ Please disable this option when either "fence sync" or
+ "android native fence sync" is enabled.
+ */
+#ifndef gcdANDROID_IMPLICIT_NATIVE_BUFFER_SYNC
+# define gcdANDROID_IMPLICIT_NATIVE_BUFFER_SYNC 1
+#endif
+
+/*
+ * Implicit native buffer sync is not needed when ANDROID_native_fence_sync
+ * is available.
+ */
+#if gcdANDROID_NATIVE_FENCE_SYNC
+# undef gcdANDROID_IMPLICIT_NATIVE_BUFFER_SYNC
+# define gcdANDROID_IMPLICIT_NATIVE_BUFFER_SYNC 0
+#endif
+
+/*
+ gcdUSE_WCLIP_PATCH
+
+ Enable wclipping patch.
+*/
+#ifndef gcdUSE_WCLIP_PATCH
+# define gcdUSE_WCLIP_PATCH 1
+#endif
+
+#ifndef gcdUSE_NPOT_PATCH
+# define gcdUSE_NPOT_PATCH 1
+#endif
+
+/*
+ gcdINTERNAL_COMMENT
+
+ Wrap internal comment, content wrapped by it and the macor itself
+ will be removed in release driver.
+*/
+#ifndef gcdINTERNAL_COMMENT
+# define gcdINTERNAL_COMMENT 1
+#endif
+
+/*
+ gcdRTT_DISABLE_FC
+
+ Disable RTT FC support. For test only.
+*/
+#ifndef gcdRTT_DISABLE_FC
+# define gcdRTT_DISABLE_FC 0
+#endif
+
+/*
+ gcdFORCE_MIPMAP
+
+ Force generate mipmap for texture.
+*/
+#ifndef gcdFORCE_MIPMAP
+# define gcdFORCE_MIPMAP 0
+#endif
+
+/*
+ gcdFORCE_BILINEAR
+
+ Force bilinear for mipfilter.
+*/
+#ifndef gcdFORCE_BILINEAR
+# define gcdFORCE_BILINEAR 1
+#endif
+
+/*
+ gcdBINARY_TRACE
+
+ When non-zero, binary trace will be generated.
+
+ When gcdBINARY_TRACE_FILE_SIZE is non-zero, binary trace buffer will
+ be written to a file which size is limited to
+ gcdBINARY_TRACE_FILE_SIZE.
+*/
+#ifndef gcdBINARY_TRACE
+# define gcdBINARY_TRACE 0
+# define gcdBINARY_TRACE_FILE_SIZE 0
+#endif
+
+#ifndef gcdMOVG
+# define gcdMOVG 0
+# define gcdENABLE_TS_DOUBLE_BUFFER 1
+#else
+#if gcdMOVG
+# define gcdENABLE_TS_DOUBLE_BUFFER 0
+#else
+# define gcdENABLE_TS_DOUBLE_BUFFER 1
+#endif
+#endif
+
+/* gcdINTERRUPT_STATISTIC
+ *
+ * Monitor the event send to GPU and interrupt issued by GPU.
+ */
+
+#ifndef gcdINTERRUPT_STATISTIC
+#if defined(LINUX) || defined(__QNXNTO__) || defined(UNDER_CE) || defined(__VXWORKS__)
+# define gcdINTERRUPT_STATISTIC 1
+#else
+# define gcdINTERRUPT_STATISTIC 0
+#endif
+#endif
+
+/*
+ gcdFENCE_WAIT_LOOP_COUNT
+ Wait fence, loop count.
+*/
+#ifndef gcdFENCE_WAIT_LOOP_COUNT
+# define gcdFENCE_WAIT_LOOP_COUNT 100
+#endif
+
+/*
+ gcdPARTIAL_FAST_CLEAR
+ When it's not zero, partial fast clear is enabled.
+ Depends on gcdHAL_3D_DRAWBLIT, if gcdHAL_3D_DRAWBLIT is not enabled,
+ only available when scissor box is completely aligned.
+ Expremental, under test only. Not ready for production.
+*/
+#ifndef gcdPARTIAL_FAST_CLEAR
+#if defined(ANDROID)
+# define gcdPARTIAL_FAST_CLEAR 0
+#else
+# define gcdPARTIAL_FAST_CLEAR 1
+#endif
+#endif
+
+/*
+ gcdREMOVE_SURF_ORIENTATION
+ When it's not zero, we will remove surface orientation function.
+ It wil become to a parameter of resolve function.
+*/
+#ifndef gcdREMOVE_SURF_ORIENTATION
+# define gcdREMOVE_SURF_ORIENTATION 1
+#endif
+
+
+
+/*
+ gcdTEST_DEC200
+ Test part for DEC200. Remove when release.
+*/
+#ifndef gcdTEST_DEC200
+# define gcdTEST_DEC200 0
+#endif
+
+/*
+ gcdPATTERN_FAST_PATH
+ For pattern match
+*/
+#ifndef gcdPATTERN_FAST_PATH
+# define gcdPATTERN_FAST_PATH 1
+#endif
+
+/*
+ gcdUSE_INPUT_DEVICE
+ disable input devices usage under fb mode to support fb+vdk multi-process
+*/
+#ifndef gcdUSE_INPUT_DEVICE
+# define gcdUSE_INPUT_DEVICE 0
+#endif
+
+/*
+ gcdPERFORMANCE_ANALYSIS
+
+ When set to 1, driver will pass information through loadstate
+ to HW. This loadstate does not impact HW execution.
+*/
+#ifndef gcdPERFORMANCE_ANALYSIS
+# define gcdPERFORMANCE_ANALYSIS 0
+#endif
+
+/*
+ gcdFRAMEINFO_STATISTIC
+ When enable, collect frame information.
+*/
+#ifndef gcdFRAMEINFO_STATISTIC
+
+#if (defined(DBG) && DBG) || defined(DEBUG) || \
+ defined(_DEBUG) || gcdDUMP || gcdPERFORMANCE_ANALYSIS || \
+ (defined(WIN32) && !defined(UNDER_CE)) || \
+ gcdFPGA_BUILD
+
+# define gcdFRAMEINFO_STATISTIC 1
+#else
+# define gcdFRAMEINFO_STATISTIC 0
+#endif
+
+#endif
+
+/*
+ gcdDEC_ENABLE_AHB
+ Enable DEC300 compression AHB mode or not.
+*/
+#ifndef gcdDEC_ENABLE_AHB
+# define gcdDEC_ENABLE_AHB 0
+#endif
+
+/*
+ gcdENABLE_UNIFIED_CONSTANT
+ Enable unified constant or not.
+*/
+#ifndef gcdENABLE_UNIFIED_CONSTANT
+# define gcdENABLE_UNIFIED_CONSTANT 1
+#endif
+
+/*
+ Core configurations. By default enable all cores.
+*/
+#ifndef gcdENABLE_3D
+# define gcdENABLE_3D 1
+#endif
+
+#ifndef gcdENABLE_2D
+# define gcdENABLE_2D 1
+#endif
+
+#ifndef gcdENABLE_VG
+# define gcdENABLE_VG 0
+#endif
+
+#ifndef gcdVG_ONLY
+# define gcdVG_ONLY (!gcdENABLE_3D && !gcdENABLE_2D && gcdENABLE_VG)
+#endif
+
+#if defined(WIN32) && !defined(UNDER_CE) && (gcdENABLE_VG == 1)
+
+#ifdef gcdUSE_VX
+#undef gcdUSE_VX
+#endif
+
+#ifdef COMMAND_PROCESSOR_VERSION
+#undef COMMAND_PROCESSOR_VERSION
+#endif
+
+#ifdef gcdENABLE_TRUST_APPLICATION
+#undef gcdENABLE_TRUST_APPLICATION
+#endif
+
+#ifdef gcdENABLE_3D
+#undef gcdENABLE_3D
+#endif
+
+#ifdef gcdENABLE_2D
+#undef gcdENABLE_2D
+#endif
+
+#define gcdENABLE_3D 0
+#define gcdENABLE_2D 0
+#define gcdUSE_VX 0
+#define COMMAND_PROCESSOR_VERSION 2
+#define gcdENABLE_TRUST_APPLICATION 0
+
+#endif /* Only for GC355 Cmodel build. */
+
+#ifndef gcdGC355_PROFILER
+# define gcdGC355_PROFILER 0
+#endif
+
+/*
+ This definition must be paired with VIVANTE_PROFILER_SYSTEM_MEMORY
+*/
+#ifndef gcdGC355_MEM_PRINT
+# define gcdGC355_MEM_PRINT 0
+#else
+#if (!((gcdENABLE_3D == 0) && (gcdENABLE_2D == 0) && (gcdENABLE_VG == 1)))
+# undef gcdGC355_MEM_PRINT
+# define gcdGC355_MEM_PRINT 0
+# endif
+#endif
+
+
+/*
+ gcdRECORD_COMMAND
+*/
+#ifndef gcdRECORD_COMMAND
+# define gcdRECORD_COMMAND 0
+#endif
+
+/*
+ gcdALLOC_CMD_FROM_RESERVE
+
+ Provide a way by which location of command buffer can be
+ specified. This is a DEBUG option to limit command buffer
+ to some memory range.
+*/
+#ifndef gcdALLOC_CMD_FROM_RESERVE
+# define gcdALLOC_CMD_FROM_RESERVE 0
+#endif
+
+/*
+ gcdBOUNDARY_CHECK
+
+ When enabled, add bounary before and after a range of
+ GPU address. So overflow can be trapped by MMU exception.
+ This is a debug option for new MMU and gcdUSE_MMU_EXCEPTION
+ is enabled.
+*/
+#ifndef gcdBOUNDARY_CHECK
+# define gcdBOUNDARY_CHECK 0
+#endif
+
+/*
+ gcdRENDER_QUALITY_CHECK
+
+ When enabled, we disable performance opt patch
+ to get know rendering quality comparing with other vendor.
+*/
+#ifndef gcdRENDER_QUALITY_CHECK
+# define gcdRENDER_QUALITY_CHECK 0
+#endif
+
+/*
+ gcdSYSTRACE
+
+ When enabled, we embed systrace in function header/footer
+ to gather time information on linux platforms include android.
+ '1' to trace API (EGL, ES11, ES2x, ES3x, etc)
+ '2' to trace HAL (except compiler)
+ '4' to trace HAL compiler
+ See gc_hal_user_debug.c for more detailed trace zones.
+*/
+#ifndef gcdSYSTRACE
+# define gcdSYSTRACE 0
+#endif
+
+#ifndef gcdENABLE_APPCTXT_BLITDRAW
+# define gcdENABLE_APPCTXT_BLITDRAW 0
+#endif
+
+/*
+ When enabled, use 1K mode for MMU version 2.0. otherwise use 4K mode.
+*/
+#ifndef gcdENABLE_MMU_1KMODE
+# define gcdENABLE_MMU_1KMODE 1
+#endif
+
+/*
+ gcdENABLE_TRUST_APPLICATION
+
+ When enabled, trust application is used to handle 'security' registers.
+
+ 1) If HW doesn't have robust and security feature, this option is meaningless.
+ 2) If HW have robust and security and this option is not enable,
+ security registers are handled by non secure driver. It is for
+ platform doesn't want/need to use trust zone.
+*/
+#ifndef gcdENABLE_TRUST_APPLICATION
+#if (defined(_WIN32) && !defined(UNDER_CE)) || (defined (LINUX) && !defined(EMULATOR))
+# define gcdENABLE_TRUST_APPLICATION 1
+#else
+# define gcdENABLE_TRUST_APPLICATION 0
+#endif
+#endif
+
+/* Disable gcdENABLE_TRUST_APPLICATION when oboslete gcdSECURITY enabled. */
+#if gcdSECURITY
+#undef gcdENABLE_TRUST_APPLICATION
+#define gcdENABLE_TRUST_APPLICATION 0
+#endif
+
+#ifndef gcdMMU_SECURE_AREA_SIZE
+#if defined(gcdENABLE_MMU_1KMODE)
+# define gcdMMU_SECURE_AREA_SIZE 32
+#else
+# define gcdMMU_SECURE_AREA_SIZE 128
+#endif
+#endif
+
+#ifndef gcdUSE_MMU_EXCEPTION
+# define gcdUSE_MMU_EXCEPTION 1
+#endif
+
+#ifndef gcdVX_OPTIMIZER
+# define gcdVX_OPTIMIZER 0
+#endif
+
+#ifndef gcdALLOC_ON_FAULT
+# define gcdALLOC_ON_FAULT 0
+#endif
+
+/*
+ gcdDISABLE_GPU_VIRTUAL_ADDRESS
+
+ When enabled, disable MMU and all virtual allocated from MMU.
+*/
+#ifndef gcdDISABLE_GPU_VIRTUAL_ADDRESS
+# define gcdDISABLE_GPU_VIRTUAL_ADDRESS 0
+#endif
+
+/*
+ gcd2D_COMPRESSION_DEC400_ALIGN_MODE
+
+ Only for DEC400 compression.
+ Set 0 as 16bytes aligned. 1 as 32bytes aligned. 2 as 64bytes aligned.
+ Default is 0 which means 32bytes aligned.
+*/
+#ifndef gcd2D_COMPRESSION_DEC400_ALIGN_MODE
+# define gcd2D_COMPRESSION_DEC400_ALIGN_MODE 1
+#endif
+
+/*
+ gcdENABLE_KERNEL_FENCE
+ When enabled, use kernel fence to do resource tracking.
+*/
+#ifndef gcdENABLE_KENREL_FENCE
+# define gcdENABLE_KERNEL_FENCE 0
+#endif
+
+/*
+ gcdUSE_VXC_BINARY
+ When enabled, will use prebuilt shader binary in VX driver.
+ */
+#ifndef gcdUSE_VXC_BINARY
+# define gcdUSE_VXC_BINARY 0
+#endif
+
+/*
+ gcdFEATURE_SANITYCHECK
+ When enabled, will do hardware feature sanity check, each
+ used hardware feature should be printed out.
+ */
+#ifndef gcdFEATURE_SANITYCHECK
+# define gcdFEATURE_SANITYCHECK 0
+#endif
+
+
+/*
+ VIVANTE_PROFILER_SYSTEM_MEMORY
+
+ This define enables the profiling data for system memory allocated by driver
+*/
+#ifndef VIVANTE_PROFILER_SYSTEM_MEMORY
+# define VIVANTE_PROFILER_SYSTEM_MEMORY 1
+# define VP_MALLOC_OFFSET (16)
+
+#endif
+
+#define gcdHAL_TEST 1
+#define gcdUSE_ZWP_SYNCHRONIZATION 1
+
+/*
+ gcdUSE_SINGLE_CONTEXT
+ When enabled, will enable single context.
+ */
+#ifndef gcdUSE_SINGLE_CONTEXT
+# define gcdUSE_SINGLE_CONTEXT 0
+#endif
+
+/*
+ gcdKERNEL_QUERY_PERFORMANCE_COUNTER_V8
+ When enabled, will enable query new performance counter of V8.0 in kernel
+ space.
+ */
+#ifndef gcdKERNEL_QUERY_PERFORMANCE_COUNTER_V8
+# define gcdKERNEL_QUERY_PERFORMANCE_COUNTER_V8 0
+#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
new file mode 100644
index 000000000000..49e2cc46deb1
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_profiler.h
@@ -0,0 +1,1195 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_profiler_h_
+#define __gc_hal_profiler_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define GLVERTEX_OBJECT 10
+#define GLVERTEX_OBJECT_BYTES 11
+
+#define GLINDEX_OBJECT 20
+#define GLINDEX_OBJECT_BYTES 21
+
+#define GLTEXTURE_OBJECT 30
+#define GLTEXTURE_OBJECT_BYTES 31
+
+#define GLBUFOBJ_OBJECT 40
+#define GLBUFOBJ_OBJECT_BYTES 41
+
+#define ES11_CALLS 151
+#define ES11_DRAWCALLS (ES11_CALLS + 1)
+#define ES11_STATECHANGECALLS (ES11_DRAWCALLS + 1)
+#define ES11_POINTCOUNT (ES11_STATECHANGECALLS + 1)
+#define ES11_LINECOUNT (ES11_POINTCOUNT + 1)
+#define ES11_TRIANGLECOUNT (ES11_LINECOUNT + 1)
+
+#define ES30_CALLS 159
+#define ES30_DRAWCALLS (ES30_CALLS + 1)
+#define ES30_STATECHANGECALLS (ES30_DRAWCALLS + 1)
+#define ES30_POINTCOUNT (ES30_STATECHANGECALLS + 1)
+#define ES30_LINECOUNT (ES30_POINTCOUNT + 1)
+#define ES30_TRIANGLECOUNT (ES30_LINECOUNT + 1)
+
+#define VG11_CALLS 88
+#define VG11_DRAWCALLS (VG11_CALLS + 1)
+#define VG11_STATECHANGECALLS (VG11_DRAWCALLS + 1)
+#define VG11_FILLCOUNT (VG11_STATECHANGECALLS + 1)
+#define VG11_STROKECOUNT (VG11_FILLCOUNT + 1)
+/* End of Driver API ID Definitions. */
+
+/* HAL & MISC IDs. */
+#define HAL_VERTBUFNEWBYTEALLOC 1
+#define HAL_VERTBUFTOTALBYTEALLOC (HAL_VERTBUFNEWBYTEALLOC + 1)
+#define HAL_VERTBUFNEWOBJALLOC (HAL_VERTBUFTOTALBYTEALLOC + 1)
+#define HAL_VERTBUFTOTALOBJALLOC (HAL_VERTBUFNEWOBJALLOC + 1)
+#define HAL_INDBUFNEWBYTEALLOC (HAL_VERTBUFTOTALOBJALLOC + 1)
+#define HAL_INDBUFTOTALBYTEALLOC (HAL_INDBUFNEWBYTEALLOC + 1)
+#define HAL_INDBUFNEWOBJALLOC (HAL_INDBUFTOTALBYTEALLOC + 1)
+#define HAL_INDBUFTOTALOBJALLOC (HAL_INDBUFNEWOBJALLOC + 1)
+#define HAL_TEXBUFNEWBYTEALLOC (HAL_INDBUFTOTALOBJALLOC + 1)
+#define HAL_TEXBUFTOTALBYTEALLOC (HAL_TEXBUFNEWBYTEALLOC + 1)
+#define HAL_TEXBUFNEWOBJALLOC (HAL_TEXBUFTOTALBYTEALLOC + 1)
+#define HAL_TEXBUFTOTALOBJALLOC (HAL_TEXBUFNEWOBJALLOC + 1)
+
+#define GPU_CYCLES 1
+#define GPU_READ64BYTE (GPU_CYCLES + 1)
+#define GPU_WRITE64BYTE (GPU_READ64BYTE + 1)
+#define GPU_TOTALCYCLES (GPU_WRITE64BYTE + 1)
+#define GPU_IDLECYCLES (GPU_TOTALCYCLES + 1)
+
+#define VS_INSTCOUNT 1
+#define VS_BRANCHINSTCOUNT (VS_INSTCOUNT + 1)
+#define VS_TEXLDINSTCOUNT (VS_BRANCHINSTCOUNT + 1)
+#define VS_RENDEREDVERTCOUNT (VS_TEXLDINSTCOUNT + 1)
+#define VS_SOURCE (VS_RENDEREDVERTCOUNT + 1)
+#define VS_NONIDLESTARVECOUNT (VS_SOURCE + 1)
+#define VS_STARVELCOUNT (VS_NONIDLESTARVECOUNT + 1)
+#define VS_STALLCOUNT (VS_STARVELCOUNT + 1)
+#define VS_PROCESSCOUNT (VS_STALLCOUNT + 1)
+
+#define PS_INSTCOUNT 1
+#define PS_BRANCHINSTCOUNT (PS_INSTCOUNT + 1)
+#define PS_TEXLDINSTCOUNT (PS_BRANCHINSTCOUNT + 1)
+#define PS_RENDEREDPIXCOUNT (PS_TEXLDINSTCOUNT + 1)
+#define PS_SOURCE (PS_RENDEREDPIXCOUNT + 1)
+#define PS_NONIDLESTARVECOUNT (PS_SOURCE + 1)
+#define PS_STARVELCOUNT (PS_NONIDLESTARVECOUNT + 1)
+#define PS_STALLCOUNT (PS_STARVELCOUNT + 1)
+#define PS_PROCESSCOUNT (PS_STALLCOUNT + 1)
+#define PS_SHADERCYCLECOUNT (PS_PROCESSCOUNT + 1)
+
+#define PA_INVERTCOUNT 1
+#define PA_INPRIMCOUNT (PA_INVERTCOUNT + 1)
+#define PA_OUTPRIMCOUNT (PA_INPRIMCOUNT + 1)
+#define PA_DEPTHCLIPCOUNT (PA_OUTPRIMCOUNT + 1)
+#define PA_TRIVIALREJCOUNT (PA_DEPTHCLIPCOUNT + 1)
+#define PA_CULLCOUNT (PA_TRIVIALREJCOUNT + 1)
+#define PA_NONIDLESTARVECOUNT (PA_CULLCOUNT + 1)
+#define PA_STARVELCOUNT (PA_NONIDLESTARVECOUNT + 1)
+#define PA_STALLCOUNT (PA_STARVELCOUNT + 1)
+#define PA_PROCESSCOUNT (PA_STALLCOUNT + 1)
+
+#define SE_TRIANGLECOUNT 1
+#define SE_LINECOUNT (SE_TRIANGLECOUNT + 1)
+#define SE_STARVECOUNT (SE_LINECOUNT + 1)
+#define SE_STALLCOUNT (SE_STARVECOUNT + 1)
+#define SE_RECEIVETRIANGLECOUNT (SE_STALLCOUNT + 1)
+#define SE_SENDTRIANGLECOUNT (SE_RECEIVETRIANGLECOUNT + 1)
+#define SE_RECEIVELINESCOUNT (SE_SENDTRIANGLECOUNT + 1)
+#define SE_SENDLINESCOUNT (SE_RECEIVELINESCOUNT + 1)
+#define SE_NONIDLESTARVECOUNT (SE_SENDLINESCOUNT + 1)
+#define SE_PROCESSCOUNT (SE_NONIDLESTARVECOUNT + 1)
+
+#define RA_VALIDPIXCOUNT 1
+#define RA_TOTALQUADCOUNT (RA_VALIDPIXCOUNT + 1)
+#define RA_VALIDQUADCOUNTEZ (RA_TOTALQUADCOUNT + 1)
+#define RA_TOTALPRIMCOUNT (RA_VALIDQUADCOUNTEZ + 1)
+#define RA_PIPECACHEMISSCOUNT (RA_TOTALPRIMCOUNT + 1)
+#define RA_PREFCACHEMISSCOUNT (RA_PIPECACHEMISSCOUNT + 1)
+#define RA_EEZCULLCOUNT (RA_PREFCACHEMISSCOUNT + 1)
+#define RA_NONIDLESTARVECOUNT (RA_EEZCULLCOUNT + 1)
+#define RA_STARVELCOUNT (RA_NONIDLESTARVECOUNT + 1)
+#define RA_STALLCOUNT (RA_STARVELCOUNT + 1)
+#define RA_PROCESSCOUNT (RA_STALLCOUNT + 1)
+
+#define TX_TOTBILINEARREQ 1
+#define TX_TOTTRILINEARREQ (TX_TOTBILINEARREQ + 1)
+#define TX_TOTDISCARDTEXREQ (TX_TOTTRILINEARREQ + 1)
+#define TX_TOTTEXREQ (TX_TOTDISCARDTEXREQ + 1)
+#define TX_MEMREADCOUNT (TX_TOTTEXREQ + 1)
+#define TX_MEMREADIN8BCOUNT (TX_MEMREADCOUNT + 1)
+#define TX_CACHEMISSCOUNT (TX_MEMREADIN8BCOUNT + 1)
+#define TX_CACHEHITTEXELCOUNT (TX_CACHEMISSCOUNT + 1)
+#define TX_CACHEMISSTEXELCOUNT (TX_CACHEHITTEXELCOUNT + 1)
+#define TX_NONIDLESTARVECOUNT (TX_CACHEMISSTEXELCOUNT+ 1)
+#define TX_STARVELCOUNT (TX_NONIDLESTARVECOUNT + 1)
+#define TX_STALLCOUNT (TX_STARVELCOUNT + 1)
+#define TX_PROCESSCOUNT (TX_STALLCOUNT + 1)
+
+#define PE_KILLEDBYCOLOR 1
+#define PE_KILLEDBYDEPTH (PE_KILLEDBYCOLOR + 1)
+#define PE_DRAWNBYCOLOR (PE_KILLEDBYDEPTH + 1)
+#define PE_DRAWNBYDEPTH (PE_DRAWNBYCOLOR + 1)
+
+#define MC_READREQ8BPIPE 1
+#define MC_READREQ8BIP (MC_READREQ8BPIPE + 1)
+#define MC_WRITEREQ8BPIPE (MC_READREQ8BIP + 1)
+#define MC_AXIMINLATENCY (MC_WRITEREQ8BPIPE + 1)
+#define MC_AXIMAXLATENCY (MC_AXIMINLATENCY + 1)
+#define MC_AXITOTALLATENCY (MC_AXIMAXLATENCY + 1)
+#define MC_AXISAMPLECOUNT (MC_AXITOTALLATENCY + 1)
+
+#define AXI_READREQSTALLED 1
+#define AXI_WRITEREQSTALLED (AXI_READREQSTALLED + 1)
+#define AXI_WRITEDATASTALLED (AXI_WRITEREQSTALLED + 1)
+
+#define FE_DRAWCOUNT 1
+#define FE_OUTVERTEXCOUNT (FE_DRAWCOUNT + 1)
+#define FE_STALLCOUNT (FE_OUTVERTEXCOUNT + 1)
+#define FE_STARVECOUNT (FE_STALLCOUNT + 1)
+
+#define PVS_INSTRCOUNT 1
+#define PVS_ALUINSTRCOUNT (PVS_INSTRCOUNT + 1)
+#define PVS_TEXINSTRCOUNT (PVS_ALUINSTRCOUNT + 1)
+#define PVS_ATTRIBCOUNT (PVS_TEXINSTRCOUNT + 1)
+#define PVS_UNIFORMCOUNT (PVS_ATTRIBCOUNT + 1)
+#define PVS_FUNCTIONCOUNT (PVS_UNIFORMCOUNT + 1)
+#define PVS_SOURCE (PVS_FUNCTIONCOUNT + 1)
+
+#define PPS_INSTRCOUNT 1
+#define PPS_ALUINSTRCOUNT (PPS_INSTRCOUNT + 1)
+#define PPS_TEXINSTRCOUNT (PPS_ALUINSTRCOUNT + 1)
+#define PPS_ATTRIBCOUNT (PPS_TEXINSTRCOUNT + 1)
+#define PPS_UNIFORMCOUNT (PPS_ATTRIBCOUNT + 1)
+#define PPS_FUNCTIONCOUNT (PPS_UNIFORMCOUNT + 1)
+#define PPS_SOURCE (PPS_FUNCTIONCOUNT + 1)
+/* End of MISC Counter IDs. */
+
+
+/* Category Constants. */
+#define VPHEADER 0x010000
+#define VPG_INFO 0x020000
+#define VPG_TIME 0x030000
+#define VPG_MEM 0x040000
+#define VPG_ES11 0x050000
+#define VPG_ES30 0x060000
+#define VPG_VG11 0x070000
+#define VPG_HAL 0x080000
+#define VPG_HW 0x090000
+#define VPG_GPU 0x0a0000
+#define VPG_VS 0x0b0000
+#define VPG_PS 0x0c0000
+#define VPG_PA 0x0d0000
+#define VPG_SETUP 0x0e0000
+#define VPG_RA 0x0f0000
+#define VPG_TX 0x100000
+#define VPG_PE 0x110000
+#define VPG_MC 0x120000
+#define VPG_AXI 0x130000
+#define VPG_PROG 0x140000
+#define VPG_PVS 0x150000
+#define VPG_PPS 0x160000
+#define VPG_ES11_TIME 0x170000
+#define VPG_ES30_TIME 0x180000
+#define VPG_FRAME 0x190000
+#define VPG_ES11_DRAW 0x200000
+#define VPG_ES30_DRAW 0x210000
+#define VPG_VG11_TIME 0x220000
+#define VPG_FE 0x230000
+#define VPG_MULTI_GPU 0x240000
+#define VPNG_FE 0x250000
+#define VPNG_VS 0x260000
+#define VPNG_PS 0x270000
+#define VPNG_PA 0x280000
+#define VPNG_SETUP 0x290000
+#define VPNG_RA 0x2a0000
+#define VPNG_TX 0x2b0000
+#define VPNG_PE 0x2c0000
+#define VPNG_MCC 0x2d0000
+#define VPNG_MCZ 0x2e0000
+#define VPNG_HI 0x2f0000
+#define VPNG_L2 0x300000
+#define VPG_FINISH 0x310000
+#define VPG_END 0xff0000
+
+/* Info. */
+#define VPC_INFOCOMPANY (VPG_INFO + 1)
+#define VPC_INFOVERSION (VPC_INFOCOMPANY + 1)
+#define VPC_INFORENDERER (VPC_INFOVERSION + 1)
+#define VPC_INFOREVISION (VPC_INFORENDERER + 1)
+#define VPC_INFODRIVER (VPC_INFOREVISION + 1)
+#define VPC_INFODRIVERMODE (VPC_INFODRIVER + 1)
+#define VPC_INFOSCREENSIZE (VPC_INFODRIVERMODE + 1)
+
+/* Counter Constants. */
+#define VPC_ELAPSETIME (VPG_TIME + 1)
+#define VPC_CPUTIME (VPC_ELAPSETIME + 1)
+
+#define VPC_MEMMAXRES (VPG_MEM + 1)
+#define VPC_MEMSHARED (VPC_MEMMAXRES + 1)
+#define VPC_MEMUNSHAREDDATA (VPC_MEMSHARED + 1)
+#define VPC_MEMUNSHAREDSTACK (VPC_MEMUNSHAREDDATA + 1)
+
+/* OpenGL ES11 Statics Counter IDs. */
+#define VPC_ES11CALLS (VPG_ES11 + ES11_CALLS)
+#define VPC_ES11DRAWCALLS (VPG_ES11 + ES11_DRAWCALLS)
+#define VPC_ES11STATECHANGECALLS (VPG_ES11 + ES11_STATECHANGECALLS)
+#define VPC_ES11POINTCOUNT (VPG_ES11 + ES11_POINTCOUNT)
+#define VPC_ES11LINECOUNT (VPG_ES11 + ES11_LINECOUNT)
+#define VPC_ES11TRIANGLECOUNT (VPG_ES11 + ES11_TRIANGLECOUNT)
+
+/* OpenGL ES30 Statistics Counter IDs. */
+#define VPC_ES30CALLS (VPG_ES30 + ES30_CALLS)
+#define VPC_ES30DRAWCALLS (VPG_ES30 + ES30_DRAWCALLS)
+#define VPC_ES30STATECHANGECALLS (VPG_ES30 + ES30_STATECHANGECALLS)
+#define VPC_ES30POINTCOUNT (VPG_ES30 + ES30_POINTCOUNT)
+#define VPC_ES30LINECOUNT (VPG_ES30 + ES30_LINECOUNT)
+#define VPC_ES30TRIANGLECOUNT (VPG_ES30 + ES30_TRIANGLECOUNT)
+
+/* OpenVG Statistics Counter IDs. */
+#define VPC_VG11CALLS (VPG_VG11 + VG11_CALLS)
+#define VPC_VG11DRAWCALLS (VPG_VG11 + VG11_DRAWCALLS)
+#define VPC_VG11STATECHANGECALLS (VPG_VG11 + VG11_STATECHANGECALLS)
+#define VPC_VG11FILLCOUNT (VPG_VG11 + VG11_FILLCOUNT)
+#define VPC_VG11STROKECOUNT (VPG_VG11 + VG11_STROKECOUNT)
+
+/* HAL Counters. */
+#define VPC_HALVERTBUFNEWBYTEALLOC (VPG_HAL + HAL_VERTBUFNEWBYTEALLOC)
+#define VPC_HALVERTBUFTOTALBYTEALLOC (VPG_HAL + HAL_VERTBUFTOTALBYTEALLOC)
+#define VPC_HALVERTBUFNEWOBJALLOC (VPG_HAL + HAL_VERTBUFNEWOBJALLOC)
+#define VPC_HALVERTBUFTOTALOBJALLOC (VPG_HAL + HAL_VERTBUFTOTALOBJALLOC)
+#define VPC_HALINDBUFNEWBYTEALLOC (VPG_HAL + HAL_INDBUFNEWBYTEALLOC)
+#define VPC_HALINDBUFTOTALBYTEALLOC (VPG_HAL + HAL_INDBUFTOTALBYTEALLOC)
+#define VPC_HALINDBUFNEWOBJALLOC (VPG_HAL + HAL_INDBUFNEWOBJALLOC)
+#define VPC_HALINDBUFTOTALOBJALLOC (VPG_HAL + HAL_INDBUFTOTALOBJALLOC)
+#define VPC_HALTEXBUFNEWBYTEALLOC (VPG_HAL + HAL_TEXBUFNEWBYTEALLOC)
+#define VPC_HALTEXBUFTOTALBYTEALLOC (VPG_HAL + HAL_TEXBUFTOTALBYTEALLOC)
+#define VPC_HALTEXBUFNEWOBJALLOC (VPG_HAL + HAL_TEXBUFNEWOBJALLOC)
+#define VPC_HALTEXBUFTOTALOBJALLOC (VPG_HAL + HAL_TEXBUFTOTALOBJALLOC)
+
+/* HW: GPU Counters. */
+#define VPC_GPUCYCLES (VPG_GPU + GPU_CYCLES)
+#define VPC_GPUREAD64BYTE (VPG_GPU + GPU_READ64BYTE)
+#define VPC_GPUWRITE64BYTE (VPG_GPU + GPU_WRITE64BYTE)
+#define VPC_GPUTOTALCYCLES (VPG_GPU + GPU_TOTALCYCLES)
+#define VPC_GPUIDLECYCLES (VPG_GPU + GPU_IDLECYCLES)
+
+/* HW: Shader Counters. */
+#define VPC_VSINSTCOUNT (VPG_VS + VS_INSTCOUNT)
+#define VPC_VSBRANCHINSTCOUNT (VPG_VS + VS_BRANCHINSTCOUNT)
+#define VPC_VSTEXLDINSTCOUNT (VPG_VS + VS_TEXLDINSTCOUNT)
+#define VPC_VSRENDEREDVERTCOUNT (VPG_VS + VS_RENDEREDVERTCOUNT)
+#define VPC_VSNONIDLESTARVECOUNT (VPG_VS + VS_NONIDLESTARVECOUNT)
+#define VPC_VSSTARVELCOUNT (VPG_VS + VS_STARVELCOUNT)
+#define VPC_VSSTALLCOUNT (VPG_VS + VS_STALLCOUNT)
+#define VPC_VSPROCESSCOUNT (VPG_VS + VS_PROCESSCOUNT)
+/* HW: PS Count. */
+#define VPC_PSINSTCOUNT (VPG_PS + PS_INSTCOUNT)
+#define VPC_PSBRANCHINSTCOUNT (VPG_PS + PS_BRANCHINSTCOUNT)
+#define VPC_PSTEXLDINSTCOUNT (VPG_PS + PS_TEXLDINSTCOUNT)
+#define VPC_PSRENDEREDPIXCOUNT (VPG_PS + PS_RENDEREDPIXCOUNT)
+#define VPC_PSNONIDLESTARVECOUNT (VPG_PS + PS_NONIDLESTARVECOUNT)
+#define VPC_PSSTARVELCOUNT (VPG_PS + PS_STARVELCOUNT)
+#define VPC_PSSTALLCOUNT (VPG_PS + PS_STALLCOUNT)
+#define VPC_PSPROCESSCOUNT (VPG_PS + PS_PROCESSCOUNT)
+#define VPC_PSSHADERCYCLECOUNT (VPG_PS + PS_SHADERCYCLECOUNT)
+
+/* HW: PA Counters. */
+#define VPC_PAINVERTCOUNT (VPG_PA + PA_INVERTCOUNT)
+#define VPC_PAINPRIMCOUNT (VPG_PA + PA_INPRIMCOUNT)
+#define VPC_PAOUTPRIMCOUNT (VPG_PA + PA_OUTPRIMCOUNT)
+#define VPC_PADEPTHCLIPCOUNT (VPG_PA + PA_DEPTHCLIPCOUNT)
+#define VPC_PATRIVIALREJCOUNT (VPG_PA + PA_TRIVIALREJCOUNT)
+#define VPC_PACULLCOUNT (VPG_PA + PA_CULLCOUNT)
+#define VPC_PANONIDLESTARVECOUNT (VPG_PA + PA_NONIDLESTARVECOUNT)
+#define VPC_PASTARVELCOUNT (VPG_PA + PA_STARVELCOUNT)
+#define VPC_PASTALLCOUNT (VPG_PA + PA_STALLCOUNT)
+#define VPC_PAPROCESSCOUNT (VPG_PA + PA_PROCESSCOUNT)
+
+/* HW: Setup Counters. */
+#define VPC_SETRIANGLECOUNT (VPG_SETUP + SE_TRIANGLECOUNT)
+#define VPC_SELINECOUNT (VPG_SETUP + SE_LINECOUNT)
+#define VPC_SESTARVECOUNT (VPG_SETUP + SE_STARVECOUNT)
+#define VPC_SESTALLCOUNT (VPG_SETUP + SE_STALLCOUNT)
+#define VPC_SERECEIVETRIANGLECOUNT (VPG_SETUP + SE_RECEIVETRIANGLECOUNT)
+#define VPC_SESENDTRIANGLECOUNT (VPG_SETUP + SE_SENDTRIANGLECOUNT)
+#define VPC_SERECEIVELINESCOUNT (VPG_SETUP + SE_RECEIVELINESCOUNT)
+#define VPC_SESENDLINESCOUNT (VPG_SETUP + SE_SENDLINESCOUNT)
+#define VPC_SENONIDLESTARVECOUNT (VPG_SETUP + SE_NONIDLESTARVECOUNT)
+#define VPC_SEPROCESSCOUNT (VPG_SETUP + SE_PROCESSCOUNT)
+
+/* HW: RA Counters. */
+#define VPC_RAVALIDPIXCOUNT (VPG_RA + RA_VALIDPIXCOUNT)
+#define VPC_RATOTALQUADCOUNT (VPG_RA + RA_TOTALQUADCOUNT)
+#define VPC_RAVALIDQUADCOUNTEZ (VPG_RA + RA_VALIDQUADCOUNTEZ)
+#define VPC_RATOTALPRIMCOUNT (VPG_RA + RA_TOTALPRIMCOUNT)
+#define VPC_RAPIPECACHEMISSCOUNT (VPG_RA + RA_PIPECACHEMISSCOUNT)
+#define VPC_RAPREFCACHEMISSCOUNT (VPG_RA + RA_PREFCACHEMISSCOUNT)
+#define VPC_RAEEZCULLCOUNT (VPG_RA + RA_EEZCULLCOUNT)
+#define VPC_RANONIDLESTARVECOUNT (VPG_RA + RA_NONIDLESTARVECOUNT)
+#define VPC_RASTARVELCOUNT (VPG_RA + RA_STARVELCOUNT)
+#define VPC_RASTALLCOUNT (VPG_RA + RA_STALLCOUNT)
+#define VPC_RAPROCESSCOUNT (VPG_RA + RA_PROCESSCOUNT)
+
+/* HW: TEX Counters. */
+#define VPC_TXTOTBILINEARREQ (VPG_TX + TX_TOTBILINEARREQ)
+#define VPC_TXTOTTRILINEARREQ (VPG_TX + TX_TOTTRILINEARREQ)
+#define VPC_TXTOTDISCARDTEXREQ (VPG_TX + TX_TOTDISCARDTEXREQ)
+#define VPC_TXTOTTEXREQ (VPG_TX + TX_TOTTEXREQ)
+#define VPC_TXMEMREADCOUNT (VPG_TX + TX_MEMREADCOUNT)
+#define VPC_TXMEMREADIN8BCOUNT (VPG_TX + TX_MEMREADIN8BCOUNT)
+#define VPC_TXCACHEMISSCOUNT (VPG_TX + TX_CACHEMISSCOUNT)
+#define VPC_TXCACHEHITTEXELCOUNT (VPG_TX + TX_CACHEHITTEXELCOUNT)
+#define VPC_TXCACHEMISSTEXELCOUNT (VPG_TX + TX_CACHEMISSTEXELCOUNT)
+#define VPC_TXNONIDLESTARVECOUNT (VPG_TX + TX_NONIDLESTARVECOUNT)
+#define VPC_TXSTARVELCOUNT (VPG_TX + TX_STARVELCOUNT)
+#define VPC_TXSTALLCOUNT (VPG_TX + TX_STALLCOUNT)
+#define VPC_TXPROCESSCOUNT (VPG_TX + TX_PROCESSCOUNT)
+
+/* HW: PE Counters. */
+#define VPC_PEKILLEDBYCOLOR (VPG_PE + PE_KILLEDBYCOLOR)
+#define VPC_PEKILLEDBYDEPTH (VPG_PE + PE_KILLEDBYDEPTH)
+#define VPC_PEDRAWNBYCOLOR (VPG_PE + PE_DRAWNBYCOLOR)
+#define VPC_PEDRAWNBYDEPTH (VPG_PE + PE_DRAWNBYDEPTH)
+
+/* HW: MC Counters. */
+#define VPC_MCREADREQ8BPIPE (VPG_MC + MC_READREQ8BPIPE)
+#define VPC_MCREADREQ8BIP (VPG_MC + MC_READREQ8BIP)
+#define VPC_MCWRITEREQ8BPIPE (VPG_MC + MC_WRITEREQ8BPIPE)
+#define VPC_MCAXIMINLATENCY (VPG_MC + MC_AXIMINLATENCY)
+#define VPC_MCAXIMAXLATENCY (VPG_MC + MC_AXIMAXLATENCY)
+#define VPC_MCAXITOTALLATENCY (VPG_MC + MC_AXITOTALLATENCY)
+#define VPC_MCAXISAMPLECOUNT (VPG_MC + MC_AXISAMPLECOUNT)
+
+/* HW: AXI Counters. */
+#define VPC_AXIREADREQSTALLED (VPG_AXI + AXI_READREQSTALLED)
+#define VPC_AXIWRITEREQSTALLED (VPG_AXI + AXI_WRITEREQSTALLED)
+#define VPC_AXIWRITEDATASTALLED (VPG_AXI + AXI_WRITEDATASTALLED)
+
+/* HW: FE Counters. */
+#define VPC_FEDRAWCOUNT (VPG_FE + FE_DRAWCOUNT)
+#define VPC_FEOUTVERTEXCOUNT (VPG_FE + FE_OUTVERTEXCOUNT)
+#define VPC_FESTALLCOUNT (VPG_FE + FE_STALLCOUNT)
+#define VPC_FESTARVECOUNT (VPG_FE + FE_STARVECOUNT)
+
+/* HW: Shader Counters. */
+#define VPNC_VSINSTCOUNT (VPNG_VS + 1)
+#define VPNC_VSBRANCHINSTCOUNT (VPNG_VS + 2)
+#define VPNC_VSTEXLDINSTCOUNT (VPNG_VS + 3)
+#define VPNC_VSRENDEREDVERTCOUNT (VPNG_VS + 4)
+#define VPNC_VSNONIDLESTARVECOUNT (VPNG_VS + 5)
+#define VPNC_VSSTARVELCOUNT (VPNG_VS + 6)
+#define VPNC_VSSTALLCOUNT (VPNG_VS + 7)
+#define VPNC_VSPROCESSCOUNT (VPNG_VS + 8)
+#define VPNC_VSSHADERCYCLECOUNT (VPNG_VS + 9)
+#define VPNC_VS_COUNT VPNC_VSSHADERCYCLECOUNT - VPNG_VS
+
+/* HW: PS Count. */
+#define VPNC_PSINSTCOUNT (VPNG_PS + 1)
+#define VPNC_PSBRANCHINSTCOUNT (VPNG_PS + 2)
+#define VPNC_PSTEXLDINSTCOUNT (VPNG_PS + 3)
+#define VPNC_PSRENDEREDPIXCOUNT (VPNG_PS + 4)
+#define VPNC_PSNONIDLESTARVECOUNT (VPNG_PS + 5)
+#define VPNC_PSSTARVELCOUNT (VPNG_PS + 6)
+#define VPNC_PSSTALLCOUNT (VPNG_PS + 7)
+#define VPNC_PSPROCESSCOUNT (VPNG_PS + 8)
+#define VPNC_PSSHADERCYCLECOUNT (VPNG_PS + 9)
+#define VPNC_PS_COUNT VPNC_PSSHADERCYCLECOUNT - VPNG_PS
+
+/* HW: PA Counters. */
+#define VPNC_PAINVERTCOUNT (VPNG_PA + 1)
+#define VPNC_PAINPRIMCOUNT (VPNG_PA + 2)
+#define VPNC_PAOUTPRIMCOUNT (VPNG_PA + 3)
+#define VPNC_PADEPTHCLIPCOUNT (VPNG_PA + 4)
+#define VPNC_PATRIVIALREJCOUNT (VPNG_PA + 5)
+#define VPNC_PACULLPRIMCOUNT (VPNG_PA + 6)
+#define VPNC_PADROPPRIMCOUNT (VPNG_PA + 7)
+#define VPNC_PAFRCLIPPRIMCOUNT (VPNG_PA + 8)
+#define VPNC_PAFRCLIPDROPPRIMCOUNT (VPNG_PA + 9)
+#define VPNC_PANONIDLESTARVECOUNT (VPNG_PA + 10)
+#define VPNC_PASTARVELCOUNT (VPNG_PA + 11)
+#define VPNC_PASTALLCOUNT (VPNG_PA + 12)
+#define VPNC_PAPROCESSCOUNT (VPNG_PA + 13)
+#define VPNC_PA_COUNT VPNC_PAPROCESSCOUNT - VPNG_PA
+
+/* HW: Setup Counters. */
+#define VPNC_SECULLTRIANGLECOUNT (VPNG_SETUP + 1)
+#define VPNC_SECULLLINECOUNT (VPNG_SETUP + 2)
+#define VPNC_SECLIPTRIANGLECOUNT (VPNG_SETUP + 3)
+#define VPNC_SECLIPLINECOUNT (VPNG_SETUP + 4)
+#define VPNC_SESTARVECOUNT (VPNG_SETUP + 5)
+#define VPNC_SESTALLCOUNT (VPNG_SETUP + 6)
+#define VPNC_SERECEIVETRIANGLECOUNT (VPNG_SETUP + 7)
+#define VPNC_SESENDTRIANGLECOUNT (VPNG_SETUP + 8)
+#define VPNC_SERECEIVELINESCOUNT (VPNG_SETUP + 9)
+#define VPNC_SESENDLINESCOUNT (VPNG_SETUP + 10)
+#define VPNC_SENONIDLESTARVECOUNT (VPNG_SETUP + 11)
+#define VPNC_SETRIVIALREJLINECOUNT (VPNG_SETUP + 12)
+#define VPNC_SEPROCESSCOUNT (VPNG_SETUP + 13)
+#define VPNC_SE_COUNT VPNC_SEPROCESSCOUNT - VPNG_SETUP
+
+/* HW: RA Counters. */
+#define VPNC_RAVALIDPIXCOUNT (VPNG_RA + 1)
+#define VPNC_RATOTALQUADCOUNT (VPNG_RA + 2)
+#define VPNC_RAVALIDQUADCOUNTEZ (VPNG_RA + 3)
+#define VPNC_RAINPUTPRIMCOUNT (VPNG_RA + 4)
+#define VPNC_RAPIPECACHEMISSCOUNT (VPNG_RA + 5)
+#define VPNC_RAPREFCACHEMISSCOUNT (VPNG_RA + 6)
+#define VPNC_RAPIPEHZCACHEMISSCOUNT (VPNG_RA + 7)
+#define VPNC_RAPREFHZCACHEMISSCOUNT (VPNG_RA + 8)
+#define VPNC_RAOUTPUTQUADCOUNT (VPNG_RA + 9)
+#define VPNC_RAOUTPUTPIXELCOUNT (VPNG_RA + 10)
+#define VPNC_RAEEZCULLCOUNT (VPNG_RA + 11)
+#define VPNC_RANONIDLESTARVECOUNT (VPNG_RA + 12)
+#define VPNC_RASTARVELCOUNT (VPNG_RA + 13)
+#define VPNC_RASTALLCOUNT (VPNG_RA + 14)
+#define VPNC_RAPROCESSCOUNT (VPNG_RA + 15)
+#define VPNC_RA_COUNT VPNC_RAPROCESSCOUNT - VPNG_RA
+
+/* HW: TEX Counters. */
+#define VPNC_TXTOTBILINEARREQ (VPNG_TX + 1)
+#define VPNC_TXTOTTRILINEARREQ (VPNG_TX + 2)
+#define VPNC_TXTOTDISCARDTEXREQ (VPNG_TX + 3)
+#define VPNC_TXTOTTEXREQ (VPNG_TX + 4)
+#define VPNC_TXMC0MISSCOUNT (VPNG_TX + 5)
+#define VPNC_TXMC0REQCOUNT (VPNG_TX + 6)
+#define VPNC_TXMC1MISSCOUNT (VPNG_TX + 7)
+#define VPNC_TXMC1REQCOUNT (VPNG_TX + 8)
+#define VPNC_TX_COUNT VPNC_TXMC1REQCOUNT - VPNG_TX
+
+/* HW: PE Counters. */
+#define VPNC_PE0KILLEDBYCOLOR (VPNG_PE + 1)
+#define VPNC_PE0KILLEDBYDEPTH (VPNG_PE + 2)
+#define VPNC_PE0DRAWNBYCOLOR (VPNG_PE + 3)
+#define VPNC_PE0DRAWNBYDEPTH (VPNG_PE + 4)
+#define VPNC_PE1KILLEDBYCOLOR (VPNG_PE + 5)
+#define VPNC_PE1KILLEDBYDEPTH (VPNG_PE + 6)
+#define VPNC_PE1DRAWNBYCOLOR (VPNG_PE + 7)
+#define VPNC_PE1DRAWNBYDEPTH (VPNG_PE + 8)
+#define VPNC_PE_COUNT VPNC_PE1DRAWNBYDEPTH - VPNG_PE
+
+/* HW: MCC Counters. */
+#define VPNC_MCCREADREQ8BCOLORPIPE (VPNG_MCC + 1)
+#define VPNC_MCCREADREQ8BSOCOLORPIPE (VPNG_MCC + 2)
+#define VPNC_MCCWRITEREQ8BCOLORPIPE (VPNG_MCC + 3)
+#define VPNC_MCCREADREQSOCOLORPIPE (VPNG_MCC + 4)
+#define VPNC_MCCWRITEREQCOLORPIPE (VPNG_MCC + 5)
+#define VPNC_MCCREADREQ8BDEPTHPIPE (VPNG_MCC + 6)
+#define VPNC_MCCREADREQ8BSFDEPTHPIPE (VPNG_MCC + 7)
+#define VPNC_MCCWRITEREQ8BDEPTHPIPE (VPNG_MCC + 8)
+#define VPNC_MCCREADREQSFDEPTHPIPE (VPNG_MCC + 9)
+#define VPNC_MCCWRITEREQDEPTHPIPE (VPNG_MCC + 10)
+#define VPNC_MCCREADREQ8BOTHERPIPE (VPNG_MCC + 11)
+#define VPNC_MCCWRITEREQ8BOTHERPIPE (VPNG_MCC + 12)
+#define VPNC_MCCREADREQOTHERPIPE (VPNG_MCC + 13)
+#define VPNC_MCCWRITEREQOTHERPIPE (VPNG_MCC + 14)
+#define VPNC_MCCAXIMINLATENCY (VPNG_MCC + 15)
+#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)
+#define VPNC_MCC_COUNT VPNC_MCCSH1WRITEBANDWIDTH - VPNG_MCC
+
+/* HW: MCZ Counters. */
+#define VPNC_MCZREADREQ8BCOLORPIPE (VPNG_MCZ + 1)
+#define VPNC_MCZREADREQ8BSOCOLORPIPE (VPNG_MCZ + 2)
+#define VPNC_MCZWRITEREQ8BCOLORPIPE (VPNG_MCZ + 3)
+#define VPNC_MCZREADREQSOCOLORPIPE (VPNG_MCZ + 4)
+#define VPNC_MCZWRITEREQCOLORPIPE (VPNG_MCZ + 5)
+#define VPNC_MCZREADREQ8BDEPTHPIPE (VPNG_MCZ + 6)
+#define VPNC_MCZREADREQ8BSFDEPTHPIPE (VPNG_MCZ + 7)
+#define VPNC_MCZWRITEREQ8BDEPTHPIPE (VPNG_MCZ + 8)
+#define VPNC_MCZREADREQSFDEPTHPIPE (VPNG_MCZ + 9)
+#define VPNC_MCZWRITEREQDEPTHPIPE (VPNG_MCZ + 10)
+#define VPNC_MCZREADREQ8BOTHERPIPE (VPNG_MCZ + 11)
+#define VPNC_MCZWRITEREQ8BOTHERPIPE (VPNG_MCZ + 12)
+#define VPNC_MCZREADREQOTHERPIPE (VPNG_MCZ + 13)
+#define VPNC_MCZWRITEREQOTHERPIPE (VPNG_MCZ + 14)
+#define VPNC_MCZAXIMINLATENCY (VPNG_MCZ + 15)
+#define VPNC_MCZAXIMAXLATENCY (VPNG_MCZ + 16)
+#define VPNC_MCZAXITOTALLATENCY (VPNG_MCZ + 17)
+#define VPNC_MCZAXISAMPLECOUNT (VPNG_MCZ + 18)
+#define VPNC_MCZ_COUNT VPNC_MCZAXISAMPLECOUNT - VPNG_MCZ
+
+/* HW: HI Counters. */
+#define VPNC_HI0READ8BYTE (VPNG_HI + 1)
+#define VPNC_HI0WRITE8BYTE (VPNG_HI + 2)
+#define VPNC_HI0READREQ (VPNG_HI + 3)
+#define VPNC_HI0WRITEREQ (VPNG_HI + 4)
+#define VPNC_HI0AXIREADREQSTALL (VPNG_HI + 5)
+#define VPNC_HI0AXIWRITEREQSTALL (VPNG_HI + 6)
+#define VPNC_HI0AXIWRITEDATASTALL (VPNG_HI + 7)
+#define VPNC_HI1READ8BYTE (VPNG_HI + 8)
+#define VPNC_HI1WRITE8BYTE (VPNG_HI + 9)
+#define VPNC_HI1READREQ (VPNG_HI + 10)
+#define VPNC_HI1WRITEREQ (VPNG_HI + 11)
+#define VPNC_HI1AXIREADREQSTALL (VPNG_HI + 12)
+#define VPNC_HI1AXIWRITEREQSTALL (VPNG_HI + 13)
+#define VPNC_HI1AXIWRITEDATASTALL (VPNG_HI + 14)
+#define VPNC_HITOTALCYCLES (VPNG_HI + 15)
+#define VPNC_HIIDLECYCLES (VPNG_HI + 16)
+#define VPNC_HIREAD8BYTE (VPNG_HI + 17)
+#define VPNC_HIWRITE8BYTE (VPNG_HI + 18)
+#define VPNC_HIOCBREAD16BYTE (VPNG_HI + 19)
+#define VPNC_HIOCBWRITE16BYTE (VPNG_HI + 20)
+#define VPNC_HI_COUNT VPNC_HIOCBWRITE16BYTE - VPNG_HI
+
+/* HW: L2 Counters. */
+#define VPNC_L2AXI0READREQCOUNT (VPNG_L2 + 1)
+#define VPNC_L2AXI1READREQCOUNT (VPNG_L2 + 2)
+#define VPNC_L2AXI0WRITEREQCOUNT (VPNG_L2 + 3)
+#define VPNC_L2AXI1WRITEREQCOUNT (VPNG_L2 + 4)
+#define VPNC_L2READTRANSREQBYAXI0 (VPNG_L2 + 5)
+#define VPNC_L2READTRANSREQBYAXI1 (VPNG_L2 + 6)
+#define VPNC_L2WRITETRANSREQBYAXI0 (VPNG_L2 + 7)
+#define VPNC_L2WRITETRANSREQBYAXI1 (VPNG_L2 + 8)
+#define VPNC_L2AXI0MINLATENCY (VPNG_L2 + 9)
+#define VPNC_L2AXI0MAXLATENCY (VPNG_L2 + 10)
+#define VPNC_L2AXI0TOTLATENCY (VPNG_L2 + 11)
+#define VPNC_L2AXI0TOTREQCOUNT (VPNG_L2 + 12)
+#define VPNC_L2AXI1MINLATENCY (VPNG_L2 + 13)
+#define VPNC_L2AXI1MAXLATENCY (VPNG_L2 + 14)
+#define VPNC_L2AXI1TOTLATENCY (VPNG_L2 + 15)
+#define VPNC_L2AXI1TOTREQCOUNT (VPNG_L2 + 16)
+#define VPNC_L2_COUNT VPNC_L2AXI1TOTREQCOUNT - VPNG_L2
+
+/* HW: FE Counters. */
+#define VPNC_FEDRAWCOUNT (VPNG_FE + 1)
+#define VPNC_FEOUTVERTEXCOUNT (VPNG_FE + 2)
+#define VPNC_FECACHEMISSCOUNT (VPNG_FE + 3)
+#define VPNC_FECACHELKCOUNT (VPNG_FE + 4)
+#define VPNC_FESTALLCOUNT (VPNG_FE + 5)
+#define VPNC_FESTARVECOUNT (VPNG_FE + 6)
+#define VPNC_FEPROCESSCOUNT (VPNG_FE + 7)
+#define VPNC_FE_COUNT VPNC_FEPROCESSCOUNT - VPNG_FE
+
+#define TOTAL_COUNTER_NUMBER (VPNC_FE_COUNT + VPNC_VS_COUNT + VPNC_PA_COUNT + VPNC_SE_COUNT + VPNC_RA_COUNT \
+ + VPNC_PS_COUNT + VPNC_TX_COUNT + VPNC_PE_COUNT + VPNC_MCC_COUNT + VPNC_MCZ_COUNT \
+ + VPNC_HI_COUNT + VPNC_L2_COUNT)
+
+#define TOTAL_MODULE_NUMBER 12
+
+/* PROGRAM: Shader program counters. */
+#define VPC_PVSINSTRCOUNT (VPG_PVS + PVS_INSTRCOUNT)
+#define VPC_PVSALUINSTRCOUNT (VPG_PVS + PVS_ALUINSTRCOUNT)
+#define VPC_PVSTEXINSTRCOUNT (VPG_PVS + PVS_TEXINSTRCOUNT)
+#define VPC_PVSATTRIBCOUNT (VPG_PVS + PVS_ATTRIBCOUNT)
+#define VPC_PVSUNIFORMCOUNT (VPG_PVS + PVS_UNIFORMCOUNT)
+#define VPC_PVSFUNCTIONCOUNT (VPG_PVS + PVS_FUNCTIONCOUNT)
+#define VPC_PVSSOURCE (VPG_PVS + PVS_SOURCE)
+
+#define VPC_PPSINSTRCOUNT (VPG_PPS + PPS_INSTRCOUNT)
+#define VPC_PPSALUINSTRCOUNT (VPG_PPS + PPS_ALUINSTRCOUNT)
+#define VPC_PPSTEXINSTRCOUNT (VPG_PPS + PPS_TEXINSTRCOUNT)
+#define VPC_PPSATTRIBCOUNT (VPG_PPS + PPS_ATTRIBCOUNT)
+#define VPC_PPSUNIFORMCOUNT (VPG_PPS + PPS_UNIFORMCOUNT)
+#define VPC_PPSFUNCTIONCOUNT (VPG_PPS + PPS_FUNCTIONCOUNT)
+#define VPC_PPSSOURCE (VPG_PPS + PPS_SOURCE)
+
+#define VPC_PROGRAMHANDLE (VPG_PROG + 1)
+
+#define VPC_ES30_DRAW_NO (VPG_ES30_DRAW + 1)
+#define VPC_ES11_DRAW_NO (VPG_ES11_DRAW + 1)
+#define VPC_ES30_GPU_NO (VPG_MULTI_GPU + 1)
+
+
+#define MODULE_FRONT_END_COUNTER_NUM 0x5
+#define MODULE_VERTEX_SHADER_COUNTER_NUM 0x9
+#define MODULE_PRIMITIVE_ASSEMBLY_COUNTER_NUM 0xC
+#define MODULE_SETUP_COUNTER_NUM 0xD
+#define MODULE_RASTERIZER_COUNTER_NUM 0xE
+#define MODULE_PIXEL_SHADER_COUNTER_NUM 0x9
+#define MODULE_TEXTURE_COUNTER_NUM 0x8
+#define MODULE_PIXEL_ENGINE_COUNTER_NUM 0x8
+#define MODULE_MEMORY_CONTROLLER_COLOR_COUNTER_NUM 0xC
+#define MODULE_MEMORY_CONTROLLER_DEPTH_COUNTER_NUM 0xC
+#define MODULE_HOST_INTERFACE0_COUNTER_NUM 0x9
+#define MODULE_HOST_INTERFACE1_COUNTER_NUM 0x7
+#define MODULE_GPUL2_CACHE_COUNTER_NUM 0xE
+#define TOTAL_PROBE_NUMBER (MODULE_FRONT_END_COUNTER_NUM + MODULE_VERTEX_SHADER_COUNTER_NUM + MODULE_PRIMITIVE_ASSEMBLY_COUNTER_NUM \
+ + MODULE_SETUP_COUNTER_NUM + MODULE_RASTERIZER_COUNTER_NUM + MODULE_PIXEL_SHADER_COUNTER_NUM \
+ + MODULE_TEXTURE_COUNTER_NUM + MODULE_PIXEL_ENGINE_COUNTER_NUM + MODULE_MEMORY_CONTROLLER_COLOR_COUNTER_NUM \
+ + MODULE_MEMORY_CONTROLLER_DEPTH_COUNTER_NUM + MODULE_HOST_INTERFACE0_COUNTER_NUM + MODULE_HOST_INTERFACE1_COUNTER_NUM \
+ + MODULE_GPUL2_CACHE_COUNTER_NUM)
+
+
+#ifdef ANDROID
+#define DEFAULT_PROFILE_FILE_NAME "/sdcard/vprofiler.vpd"
+#else
+#define DEFAULT_PROFILE_FILE_NAME "vprofiler.vpd"
+#endif
+
+#define VPHEADER_VERSION "VP20"
+
+#define VPFILETYPE_GL "10"
+
+#define VPFILETYPE_CL "00"
+
+#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 data value. */
+#define gcmRECORD_VALUE(IntData) \
+ do \
+ { \
+ gctINT32 value = IntData; \
+ value = BIG_ENDIAN_TRANS_INT(value); \
+ counterData[counterIndex++] = value; \
+ } \
+ while (gcvFALSE)
+
+#define gcmRECORD_CONST(Const) \
+ do \
+ { \
+ gctINT32 data = Const; \
+ data = BIG_ENDIAN_TRANS_INT(data); \
+ counterData[counterIndex++] = data; \
+ } \
+ while (gcvFALSE)
+
+#define gcmRECORD_COUNTER(Counter, Value) \
+ gcmRECORD_CONST(Counter); \
+ gcmRECORD_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 (*(memory + (counterId + offset) * (1 << clusterIDWidth)) == 0xdeaddead) \
+ { \
+ counter = 0xdeaddead; \
+ } \
+ else \
+ { \
+ gctUINT32 i; \
+ gctUINT32_PTR Memory = memory; \
+ counter = 0; \
+ Memory = memory + TOTAL_PROBE_NUMBER * CoreId * (1 << clusterIDWidth); \
+ for (i = 0; i < (gctUINT32)(1 << clusterIDWidth); i++) \
+ { \
+ counter += *(Memory + (counterId + offset) * (1 << clusterIDWidth) + i); \
+ } \
+ } \
+ } \
+ while (gcvFALSE)
+
+#define gcmGET_LATENCY_COUNTER(minLatency, maxLatency, counterId) \
+ do \
+ { \
+ if (*(memory + (counterId + offset) * (1 << clusterIDWidth)) == 0xdeaddead) \
+ { \
+ minLatency = maxLatency = 0xdeaddead; \
+ } \
+ else \
+ { \
+ gctUINT32 i; \
+ gctUINT32_PTR Memory = memory; \
+ Memory = memory + TOTAL_PROBE_NUMBER * CoreId * (1 << clusterIDWidth); \
+ for (i = 0; i < (gctUINT32)(1 << clusterIDWidth); i++) \
+ { \
+ maxLatency += ((*(Memory + (counterId + offset) * (1 << clusterIDWidth) + i) & 0xfff000) >> 12); \
+ minLatency += (*(Memory + (counterId + offset) * (1 << clusterIDWidth) + i) & 0x000fff); \
+ if (minLatency == 4095) \
+ minLatency = 0; \
+ } \
+ } \
+ } \
+ while (gcvFALSE)
+
+typedef enum _gceCOUNTER
+{
+ gcvCOUNTER_FRONT_END,
+ gcvCOUNTER_VERTEX_SHADER,
+ gcvCOUNTER_PRIMITIVE_ASSEMBLY,
+ gcvCOUNTER_SETUP,
+ gcvCOUNTER_RASTERIZER,
+ gcvCOUNTER_PIXEL_SHADER,
+ gcvCOUNTER_TEXTURE,
+ gcvCOUNTER_PIXEL_ENGINE,
+ gcvCOUNTER_MEMORY_CONTROLLER_COLOR,
+ gcvCOUNTER_MEMORY_CONTROLLER_DEPTH,
+ gcvCOUNTER_HOST_INTERFACE0,
+ gcvCOUNTER_HOST_INTERFACE1,
+ gcvCOUNTER_GPUL2_CACHE,
+ gcvCOUNTER_COUNT
+}
+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_COUNTERS_PART1
+{
+ gctUINT32 gpuTotalRead64BytesPerFrame;
+ gctUINT32 gpuTotalWrite64BytesPerFrame;
+
+ /* FE */
+ gctUINT32 fe_draw_count;
+ gctUINT32 fe_out_vertex_count;
+ gctUINT32 fe_cache_miss_count;
+ gctUINT32 fe_cache_lk_count;
+ gctUINT32 fe_stall_count;
+ gctUINT32 fe_starve_count;
+ gctUINT32 fe_process_count;
+
+ /* PE */
+ gctUINT32 pe0_pixel_count_killed_by_color_pipe;
+ gctUINT32 pe0_pixel_count_killed_by_depth_pipe;
+ gctUINT32 pe0_pixel_count_drawn_by_color_pipe;
+ gctUINT32 pe0_pixel_count_drawn_by_depth_pipe;
+ gctUINT32 pe1_pixel_count_killed_by_color_pipe;
+ gctUINT32 pe1_pixel_count_killed_by_depth_pipe;
+ gctUINT32 pe1_pixel_count_drawn_by_color_pipe;
+ gctUINT32 pe1_pixel_count_drawn_by_depth_pipe;
+
+ /* SH */
+ gctUINT32 shader_cycle_count;
+ gctUINT32 vs_shader_cycle_count;
+ gctUINT32 ps_shader_cycle_count;
+ gctUINT32 ps_inst_counter;
+ gctUINT32 ps_rendered_pixel_counter;
+ gctUINT32 vs_inst_counter;
+ gctUINT32 vs_rendered_vertice_counter;
+ gctUINT32 vs_branch_inst_counter;
+ gctUINT32 vs_texld_inst_counter;
+ gctUINT32 ps_branch_inst_counter;
+ gctUINT32 ps_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;
+
+ /* 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_prim_counter;
+ gctUINT32 pa_droped_prim_counter;
+ gctUINT32 pa_frustum_clipped_prim_counter;
+ gctUINT32 pa_frustum_clipdroped_prim_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_clipped_triangle_count;
+ gctUINT32 se_clipped_line_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_trivial_rejected_line_count;
+ gctUINT32 se_non_idle_starve_count;
+
+ /* RA */
+ gctUINT32 ra_input_prim_count;
+ gctUINT32 ra_total_quad_count;
+ gctUINT32 ra_valid_quad_count_after_early_z;
+ gctUINT32 ra_valid_pixel_count_to_render;
+ gctUINT32 ra_output_valid_quad_count;
+ gctUINT32 ra_output_valid_pixel_count;
+ gctUINT32 ra_pipe_cache_miss_counter;
+ gctUINT32 ra_pipe_hz_cache_miss_counter;
+ gctUINT32 ra_prefetch_cache_miss_counter;
+ gctUINT32 ra_prefetch_hz_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_mc0_miss_count;
+ gctUINT32 tx_mc0_request_byte_count;
+ gctUINT32 tx_mc1_miss_count;
+ gctUINT32 tx_mc1_request_byte_count;
+ gctUINT32 tx_non_idle_starve_count;
+ gctUINT32 tx_starve_count;
+ gctUINT32 tx_stall_count;
+ gctUINT32 tx_process_count;
+}
+gcsPROFILER_COUNTERS_PART1;
+
+typedef struct _gcsPROFILER_COUNTERS_PART2
+{
+ /* MCC */
+ gctUINT32 mcc_total_read_req_8B_from_colorpipe;
+ gctUINT32 mcc_total_read_req_8B_sentout_from_colorpipe;
+ gctUINT32 mcc_total_write_req_8B_from_colorpipe;
+ gctUINT32 mcc_total_read_req_sentout_from_colorpipe;
+ gctUINT32 mcc_total_write_req_from_colorpipe;
+ gctUINT32 mcc_total_read_req_8B_from_depthpipe;
+ gctUINT32 mcc_total_read_req_8B_sentout_from_depthpipe;
+ gctUINT32 mcc_total_write_req_8B_from_depthpipe;
+ gctUINT32 mcc_total_read_req_sentout_from_depthpipe;
+ gctUINT32 mcc_total_write_req_from_depthpipe;
+ gctUINT32 mcc_total_read_req_8B_from_others;
+ gctUINT32 mcc_total_write_req_8B_from_others;
+ gctUINT32 mcc_total_read_req_from_others;
+ gctUINT32 mcc_total_write_req_from_others;
+ gctUINT32 mcc_axi_total_latency;
+ 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;
+ gctUINT32 mcz_total_read_req_8B_sentout_from_colorpipe;
+ gctUINT32 mcz_total_write_req_8B_from_colorpipe;
+ gctUINT32 mcz_total_read_req_sentout_from_colorpipe;
+ gctUINT32 mcz_total_write_req_from_colorpipe;
+ gctUINT32 mcz_total_read_req_8B_from_depthpipe;
+ gctUINT32 mcz_total_read_req_8B_sentout_from_depthpipe;
+ gctUINT32 mcz_total_write_req_8B_from_depthpipe;
+ gctUINT32 mcz_total_read_req_sentout_from_depthpipe;
+ gctUINT32 mcz_total_write_req_from_depthpipe;
+ gctUINT32 mcz_total_read_req_8B_from_others;
+ gctUINT32 mcz_total_write_req_8B_from_others;
+ gctUINT32 mcz_total_read_req_from_others;
+ gctUINT32 mcz_total_write_req_from_others;
+ gctUINT32 mcz_axi_total_latency;
+ gctUINT32 mcz_axi_sample_count;
+ gctUINT32 mcz_axi_max_latency;
+ gctUINT32 mcz_axi_min_latency;
+
+ /* HI */
+ gctUINT32 hi0_total_read_8B_count;
+ gctUINT32 hi0_total_write_8B_count;
+ gctUINT32 hi0_total_read_request_count;
+ gctUINT32 hi0_total_write_request_count;
+ gctUINT32 hi0_axi_cycles_read_request_stalled;
+ gctUINT32 hi0_axi_cycles_write_request_stalled;
+ gctUINT32 hi0_axi_cycles_write_data_stalled;
+ gctUINT32 hi1_total_read_8B_count;
+ gctUINT32 hi1_total_write_8B_count;
+ gctUINT32 hi1_total_read_request_count;
+ gctUINT32 hi1_total_write_request_count;
+ gctUINT32 hi1_axi_cycles_read_request_stalled;
+ gctUINT32 hi1_axi_cycles_write_request_stalled;
+ gctUINT32 hi1_axi_cycles_write_data_stalled;
+ gctUINT32 hi_total_cycle_count;
+ gctUINT32 hi_total_idle_cycle_count;
+ gctUINT32 hi_total_read_8B_count;
+ gctUINT32 hi_total_write_8B_count;
+ gctUINT32 hi_total_readOCB_16B_count;
+ gctUINT32 hi_total_writeOCB_16B_count;
+
+ /* L2 */
+ gctUINT32 l2_total_axi0_read_request_count;
+ gctUINT32 l2_total_axi1_read_request_count;
+ gctUINT32 l2_total_axi0_write_request_count;
+ gctUINT32 l2_total_axi1_write_request_count;
+ gctUINT32 l2_total_read_transactions_request_by_axi0;
+ gctUINT32 l2_total_read_transactions_request_by_axi1;
+ gctUINT32 l2_total_write_transactions_request_by_axi0;
+ gctUINT32 l2_total_write_transactions_request_by_axi1;
+ gctUINT32 l2_axi0_minmax_latency;
+ gctUINT32 l2_axi0_min_latency;
+ gctUINT32 l2_axi0_max_latency;
+ gctUINT32 l2_axi0_total_latency;
+ gctUINT32 l2_axi0_total_request_count;
+ gctUINT32 l2_axi1_minmax_latency;
+ gctUINT32 l2_axi1_min_latency;
+ gctUINT32 l2_axi1_max_latency;
+ gctUINT32 l2_axi1_total_latency;
+ gctUINT32 l2_axi1_total_request_count;
+}
+gcsPROFILER_COUNTERS_PART2;
+
+typedef struct _gcsPROFILER_COUNTERS
+{
+ gcsPROFILER_COUNTERS_PART1 counters_part1;
+ gcsPROFILER_COUNTERS_PART2 counters_part2;
+}
+gcsPROFILER_COUNTERS;
+
+#define NumOfPerFrameBuf 16
+#define NumOfPerDrawBuf 128
+
+typedef enum _gceCOUNTER_OPTYPE
+{
+ gcvCOUNTER_OP_DRAW = 0,
+ gcvCOUNTER_OP_BLT = 1,
+ gcvCOUNTER_OP_COMPUTE = 2,
+ gcvCOUNTER_OP_RS = 3,
+ gcvCOUNTER_OP_FINISH = 4,
+ gcvCOUNTER_OP_FRAME = 5,
+ gcvCOUNTER_OP_NONE = 6
+}
+gceCOUNTER_OPTYPE;
+
+typedef struct gcsCounterBuffer * gcsCounterBuffer_PTR;
+
+struct gcsCounterBuffer
+{
+ gcsPROFILER_COUNTERS *counters;
+ gctHANDLE couterBufobj;
+ gctUINT32 probeAddress;
+ gctPOINTER logicalAddress;
+ gceCOUNTER_OPTYPE opType;
+ gctUINT32 opID;
+ gctUINT32 startPos;
+ gctUINT32 endPos;
+ gctUINT32 dataSize;
+ gctBOOL available;
+ gctBOOL needDump;
+ gcsCounterBuffer_PTR next;
+ gcsCounterBuffer_PTR prev;
+};
+
+typedef struct _gcoPROFILER * gcoPROFILER;
+
+struct _gcoPROFILER
+{
+ gctBOOL enable;
+ gctBOOL enablePrint;
+ gctBOOL disableProbe;
+ gctBOOL probeMode;
+
+ gctFILE file;
+ gctCHAR* fileName;
+
+ gcsCounterBuffer_PTR counterBuf;
+ gctUINT32 bufferCount;
+
+ gctBOOL perDrawMode;
+ gctBOOL needDump;
+ gctBOOL counterEnable;
+
+ gceProfilerClient profilerClient;
+
+ /*query some features from hw*/
+ gctUINT32 coreCount;
+ gctUINT32 shaderCoreCount;
+ gctBOOL bHalti4;
+ gctBOOL psRenderPixelFix;
+ gctBOOL axiBus128bits;
+};
+
+typedef enum _gceProbeStatus
+{
+ gcvPROBE_Disabled = 0,
+ gcvPROBE_Paused = 1,
+ gcvPROBE_Enabled = 2,
+}
+gceProbeStatus;
+
+typedef enum _gceProbeCmd
+{
+ gcvPROBECMD_BEGIN = 0,
+ gcvPROBECMD_PAUSE = 1,
+ gcvPROBECMD_RESUME = 2,
+ gcvPROBECMD_END = 3,
+}
+gceProbeCmd;
+
+typedef struct _gcsPROBESTATES
+{
+ gceProbeStatus status;
+ gctUINT32 probeAddress;
+}gcsPROBESTATES;
+
+/* Construct a Profiler object per context. */
+gceSTATUS
+gcoPROFILER_Construct(
+ OUT gcoPROFILER * Profiler
+ );
+
+gceSTATUS
+gcoPROFILER_Destroy(
+ IN gcoPROFILER Profiler
+ );
+
+gceSTATUS
+gcoPROFILER_Initialize(
+ IN gcoPROFILER Profiler
+ );
+
+gceSTATUS
+gcoPROFILER_Disable(
+ void
+ );
+
+gceSTATUS
+gcoPROFILER_EnableCounters(
+ IN gcoPROFILER Profiler,
+ IN gceCOUNTER_OPTYPE operationType
+ );
+
+gceSTATUS
+gcoPROFILER_End(
+ IN gcoPROFILER Profiler,
+ IN gceCOUNTER_OPTYPE operationType,
+ IN gctUINT32 OpID
+ );
+
+gceSTATUS
+gcoPROFILER_Write(
+ IN gcoPROFILER Profiler,
+ IN gctSIZE_T ByteCount,
+ IN gctCONST_POINTER Data
+ );
+
+gceSTATUS
+gcoPROFILER_Flush(
+ IN gcoPROFILER Profiler
+ );
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_profiler_h_ */
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h
new file mode 100644
index 000000000000..1aba11c2e201
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_raster.h
@@ -0,0 +1,1108 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_raster_h_
+#define __gc_hal_raster_h_
+
+#include "gc_hal_enum.h"
+#include "gc_hal_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************\
+****************************** Object Declarations *****************************
+\******************************************************************************/
+
+typedef struct _gcoBRUSH * gcoBRUSH;
+typedef struct _gcoBRUSH_CACHE * gcoBRUSH_CACHE;
+
+/******************************************************************************\
+******************************** gcoBRUSH Object *******************************
+\******************************************************************************/
+
+/* Create a new solid color gcoBRUSH object. */
+gceSTATUS
+gcoBRUSH_ConstructSingleColor(
+ IN gcoHAL Hal,
+ IN gctUINT32 ColorConvert,
+ IN gctUINT32 Color,
+ IN gctUINT64 Mask,
+ gcoBRUSH * Brush
+ );
+
+/* Create a new monochrome gcoBRUSH object. */
+gceSTATUS
+gcoBRUSH_ConstructMonochrome(
+ IN gcoHAL Hal,
+ IN gctUINT32 OriginX,
+ IN gctUINT32 OriginY,
+ IN gctUINT32 ColorConvert,
+ IN gctUINT32 FgColor,
+ IN gctUINT32 BgColor,
+ IN gctUINT64 Bits,
+ IN gctUINT64 Mask,
+ gcoBRUSH * Brush
+ );
+
+/* Create a color gcoBRUSH object. */
+gceSTATUS
+gcoBRUSH_ConstructColor(
+ IN gcoHAL Hal,
+ IN gctUINT32 OriginX,
+ IN gctUINT32 OriginY,
+ IN gctPOINTER Address,
+ IN gceSURF_FORMAT Format,
+ IN gctUINT64 Mask,
+ gcoBRUSH * Brush
+ );
+
+/* Destroy an gcoBRUSH object. */
+gceSTATUS
+gcoBRUSH_Destroy(
+ IN gcoBRUSH Brush
+ );
+
+/******************************************************************************\
+******************************** gcoSURF Object *******************************
+\******************************************************************************/
+
+/* Set cipping rectangle. */
+gceSTATUS
+gcoSURF_SetClipping(
+ IN gcoSURF Surface
+ );
+
+/* Clear one or more rectangular areas. */
+gceSTATUS
+gcoSURF_Clear2D(
+ IN gcoSURF DestSurface,
+ IN gctUINT32 RectCount,
+ IN gcsRECT_PTR DestRect,
+ IN gctUINT32 LoColor,
+ IN gctUINT32 HiColor
+ );
+
+/* Draw one or more Bresenham lines. */
+gceSTATUS
+gcoSURF_Line(
+ IN gcoSURF Surface,
+ IN gctUINT32 LineCount,
+ IN gcsRECT_PTR Position,
+ IN gcoBRUSH Brush,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop
+ );
+
+/* Generic rectangular blit. */
+gceSTATUS
+gcoSURF_Blit(
+ IN OPTIONAL gcoSURF SrcSurface,
+ IN gcoSURF DestSurface,
+ IN gctUINT32 RectCount,
+ IN OPTIONAL gcsRECT_PTR SrcRect,
+ IN gcsRECT_PTR DestRect,
+ IN OPTIONAL gcoBRUSH Brush,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop,
+ IN OPTIONAL gceSURF_TRANSPARENCY Transparency,
+ IN OPTIONAL gctUINT32 TransparencyColor,
+ IN OPTIONAL gctPOINTER Mask,
+ IN OPTIONAL gceSURF_MONOPACK MaskPack
+ );
+
+/* Monochrome blit. */
+gceSTATUS
+gcoSURF_MonoBlit(
+ IN gcoSURF DestSurface,
+ IN gctPOINTER Source,
+ IN gceSURF_MONOPACK SourcePack,
+ IN gcsPOINT_PTR SourceSize,
+ IN gcsPOINT_PTR SourceOrigin,
+ IN gcsRECT_PTR DestRect,
+ IN OPTIONAL gcoBRUSH Brush,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop,
+ IN gctBOOL ColorConvert,
+ IN gctUINT8 MonoTransparency,
+ IN gceSURF_TRANSPARENCY Transparency,
+ IN gctUINT32 FgColor,
+ IN gctUINT32 BgColor
+ );
+
+/* Filter blit. */
+gceSTATUS
+gcoSURF_FilterBlit(
+ IN gcoSURF SrcSurface,
+ IN gcoSURF DestSurface,
+ IN gcsRECT_PTR SrcRect,
+ IN gcsRECT_PTR DestRect,
+ IN gcsRECT_PTR DestSubRect
+ );
+
+/* Enable alpha blending engine in the hardware and disengage the ROP engine. */
+gceSTATUS
+gcoSURF_EnableAlphaBlend(
+ IN gcoSURF Surface,
+ IN gctUINT8 SrcGlobalAlphaValue,
+ IN gctUINT8 DstGlobalAlphaValue,
+ IN gceSURF_PIXEL_ALPHA_MODE SrcAlphaMode,
+ IN gceSURF_PIXEL_ALPHA_MODE DstAlphaMode,
+ IN gceSURF_GLOBAL_ALPHA_MODE SrcGlobalAlphaMode,
+ IN gceSURF_GLOBAL_ALPHA_MODE DstGlobalAlphaMode,
+ IN gceSURF_BLEND_FACTOR_MODE SrcFactorMode,
+ IN gceSURF_BLEND_FACTOR_MODE DstFactorMode,
+ IN gceSURF_PIXEL_COLOR_MODE SrcColorMode,
+ IN gceSURF_PIXEL_COLOR_MODE DstColorMode
+ );
+
+/* Disable alpha blending engine in the hardware and engage the ROP engine. */
+gceSTATUS
+gcoSURF_DisableAlphaBlend(
+ IN gcoSURF Surface
+ );
+
+gceSTATUS
+gcoSURF_SetDither(
+ IN gcoSURF Surface,
+ IN gctBOOL Dither
+ );
+
+gceSTATUS
+gcoSURF_Set2DSource(
+ gcoSURF Surface,
+ gceSURF_ROTATION Rotation
+ );
+
+gceSTATUS
+gcoSURF_Set2DTarget(
+ gcoSURF Surface,
+ gceSURF_ROTATION Rotation
+ );
+
+/******************************************************************************\
+********************************** gco2D Object *********************************
+\******************************************************************************/
+
+/* Construct a new gco2D object. */
+gceSTATUS
+gco2D_Construct(
+ IN gcoHAL Hal,
+ OUT gco2D * Hardware
+ );
+
+/* Destroy an gco2D object. */
+gceSTATUS
+gco2D_Destroy(
+ IN gco2D Hardware
+ );
+
+/* Sets the maximum number of brushes in the brush cache. */
+gceSTATUS
+gco2D_SetBrushLimit(
+ IN gco2D Hardware,
+ IN gctUINT MaxCount
+ );
+
+/* Flush the brush. */
+gceSTATUS
+gco2D_FlushBrush(
+ IN gco2D Engine,
+ IN gcoBRUSH Brush,
+ IN gceSURF_FORMAT Format
+ );
+
+/* Program the specified solid color brush. */
+gceSTATUS
+gco2D_LoadSolidBrush(
+ IN gco2D Engine,
+ IN gceSURF_FORMAT Format,
+ IN gctUINT32 ColorConvert,
+ IN gctUINT32 Color,
+ IN gctUINT64 Mask
+ );
+
+gceSTATUS
+gco2D_LoadMonochromeBrush(
+ IN gco2D Engine,
+ IN gctUINT32 OriginX,
+ IN gctUINT32 OriginY,
+ IN gctUINT32 ColorConvert,
+ IN gctUINT32 FgColor,
+ IN gctUINT32 BgColor,
+ IN gctUINT64 Bits,
+ IN gctUINT64 Mask
+ );
+
+gceSTATUS
+gco2D_LoadColorBrush(
+ IN gco2D Engine,
+ IN gctUINT32 OriginX,
+ IN gctUINT32 OriginY,
+ IN gctUINT32 Address,
+ IN gceSURF_FORMAT Format,
+ IN gctUINT64 Mask
+ );
+
+/* Configure monochrome source. */
+gceSTATUS
+gco2D_SetMonochromeSource(
+ IN gco2D Engine,
+ IN gctBOOL ColorConvert,
+ IN gctUINT8 MonoTransparency,
+ IN gceSURF_MONOPACK DataPack,
+ IN gctBOOL CoordRelative,
+ IN gceSURF_TRANSPARENCY Transparency,
+ IN gctUINT32 FgColor,
+ IN gctUINT32 BgColor
+ );
+
+/* Configure color source. */
+gceSTATUS
+gco2D_SetColorSource(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctUINT32 Stride,
+ IN gceSURF_FORMAT Format,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctBOOL CoordRelative,
+ IN gceSURF_TRANSPARENCY Transparency,
+ IN gctUINT32 TransparencyColor
+ );
+
+/* Configure color source extension for full rotation. */
+gceSTATUS
+gco2D_SetColorSourceEx(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctUINT32 Stride,
+ IN gceSURF_FORMAT Format,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctUINT32 SurfaceHeight,
+ IN gctBOOL CoordRelative,
+ IN gceSURF_TRANSPARENCY Transparency,
+ IN gctUINT32 TransparencyColor
+ );
+
+/* Same as gco2D_SetColorSourceEx, but with better 64bit SW-path support.
+** Please do NOT export the API now.
+*/
+gceSTATUS
+gco2D_SetColorSource64(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Stride,
+ IN gceSURF_FORMAT Format,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctUINT32 SurfaceHeight,
+ IN gctBOOL CoordRelative,
+ IN gceSURF_TRANSPARENCY Transparency,
+ IN gctUINT32 TransparencyColor
+ );
+
+/* Configure color source. */
+gceSTATUS
+gco2D_SetColorSourceAdvanced(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctUINT32 Stride,
+ IN gceSURF_FORMAT Format,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctUINT32 SurfaceHeight,
+ IN gctBOOL CoordRelative
+ );
+
+gceSTATUS
+gco2D_SetColorSourceN(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctUINT32 Stride,
+ IN gceSURF_FORMAT Format,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctUINT32 SurfaceHeight,
+ IN gctUINT32 SurfaceNumber
+ );
+
+/* Configure masked color source. */
+gceSTATUS
+gco2D_SetMaskedSource(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctUINT32 Stride,
+ IN gceSURF_FORMAT Format,
+ IN gctBOOL CoordRelative,
+ IN gceSURF_MONOPACK MaskPack
+ );
+
+/* Configure masked color source extension for full rotation. */
+gceSTATUS
+gco2D_SetMaskedSourceEx(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctUINT32 Stride,
+ IN gceSURF_FORMAT Format,
+ IN gctBOOL CoordRelative,
+ IN gceSURF_MONOPACK MaskPack,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctUINT32 SurfaceHeight
+ );
+
+/* Same as gco2D_SetMaskedSourceEx, but with better 64bit SW-path support.
+** Please do NOT export the API now.
+*/
+gceSTATUS
+gco2D_SetMaskedSource64(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Stride,
+ IN gceSURF_FORMAT Format,
+ IN gctBOOL CoordRelative,
+ IN gceSURF_MONOPACK MaskPack,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctUINT32 SurfaceHeight
+ );
+
+/* Setup the source rectangle. */
+gceSTATUS
+gco2D_SetSource(
+ IN gco2D Engine,
+ IN gcsRECT_PTR SrcRect
+ );
+
+/* Set clipping rectangle. */
+gceSTATUS
+gco2D_SetClipping(
+ IN gco2D Engine,
+ IN gcsRECT_PTR Rect
+ );
+
+/* Configure destination. */
+gceSTATUS
+gco2D_SetTarget(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctUINT32 Stride,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth
+ );
+
+/* Configure destination extension for full rotation. */
+gceSTATUS
+gco2D_SetTargetEx(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctUINT32 Stride,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctUINT32 SurfaceHeight
+ );
+
+/* Same as gco2D_SetTargetEx, but with better 64bit SW-path support.
+** Please do NOT export the API now.
+*/
+gceSTATUS
+gco2D_SetTarget64(
+ IN gco2D Engine,
+ IN gctUINT32 Address,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Stride,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctUINT32 SurfaceHeight
+ );
+
+/* Calculate and program the stretch factors. */
+gceSTATUS
+gco2D_CalcStretchFactor(
+ IN gco2D Engine,
+ IN gctINT32 SrcSize,
+ IN gctINT32 DestSize,
+ OUT gctUINT32_PTR Factor
+ );
+
+gceSTATUS
+gco2D_SetStretchFactors(
+ IN gco2D Engine,
+ IN gctUINT32 HorFactor,
+ IN gctUINT32 VerFactor
+ );
+
+/* Calculate and program the stretch factors based on the rectangles. */
+gceSTATUS
+gco2D_SetStretchRectFactors(
+ IN gco2D Engine,
+ IN gcsRECT_PTR SrcRect,
+ IN gcsRECT_PTR DestRect
+ );
+
+/* Create a new solid color gcoBRUSH object. */
+gceSTATUS
+gco2D_ConstructSingleColorBrush(
+ IN gco2D Engine,
+ IN gctUINT32 ColorConvert,
+ IN gctUINT32 Color,
+ IN gctUINT64 Mask,
+ gcoBRUSH * Brush
+ );
+
+/* Create a new monochrome gcoBRUSH object. */
+gceSTATUS
+gco2D_ConstructMonochromeBrush(
+ IN gco2D Engine,
+ IN gctUINT32 OriginX,
+ IN gctUINT32 OriginY,
+ IN gctUINT32 ColorConvert,
+ IN gctUINT32 FgColor,
+ IN gctUINT32 BgColor,
+ IN gctUINT64 Bits,
+ IN gctUINT64 Mask,
+ gcoBRUSH * Brush
+ );
+
+/* Create a color gcoBRUSH object. */
+gceSTATUS
+gco2D_ConstructColorBrush(
+ IN gco2D Engine,
+ IN gctUINT32 OriginX,
+ IN gctUINT32 OriginY,
+ IN gctPOINTER Address,
+ IN gceSURF_FORMAT Format,
+ IN gctUINT64 Mask,
+ gcoBRUSH * Brush
+ );
+
+/* Clear one or more rectangular areas. */
+gceSTATUS
+gco2D_Clear(
+ IN gco2D Engine,
+ IN gctUINT32 RectCount,
+ IN gcsRECT_PTR Rect,
+ IN gctUINT32 Color32,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop,
+ IN gceSURF_FORMAT DestFormat
+ );
+
+/* Draw one or more Bresenham lines. */
+gceSTATUS
+gco2D_Line(
+ IN gco2D Engine,
+ IN gctUINT32 LineCount,
+ IN gcsRECT_PTR Position,
+ IN gcoBRUSH Brush,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop,
+ IN gceSURF_FORMAT DestFormat
+ );
+
+/* Draw one or more Bresenham lines based on the 32-bit color. */
+gceSTATUS
+gco2D_ColorLine(
+ IN gco2D Engine,
+ IN gctUINT32 LineCount,
+ IN gcsRECT_PTR Position,
+ IN gctUINT32 Color32,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop,
+ IN gceSURF_FORMAT DestFormat
+ );
+
+/* Generic blit. */
+gceSTATUS
+gco2D_Blit(
+ IN gco2D Engine,
+ IN gctUINT32 RectCount,
+ IN gcsRECT_PTR Rect,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop,
+ IN gceSURF_FORMAT DestFormat
+ );
+
+gceSTATUS
+gco2D_Blend(
+ IN gco2D Engine,
+ IN gctUINT32 SrcCount,
+ IN gctUINT32 RectCount,
+ IN gcsRECT_PTR Rect,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop,
+ IN gceSURF_FORMAT DestFormat
+ );
+
+/* Batch blit. */
+gceSTATUS
+gco2D_BatchBlit(
+ IN gco2D Engine,
+ IN gctUINT32 RectCount,
+ IN gcsRECT_PTR SrcRect,
+ IN gcsRECT_PTR DestRect,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop,
+ IN gceSURF_FORMAT DestFormat
+ );
+
+/* Stretch blit. */
+gceSTATUS
+gco2D_StretchBlit(
+ IN gco2D Engine,
+ IN gctUINT32 RectCount,
+ IN gcsRECT_PTR Rect,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop,
+ IN gceSURF_FORMAT DestFormat
+ );
+
+/* Monochrome blit. */
+gceSTATUS
+gco2D_MonoBlit(
+ IN gco2D Engine,
+ IN gctPOINTER StreamBits,
+ IN gcsPOINT_PTR StreamSize,
+ IN gcsRECT_PTR StreamRect,
+ IN gceSURF_MONOPACK SrcStreamPack,
+ IN gceSURF_MONOPACK DestStreamPack,
+ IN gcsRECT_PTR DestRect,
+ IN gctUINT32 FgRop,
+ IN gctUINT32 BgRop,
+ IN gceSURF_FORMAT DestFormat
+ );
+
+gceSTATUS
+gco2D_MonoBlitEx(
+ IN gco2D Engine,
+ IN gctPOINTER StreamBits,
+ IN gctINT32 StreamStride,
+ IN gctINT32 StreamWidth,
+ IN gctINT32 StreamHeight,
+ IN gctINT32 StreamX,
+ IN gctINT32 StreamY,
+ IN gctUINT32 FgColor,
+ IN gctUINT32 BgColor,
+ IN gcsRECT_PTR SrcRect,
+ IN gcsRECT_PTR DstRect,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop
+ );
+
+/* Set kernel size. */
+gceSTATUS
+gco2D_SetKernelSize(
+ IN gco2D Engine,
+ IN gctUINT8 HorKernelSize,
+ IN gctUINT8 VerKernelSize
+ );
+
+/* Set filter type. */
+gceSTATUS
+gco2D_SetFilterType(
+ IN gco2D Engine,
+ IN gceFILTER_TYPE FilterType
+ );
+
+/* Set the filter kernel by user. */
+gceSTATUS
+gco2D_SetUserFilterKernel(
+ IN gco2D Engine,
+ IN gceFILTER_PASS_TYPE PassType,
+ IN gctUINT16_PTR KernelArray
+ );
+
+/* Select the pass(es) to be done for user defined filter. */
+gceSTATUS
+gco2D_EnableUserFilterPasses(
+ IN gco2D Engine,
+ IN gctBOOL HorPass,
+ IN gctBOOL VerPass
+ );
+
+/* Frees the temporary buffer allocated by filter blit operation. */
+gceSTATUS
+gco2D_FreeFilterBuffer(
+ IN gco2D Engine
+ );
+
+/* Filter blit. */
+gceSTATUS
+gco2D_FilterBlit(
+ IN gco2D Engine,
+ IN gctUINT32 SrcAddress,
+ IN gctUINT SrcStride,
+ IN gctUINT32 SrcUAddress,
+ IN gctUINT SrcUStride,
+ IN gctUINT32 SrcVAddress,
+ IN gctUINT SrcVStride,
+ IN gceSURF_FORMAT SrcFormat,
+ IN gceSURF_ROTATION SrcRotation,
+ IN gctUINT32 SrcSurfaceWidth,
+ IN gcsRECT_PTR SrcRect,
+ IN gctUINT32 DestAddress,
+ IN gctUINT DestStride,
+ IN gceSURF_FORMAT DestFormat,
+ IN gceSURF_ROTATION DestRotation,
+ IN gctUINT32 DestSurfaceWidth,
+ IN gcsRECT_PTR DestRect,
+ IN gcsRECT_PTR DestSubRect
+ );
+
+/* Filter blit extension for full rotation. */
+gceSTATUS
+gco2D_FilterBlitEx(
+ IN gco2D Engine,
+ IN gctUINT32 SrcAddress,
+ IN gctUINT SrcStride,
+ IN gctUINT32 SrcUAddress,
+ IN gctUINT SrcUStride,
+ IN gctUINT32 SrcVAddress,
+ IN gctUINT SrcVStride,
+ IN gceSURF_FORMAT SrcFormat,
+ IN gceSURF_ROTATION SrcRotation,
+ IN gctUINT32 SrcSurfaceWidth,
+ IN gctUINT32 SrcSurfaceHeight,
+ IN gcsRECT_PTR SrcRect,
+ IN gctUINT32 DestAddress,
+ IN gctUINT DestStride,
+ IN gceSURF_FORMAT DestFormat,
+ IN gceSURF_ROTATION DestRotation,
+ IN gctUINT32 DestSurfaceWidth,
+ IN gctUINT32 DestSurfaceHeight,
+ IN gcsRECT_PTR DestRect,
+ IN gcsRECT_PTR DestSubRect
+ );
+
+gceSTATUS
+gco2D_FilterBlitEx2(
+ IN gco2D Engine,
+ IN gctUINT32_PTR SrcAddresses,
+ IN gctUINT32 SrcAddressNum,
+ IN gctUINT32_PTR SrcStrides,
+ IN gctUINT32 SrcStrideNum,
+ IN gceTILING SrcTiling,
+ IN gceSURF_FORMAT SrcFormat,
+ IN gceSURF_ROTATION SrcRotation,
+ IN gctUINT32 SrcSurfaceWidth,
+ IN gctUINT32 SrcSurfaceHeight,
+ IN gcsRECT_PTR SrcRect,
+ IN gctUINT32_PTR DestAddresses,
+ IN gctUINT32 DestAddressNum,
+ IN gctUINT32_PTR DestStrides,
+ IN gctUINT32 DestStrideNum,
+ IN gceTILING DestTiling,
+ IN gceSURF_FORMAT DestFormat,
+ IN gceSURF_ROTATION DestRotation,
+ IN gctUINT32 DestSurfaceWidth,
+ IN gctUINT32 DestSurfaceHeight,
+ IN gcsRECT_PTR DestRect,
+ IN gcsRECT_PTR DestSubRect
+ );
+
+/* Enable alpha blending engine in the hardware and disengage the ROP engine. */
+gceSTATUS
+gco2D_EnableAlphaBlend(
+ IN gco2D Engine,
+ IN gctUINT8 SrcGlobalAlphaValue,
+ IN gctUINT8 DstGlobalAlphaValue,
+ IN gceSURF_PIXEL_ALPHA_MODE SrcAlphaMode,
+ IN gceSURF_PIXEL_ALPHA_MODE DstAlphaMode,
+ IN gceSURF_GLOBAL_ALPHA_MODE SrcGlobalAlphaMode,
+ IN gceSURF_GLOBAL_ALPHA_MODE DstGlobalAlphaMode,
+ IN gceSURF_BLEND_FACTOR_MODE SrcFactorMode,
+ IN gceSURF_BLEND_FACTOR_MODE DstFactorMode,
+ IN gceSURF_PIXEL_COLOR_MODE SrcColorMode,
+ IN gceSURF_PIXEL_COLOR_MODE DstColorMode
+ );
+
+/* Enable alpha blending engine in the hardware. */
+gceSTATUS
+gco2D_EnableAlphaBlendAdvanced(
+ IN gco2D Engine,
+ IN gceSURF_PIXEL_ALPHA_MODE SrcAlphaMode,
+ IN gceSURF_PIXEL_ALPHA_MODE DstAlphaMode,
+ IN gceSURF_GLOBAL_ALPHA_MODE SrcGlobalAlphaMode,
+ IN gceSURF_GLOBAL_ALPHA_MODE DstGlobalAlphaMode,
+ IN gceSURF_BLEND_FACTOR_MODE SrcFactorMode,
+ IN gceSURF_BLEND_FACTOR_MODE DstFactorMode
+ );
+
+/* Enable alpha blending engine with Porter Duff rule. */
+gceSTATUS
+gco2D_SetPorterDuffBlending(
+ IN gco2D Engine,
+ IN gce2D_PORTER_DUFF_RULE Rule
+ );
+
+/* Disable alpha blending engine in the hardware and engage the ROP engine. */
+gceSTATUS
+gco2D_DisableAlphaBlend(
+ IN gco2D Engine
+ );
+
+/* Retrieve the maximum number of 32-bit data chunks for a single DE command. */
+gctUINT32
+gco2D_GetMaximumDataCount(
+ void
+ );
+
+/* Retrieve the maximum number of rectangles, that can be passed in a single DE command. */
+gctUINT32
+gco2D_GetMaximumRectCount(
+ void
+ );
+
+/* Returns the pixel alignment of the surface. */
+gceSTATUS
+gco2D_GetPixelAlignment(
+ gceSURF_FORMAT Format,
+ gcsPOINT_PTR Alignment
+ );
+
+/* Retrieve monochrome stream pack size. */
+gceSTATUS
+gco2D_GetPackSize(
+ IN gceSURF_MONOPACK StreamPack,
+ OUT gctUINT32 * PackWidth,
+ OUT gctUINT32 * PackHeight
+ );
+
+/* Flush the 2D pipeline. */
+gceSTATUS
+gco2D_Flush(
+ IN gco2D Engine
+ );
+
+/* Load 256-entry color table for INDEX8 source surfaces. */
+gceSTATUS
+gco2D_LoadPalette(
+ IN gco2D Engine,
+ IN gctUINT FirstIndex,
+ IN gctUINT IndexCount,
+ IN gctPOINTER ColorTable,
+ IN gctBOOL ColorConvert
+ );
+
+/* Enable/disable 2D BitBlt mirrorring. */
+gceSTATUS
+gco2D_SetBitBlitMirror(
+ IN gco2D Engine,
+ IN gctBOOL HorizontalMirror,
+ IN gctBOOL VerticalMirror
+ );
+
+/*
+ * Set the transparency for source, destination and pattern.
+ * It also enable or disable the DFB color key mode.
+ */
+gceSTATUS
+gco2D_SetTransparencyAdvancedEx(
+ IN gco2D Engine,
+ IN gce2D_TRANSPARENCY SrcTransparency,
+ IN gce2D_TRANSPARENCY DstTransparency,
+ IN gce2D_TRANSPARENCY PatTransparency,
+ IN gctBOOL EnableDFBColorKeyMode
+ );
+
+/* Set the transparency for source, destination and pattern. */
+gceSTATUS
+gco2D_SetTransparencyAdvanced(
+ IN gco2D Engine,
+ IN gce2D_TRANSPARENCY SrcTransparency,
+ IN gce2D_TRANSPARENCY DstTransparency,
+ IN gce2D_TRANSPARENCY PatTransparency
+ );
+
+/* Set the source color key. */
+gceSTATUS
+gco2D_SetSourceColorKeyAdvanced(
+ IN gco2D Engine,
+ IN gctUINT32 ColorKey
+ );
+
+/* Set the source color key range. */
+gceSTATUS
+gco2D_SetSourceColorKeyRangeAdvanced(
+ IN gco2D Engine,
+ IN gctUINT32 ColorKeyLow,
+ IN gctUINT32 ColorKeyHigh
+ );
+
+/* Set the target color key. */
+gceSTATUS
+gco2D_SetTargetColorKeyAdvanced(
+ IN gco2D Engine,
+ IN gctUINT32 ColorKey
+ );
+
+/* Set the target color key range. */
+gceSTATUS
+gco2D_SetTargetColorKeyRangeAdvanced(
+ IN gco2D Engine,
+ IN gctUINT32 ColorKeyLow,
+ IN gctUINT32 ColorKeyHigh
+ );
+
+/* Set the YUV color space mode. */
+gceSTATUS
+gco2D_SetYUVColorMode(
+ IN gco2D Engine,
+ IN gce2D_YUV_COLOR_MODE Mode
+ );
+
+/* Setup the source global color value in ARGB8 format. */
+gceSTATUS gco2D_SetSourceGlobalColorAdvanced(
+ IN gco2D Engine,
+ IN gctUINT32 Color32
+ );
+
+/* Setup the target global color value in ARGB8 format. */
+gceSTATUS gco2D_SetTargetGlobalColorAdvanced(
+ IN gco2D Engine,
+ IN gctUINT32 Color32
+ );
+
+/* Setup the source and target pixel multiply modes. */
+gceSTATUS
+gco2D_SetPixelMultiplyModeAdvanced(
+ IN gco2D Engine,
+ IN gce2D_PIXEL_COLOR_MULTIPLY_MODE SrcPremultiplySrcAlpha,
+ IN gce2D_PIXEL_COLOR_MULTIPLY_MODE DstPremultiplyDstAlpha,
+ IN gce2D_GLOBAL_COLOR_MULTIPLY_MODE SrcPremultiplyGlobalMode,
+ IN gce2D_PIXEL_COLOR_MULTIPLY_MODE DstDemultiplyDstAlpha
+ );
+
+/* Set the GPU clock cycles after which the idle engine will keep auto-flushing. */
+gceSTATUS
+gco2D_SetAutoFlushCycles(
+ IN gco2D Engine,
+ IN gctUINT32 Cycles
+ );
+
+#if VIVANTE_PROFILER
+/* 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.
+*/
+gceSTATUS
+gco2D_ProfileEngine(
+ IN gco2D Engine,
+ OPTIONAL gcs2D_PROFILE_PTR Profile
+ );
+#endif
+
+/* Enable or disable 2D dithering. */
+gceSTATUS
+gco2D_EnableDither(
+ IN gco2D Engine,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gco2D_SetGenericSource(
+ IN gco2D Engine,
+ IN gctUINT32_PTR Addresses,
+ IN gctUINT32 AddressNum,
+ IN gctUINT32_PTR Strides,
+ IN gctUINT32 StrideNum,
+ IN gceTILING Tiling,
+ IN gceSURF_FORMAT Format,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctUINT32 SurfaceHeight
+);
+
+gceSTATUS
+gco2D_SetGenericTarget(
+ IN gco2D Engine,
+ IN gctUINT32_PTR Addresses,
+ IN gctUINT32 AddressNum,
+ IN gctUINT32_PTR Strides,
+ IN gctUINT32 StrideNum,
+ IN gceTILING Tiling,
+ IN gceSURF_FORMAT Format,
+ IN gceSURF_ROTATION Rotation,
+ IN gctUINT32 SurfaceWidth,
+ IN gctUINT32 SurfaceHeight
+);
+
+gceSTATUS
+gco2D_SetCurrentSourceIndex(
+ IN gco2D Engine,
+ IN gctUINT32 SrcIndex
+ );
+
+gceSTATUS
+gco2D_MultiSourceBlit(
+ IN gco2D Engine,
+ IN gctUINT32 SourceMask,
+ IN gcsRECT_PTR DestRect,
+ IN gctUINT32 RectCount
+ );
+
+gceSTATUS
+gco2D_SetROP(
+ IN gco2D Engine,
+ IN gctUINT8 FgRop,
+ IN gctUINT8 BgRop
+ );
+
+gceSTATUS
+gco2D_SetGdiStretchMode(
+ IN gco2D Engine,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gco2D_SetSourceTileStatus(
+ IN gco2D Engine,
+ IN gce2D_TILE_STATUS_CONFIG TSControl,
+ IN gceSURF_FORMAT CompressedFormat,
+ IN gctUINT32 ClearValue,
+ IN gctUINT32 GpuAddress
+ );
+
+gceSTATUS
+gco2D_SetTargetTileStatus(
+ IN gco2D Engine,
+ IN gce2D_TILE_STATUS_CONFIG TileStatusConfig,
+ IN gceSURF_FORMAT CompressedFormat,
+ IN gctUINT32 ClearValue,
+ IN gctUINT32 GpuAddress
+ );
+
+gceSTATUS
+gco2D_QueryU32(
+ IN gco2D Engine,
+ IN gce2D_QUERY Item,
+ OUT gctUINT32_PTR Value
+ );
+
+gceSTATUS
+gco2D_SetStateU32(
+ IN gco2D Engine,
+ IN gce2D_STATE State,
+ IN gctUINT32 Value
+ );
+
+gceSTATUS
+gco2D_SetStateArrayI32(
+ IN gco2D Engine,
+ IN gce2D_STATE State,
+ IN gctINT32_PTR Array,
+ IN gctINT32 ArraySize
+ );
+
+gceSTATUS
+gco2D_SetStateArrayU32(
+ IN gco2D Engine,
+ IN gce2D_STATE State,
+ IN gctUINT32_PTR Array,
+ IN gctINT32 ArraySize
+ );
+
+gceSTATUS
+gco2D_SetTargetRect(
+ IN gco2D Engine,
+ IN gcsRECT_PTR Rect
+ );
+
+gceSTATUS
+gco2D_Set2DEngine(
+ IN gco2D Engine
+ );
+
+gceSTATUS
+gco2D_UnSet2DEngine(
+ IN gco2D Engine
+ );
+
+gceSTATUS
+gco2D_Get2DEngine(
+ OUT gco2D * Engine
+ );
+
+gceSTATUS
+gco2D_Commit(
+ IN gco2D Engine,
+ IN gctBOOL Stall
+ );
+
+gceSTATUS
+gco2D_NatureRotateTranslation(
+ IN gctBOOL IsSrcRot,
+ IN gce2D_NATURE_ROTATION NatureRotation,
+ IN gctINT32 SrcSurfaceWidth,
+ IN gctINT32 SrcSurfaceHeight,
+ IN gctINT32 DstSurfaceWidth,
+ IN gctINT32 DstSurfaceHeight,
+ IN OUT gcsRECT_PTR SrcRect,
+ IN OUT gcsRECT_PTR DstRect,
+ OUT gceSURF_ROTATION * SrcRotation,
+ OUT gceSURF_ROTATION * DstRotation
+ );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_raster_h_ */
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_security_interface.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_security_interface.h
new file mode 100644
index 000000000000..1857b60838bc
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_security_interface.h
@@ -0,0 +1,186 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef _GC_HAL_SECURITY_INTERFACE_H_
+#define _GC_HAL_SECURITY_INTERFACE_H_
+/*!
+ @brief Command codes between kernel module and TrustZone
+ @discussion
+ Critical services must be done in TrustZone to avoid sensitive content leak. Most of kernel module is kept in non-Secure os to minimize
+ code in TrustZone.
+ */
+typedef enum kernel_packet_command {
+ KERNEL_START_COMMAND,
+ KERNEL_SUBMIT,
+ KERNEL_MAP_MEMORY, /* */
+ KERNEL_UNMAP_MEMORY,
+ KERNEL_ALLOCATE_SECRUE_MEMORY, /*! Security memory management. */
+ KERNEL_FREE_SECURE_MEMORY,
+ KERNEL_EXECUTE, /* Execute a command buffer. */
+ KERNEL_DUMP_MMU_EXCEPTION,
+ KERNEL_HANDLE_MMU_EXCEPTION,
+ KERNEL_READ_MMU_EXCEPTION,
+} kernel_packet_command_t;
+
+struct kernel_start_command {
+ kernel_packet_command_t command; /*! The command (always needs to be the first entry in a structure). */
+ gctUINT8 gpu; /*! Which GPU. */
+ gctUINT32 address;
+ gctUINT32 bytes;
+};
+
+/*!
+ @brief gckCOMMAND Object requests TrustZone to submit command buffer.
+ @discussion
+ Code in trustzone will check content of command buffer after copying command buffer to TrustZone.
+ */
+struct kernel_submit {
+ kernel_packet_command_t command; /*! The command (always needs to be the first entry in a structure). */
+ gctUINT8 gpu; /*! Which GPU. */
+ gctUINT8 kernel_command; /*! Whether it is a kernel command. */
+ gctUINT32 command_buffer_handle; /*! Handle to command buffer. */
+ gctUINT32 offset; /* Offset in command buffer. */
+ gctUINT32 * command_buffer; /*! Content of command buffer need to be submit. */
+ gctUINT32 command_buffer_length; /*! Length of command buffer. */
+};
+
+
+/*!
+ @brief gckVIDMEM Object requests TrustZone to allocate security memory.
+ @discussion
+ Allocate a buffer from security GPU memory.
+ */
+struct kernel_allocate_security_memory {
+ kernel_packet_command_t command; /*! The command (always needs to be the first entry in a structure). */
+ gctUINT32 bytes; /*! Requested bytes. */
+ gctUINT32 memory_handle; /*! Handle of allocated memory. */
+};
+
+/*!
+ @brief gckVIDMEM Object requests TrustZone to allocate security memory.
+ @discussion
+ Free a video memory buffer from security GPU memory.
+ */
+struct kernel_free_security_memory {
+ kernel_packet_command_t command; /*! The command (always needs to be the first entry in a structure). */
+ gctUINT32 memory_handle; /*! Handle of allocated memory. */
+};
+
+struct kernel_execute {
+ kernel_packet_command_t command; /*! The command (always needs to be the first entry in a structure). */
+ gctUINT8 gpu; /*! Which GPU. */
+ gctUINT8 kernel_command; /*! Whether it is a kernel command. */
+ gctUINT32 * command_buffer; /*! Content of command buffer need to be submit. */
+ gctUINT32 command_buffer_length; /*! Length of command buffer. */
+};
+
+typedef struct kernel_map_scatter_gather {
+ gctUINT32 bytes;
+ gctUINT32 physical;
+ struct kernel_map_scatter_gather *next;
+}
+kernel_map_scatter_gather_t;
+
+struct kernel_map_memory {
+ kernel_packet_command_t command;
+ kernel_map_scatter_gather_t *scatter;
+ gctUINT32 *physicals;
+ gctPHYS_ADDR_T physical; /*! Contiguous physical address range. */
+ gctUINT32 pageCount;
+ gctUINT32 gpuAddress;
+};
+
+struct kernel_unmap_memory {
+ gctUINT32 gpuAddress;
+ gctUINT32 pageCount;
+};
+
+struct kernel_read_mmu_exception {
+ gctUINT32 mmuStatus;
+ gctUINT32 mmuException;
+};
+
+struct kernel_handle_mmu_exception {
+ gctUINT32 mmuStatus;
+ gctPHYS_ADDR_T physical;
+ gctUINT32 gpuAddress;
+};
+
+typedef struct _gcsTA_INTERFACE {
+ kernel_packet_command_t command;
+ union {
+ struct kernel_submit Submit;
+ struct kernel_start_command StartCommand;
+ struct kernel_allocate_security_memory AllocateSecurityMemory;
+ struct kernel_execute Execute;
+ struct kernel_map_memory MapMemory;
+ struct kernel_unmap_memory UnmapMemory;
+ struct kernel_read_mmu_exception ReadMMUException;
+ struct kernel_handle_mmu_exception HandleMMUException;
+ } u;
+ gceSTATUS result;
+} gcsTA_INTERFACE;
+
+enum {
+ gcvTA_COMMAND_INIT,
+ gcvTA_COMMAND_DISPATCH,
+
+ gcvTA_CALLBACK_ALLOC_SECURE_MEM,
+ gcvTA_CALLBACK_FREE_SECURE_MEM,
+};
+
+#endif
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h
new file mode 100644
index 000000000000..415b5645b15c
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_statistics.h
@@ -0,0 +1,135 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_statistics_h_
+#define __gc_hal_statistics_h_
+
+
+#define VIV_STAT_ENABLE_STATISTICS 0
+
+/* Toal number of frames for which the frame time is accounted. We have storage
+ to keep frame times for last this many frames.
+*/
+#define VIV_STAT_FRAME_BUFFER_SIZE 30
+
+
+/*
+ Total number of frames sampled for a mode. This means
+
+ # of frames for HZ Current : VIV_STAT_EARLY_Z_SAMPLE_FRAMES
+ # of frames for HZ Switched : VIV_STAT_EARLY_Z_SAMPLE_FRAMES
+ +
+ --------------------------------------------------------
+ : (2 * VIV_STAT_EARLY_Z_SAMPLE_FRAMES) frames needed
+
+ IMPORTANT: This total must be smaller than VIV_STAT_FRAME_BUFFER_SIZE
+*/
+#define VIV_STAT_EARLY_Z_SAMPLE_FRAMES 7
+#define VIV_STAT_EARLY_Z_LATENCY_FRAMES 2
+
+/* Multiplication factor for previous Hz off mode. Make it more than 1.0 to advertise HZ on.*/
+#define VIV_STAT_EARLY_Z_FACTOR (1.05f)
+
+/* Defines the statistical data keys monitored by the statistics module */
+typedef enum _gceSTATISTICS
+{
+ gcvFRAME_FPS = 1,
+}
+gceSTATISTICS;
+
+/* HAL statistics information. */
+typedef struct _gcsSTATISTICS_EARLYZ
+{
+ gctUINT switchBackCount;
+ gctUINT nextCheckPoint;
+ gctBOOL disabled;
+}
+gcsSTATISTICS_EARLYZ;
+
+
+/* HAL statistics information. */
+typedef struct _gcsSTATISTICS
+{
+ gctUINT64 frameTime[VIV_STAT_FRAME_BUFFER_SIZE];
+ gctUINT64 previousFrameTime;
+ gctUINT frame;
+ gcsSTATISTICS_EARLYZ earlyZ;
+}
+gcsSTATISTICS;
+
+
+/* Add a frame based data into current statistics. */
+void
+gcfSTATISTICS_AddData(
+ IN gceSTATISTICS Key,
+ IN gctUINT Value
+ );
+
+/* Marks the frame end and triggers statistical calculations and decisions.*/
+void
+gcfSTATISTICS_MarkFrameEnd (
+ void
+ );
+
+/* Sets whether the dynmaic HZ is disabled or not .*/
+void
+gcfSTATISTICS_DisableDynamicEarlyZ (
+ IN gctBOOL Disabled
+ );
+
+#endif /*__gc_hal_statistics_h_ */
+
+
+
diff --git a/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h
new file mode 100644
index 000000000000..7ded9c86f691
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_types.h
@@ -0,0 +1,1153 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_types_h_
+#define __gc_hal_types_h_
+
+#include "gc_hal_version.h"
+#include "gc_hal_options.h"
+
+#if !defined(VIV_KMD)
+#if defined(__KERNEL__)
+#include "linux/version.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+ typedef unsigned long uintptr_t;
+# endif
+# include "linux/types.h"
+#elif defined(UNDER_CE)
+#include <crtdefs.h>
+typedef signed char int8_t;
+typedef short int16_t;
+typedef int int32_t;
+typedef long long int64_t;
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned long long uint64_t;
+#elif defined(_MSC_VER) && (_MSC_VER <= 1500)
+#include <crtdefs.h>
+#include "vadefs.h"
+#elif defined(__QNXNTO__)
+#define _QNX_SOURCE
+#include <stdint.h>
+#include <stddef.h>
+#else
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdint.h>
+#endif
+#endif
+
+#ifdef _WIN32
+#pragma warning(disable:4127) /* Conditional expression is constant (do { } while(0)). */
+#pragma warning(disable:4100) /* Unreferenced formal parameter. */
+#pragma warning(disable:4204) /* Non-constant aggregate initializer (C99). */
+#pragma warning(disable:4131) /* Uses old-style declarator. */
+#pragma warning(disable:4206) /* Translation unit is empty. */
+#pragma warning(disable:4214) /* Nonstandard extension used :
+ ** bit field types other than int. */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************\
+** Platform macros.
+*/
+
+#if defined(__GNUC__)
+# define gcdHAS_ELLIPSIS 1 /* GCC always has it. */
+#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
+# define gcdHAS_ELLIPSIS 1 /* C99 has it. */
+#elif defined(_MSC_VER) && (_MSC_VER >= 1500)
+# define gcdHAS_ELLIPSIS 1 /* MSVC 2007+ has it. */
+#elif defined(UNDER_CE)
+#if UNDER_CE >= 600
+# define gcdHAS_ELLIPSIS 1
+# else
+# define gcdHAS_ELLIPSIS 0
+# endif
+#else
+# error "gcdHAS_ELLIPSIS: Platform could not be determined"
+#endif
+
+/******************************************************************************\
+************************************ Keyword ***********************************
+\******************************************************************************/
+
+#if defined(ANDROID) && defined(__BIONIC_FORTIFY)
+#if defined(__clang__)
+# define gcmINLINE __inline__ __attribute__ ((always_inline)) __attribute__ ((gnu_inline))
+# else
+# define gcmINLINE __inline__ __attribute__ ((always_inline)) __attribute__ ((gnu_inline)) __attribute__ ((artificial))
+# endif
+#elif ((defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || defined(__APPLE__))
+# define gcmINLINE inline /* C99 keyword. */
+#elif defined(__GNUC__)
+# define gcmINLINE __inline__ /* GNU keyword. */
+#elif defined(_MSC_VER) || defined(UNDER_CE)
+# define gcmINLINE __inline /* Internal keyword. */
+#else
+# error "gcmINLINE: Platform could not be determined"
+#endif
+
+
+/* Possible debug flags. */
+#define gcdDEBUG_NONE 0
+#define gcdDEBUG_ALL (1 << 0)
+#define gcdDEBUG_FATAL (1 << 1)
+#define gcdDEBUG_TRACE (1 << 2)
+#define gcdDEBUG_BREAK (1 << 3)
+#define gcdDEBUG_ASSERT (1 << 4)
+#define gcdDEBUG_CODE (1 << 5)
+#define gcdDEBUG_STACK (1 << 6)
+
+#define gcmIS_DEBUG(flag) (gcdDEBUG & (flag | gcdDEBUG_ALL) )
+
+#ifndef gcdDEBUG
+#if (defined(DBG) && DBG) || defined(DEBUG) || defined(_DEBUG)
+# define gcdDEBUG gcdDEBUG_ALL
+# else
+# define gcdDEBUG gcdDEBUG_NONE
+# endif
+#endif
+
+#ifdef _USRDLL
+#ifdef _MSC_VER
+#ifdef HAL_EXPORTS
+# define HALAPI __declspec(dllexport)
+# else
+# define HALAPI __declspec(dllimport)
+# endif
+# define HALDECL __cdecl
+# else
+#ifdef HAL_EXPORTS
+# define HALAPI
+# else
+# define HALAPI extern
+# endif
+# endif
+#else
+# define HALAPI
+# define HALDECL
+#endif
+
+/******************************************************************************\
+********************************** Common Types ********************************
+\******************************************************************************/
+
+#define gcvFALSE 0
+#define gcvTRUE 1
+
+#define gcvINFINITE ((gctUINT32) ~0U)
+
+#define gcvINVALID_HANDLE ((gctHANDLE) ~0U)
+
+typedef int gctBOOL;
+typedef gctBOOL * gctBOOL_PTR;
+
+typedef int gctINT;
+typedef signed char gctINT8;
+typedef signed short gctINT16;
+typedef signed int gctINT32;
+typedef signed long long gctINT64;
+
+typedef gctINT * gctINT_PTR;
+typedef gctINT8 * gctINT8_PTR;
+typedef gctINT16 * gctINT16_PTR;
+typedef gctINT32 * gctINT32_PTR;
+typedef gctINT64 * gctINT64_PTR;
+
+typedef unsigned int gctUINT;
+typedef unsigned char gctUINT8;
+typedef unsigned short gctUINT16;
+typedef unsigned int gctUINT32;
+typedef unsigned long long gctUINT64;
+typedef uintptr_t gctUINTPTR_T;
+typedef ptrdiff_t gctPTRDIFF_T;
+
+typedef gctUINT * gctUINT_PTR;
+typedef gctUINT8 * gctUINT8_PTR;
+typedef gctUINT16 * gctUINT16_PTR;
+typedef gctUINT32 * gctUINT32_PTR;
+typedef gctUINT64 * gctUINT64_PTR;
+
+typedef size_t gctSIZE_T;
+typedef gctSIZE_T * gctSIZE_T_PTR;
+typedef gctUINT32 gctTRACE;
+
+#ifdef __cplusplus
+# define gcvNULL 0
+#else
+# define gcvNULL ((void *) 0)
+#endif
+
+#define gcvMAXINT8 0x7f
+#define gcvMININT8 0x80
+#define gcvMAXINT16 0x7fff
+#define gcvMININT16 0x8000
+#define gcvMAXINT32 0x7fffffff
+#define gcvMININT32 0x80000000
+#define gcvMAXINT64 0x7fffffffffffffff
+#define gcvMININT64 0x8000000000000000
+#define gcvMAXUINT8 0xff
+#define gcvMINUINT8 0x0
+#define gcvMAXUINT16 0xffff
+#define gcvMINUINT16 0x0
+#define gcvMAXUINT32 0xffffffff
+#define gcvMINUINT32 0x0
+#define gcvMAXUINT64 0xffffffffffffffff
+#define gcvMINUINT64 0x0
+#define gcvMAXUINTPTR_T (~(gctUINTPTR_T)0)
+#define gcvMAXSIZE_T ((gctSIZE_T)(-1))
+
+typedef float gctFLOAT;
+typedef signed int gctFIXED_POINT;
+typedef float * gctFLOAT_PTR;
+
+typedef void * gctPHYS_ADDR;
+typedef void * gctHANDLE;
+typedef void * gctFILE;
+typedef void * gctSIGNAL;
+typedef void * gctWINDOW;
+typedef void * gctIMAGE;
+typedef void * gctSHBUF;
+
+typedef void * gctSEMAPHORE;
+
+typedef void * gctPOINTER;
+typedef const void * gctCONST_POINTER;
+
+typedef char gctCHAR;
+typedef signed char gctSIGNED_CHAR;
+typedef unsigned char gctUNSIGNED_CHAR;
+typedef char * gctSTRING;
+typedef const char * gctCONST_STRING;
+
+typedef gctUINT64 gctPHYS_ADDR_T;
+
+typedef struct _gcsCOUNT_STRING
+{
+ gctSIZE_T Length;
+ gctCONST_STRING String;
+}
+gcsCOUNT_STRING;
+
+typedef union _gcuFLOAT_UINT32
+{
+ gctFLOAT f;
+ gctUINT32 u;
+}
+gcuFLOAT_UINT32;
+
+/* Fixed point constants. */
+#define gcvZERO_X ((gctFIXED_POINT) 0x00000000)
+#define gcvHALF_X ((gctFIXED_POINT) 0x00008000)
+#define gcvONE_X ((gctFIXED_POINT) 0x00010000)
+#define gcvNEGONE_X ((gctFIXED_POINT) 0xFFFF0000)
+#define gcvTWO_X ((gctFIXED_POINT) 0x00020000)
+
+
+
+#define gcmFIXEDCLAMP_NEG1_TO_1(_x) \
+ (((_x) < gcvNEGONE_X) \
+ ? gcvNEGONE_X \
+ : (((_x) > gcvONE_X) \
+ ? gcvONE_X \
+ : (_x)))
+
+#define gcmFLOATCLAMP_NEG1_TO_1(_f) \
+ (((_f) < -1.0f) \
+ ? -1.0f \
+ : (((_f) > 1.0f) \
+ ? 1.0f \
+ : (_f)))
+
+
+#define gcmFIXEDCLAMP_0_TO_1(_x) \
+ (((_x) < 0) \
+ ? 0 \
+ : (((_x) > gcvONE_X) \
+ ? gcvONE_X \
+ : (_x)))
+
+#define gcmFLOATCLAMP_0_TO_1(_f) \
+ (((_f) < 0.0f) \
+ ? 0.0f \
+ : (((_f) > 1.0f) \
+ ? 1.0f \
+ : (_f)))
+
+
+/******************************************************************************\
+******************************* Multicast Values *******************************
+\******************************************************************************/
+
+/* Value types. */
+typedef enum _gceVALUE_TYPE
+{
+ gcvVALUE_UINT = 0x0,
+ gcvVALUE_FIXED,
+ gcvVALUE_FLOAT,
+ gcvVALUE_INT,
+
+ /*
+ ** The value need be unsigned denormalized. clamp (0.0-1.0) should be done first.
+ */
+ gcvVALUE_FLAG_UNSIGNED_DENORM = 0x00010000,
+
+ /*
+ ** The value need be signed denormalized. clamp (-1.0-1.0) should be done first.
+ */
+ gcvVALUE_FLAG_SIGNED_DENORM = 0x00020000,
+
+ /*
+ ** The value need to gammar
+ */
+ gcvVALUE_FLAG_GAMMAR = 0x00040000,
+
+ /*
+ ** The value need to convert from float to float16
+ */
+ gcvVALUE_FLAG_FLOAT_TO_FLOAT16 = 0x0080000,
+
+ /*
+ ** Mask for flag field.
+ */
+ gcvVALUE_FLAG_MASK = 0xFFFF0000,
+}
+gceVALUE_TYPE;
+
+/* Value unions. */
+typedef union _gcuVALUE
+{
+ gctUINT uintValue;
+ gctFIXED_POINT fixedValue;
+ gctFLOAT floatValue;
+ gctINT intValue;
+}
+gcuVALUE;
+
+
+
+
+/* Stringizing macro. */
+#define gcmSTRING(Value) #Value
+
+/******************************************************************************\
+******************************* Fixed Point Math *******************************
+\******************************************************************************/
+
+#define gcmXMultiply(x1, x2) gcoMATH_MultiplyFixed(x1, x2)
+#define gcmXDivide(x1, x2) gcoMATH_DivideFixed(x1, x2)
+#define gcmXMultiplyDivide(x1, x2, x3) gcoMATH_MultiplyDivideFixed(x1, x2, x3)
+
+/* 2D Engine profile. */
+typedef struct _gcs2D_PROFILE
+{
+ /* Cycle count.
+ 32bit counter incremented every 2D clock cycle.
+ Wraps back to 0 when the counter overflows.
+ */
+ gctUINT32 cycleCount;
+
+ /* Pixels rendered by the 2D engine.
+ Resets to 0 every time it is read. */
+ gctUINT32 pixelsRendered;
+}
+gcs2D_PROFILE;
+
+/* Macro to combine four characters into a Charcater Code. */
+#define gcmCC(c1, c2, c3, c4) \
+(\
+ (char) (c1) \
+ | \
+ ((char) (c2) << 8) \
+ | \
+ ((char) (c3) << 16) \
+ | \
+ ((char) (c4) << 24) \
+)
+
+#define gcmPRINTABLE(c) ((((c) >= ' ') && ((c) <= '}')) ? ((c) != '%' ? (c) : ' ') : ' ')
+
+#define gcmCC_PRINT(cc) \
+ gcmPRINTABLE((char) ((cc) & 0xFF)), \
+ gcmPRINTABLE((char) (((cc) >> 8) & 0xFF)), \
+ gcmPRINTABLE((char) (((cc) >> 16) & 0xFF)), \
+ gcmPRINTABLE((char) (((cc) >> 24) & 0xFF))
+
+/******************************************************************************\
+****************************** Function Parameters *****************************
+\******************************************************************************/
+
+#define IN
+#define OUT
+#define INOUT
+#define OPTIONAL
+
+/******************************************************************************\
+********************************* Status Codes *********************************
+\******************************************************************************/
+
+typedef enum _gceSTATUS
+{
+ gcvSTATUS_OK = 0,
+ gcvSTATUS_FALSE = 0,
+ gcvSTATUS_TRUE = 1,
+ gcvSTATUS_NO_MORE_DATA = 2,
+ gcvSTATUS_CACHED = 3,
+ gcvSTATUS_MIPMAP_TOO_LARGE = 4,
+ gcvSTATUS_NAME_NOT_FOUND = 5,
+ gcvSTATUS_NOT_OUR_INTERRUPT = 6,
+ gcvSTATUS_MISMATCH = 7,
+ gcvSTATUS_MIPMAP_TOO_SMALL = 8,
+ gcvSTATUS_LARGER = 9,
+ gcvSTATUS_SMALLER = 10,
+ gcvSTATUS_CHIP_NOT_READY = 11,
+ gcvSTATUS_NEED_CONVERSION = 12,
+ gcvSTATUS_SKIP = 13,
+ gcvSTATUS_DATA_TOO_LARGE = 14,
+ gcvSTATUS_INVALID_CONFIG = 15,
+ gcvSTATUS_CHANGED = 16,
+ gcvSTATUS_NOT_SUPPORT_DITHER = 17,
+ gcvSTATUS_EXECUTED = 18,
+ gcvSTATUS_TERMINATE = 19,
+
+ gcvSTATUS_INVALID_ARGUMENT = -1,
+ gcvSTATUS_INVALID_OBJECT = -2,
+ gcvSTATUS_OUT_OF_MEMORY = -3,
+ gcvSTATUS_MEMORY_LOCKED = -4,
+ gcvSTATUS_MEMORY_UNLOCKED = -5,
+ gcvSTATUS_HEAP_CORRUPTED = -6,
+ gcvSTATUS_GENERIC_IO = -7,
+ gcvSTATUS_INVALID_ADDRESS = -8,
+ gcvSTATUS_CONTEXT_LOSSED = -9,
+ gcvSTATUS_TOO_COMPLEX = -10,
+ gcvSTATUS_BUFFER_TOO_SMALL = -11,
+ gcvSTATUS_INTERFACE_ERROR = -12,
+ gcvSTATUS_NOT_SUPPORTED = -13,
+ gcvSTATUS_MORE_DATA = -14,
+ gcvSTATUS_TIMEOUT = -15,
+ gcvSTATUS_OUT_OF_RESOURCES = -16,
+ gcvSTATUS_INVALID_DATA = -17,
+ gcvSTATUS_INVALID_MIPMAP = -18,
+ gcvSTATUS_NOT_FOUND = -19,
+ gcvSTATUS_NOT_ALIGNED = -20,
+ gcvSTATUS_INVALID_REQUEST = -21,
+ gcvSTATUS_GPU_NOT_RESPONDING = -22,
+ gcvSTATUS_TIMER_OVERFLOW = -23,
+ gcvSTATUS_VERSION_MISMATCH = -24,
+ gcvSTATUS_LOCKED = -25,
+ gcvSTATUS_INTERRUPTED = -26,
+ gcvSTATUS_DEVICE = -27,
+ gcvSTATUS_NOT_MULTI_PIPE_ALIGNED = -28,
+ gcvSTATUS_OUT_OF_SAMPLER = -29,
+
+ /* Linker errors. */
+ gcvSTATUS_GLOBAL_TYPE_MISMATCH = -1000,
+ gcvSTATUS_TOO_MANY_ATTRIBUTES = -1001,
+ gcvSTATUS_TOO_MANY_UNIFORMS = -1002,
+ gcvSTATUS_TOO_MANY_VARYINGS = -1003,
+ gcvSTATUS_UNDECLARED_VARYING = -1004,
+ gcvSTATUS_VARYING_TYPE_MISMATCH = -1005,
+ gcvSTATUS_MISSING_MAIN = -1006,
+ gcvSTATUS_NAME_MISMATCH = -1007,
+ gcvSTATUS_INVALID_INDEX = -1008,
+ gcvSTATUS_UNIFORM_MISMATCH = -1009,
+ gcvSTATUS_UNSAT_LIB_SYMBOL = -1010,
+ gcvSTATUS_TOO_MANY_SHADERS = -1011,
+ gcvSTATUS_LINK_INVALID_SHADERS = -1012,
+ gcvSTATUS_CS_NO_WORKGROUP_SIZE = -1013,
+ gcvSTATUS_LINK_LIB_ERROR = -1014,
+
+ gcvSTATUS_SHADER_VERSION_MISMATCH = -1015,
+ gcvSTATUS_TOO_MANY_INSTRUCTION = -1016,
+ gcvSTATUS_SSBO_MISMATCH = -1017,
+ gcvSTATUS_TOO_MANY_OUTPUT = -1018,
+ gcvSTATUS_TOO_MANY_INPUT = -1019,
+ gcvSTATUS_NOT_SUPPORT_CL = -1020,
+ gcvSTATUS_NOT_SUPPORT_INTEGER = -1021,
+ gcvSTATUS_UNIFORM_TYPE_MISMATCH = -1022,
+
+ gcvSTATUS_MISSING_PRIMITIVE_TYPE = -1023,
+ gcvSTATUS_MISSING_OUTPUT_VERTEX_COUNT = -1024,
+ gcvSTATUS_NON_INVOCATION_ID_AS_INDEX = -1025,
+ gcvSTATUS_INPUT_ARRAY_SIZE_MISMATCH = -1026,
+ gcvSTATUS_OUTPUT_ARRAY_SIZE_MISMATCH = -1027,
+ gcvSTATUS_LOCATION_ALIASED = -1028,
+
+ /* Compiler errors. */
+ gcvSTATUS_COMPILER_FE_PREPROCESSOR_ERROR = -2000,
+ gcvSTATUS_COMPILER_FE_PARSER_ERROR = -2001,
+
+ /* Recompilation Errors */
+ gcvSTATUS_RECOMPILER_CONVERT_UNIMPLEMENTED = -3000,
+}
+gceSTATUS;
+
+/******************************************************************************\
+********************************* Status Macros ********************************
+\******************************************************************************/
+
+#define gcmIS_ERROR(status) (status < 0)
+#define gcmNO_ERROR(status) (status >= 0)
+#define gcmIS_SUCCESS(status) (status == gcvSTATUS_OK)
+
+/******************************************************************************\
+********************************* Field Macros *********************************
+\******************************************************************************/
+
+#define __gcmSTART(reg_field) \
+ (0 ? reg_field)
+
+#define __gcmEND(reg_field) \
+ (1 ? reg_field)
+
+#define __gcmGETSIZE(reg_field) \
+ (__gcmEND(reg_field) - __gcmSTART(reg_field) + 1)
+
+#define __gcmALIGN(data, reg_field) \
+ (((gctUINT32) (data)) << __gcmSTART(reg_field))
+
+#define __gcmMASK(reg_field) \
+ ((gctUINT32) ((__gcmGETSIZE(reg_field) == 32) \
+ ? ~0U \
+ : (~(~0U << __gcmGETSIZE(reg_field)))))
+
+/*******************************************************************************
+**
+** gcmFIELDMASK
+**
+** Get aligned field mask.
+**
+** ARGUMENTS:
+**
+** reg Name of register.
+** field Name of field within register.
+*/
+#define gcmFIELDMASK(reg, field) \
+(\
+ __gcmALIGN(__gcmMASK(reg##_##field), reg##_##field) \
+)
+
+/*******************************************************************************
+**
+** gcmGETFIELD
+**
+** Extract the value of a field from specified data.
+**
+** ARGUMENTS:
+**
+** data Data value.
+** reg Name of register.
+** field Name of field within register.
+*/
+#define gcmGETFIELD(data, reg, field) \
+(\
+ ((((gctUINT32) (data)) >> __gcmSTART(reg##_##field)) \
+ & __gcmMASK(reg##_##field)) \
+)
+
+/*******************************************************************************
+**
+** gcmSETFIELD
+**
+** Set the value of a field within specified data.
+**
+** ARGUMENTS:
+**
+** data Data value.
+** reg Name of register.
+** field Name of field within register.
+** value Value for field.
+*/
+#define gcmSETFIELD(data, reg, field, value) \
+(\
+ (((gctUINT32) (data)) \
+ & ~__gcmALIGN(__gcmMASK(reg##_##field), reg##_##field)) \
+ | __gcmALIGN((gctUINT32) (value) \
+ & __gcmMASK(reg##_##field), reg##_##field) \
+)
+
+/*******************************************************************************
+**
+** gcmSETFIELDVALUE
+**
+** Set the value of a field within specified data with a
+** predefined value.
+**
+** ARGUMENTS:
+**
+** data Data value.
+** reg Name of register.
+** field Name of field within register.
+** value Name of the value within the field.
+*/
+#define gcmSETFIELDVALUE(data, reg, field, value) \
+(\
+ (((gctUINT32) (data)) \
+ & ~__gcmALIGN(__gcmMASK(reg##_##field), reg##_##field)) \
+ | __gcmALIGN(reg##_##field##_##value \
+ & __gcmMASK(reg##_##field), reg##_##field) \
+)
+
+/*******************************************************************************
+**
+** gcmGETMASKEDFIELDMASK
+**
+** Determine field mask of a masked field.
+**
+** ARGUMENTS:
+**
+** reg Name of register.
+** field Name of field within register.
+*/
+#define gcmGETMASKEDFIELDMASK(reg, field) \
+(\
+ gcmSETFIELD(0, reg, field, ~0U) | \
+ gcmSETFIELD(0, reg, MASK_ ## field, ~0U) \
+)
+
+/*******************************************************************************
+**
+** gcmSETMASKEDFIELD
+**
+** Set the value of a masked field with specified data.
+**
+** ARGUMENTS:
+**
+** reg Name of register.
+** field Name of field within register.
+** value Value for field.
+*/
+#define gcmSETMASKEDFIELD(reg, field, value) \
+(\
+ gcmSETFIELD (~0U, reg, field, value) & \
+ gcmSETFIELDVALUE(~0U, reg, MASK_ ## field, ENABLED) \
+)
+
+/*******************************************************************************
+**
+** gcmSETMASKEDFIELDVALUE
+**
+** Set the value of a masked field with specified data.
+**
+** ARGUMENTS:
+**
+** reg Name of register.
+** field Name of field within register.
+** value Value for field.
+*/
+#define gcmSETMASKEDFIELDVALUE(reg, field, value) \
+(\
+ gcmSETFIELDVALUE(~0U, reg, field, value) & \
+ gcmSETFIELDVALUE(~0U, reg, MASK_ ## field, ENABLED) \
+)
+
+/*******************************************************************************
+**
+** gcmVERIFYFIELDVALUE
+**
+** Verify if the value of a field within specified data equals a
+** predefined value.
+**
+** ARGUMENTS:
+**
+** data Data value.
+** reg Name of register.
+** field Name of field within register.
+** value Name of the value within the field.
+*/
+#define gcmVERIFYFIELDVALUE(data, reg, field, value) \
+(\
+ (((gctUINT32) (data)) >> __gcmSTART(reg##_##field) & \
+ __gcmMASK(reg##_##field)) \
+ == \
+ (reg##_##field##_##value & __gcmMASK(reg##_##field)) \
+)
+
+/*******************************************************************************
+** Bit field macros.
+*/
+
+#define __gcmSTARTBIT(Field) \
+ (1 ? Field )
+
+#define __gcmBITSIZE(Field) \
+ (0 ? Field )
+
+#define __gcmBITMASK(Field) \
+(\
+ (1 << __gcmBITSIZE(Field)) - 1 \
+)
+
+#define gcmGETBITS(Value, Type, Field) \
+(\
+ (((Type) (Value)) >> __gcmSTARTBIT(Field) ) \
+ & \
+ __gcmBITMASK(Field) \
+)
+
+#define gcmSETBITS(Value, Type, Field, NewValue) \
+(\
+ (((Type) (Value)) \
+ & ~(__gcmBITMASK(Field) << __gcmSTARTBIT(Field)) \
+ ) \
+ | \
+ ((((Type) (NewValue)) \
+ & __gcmBITMASK(Field) \
+ ) << __gcmSTARTBIT(Field) \
+ ) \
+)
+
+/*******************************************************************************
+**
+** gcmISINREGRANGE
+**
+** Verify whether the specified address is in the register range.
+**
+** ARGUMENTS:
+**
+** Address Address to be verified.
+** Name Name of a register.
+*/
+
+#define gcmISINREGRANGE(Address, Name) \
+(\
+ ((Address & (~0U << Name ## _LSB)) == (Name ## _Address >> 2)) \
+)
+
+/******************************************************************************\
+******************************** Ceiling Macro ********************************
+\******************************************************************************/
+#define gcmCEIL(x) (((x) - (gctUINT32)(x)) == 0 ? (gctUINT32)(x) : (gctUINT32)(x) + 1)
+
+/******************************************************************************\
+******************************** Min/Max Macros ********************************
+\******************************************************************************/
+
+#define gcmMIN(x, y) (((x) <= (y)) ? (x) : (y))
+#define gcmMAX(x, y) (((x) >= (y)) ? (x) : (y))
+#define gcmCLAMP(x, min, max) (((x) < (min)) ? (min) : \
+ ((x) > (max)) ? (max) : (x))
+#define gcmABS(x) (((x) < 0) ? -(x) : (x))
+#define gcmNEG(x) (((x) < 0) ? (x) : -(x))
+
+/******************************************************************************\
+******************************** Bit Macro ********************************
+\******************************************************************************/
+#define gcmBITSET(x, y) ((x) & (y))
+/*******************************************************************************
+**
+** gcmPTR2SIZE
+**
+** Convert a pointer to an integer value.
+**
+** ARGUMENTS:
+**
+** p Pointer value.
+*/
+#define gcmPTR2SIZE(p) \
+(\
+ (gctUINTPTR_T) (p) \
+)
+
+#define gcmPTR2INT32(p) \
+(\
+ (gctUINT32)(gctUINTPTR_T) (p) \
+)
+
+/*******************************************************************************
+**
+** gcmINT2PTR
+**
+** Convert an integer value into a pointer.
+**
+** ARGUMENTS:
+**
+** v Integer value.
+*/
+
+#define gcmINT2PTR(i) \
+(\
+ (gctPOINTER) (gctUINTPTR_T)(i) \
+)
+
+/*******************************************************************************
+**
+** gcmOFFSETOF
+**
+** Compute the byte offset of a field inside a structure.
+**
+** ARGUMENTS:
+**
+** s Structure name.
+** field Field name.
+*/
+#define gcmOFFSETOF(s, field) \
+(\
+ gcmPTR2INT32(& (((struct s *) 0)->field)) \
+)
+
+#define __gcmOFFSETOF(type, field) \
+(\
+ gcmPTR2INT32(& (((type *) 0)->field)) \
+)
+
+/*******************************************************************************
+**
+** gcmCONTAINEROF
+**
+** Get containing structure of a member.
+**
+** ARGUMENTS:
+**
+** Pointer Pointer of member.
+** Type Structure name.
+** Name Field name.
+*/
+#define gcmCONTAINEROF(Pointer, Type, Member) \
+(\
+ (Type *)((gctUINTPTR_T)Pointer - __gcmOFFSETOF(Type, Member)) \
+)
+
+/*******************************************************************************
+**
+** gcmBSWAP32
+**
+** Return a value with all bytes in the 32 bit argument swapped.
+*/
+#if !defined(__KERNEL__) && defined(__GNUC__) && (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ >= 40300) \
+ && !defined(__VXWORKS__)
+# define gcmBSWAP32(x) __builtin_bswap32(x)
+#else
+# define gcmBSWAP32(x) ((gctUINT32)(\
+ (((gctUINT32)(x) & (gctUINT32)0x000000FFUL) << 24) | \
+ (((gctUINT32)(x) & (gctUINT32)0x0000FF00UL) << 8) | \
+ (((gctUINT32)(x) & (gctUINT32)0x00FF0000UL) >> 8) | \
+ (((gctUINT32)(x) & (gctUINT32)0xFF000000UL) >> 24)))
+#endif
+
+/*******************************************************************************
+***** Database ****************************************************************/
+
+typedef struct _gcsDATABASE_COUNTERS
+{
+ /* Number of currently allocated bytes. */
+ gctUINT64 bytes;
+
+ /* Maximum number of bytes allocated (memory footprint). */
+ gctUINT64 maxBytes;
+
+ /* Total number of bytes allocated. */
+ gctUINT64 totalBytes;
+
+ /* The numbers of times video memory was allocated. */
+ gctUINT32 allocCount;
+
+ /* The numbers of times video memory was freed. */
+ gctUINT32 freeCount;
+}
+gcsDATABASE_COUNTERS;
+
+typedef struct _gcuDATABASE_INFO
+{
+ /* Counters. */
+ gcsDATABASE_COUNTERS counters;
+
+ /* Time value. */
+ gctUINT64 time;
+}
+gcuDATABASE_INFO;
+
+/*******************************************************************************
+***** Frame database **********************************************************/
+
+/* gcsHAL_FRAME_INFO */
+typedef struct _gcsHAL_FRAME_INFO
+{
+ /* Current timer tick. */
+ OUT gctUINT64 ticks;
+
+ /* Bandwidth counters. */
+ OUT gctUINT readBytes8[8];
+ OUT gctUINT writeBytes8[8];
+
+ /* Counters. */
+ OUT gctUINT cycles[8];
+ OUT gctUINT idleCycles[8];
+ OUT gctUINT mcCycles[8];
+ OUT gctUINT readRequests[8];
+ OUT gctUINT writeRequests[8];
+
+ /* 3D counters. */
+ OUT gctUINT vertexCount;
+ OUT gctUINT primitiveCount;
+ OUT gctUINT rejectedPrimitives;
+ OUT gctUINT culledPrimitives;
+ OUT gctUINT clippedPrimitives;
+ OUT gctUINT outPrimitives;
+ OUT gctUINT inPrimitives;
+ OUT gctUINT culledQuadCount;
+ OUT gctUINT totalQuadCount;
+ OUT gctUINT quadCount;
+ OUT gctUINT totalPixelCount;
+
+ /* PE counters. */
+ OUT gctUINT colorKilled[8];
+ OUT gctUINT colorDrawn[8];
+ OUT gctUINT depthKilled[8];
+ OUT gctUINT depthDrawn[8];
+
+ /* Shader counters. */
+ OUT gctUINT shaderCycles;
+ OUT gctUINT vsInstructionCount;
+ OUT gctUINT vsTextureCount;
+ OUT gctUINT psInstructionCount;
+ OUT gctUINT psTextureCount;
+
+ /* Texture counters. */
+ OUT gctUINT bilinearRequests;
+ OUT gctUINT trilinearRequests;
+ OUT gctUINT txBytes8;
+ OUT gctUINT txHitCount;
+ OUT gctUINT txMissCount;
+}
+gcsHAL_FRAME_INFO;
+
+typedef struct _gckLINKDATA * gckLINKDATA;
+struct _gckLINKDATA
+{
+ gctUINT32 start;
+ gctUINT32 end;
+ gctUINT32 pid;
+ gctUINT32 linkLow;
+ gctUINT32 linkHigh;
+};
+
+typedef struct _gckADDRESSDATA * gckADDRESSDATA;
+struct _gckADDRESSDATA
+{
+ gctUINT32 start;
+ gctUINT32 end;
+};
+
+typedef union _gcuQUEUEDATA
+{
+ struct _gckLINKDATA linkData;
+
+ struct _gckADDRESSDATA addressData;
+}
+gcuQUEUEDATA;
+
+typedef struct _gckQUEUE * gckQUEUE;
+struct _gckQUEUE
+{
+ gcuQUEUEDATA * datas;
+ gctUINT32 rear;
+ gctUINT32 front;
+ gctUINT32 count;
+ gctUINT32 size;
+};
+
+typedef enum _gceTRACEMODE
+{
+ gcvTRACEMODE_NONE = 0,
+ gcvTRACEMODE_FULL = 1,
+ gcvTRACEMODE_LOGGER = 2,
+ gcvTRACEMODE_ALLZONE = 3,
+ gcvTRACEMODE_PRE = 4,
+ gcvTRACEMODE_POST = 5,
+} gceTRACEMODE;
+
+typedef struct _gcsLISTHEAD * gcsLISTHEAD_PTR;
+typedef struct _gcsLISTHEAD
+{
+ gcsLISTHEAD_PTR prev;
+ gcsLISTHEAD_PTR next;
+}
+gcsLISTHEAD;
+
+/*
+ * 'Patch' here means a mechanism to let kernel side modify user space reserved
+ * command buffer location, or something the like, during the command buffer
+ * commit.
+ *
+ * Reasons of using 'patch':
+ * 1. Some resources/states are managed globally only in kernel side, such as
+ * MCFE semaphore, etc.
+ * 2. For the sake of security or optimization, like video memory address.
+ *
+ * Patches are arranged in arrays, each array has the same type. The 'patchArray'
+ * in 'gcsHAL_PATCH_LIST' pointers the concrete patch item array.
+ *
+ * NOTICE:
+ * Be aware of the order and values! Tables in gc_hal_user_buffer.c and
+ * gc_hal_kernel_command.c depend on this.
+ */
+/* The patch types. */
+enum _gceHAL_PATCH_TYPE
+{
+ gcvHAL_PATCH_VIDMEM_ADDRESS = 1,
+ gcvHAL_PATCH_MCFE_SEMAPHORE,
+ gcvHAL_PATCH_VIDMEM_TIMESTAMP,
+
+ /* Must be the last one for counting. */
+ gcvHAL_PATCH_TYPE_COUNT,
+};
+
+/* The patch array. */
+typedef struct _gcsHAL_PATCH_LIST
+{
+ /* Patch type. */
+ gctUINT32 type;
+
+ /* Patch item count. */
+ gctUINT32 count;
+
+ /*
+ * Pointer to the patch items.
+ *
+ * gcsHAL_PATCH_VIDMEM_ADDRESS * patchArray;
+ * gcsHAL_PATCH_MCFE_SEMAPHORE * patchArray;
+ * gcsHAL_PATCH_VIDMEM_TIMESTAMP * patchArray;
+ * ...
+ */
+ gctUINT64 patchArray;
+
+ /* struct _gcsHAL_PATCH_LIST * next; */
+ gctUINT64 next;
+}
+gcsHAL_PATCH_LIST;
+
+/*
+ * Patch a GPU address in the place (gcvHAL_PATCH_VIDMEM_ADDRESS).
+ * Size of a GPU address is always 32 bits.
+ */
+typedef struct _gcsHAL_PATCH_VIDMEM_ADDRESS
+{
+ /* Patch location in the command buffer. */
+ gctUINT32 location;
+
+ /* Handle of the video memory node. */
+ gctUINT32 node;
+
+ /* Address offset in the video memory node. */
+ gctUINT32 offset;
+}
+gcsHAL_PATCH_VIDMEM_ADDRESS;
+
+/*
+ * Patch a MCFE semaphore command in the place (gcvHAL_PATCH_MCFE_SEMAPHORE).
+ * Size of the semaphore command is fixed at _64_ bits!
+ */
+typedef struct _gcsHAL_PATCH_MCFE_SEMAPHORE
+{
+ /* Patch location in the command buffer. */
+ gctUINT32 location;
+
+ /* semaphore direction: 1 = Send, 0 = Wait. */
+ gctUINT32 sendSema;
+
+ /* Handle of the semaphore. */
+ gctUINT32 semaHandle;
+}
+gcsHAL_PATCH_MCFE_SEMAPHORE;
+
+/*
+ * Patch timestamp of given video memory node (gcvHAL_PATCH_VIDMEM_TIMESTAMP).
+ * Pure software-wise, not command relevant.
+ */
+typedef struct _gcsHAL_PATCH_VIDMEM_TIMESTAMP
+{
+ /* Handle of a video memory node. */
+ gctUINT32 handle;
+
+ gctUINT32 flag;
+}
+gcsHAL_PATCH_VIDMEM_TIMESTAMP;
+
+
+/*
+ gcvFEATURE_DATABASE_DATE_MASK
+
+ Mask used to control which bits of chip date will be used to
+ query feature database, ignore release date for fpga and emulator.
+*/
+#if (gcdFPGA_BUILD || defined(EMULATOR))
+# define gcvFEATURE_DATABASE_DATE_MASK (0U)
+#else
+# define gcvFEATURE_DATABASE_DATE_MASK (~0U)
+#endif
+
+#if defined(__GNUC__)
+#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+#define gcdENDIAN_BIG 1
+#else
+#define gcdENDIAN_BIG 0
+#endif
+#else
+#define gcdENDIAN_BIG 0
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_types_h_ */
+
+
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
new file mode 100644
index 000000000000..e1173a3b6759
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_version.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_version_h_
+#define __gc_hal_version_h_
+
+#define gcvVERSION_MAJOR 6
+
+#define gcvVERSION_MINOR 4
+
+#define gcvVERSION_PATCH 0
+
+#define gcvVERSION_BUILD 234062
+
+#define gcvVERSION_STRING "6.4.0.p2.234062"
+
+#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
new file mode 100644
index 000000000000..3188abdfa54f
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/kernel/inc/gc_hal_vg.h
@@ -0,0 +1,886 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_vg_h_
+#define __gc_hal_vg_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include "gc_hal_types.h"
+#include "gc_hal_enum.h"
+#include "gc_hal_base.h"
+
+#if gcdENABLE_VG
+
+/* Thread routine type. */
+#if defined(LINUX)
+ typedef gctINT gctTHREADFUNCRESULT;
+ typedef gctPOINTER gctTHREADFUNCPARAMETER;
+# define gctTHREADFUNCTYPE
+#elif defined(WIN32)
+ typedef gctUINT gctTHREADFUNCRESULT;
+ typedef gctPOINTER gctTHREADFUNCPARAMETER;
+# define gctTHREADFUNCTYPE __stdcall
+#elif defined(__QNXNTO__)
+ typedef void * gctTHREADFUNCRESULT;
+ typedef gctPOINTER gctTHREADFUNCPARAMETER;
+# define gctTHREADFUNCTYPE
+#endif
+
+typedef gctTHREADFUNCRESULT (gctTHREADFUNCTYPE * gctTHREADFUNC) (
+ gctTHREADFUNCPARAMETER ThreadParameter
+ );
+
+
+#if defined(gcvDEBUG)
+# undef gcvDEBUG
+#endif
+
+#define gcdFORCE_DEBUG 0
+#define gcdFORCE_MESSAGES 0
+
+
+#if DBG || defined(DEBUG) || defined(_DEBUG) || gcdFORCE_DEBUG
+# define gcvDEBUG 1
+#else
+# define gcvDEBUG 0
+#endif
+
+#define _gcmERROR_RETURN(prefix, func) \
+ status = func; \
+ if (gcmIS_ERROR(status)) \
+ { \
+ prefix##PRINT_VERSION(); \
+ prefix##TRACE(gcvLEVEL_ERROR, \
+ #prefix "ERR_RETURN: status=%d(%s) @ %s(%d)", \
+ status, gcoOS_DebugStatus2Name(status), __FUNCTION__, __LINE__); \
+ return status; \
+ } \
+ do { } while (gcvFALSE)
+
+#define gcmERROR_RETURN(func) _gcmERROR_RETURN(gcm, func)
+
+#define gcmLOG_LOCATION()
+
+#define gcmkIS_ERROR(status) (status < 0)
+
+#define gcmALIGNDOWN(n, align) \
+(\
+ (n) & ~((align) - 1) \
+)
+
+#define gcmIS_VALID_INDEX(Index, Array) \
+ (((gctUINT) (Index)) < gcmCOUNTOF(Array))
+
+
+#define gcmIS_NAN(x) \
+(\
+ ((* (gctUINT32_PTR) &(x)) & 0x7FFFFFFF) == 0x7FFFFFFF \
+)
+
+#define gcmLERP(v1, v2, w) \
+ ((v1) * (w) + (v2) * (1.0f - (w)))
+
+#define gcmINTERSECT(Start1, Start2, Length) \
+ (gcmABS((Start1) - (Start2)) < (Length))
+
+/*******************************************************************************
+**
+** gcmERR_GOTO
+**
+** Prints a message and terminates the current loop on error.
+**
+** ASSUMPTIONS:
+**
+** 'status' variable of gceSTATUS type must be defined.
+**
+** ARGUMENTS:
+**
+** Function
+** Function to evaluate.
+*/
+
+#define gcmERR_GOTO(Function) \
+ status = Function; \
+ if (gcmIS_ERROR(status)) \
+ { \
+ gcmTRACE(\
+ gcvLEVEL_ERROR, \
+ "gcmERR_GOTO: status=%d @ line=%d in function %s.\n", \
+ status, __LINE__, __FUNCTION__ \
+ ); \
+ goto ErrorHandler; \
+ }
+
+#if gcvDEBUG || gcdFORCE_MESSAGES
+# define gcmVERIFY_BOOLEAN(Expression) \
+ gcmASSERT(\
+ ((Expression) == gcvFALSE ) || \
+ ((Expression) == gcvTRUE ) \
+ )
+#else
+# define gcmVERIFY_BOOLEAN(Expression)
+#endif
+
+/*******************************************************************************
+**
+** gcmVERIFYFIELDFIT
+**
+** Verify whether the value fits in the field.
+**
+** ARGUMENTS:
+**
+** data Data value.
+** reg Name of register.
+** field Name of field within register.
+** value Value for field.
+*/
+#define gcmVERIFYFIELDFIT(reg, field, value) \
+ gcmASSERT(\
+ (value) <= gcmFIELDMAX(reg, field) \
+ )
+/*******************************************************************************
+**
+** gcmFIELDMAX
+**
+** Get field maximum value.
+**
+** ARGUMENTS:
+**
+** reg Name of register.
+** field Name of field within register.
+*/
+#define gcmFIELDMAX(reg, field) \
+(\
+ (gctUINT32) \
+ (\
+ (__gcmGETSIZE(reg##_##field) == 32) \
+ ? ~0U \
+ : (~(~0U << __gcmGETSIZE(reg##_##field))) \
+ ) \
+)
+
+
+/* ANSI C does not have the 'f' functions, define replacements here. */
+#define gcmSINF(x) ((gctFLOAT) sin(x))
+#define gcmCOSF(x) ((gctFLOAT) cos(x))
+#define gcmASINF(x) ((gctFLOAT) asin(x))
+#define gcmACOSF(x) ((gctFLOAT) acos(x))
+#define gcmSQRTF(x) ((gctFLOAT) sqrt(x))
+#define gcmFABSF(x) ((gctFLOAT) fabs(x))
+#define gcmFMODF(x, y) ((gctFLOAT) fmod((x), (y)))
+#define gcmCEILF(x) ((gctFLOAT) ceil(x))
+#define gcmFLOORF(x) ((gctFLOAT) floor(x))
+
+
+
+/* Fixed point constants. */
+#define gcvZERO_X ((gctFIXED_POINT) 0x00000000)
+#define gcvHALF_X ((gctFIXED_POINT) 0x00008000)
+#define gcvONE_X ((gctFIXED_POINT) 0x00010000)
+#define gcvNEGONE_X ((gctFIXED_POINT) 0xFFFF0000)
+#define gcvTWO_X ((gctFIXED_POINT) 0x00020000)
+
+/* Integer constants. */
+#define gcvMAX_POS_INT ((gctINT) 0x7FFFFFFF)
+#define gcvMAX_NEG_INT ((gctINT) 0x80000000)
+
+/* Float constants. */
+#define gcvMAX_POS_FLOAT ((gctFLOAT) 3.4028235e+038)
+#define gcvMAX_NEG_FLOAT ((gctFLOAT) -3.4028235e+038)
+
+/******************************************************************************\
+***************************** Miscellaneous Macro ******************************
+\******************************************************************************/
+
+#define gcmKB2BYTES(Kilobyte) \
+(\
+ (Kilobyte) << 10 \
+)
+
+#define gcmMB2BYTES(Megabyte) \
+(\
+ (Megabyte) << 20 \
+)
+
+#define gcmMAT(Matrix, Row, Column) \
+(\
+ (Matrix) [(Row) * 3 + (Column)] \
+)
+
+#define gcmMAKE2CHAR(Char1, Char2) \
+(\
+ ((gctUINT16) (gctUINT8) (Char1) << 0) | \
+ ((gctUINT16) (gctUINT8) (Char2) << 8) \
+)
+
+#define gcmMAKE4CHAR(Char1, Char2, Char3, Char4) \
+(\
+ ((gctUINT32)(gctUINT8) (Char1) << 0) | \
+ ((gctUINT32)(gctUINT8) (Char2) << 8) | \
+ ((gctUINT32)(gctUINT8) (Char3) << 16) | \
+ ((gctUINT32)(gctUINT8) (Char4) << 24) \
+)
+
+/* some platforms need to fix the physical address for HW to access*/
+#define gcmFIXADDRESS(address) \
+(\
+ (address)\
+)
+
+#define gcmkFIXADDRESS(address) \
+(\
+ (address)\
+)
+
+/*----------------------------------------------------------------------------*/
+/*----------------------------- Semaphore Object -----------------------------*/
+
+/* Increment the value of a semaphore. */
+gceSTATUS
+gckOS_IncrementSemaphore(
+ IN gckOS Os,
+ IN gctSEMAPHORE Semaphore
+ );
+
+/* Decrement the value of a semaphore (waiting might occur). */
+gceSTATUS
+gckOS_DecrementSemaphore(
+ IN gckOS Os,
+ IN gctSEMAPHORE Semaphore
+ );
+
+
+/*----------------------------------------------------------------------------*/
+/*------------------------------- Thread Object ------------------------------*/
+
+/* Start a thread. */
+gceSTATUS
+gckOS_StartThread(
+ IN gckOS Os,
+ IN gctTHREADFUNC ThreadFunction,
+ IN gctPOINTER ThreadParameter,
+ OUT gctTHREAD * Thread
+ );
+
+/* Stop a thread. */
+gceSTATUS
+gckOS_StopThread(
+ IN gckOS Os,
+ IN gctTHREAD Thread
+ );
+
+/* Verify whether the thread is still running. */
+gceSTATUS
+gckOS_VerifyThread(
+ IN gckOS Os,
+ IN gctTHREAD Thread
+ );
+
+
+/* Construct a new gckVGKERNEL object. */
+gceSTATUS
+gckVGKERNEL_Construct(
+ IN gckOS Os,
+ IN gctPOINTER Context,
+ IN gckKERNEL inKernel,
+ OUT gckVGKERNEL * Kernel
+ );
+
+/* Destroy an gckVGKERNEL object. */
+gceSTATUS
+gckVGKERNEL_Destroy(
+ IN gckVGKERNEL Kernel
+ );
+
+/* Unmap memory. */
+gceSTATUS
+gckKERNEL_UnmapMemory(
+ IN gckKERNEL Kernel,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical,
+ IN gctUINT32 ProcessID
+ );
+
+/* Dispatch a user-level command. */
+gceSTATUS
+gckVGKERNEL_Dispatch(
+ IN gckKERNEL Kernel,
+ IN OUT struct _gcsHAL_INTERFACE * Interface
+ );
+
+/* Query command buffer requirements. */
+gceSTATUS
+gckKERNEL_QueryCommandBuffer(
+ IN gckKERNEL Kernel,
+ OUT gcsCOMMAND_BUFFER_INFO_PTR Information
+ );
+
+/******************************************************************************\
+******************************* gckVGHARDWARE Object ******************************
+\******************************************************************************/
+
+/* Construct a new gckVGHARDWARE object. */
+gceSTATUS
+gckVGHARDWARE_Construct(
+ IN gckOS Os,
+ OUT gckVGHARDWARE * Hardware
+ );
+
+/* Destroy an gckVGHARDWARE object. */
+gceSTATUS
+gckVGHARDWARE_Destroy(
+ IN gckVGHARDWARE Hardware
+ );
+
+/* Query system memory requirements. */
+gceSTATUS
+gckVGHARDWARE_QuerySystemMemory(
+ IN gckVGHARDWARE Hardware,
+ OUT gctSIZE_T * SystemSize,
+ OUT gctUINT32 * SystemBaseAddress
+ );
+
+/* Build virtual address. */
+gceSTATUS
+gckVGHARDWARE_BuildVirtualAddress(
+ IN gckVGHARDWARE Hardware,
+ IN gctUINT32 Index,
+ IN gctUINT32 Offset,
+ OUT gctUINT32 * Address
+ );
+
+/* Kickstart the command processor. */
+gceSTATUS
+gckVGHARDWARE_Execute(
+ IN gckVGHARDWARE Hardware,
+ IN gctUINT32 Address,
+ IN gctUINT32 Count
+ );
+
+/* Query the available memory. */
+gceSTATUS
+gckVGHARDWARE_QueryMemory(
+ IN gckVGHARDWARE Hardware,
+ OUT gctSIZE_T * InternalSize,
+ OUT gctUINT32 * InternalBaseAddress,
+ OUT gctUINT32 * InternalAlignment,
+ OUT gctSIZE_T * ExternalSize,
+ OUT gctUINT32 * ExternalBaseAddress,
+ OUT gctUINT32 * ExternalAlignment,
+ OUT gctUINT32 * HorizontalTileSize,
+ OUT gctUINT32 * VerticalTileSize
+ );
+
+/* Query the identity of the hardware. */
+gceSTATUS
+gckVGHARDWARE_QueryChipIdentity(
+ IN gckVGHARDWARE Hardware,
+ OUT gceCHIPMODEL* ChipModel,
+ OUT gctUINT32* ChipRevision,
+ OUT gctUINT32* ProductID,
+ OUT gctUINT32* EcoID,
+ OUT gctUINT32* CustomerID,
+ OUT gctUINT32* ChipFeatures,
+ OUT gctUINT32* ChipMinorFeatures,
+ OUT gctUINT32* ChipMinorFeatures1
+ );
+
+/* Convert an API format. */
+gceSTATUS
+gckVGHARDWARE_ConvertFormat(
+ IN gckVGHARDWARE Hardware,
+ IN gceSURF_FORMAT Format,
+ OUT gctUINT32 * BitsPerPixel,
+ OUT gctUINT32 * BytesPerTile
+ );
+
+/* Split a harwdare specific address into API stuff. */
+gceSTATUS
+gckVGHARDWARE_SplitMemory(
+ IN gckVGHARDWARE Hardware,
+ IN gctUINT32 Address,
+ OUT gcePOOL * Pool,
+ OUT gctUINT32 * Offset
+ );
+
+/* Convert logical address to hardware specific address. */
+gceSTATUS
+gckVGHARDWARE_ConvertLogical(
+ IN gckVGHARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN gctBOOL InUserSpace,
+ OUT gctUINT32 * Address
+ );
+
+/* Program MMU. */
+gceSTATUS
+gckVGHARDWARE_SetMMU(
+ IN gckVGHARDWARE Hardware,
+ IN gctPOINTER Logical
+ );
+
+/* Flush the MMU. */
+gceSTATUS
+gckVGHARDWARE_FlushMMU(
+ IN gckVGHARDWARE Hardware
+ );
+
+/* Get idle register. */
+gceSTATUS
+gckVGHARDWARE_GetIdle(
+ IN gckVGHARDWARE Hardware,
+ OUT gctUINT32 * Data
+ );
+
+/* Flush the caches. */
+gceSTATUS
+gckVGHARDWARE_Flush(
+ IN gckVGHARDWARE Hardware,
+ IN gceKERNEL_FLUSH Flush,
+ IN gctPOINTER Logical,
+ IN OUT gctSIZE_T * Bytes
+ );
+
+/* Enable/disable fast clear. */
+gceSTATUS
+gckVGHARDWARE_SetFastClear(
+ IN gckVGHARDWARE Hardware,
+ IN gctINT Enable
+ );
+
+gceSTATUS
+gckVGHARDWARE_ReadInterrupt(
+ IN gckVGHARDWARE Hardware,
+ OUT gctUINT32_PTR IDs
+ );
+
+/* Power management. */
+gceSTATUS
+gckVGHARDWARE_SetPowerState(
+ IN gckVGHARDWARE Hardware,
+ IN gceCHIPPOWERSTATE State
+ );
+
+gceSTATUS
+gckVGHARDWARE_QueryPowerManagementState(
+ IN gckVGHARDWARE Hardware,
+ OUT gceCHIPPOWERSTATE* State
+ );
+
+gceSTATUS
+gckVGHARDWARE_EnablePowerManagement(
+ IN gckVGHARDWARE Hardware,
+ IN gctBOOL Enable
+ );
+
+gceSTATUS
+gckVGHARDWARE_SetPowerOffTimeout(
+ IN gckVGHARDWARE Hardware,
+ IN gctUINT32 Timeout
+ );
+
+gceSTATUS
+gckVGHARDWARE_QueryPowerOffTimeout(
+ IN gckVGHARDWARE Hardware,
+ OUT gctUINT32* Timeout
+ );
+
+gceSTATUS
+gckVGHARDWARE_QueryIdle(
+ IN gckVGHARDWARE Hardware,
+ OUT gctBOOL_PTR IsIdle
+ );
+/******************************************************************************\
+*************************** Command Buffer Structures **************************
+\******************************************************************************/
+
+/* Vacant command buffer marker. */
+#define gcvVACANT_BUFFER ((gcsCOMPLETION_SIGNAL_PTR) ((gctSIZE_T)1))
+
+/* Command buffer header. */
+typedef struct _gcsCMDBUFFER * gcsCMDBUFFER_PTR;
+typedef struct _gcsCMDBUFFER
+{
+ /* Pointer to the completion signal. */
+ gcsCOMPLETION_SIGNAL_PTR completion;
+
+ /* The user sets this to the node of the container buffer whitin which
+ this particular command buffer resides. The kernel sets this to the
+ node of the internally allocated buffer. */
+ gcuVIDMEM_NODE_PTR node;
+
+ /* Command buffer hardware address. */
+ gctUINT32 address;
+
+ /* The offset of the buffer from the beginning of the header. */
+ gctUINT32 bufferOffset;
+
+ /* Size of the area allocated for the data portion of this particular
+ command buffer (headers and tail reserves are excluded). */
+ gctUINT32 size;
+
+ /* Offset into the buffer [0..size]; reflects exactly how much data has
+ been put into the command buffer. */
+ gctUINT offset;
+
+ /* The number of command units in the buffer for the hardware to
+ execute. */
+ gctUINT32 dataCount;
+
+ /* MANAGED BY : user HAL (gcoBUFFER object).
+ USED BY : user HAL (gcoBUFFER object).
+ Points to the immediate next allocated command buffer. */
+ gcsCMDBUFFER_PTR nextAllocated;
+
+ /* MANAGED BY : user layers (HAL and drivers).
+ USED BY : kernel HAL (gcoBUFFER object).
+ Points to the next subbuffer if any. A family of subbuffers are chained
+ together and are meant to be executed inseparably as a unit. Meaning
+ that context switching cannot occur while a chain of subbuffers is being
+ executed. */
+ gcsCMDBUFFER_PTR nextSubBuffer;
+}
+gcsCMDBUFFER;
+
+/* Command queue element. */
+typedef struct _gcsVGCMDQUEUE
+{
+ /* Pointer to the command buffer header. */
+ gcsCMDBUFFER_PTR commandBuffer;
+
+ /* Dynamic vs. static command buffer state. */
+ gctBOOL dynamic;
+}
+gcsVGCMDQUEUE;
+
+/* Context map entry. */
+typedef struct _gcsVGCONTEXT_MAP
+{
+ /* State index. */
+ gctUINT32 index;
+
+ /* New state value. */
+ gctUINT32 data;
+
+ /* Points to the next entry in the mod list. */
+ gcsVGCONTEXT_MAP_PTR next;
+}
+gcsVGCONTEXT_MAP;
+
+/* gcsVGCONTEXT structure that holds the current context. */
+typedef struct _gcsVGCONTEXT
+{
+ /* Context ID. */
+ gctUINT64 id;
+
+ /* State caching ebable flag. */
+ gctBOOL stateCachingEnabled;
+
+ /* Current pipe. */
+ gctUINT32 currentPipe;
+
+ /* State map/mod buffer. */
+ gctUINT32 mapFirst;
+ gctUINT32 mapLast;
+ gcsVGCONTEXT_MAP_PTR mapContainer;
+ gcsVGCONTEXT_MAP_PTR mapPrev;
+ gcsVGCONTEXT_MAP_PTR mapCurr;
+ gcsVGCONTEXT_MAP_PTR firstPrevMap;
+ gcsVGCONTEXT_MAP_PTR firstCurrMap;
+
+ /* Main context buffer. */
+ gcsCMDBUFFER_PTR header;
+ gctUINT32_PTR buffer;
+
+ /* Completion signal. */
+ gctHANDLE process;
+ gctSIGNAL signal;
+
+#if defined(__QNXNTO__)
+ gctSIGNAL userSignal;
+ gctINT32 coid;
+ gctINT32 rcvid;
+#endif
+}
+gcsVGCONTEXT;
+
+/* User space task header. */
+typedef struct _gcsTASK * gcsTASK_PTR;
+typedef struct _gcsTASK
+{
+ /* Pointer to the next task for the same interrupt in user space. */
+ gcsTASK_PTR next;
+
+ /* Size of the task data that immediately follows the structure. */
+ gctUINT size;
+
+ /* Task data starts here. */
+ /* ... */
+}
+gcsTASK;
+
+/* User space task master table entry. */
+typedef struct _gcsTASK_MASTER_ENTRY * gcsTASK_MASTER_ENTRY_PTR;
+typedef struct _gcsTASK_MASTER_ENTRY
+{
+ /* Pointers to the head and to the tail of the task chain. */
+ gcsTASK_PTR head;
+ gcsTASK_PTR tail;
+}
+gcsTASK_MASTER_ENTRY;
+
+/* User space task master table entry. */
+typedef struct _gcsTASK_MASTER_TABLE
+{
+ /* Table with one entry per block. */
+ gcsTASK_MASTER_ENTRY table[gcvBLOCK_COUNT];
+
+ /* The total number of tasks sckeduled. */
+ gctUINT count;
+
+ /* The total size of event data in bytes. */
+ gctUINT size;
+
+#if defined(__QNXNTO__)
+ gctINT32 coid;
+ gctINT32 rcvid;
+#endif
+}
+gcsTASK_MASTER_TABLE;
+
+/******************************************************************************\
+***************************** gckVGINTERRUPT Object ******************************
+\******************************************************************************/
+
+typedef struct _gckVGINTERRUPT * gckVGINTERRUPT;
+
+typedef gceSTATUS (* gctINTERRUPT_HANDLER)(
+ IN gckVGKERNEL Kernel
+ );
+
+gceSTATUS
+gckVGINTERRUPT_Construct(
+ IN gckVGKERNEL Kernel,
+ OUT gckVGINTERRUPT * Interrupt
+ );
+
+gceSTATUS
+gckVGINTERRUPT_Destroy(
+ IN gckVGINTERRUPT Interrupt
+ );
+
+gceSTATUS
+gckVGINTERRUPT_Enable(
+ IN gckVGINTERRUPT Interrupt,
+ IN OUT gctINT32_PTR Id,
+ IN gctINTERRUPT_HANDLER Handler
+ );
+
+gceSTATUS
+gckVGINTERRUPT_Disable(
+ IN gckVGINTERRUPT Interrupt,
+ IN gctINT32 Id
+ );
+
+#ifndef __QNXNTO__
+
+gceSTATUS
+gckVGINTERRUPT_Enque(
+ IN gckVGINTERRUPT Interrupt
+ );
+
+#else
+
+gceSTATUS
+gckVGINTERRUPT_Enque(
+ IN gckVGINTERRUPT Interrupt,
+ OUT gckOS *Os,
+ OUT gctSEMAPHORE *Semaphore
+ );
+
+#endif
+
+gceSTATUS
+gckVGINTERRUPT_DumpState(
+ IN gckVGINTERRUPT Interrupt
+ );
+
+
+/******************************************************************************\
+******************************* gckVGCOMMAND Object *******************************
+\******************************************************************************/
+
+typedef struct _gckVGCOMMAND * gckVGCOMMAND;
+
+/* Construct a new gckVGCOMMAND object. */
+gceSTATUS
+gckVGCOMMAND_Construct(
+ IN gckVGKERNEL Kernel,
+ IN gctUINT TaskGranularity,
+ IN gctUINT QueueSize,
+ OUT gckVGCOMMAND * Command
+ );
+
+/* Destroy an gckVGCOMMAND object. */
+gceSTATUS
+gckVGCOMMAND_Destroy(
+ IN gckVGCOMMAND Command
+ );
+
+/* Query command buffer attributes. */
+gceSTATUS
+gckVGCOMMAND_QueryCommandBuffer(
+ IN gckVGCOMMAND Command,
+ OUT gcsCOMMAND_BUFFER_INFO_PTR Information
+ );
+
+/* Allocate a command queue. */
+gceSTATUS
+gckVGCOMMAND_Allocate(
+ IN gckVGCOMMAND Command,
+ IN gctSIZE_T Size,
+ OUT gcsCMDBUFFER_PTR * CommandBuffer,
+ OUT gctPOINTER * Data
+ );
+
+/* Release memory held by the command queue. */
+gceSTATUS
+gckVGCOMMAND_Free(
+ IN gckVGCOMMAND Command,
+ IN gcsCMDBUFFER_PTR CommandBuffer
+ );
+
+/* Schedule the command queue for execution. */
+gceSTATUS
+gckVGCOMMAND_Execute(
+ IN gckVGCOMMAND Command,
+ IN gcsCMDBUFFER_PTR CommandBuffer
+ );
+
+/* Commit a buffer to the command queue. */
+gceSTATUS
+gckVGCOMMAND_Commit(
+ IN gckVGCOMMAND Command,
+ IN gcsVGCONTEXT_PTR Context,
+ IN gcsVGCMDQUEUE_PTR Queue,
+ IN gctUINT EntryCount,
+ IN gcsTASK_MASTER_TABLE_PTR TaskTable
+ );
+
+/******************************************************************************\
+********************************* gckVGMMU Object ********************************
+\******************************************************************************/
+
+typedef struct _gckVGMMU * gckVGMMU;
+
+/* Construct a new gckVGMMU object. */
+gceSTATUS
+gckVGMMU_Construct(
+ IN gckVGKERNEL Kernel,
+ IN gctUINT32 MmuSize,
+ OUT gckVGMMU * Mmu
+ );
+
+/* Destroy an gckVGMMU object. */
+gceSTATUS
+gckVGMMU_Destroy(
+ IN gckVGMMU Mmu
+ );
+
+/* Allocate pages inside the MMU. */
+gceSTATUS
+gckVGMMU_AllocatePages(
+ IN gckVGMMU Mmu,
+ IN gctSIZE_T PageCount,
+ OUT gctPOINTER * PageTable,
+ OUT gctUINT32 * Address
+ );
+
+/* Remove a page table from the MMU. */
+gceSTATUS
+gckVGMMU_FreePages(
+ IN gckVGMMU Mmu,
+ IN gctPOINTER PageTable,
+ IN gctSIZE_T PageCount
+ );
+
+/* Set the MMU page with info. */
+gceSTATUS
+gckVGMMU_SetPage(
+ IN gckVGMMU Mmu,
+ IN gctUINT32 PageAddress,
+ IN gctUINT32 *PageEntry
+ );
+
+/* Flush MMU */
+gceSTATUS
+gckVGMMU_Flush(
+ IN gckVGMMU Mmu
+ );
+
+#endif /* gcdENABLE_VG */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* __gc_hal_h_ */
+
+
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_array.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_array.h
new file mode 100644
index 000000000000..6bc1e196882e
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_array.h
@@ -0,0 +1,119 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_allocator_array_h_
+#define __gc_hal_kernel_allocator_array_h_
+
+extern gceSTATUS
+_GFPAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+
+extern gceSTATUS
+_UserMemoryAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+
+extern gceSTATUS
+_ReservedMemoryAllocatorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+
+#ifdef CONFIG_DMA_SHARED_BUFFER
+extern gceSTATUS
+_DmabufAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+#endif
+
+#ifndef NO_DMA_COHERENT
+extern gceSTATUS
+_DmaAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+#endif
+
+/* Default allocator entry. */
+gcsALLOCATOR_DESC allocatorArray[] =
+{
+ /* GFP allocator. */
+ gcmkDEFINE_ALLOCATOR_DESC("gfp", _GFPAlloctorInit),
+
+ /* User memory importer. */
+ gcmkDEFINE_ALLOCATOR_DESC("user", _UserMemoryAlloctorInit),
+
+#ifdef CONFIG_DMA_SHARED_BUFFER
+ /* Dmabuf allocator. */
+ gcmkDEFINE_ALLOCATOR_DESC("dmabuf", _DmabufAlloctorInit),
+#endif
+
+#ifndef NO_DMA_COHERENT
+ gcmkDEFINE_ALLOCATOR_DESC("dma", _DmaAlloctorInit),
+#endif
+
+ gcmkDEFINE_ALLOCATOR_DESC("reserved-mem", _ReservedMemoryAllocatorInit),
+};
+
+#endif
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
new file mode 100644
index 000000000000..9a5bd4c7dc82
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dma.c
@@ -0,0 +1,605 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_allocator.h"
+
+#include <linux/pagemap.h>
+#include <linux/seq_file.h>
+#include <linux/mman.h>
+#include <asm/atomic.h>
+#include <linux/dma-mapping.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,19,0)
+#include <linux/dma-direct.h>
+#endif
+#include <linux/slab.h>
+#include <linux/platform_device.h>
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+typedef struct _gcsDMA_PRIV * gcsDMA_PRIV_PTR;
+typedef struct _gcsDMA_PRIV {
+ atomic_t usage;
+}
+gcsDMA_PRIV;
+
+struct mdl_dma_priv {
+ gctPOINTER kvaddr;
+ dma_addr_t dmaHandle;
+};
+
+/*
+* Debugfs support.
+*/
+static int gc_dma_usage_show(struct seq_file* m, void* data)
+{
+ gcsINFO_NODE *node = m->private;
+ gckALLOCATOR Allocator = node->device;
+ gcsDMA_PRIV_PTR priv = Allocator->privateData;
+ long long usage = (long long)atomic_read(&priv->usage);
+
+ seq_printf(m, "type n pages bytes\n");
+ seq_printf(m, "normal %10llu %12llu\n", usage, usage * PAGE_SIZE);
+
+ return 0;
+}
+
+static gcsINFO InfoList[] =
+{
+ {"dmausage", gc_dma_usage_show},
+};
+
+static void
+_DebugfsInit(
+ IN gckALLOCATOR Allocator,
+ IN gckDEBUGFS_DIR Root
+ )
+{
+ gcmkVERIFY_OK(
+ gckDEBUGFS_DIR_Init(&Allocator->debugfsDir, Root->root, "dma"));
+
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_CreateFiles(
+ &Allocator->debugfsDir,
+ InfoList,
+ gcmCOUNTOF(InfoList),
+ Allocator
+ ));
+}
+
+static void
+_DebugfsCleanup(
+ IN gckALLOCATOR Allocator
+ )
+{
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_RemoveFiles(
+ &Allocator->debugfsDir,
+ InfoList,
+ gcmCOUNTOF(InfoList)
+ ));
+
+ gckDEBUGFS_DIR_Deinit(&Allocator->debugfsDir);
+}
+
+static gceSTATUS
+_DmaAlloc(
+ IN gckALLOCATOR Allocator,
+ INOUT PLINUX_MDL Mdl,
+ IN gctSIZE_T NumPages,
+ IN gctUINT32 Flags
+ )
+{
+ gceSTATUS status;
+ u32 gfp = GFP_KERNEL | gcdNOWARN;
+ gcsDMA_PRIV_PTR allocatorPriv = (gcsDMA_PRIV_PTR)Allocator->privateData;
+
+ struct mdl_dma_priv *mdlPriv=gcvNULL;
+ gckOS os = Allocator->os;
+
+ gcmkHEADER_ARG("Mdl=%p NumPages=0x%zx Flags=0x%x", Mdl, NumPages, Flags);
+
+ gcmkONERROR(gckOS_Allocate(os, sizeof(struct mdl_dma_priv), (gctPOINTER *)&mdlPriv));
+ mdlPriv->kvaddr = gcvNULL;
+
+#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
+ if (Flags & gcvALLOC_FLAG_4GB_ADDR)
+ {
+ gfp |= __GFP_DMA32;
+ }
+#endif
+
+ mdlPriv->kvaddr
+#if defined CONFIG_MIPS || defined CONFIG_CPU_CSKYV2 || defined CONFIG_PPC || defined CONFIG_ARM64
+ = dma_alloc_coherent(galcore_device, NumPages * PAGE_SIZE, &mdlPriv->dmaHandle, gfp);
+#else
+ = dma_alloc_writecombine(galcore_device, NumPages * PAGE_SIZE, &mdlPriv->dmaHandle, gfp);
+#endif
+
+#ifdef CONFLICT_BETWEEN_BASE_AND_PHYS
+ if ((os->device->baseAddress & 0x80000000) != (mdlPriv->dmaHandle & 0x80000000))
+ {
+ mdlPriv->dmaHandle = (mdlPriv->dmaHandle & ~0x80000000)
+ | (os->device->baseAddress & 0x80000000);
+ }
+#endif
+
+ if (mdlPriv->kvaddr == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ Mdl->priv = mdlPriv;
+
+ Mdl->dmaHandle = mdlPriv->dmaHandle;
+
+ /* Statistic. */
+ atomic_add(NumPages, &allocatorPriv->usage);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (mdlPriv)
+ {
+ gckOS_Free(os, mdlPriv);
+ }
+
+ gcmkFOOTER();
+ 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 */
+ gctSIZE_T skipPages = Offset >> PAGE_SHIFT; /* skipped pages */
+ gctSIZE_T numPages = (PAGE_ALIGN(Offset + Bytes) >> PAGE_SHIFT) - skipPages;
+ gctSIZE_T 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);
+ }
+
+#if !defined(phys_to_page)
+ page = virt_to_page(mdlPriv->kvaddr);
+#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0)
+ page = phys_to_page(mdlPriv->dmaHandle);
+#else
+ page = phys_to_page(dma_to_phys(&Allocator->os->device->platform->device->dev, mdlPriv->dmaHandle));
+#endif
+
+ 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,
+ IN OUT PLINUX_MDL Mdl
+ )
+{
+ gckOS os = Allocator->os;
+ struct mdl_dma_priv *mdlPriv=(struct mdl_dma_priv *)Mdl->priv;
+ gcsDMA_PRIV_PTR allocatorPriv = (gcsDMA_PRIV_PTR)Allocator->privateData;
+
+#if defined CONFIG_MIPS || defined CONFIG_CPU_CSKYV2 || defined CONFIG_PPC || defined CONFIG_ARM64
+ dma_free_coherent(galcore_device, Mdl->numPages * PAGE_SIZE, mdlPriv->kvaddr, mdlPriv->dmaHandle);
+#else
+ dma_free_writecombine(galcore_device, Mdl->numPages * PAGE_SIZE, mdlPriv->kvaddr, mdlPriv->dmaHandle);
+#endif
+
+ gckOS_Free(os, mdlPriv);
+
+ /* Statistic. */
+ atomic_sub(Mdl->numPages, &allocatorPriv->usage);
+}
+
+static gceSTATUS
+_DmaMmap(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctBOOL Cacheable,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ IN struct vm_area_struct *vma
+ )
+{
+ struct mdl_dma_priv *mdlPriv = (struct mdl_dma_priv*)Mdl->priv;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Allocator=%p Mdl=%p vma=%p", Allocator, Mdl, vma);
+
+ 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) + skipPages,
+ numPages << PAGE_SHIFT,
+ pgprot_writecombine(vma->vm_page_prot)) < 0)
+#else
+ /* map kernel memory to user space.. */
+ if (dma_mmap_writecombine(galcore_device,
+ vma,
+ (gctINT8_PTR)mdlPriv->kvaddr + (skipPages << PAGE_SHIFT),
+ mdlPriv->dmaHandle + (skipPages << PAGE_SHIFT),
+ numPages << PAGE_SHIFT) < 0)
+#endif
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_WARNING, gcvZONE_OS,
+ "%s(%d): dma_mmap_attrs error",
+ __FUNCTION__, __LINE__
+ );
+
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+static void
+_DmaUnmapUser(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap,
+ IN gctUINT32 Size
+ )
+{
+ if (unlikely(current->mm == gcvNULL))
+ {
+ /* Do nothing if process is exiting. */
+ return;
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)
+ if (vm_munmap((unsigned long)MdlMap->vmaAddr, 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)MdlMap->vmaAddr, Size) < 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_WARNING, gcvZONE_OS,
+ "%s(%d): do_munmap failed",
+ __FUNCTION__, __LINE__
+ );
+ }
+ up_write(&current->mm->mmap_sem);
+#endif
+}
+
+static gceSTATUS
+_DmaMapUser(
+ gckALLOCATOR Allocator,
+ PLINUX_MDL Mdl,
+ PLINUX_MDL_MAP MdlMap,
+ gctBOOL Cacheable
+ )
+{
+ 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(_DmaMmap(Allocator, Mdl, Cacheable, 0, Mdl->numPages, vma));
+
+ MdlMap->vmaAddr = userLogical;
+ MdlMap->cacheable = gcvFALSE;
+ MdlMap->vma = vma;
+ }
+ while (gcvFALSE);
+ up_write(&current->mm->mmap_sem);
+
+OnError:
+ if (gcmIS_ERROR(status) && userLogical)
+ {
+ _DmaUnmapUser(Allocator, Mdl, userLogical, Mdl->numPages * PAGE_SIZE);
+ }
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_DmaMapKernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *Logical
+ )
+{
+ struct mdl_dma_priv *mdlPriv=(struct mdl_dma_priv *)Mdl->priv;
+ *Logical = (uint8_t *)mdlPriv->kvaddr + Offset;
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_DmaUnmapKernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctPOINTER Logical
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_DmaCache(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes,
+ IN gceCACHEOPERATION Operation
+ )
+{
+ switch (Operation)
+ {
+ case gcvCACHE_CLEAN:
+ case gcvCACHE_FLUSH:
+ _MemoryBarrier();
+ break;
+ case gcvCACHE_INVALIDATE:
+ break;
+ default:
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_DmaPhysical(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * Physical
+ )
+{
+ struct mdl_dma_priv *mdlPriv=(struct mdl_dma_priv *)Mdl->priv;
+
+ *Physical = mdlPriv->dmaHandle + Offset;
+
+ return gcvSTATUS_OK;
+}
+
+static void
+_DmaAllocatorDestructor(
+ gcsALLOCATOR *Allocator
+ )
+{
+ _DebugfsCleanup(Allocator);
+
+ if (Allocator->privateData)
+ {
+ kfree(Allocator->privateData);
+ }
+
+ kfree(Allocator);
+}
+
+/* Default allocator operations. */
+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. */
+gceSTATUS
+_DmaAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ )
+{
+ gceSTATUS status;
+ gckALLOCATOR allocator = gcvNULL;
+ gcsDMA_PRIV_PTR priv = gcvNULL;
+
+ gcmkONERROR(gckALLOCATOR_Construct(Os, &DmaAllocatorOperations, &allocator));
+
+ priv = kzalloc(gcmSIZEOF(gcsDMA_PRIV), GFP_KERNEL | gcdNOWARN);
+
+ if (!priv)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ atomic_set(&priv->usage, 0);
+
+ /* Register private data. */
+ allocator->privateData = priv;
+ allocator->destructor = _DmaAllocatorDestructor;
+
+ _DebugfsInit(allocator, Parent);
+
+ /*
+ * DMA allocator is only used for NonPaged memory
+ * when NO_DMA_COHERENT is not defined.
+ */
+ allocator->capability = gcvALLOC_FLAG_CONTIGUOUS
+ | gcvALLOC_FLAG_DMABUF_EXPORTABLE
+#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
+ | gcvALLOC_FLAG_4GB_ADDR
+#endif
+ ;
+
+ *Allocator = allocator;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (allocator)
+ {
+ kfree(allocator);
+ }
+ return status;
+}
+
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
new file mode 100644
index 000000000000..97ab69804f70
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_dmabuf.c
@@ -0,0 +1,552 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_allocator.h"
+
+#include <linux/pagemap.h>
+#include <linux/seq_file.h>
+#include <linux/mman.h>
+#include <linux/slab.h>
+#include <linux/mutex.h>
+#include <asm/atomic.h>
+#include <linux/dma-mapping.h>
+
+#include <linux/dma-buf.h>
+#include <linux/platform_device.h>
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+/* Descriptor of a dma_buf imported. */
+typedef struct _gcsDMABUF
+{
+ struct dma_buf * dmabuf;
+ struct dma_buf_attachment * attachment;
+ struct sg_table * sgt;
+ unsigned long * pagearray;
+
+ int npages;
+ int pid;
+ struct list_head list;
+}
+gcsDMABUF;
+
+struct allocator_priv
+{
+ struct mutex lock;
+ struct list_head buf_list;
+};
+
+/*
+* Debugfs support.
+*/
+static int dma_buf_info_show(struct seq_file* m, void* data)
+{
+ int ret;
+ gcsDMABUF *buf_desc;
+ struct dma_buf_attachment *attach_obj;
+ int count = 0;
+ size_t size = 0;
+ int npages = 0;
+ const char *exp_name;
+
+ gcsINFO_NODE *node = m->private;
+ gckALLOCATOR allocator = node->device;
+ struct allocator_priv *priv = allocator->privateData;
+
+ ret = mutex_lock_interruptible(&priv->lock);
+
+ if (ret)
+ return ret;
+
+ seq_puts(m, "Attached dma-buf objects:\n");
+ seq_puts(m, " pid fd pages size exporter attached-devices\n");
+
+ list_for_each_entry(buf_desc, &priv->buf_list, list) {
+ struct dma_buf *buf_obj = buf_desc->dmabuf;
+
+ ret = mutex_lock_interruptible(&buf_obj->lock);
+
+ if (ret) {
+ seq_puts(m,
+ "ERROR locking buffer object: skipping\n");
+ continue;
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+ exp_name = buf_obj->exp_name;
+#else
+ exp_name = "unknown";
+#endif
+
+ seq_printf(m, "%6d %p %8d %8zu %10s",
+ buf_desc->pid,
+ buf_desc->dmabuf,
+ buf_desc->npages,
+ buf_obj->size,
+ exp_name);
+
+ list_for_each_entry(attach_obj, &buf_obj->attachments, node) {
+ seq_printf(m, " %s", dev_name(attach_obj->dev));
+ }
+ seq_puts(m, "\n");
+
+ count++;
+ size += buf_obj->size;
+ npages += buf_desc->npages;
+
+ mutex_unlock(&buf_obj->lock);
+ }
+
+ seq_printf(m, "\nTotal %d objects, %d pages, %zu bytes\n", count, npages, size);
+
+ mutex_unlock(&priv->lock);
+ return 0;
+}
+
+static gcsINFO _InfoList[] =
+{
+ {"bufinfo", dma_buf_info_show},
+};
+
+static void
+_DebugfsInit(
+ IN gckALLOCATOR Allocator,
+ IN gckDEBUGFS_DIR Root
+ )
+{
+ gcmkVERIFY_OK(
+ gckDEBUGFS_DIR_Init(&Allocator->debugfsDir, Root->root, "dma_buf"));
+
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_CreateFiles(
+ &Allocator->debugfsDir,
+ _InfoList,
+ gcmCOUNTOF(_InfoList),
+ Allocator
+ ));
+}
+
+static void
+_DebugfsCleanup(
+ IN gckALLOCATOR Allocator
+ )
+{
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_RemoveFiles(
+ &Allocator->debugfsDir,
+ _InfoList,
+ gcmCOUNTOF(_InfoList)
+ ));
+
+ gckDEBUGFS_DIR_Deinit(&Allocator->debugfsDir);
+}
+
+static gceSTATUS
+_DmabufAttach(
+ IN gckALLOCATOR Allocator,
+ IN gcsATTACH_DESC_PTR Desc,
+ IN PLINUX_MDL Mdl
+ )
+{
+ gceSTATUS status;
+
+ gckOS os = Allocator->os;
+
+ struct dma_buf *dmabuf = Desc->dmaBuf.dmabuf;
+ struct sg_table *sgt = NULL;
+ struct dma_buf_attachment *attachment = NULL;
+ int npages = 0;
+ unsigned long *pagearray = NULL;
+ int i, j, k = 0;
+ struct scatterlist *s;
+ struct allocator_priv *priv = Allocator->privateData;
+ gcsDMABUF *buf_desc = NULL;
+
+ gcmkHEADER();
+
+ gcmkVERIFY_OBJECT(os, gcvOBJ_OS);
+
+ if (!dmabuf)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ get_dma_buf(dmabuf);
+ attachment = dma_buf_attach(dmabuf, &os->device->platform->device->dev);
+
+ if (!attachment)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ sgt = dma_buf_map_attachment(attachment, DMA_BIDIRECTIONAL);
+
+ if (!sgt)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ /* Prepare page array. */
+ /* Get number of pages. */
+ for_each_sg(sgt->sgl, s, sgt->orig_nents, i)
+ {
+ npages += (sg_dma_len(s) + PAGE_SIZE - 1) / PAGE_SIZE;
+ }
+
+ /* Allocate page array. */
+ gcmkONERROR(gckOS_Allocate(os, npages * gcmSIZEOF(*pagearray), (gctPOINTER *)&pagearray));
+
+ /* Fill page array. */
+ for_each_sg(sgt->sgl, s, sgt->orig_nents, i)
+ {
+ for (j = 0; j < (sg_dma_len(s) + PAGE_SIZE - 1) / PAGE_SIZE; j++)
+ {
+ pagearray[k++] = sg_dma_address(s) + j * PAGE_SIZE;
+ }
+ }
+
+ /* Prepare descriptor. */
+ gcmkONERROR(gckOS_Allocate(os, sizeof(gcsDMABUF), (gctPOINTER *)&buf_desc));
+
+ buf_desc->dmabuf = dmabuf;
+ buf_desc->pagearray = pagearray;
+ buf_desc->attachment = attachment;
+ buf_desc->sgt = sgt;
+
+ /* Record in buffer list to support debugfs. */
+ buf_desc->npages = npages;
+ buf_desc->pid = _GetProcessID();
+
+ mutex_lock(&priv->lock);
+ list_add(&buf_desc->list, &priv->buf_list);
+ mutex_unlock(&priv->lock);
+
+ /* Record page number. */
+ Mdl->numPages = npages;
+
+ Mdl->priv = buf_desc;
+
+ Mdl->contiguous = (sgt->nents == 1) ? gcvTRUE : gcvFALSE;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (pagearray)
+ {
+ gcmkOS_SAFE_FREE(os, pagearray);
+ }
+
+ if (sgt)
+ {
+ dma_buf_unmap_attachment(attachment, sgt, DMA_BIDIRECTIONAL);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+
+static void
+_DmabufFree(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl
+ )
+{
+ gcsDMABUF *buf_desc = Mdl->priv;
+ gckOS os = Allocator->os;
+ struct allocator_priv *priv = Allocator->privateData;
+
+ mutex_lock(&priv->lock);
+ list_del(&buf_desc->list);
+ mutex_unlock(&priv->lock);
+
+ dma_buf_unmap_attachment(buf_desc->attachment, buf_desc->sgt, DMA_BIDIRECTIONAL);
+
+ dma_buf_detach(buf_desc->dmabuf, buf_desc->attachment);
+
+ dma_buf_put(buf_desc->dmabuf);
+
+ gckOS_Free(os, buf_desc->pagearray);
+
+ gckOS_Free(os, buf_desc);
+}
+
+static void
+_DmabufUnmapUser(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap,
+ IN gctUINT32 Size
+ )
+{
+ gcsDMABUF *buf_desc = Mdl->priv;
+ gctINT8_PTR userLogical = MdlMap->vmaAddr;
+
+ if (unlikely(current->mm == gcvNULL))
+ {
+ /* Do nothing if process is exiting. */
+ return;
+ }
+
+ userLogical -= buf_desc->sgt->sgl->offset;
+ vm_munmap((unsigned long)userLogical, Mdl->numPages << PAGE_SHIFT);
+}
+
+static gceSTATUS
+_DmabufMapUser(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap,
+ IN gctBOOL Cacheable
+ )
+{
+ gcsDMABUF *buf_desc = Mdl->priv;
+ gctINT8_PTR userLogical = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ userLogical = (gctINT8_PTR)vm_mmap(buf_desc->dmabuf->file,
+ 0L,
+ Mdl->numPages << PAGE_SHIFT,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_NORESERVE,
+ 0);
+
+ if (IS_ERR(userLogical))
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+ userLogical += buf_desc->sgt->sgl->offset;
+
+ /* To make sure the mapping is created. */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
+ if (access_ok(userLogical, 4))
+#else
+ if (access_ok(VERIFY_READ, userLogical, 4))
+#endif
+ {
+ uint32_t mem;
+ get_user(mem, (uint32_t *)userLogical);
+
+ (void)mem;
+ }
+
+ MdlMap->vmaAddr = (gctPOINTER)userLogical;
+ MdlMap->cacheable = Cacheable;
+
+OnError:
+ if (gcmIS_ERROR(status) && MdlMap->vmaAddr)
+ {
+ _DmabufUnmapUser(Allocator, Mdl, MdlMap, Mdl->numPages << PAGE_SHIFT);
+ }
+ return status;
+}
+
+static gceSTATUS
+_DmabufMapKernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *Logical
+ )
+{
+ /* Kernel doesn't acess video memory. */
+ return gcvSTATUS_NOT_SUPPORTED;
+
+}
+
+static gceSTATUS
+_DmabufUnmapKernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctPOINTER Logical
+ )
+{
+ /* Kernel doesn't acess video memory. */
+ return gcvSTATUS_NOT_SUPPORTED;
+}
+
+static gceSTATUS
+_DmabufCache(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes,
+ IN gceCACHEOPERATION Operation
+ )
+{
+ gcsDMABUF *buf_desc = Mdl->priv;
+ struct sg_table *sgt = buf_desc->sgt;
+ enum dma_data_direction dir;
+
+ switch (Operation)
+ {
+ case gcvCACHE_CLEAN:
+ dir = DMA_TO_DEVICE;
+ dma_sync_sg_for_device(galcore_device, sgt->sgl, sgt->nents, dir);
+ break;
+ case gcvCACHE_FLUSH:
+ dir = DMA_TO_DEVICE;
+ dma_sync_sg_for_device(galcore_device, sgt->sgl, sgt->nents, dir);
+ dir = DMA_FROM_DEVICE;
+ dma_sync_sg_for_cpu(galcore_device, sgt->sgl, sgt->nents, dir);
+ break;
+ case gcvCACHE_INVALIDATE:
+ dir = DMA_FROM_DEVICE;
+ dma_sync_sg_for_cpu(galcore_device, sgt->sgl, sgt->nents, dir);
+ break;
+ default:
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+
+static gceSTATUS
+_DmabufPhysical(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * Physical
+ )
+{
+ gcsDMABUF *buf_desc = Mdl->priv;
+ gctUINT32 offsetInPage = Offset & ~PAGE_MASK;
+ gctUINT32 index = Offset / PAGE_SIZE;
+
+ *Physical = buf_desc->pagearray[index] + offsetInPage;
+
+
+ return gcvSTATUS_OK;
+}
+
+/* Default allocator operations. */
+static gcsALLOCATOR_OPERATIONS DmabufAllocatorOperations =
+{
+ .Attach = _DmabufAttach,
+ .Free = _DmabufFree,
+ .MapUser = _DmabufMapUser,
+ .UnmapUser = _DmabufUnmapUser,
+ .MapKernel = _DmabufMapKernel,
+ .UnmapKernel = _DmabufUnmapKernel,
+ .Cache = _DmabufCache,
+ .Physical = _DmabufPhysical,
+};
+
+static void
+_DmabufAllocatorDestructor(
+ gcsALLOCATOR *Allocator
+ )
+{
+ _DebugfsCleanup(Allocator);
+
+ if (Allocator->privateData)
+ {
+ kfree(Allocator->privateData);
+ }
+
+ kfree(Allocator);
+}
+
+/* Default allocator entry. */
+gceSTATUS
+_DmabufAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ )
+{
+ gceSTATUS status;
+ gckALLOCATOR allocator;
+ struct allocator_priv *priv = NULL;
+
+ priv = kmalloc(sizeof (struct allocator_priv), GFP_KERNEL | gcdNOWARN);
+
+ if (!priv)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ mutex_init(&priv->lock);
+ INIT_LIST_HEAD(&priv->buf_list);
+
+ gcmkONERROR(
+ gckALLOCATOR_Construct(Os, &DmabufAllocatorOperations, &allocator));
+
+ allocator->capability = gcvALLOC_FLAG_DMABUF
+ | gcvALLOC_FLAG_DMABUF_EXPORTABLE
+ ;
+
+ /* Register private data. */
+ allocator->privateData = priv;
+ allocator->destructor = _DmabufAllocatorDestructor;
+
+ _DebugfsInit(allocator, Parent);
+
+ *Allocator = allocator;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (priv)
+ {
+ kfree(priv);
+ }
+
+ return status;
+}
+
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
new file mode 100644
index 000000000000..3d98d16053b3
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_gfp.c
@@ -0,0 +1,1389 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_allocator.h"
+#include <linux/pagemap.h>
+#include <linux/seq_file.h>
+#include <linux/mman.h>
+#include <asm/atomic.h>
+#include <linux/dma-mapping.h>
+#include <linux/slab.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,12,0)
+#include <asm/set_memory.h>
+#endif
+#include "gc_hal_kernel_platform.h"
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+#define gcdDISCRETE_PAGES 0
+
+struct gfp_alloc
+{
+ atomic_t low;
+ atomic_t high;
+};
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION (2,6,24)
+struct sg_table
+{
+ struct scatterlist *sgl;
+ unsigned int nents;
+ unsigned int orig_nents;
+};
+#endif
+
+struct gfp_mdl_priv
+{
+ int contiguous;
+
+ union
+ {
+ /* Pointer to a array of pages. */
+ struct
+ {
+ struct page *contiguousPages;
+ dma_addr_t dma_addr;
+ int exact;
+ };
+
+ struct
+ {
+ /* Pointer to a array of pointers to page. */
+ struct page **nonContiguousPages;
+
+ struct page **Pages1M;
+ int numPages1M;
+ int *isExact;
+ struct sg_table sgt;
+ };
+ };
+
+ gcsPLATFORM * platform;
+};
+
+/******************************************************************************\
+************************** GFP Allocator Debugfs ***************************
+\******************************************************************************/
+
+static int gc_usage_show(struct seq_file* m, void* data)
+{
+ gcsINFO_NODE *node = m->private;
+ gckALLOCATOR Allocator = node->device;
+ struct gfp_alloc *priv = Allocator->privateData;
+ long long low = (long long)atomic_read(&priv->low);
+ long long high = (long long)atomic_read(&priv->high);
+
+ seq_printf(m, "type n pages bytes\n");
+ seq_printf(m, "normal %10llu %12llu\n", low, low * PAGE_SIZE);
+ seq_printf(m, "HighMem %10llu %12llu\n", high, high * PAGE_SIZE);
+
+ return 0;
+}
+
+static gcsINFO InfoList[] =
+{
+ {"usage", gc_usage_show},
+};
+
+static void
+_GFPAllocatorDebugfsInit(
+ IN gckALLOCATOR Allocator,
+ IN gckDEBUGFS_DIR Root
+ )
+{
+ gcmkVERIFY_OK(
+ gckDEBUGFS_DIR_Init(&Allocator->debugfsDir, Root->root, "gfp"));
+
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_CreateFiles(
+ &Allocator->debugfsDir,
+ InfoList,
+ gcmCOUNTOF(InfoList),
+ Allocator
+ ));
+}
+
+static void
+_GFPAllocatorDebugfsCleanup(
+ IN gckALLOCATOR Allocator
+ )
+{
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_RemoveFiles(
+ &Allocator->debugfsDir,
+ InfoList,
+ gcmCOUNTOF(InfoList)
+ ));
+
+ gckDEBUGFS_DIR_Deinit(&Allocator->debugfsDir);
+}
+
+static void
+_NonContiguousFree(
+ IN struct page ** Pages,
+ IN gctSIZE_T NumPages
+ )
+{
+ gctSIZE_T i;
+
+ gcmkHEADER_ARG("Pages=%p, NumPages=%zx", Pages, NumPages);
+
+ gcmkASSERT(Pages != gcvNULL);
+
+ for (i = 0; i < NumPages; i++)
+ {
+ __free_page(Pages[i]);
+ }
+
+ if (is_vmalloc_addr(Pages))
+ {
+ vfree(Pages);
+ }
+ else
+ {
+ kfree(Pages);
+ }
+
+ gcmkFOOTER_NO();
+}
+
+static gceSTATUS
+_NonContiguousAlloc(
+ IN struct gfp_mdl_priv *MdlPriv,
+ IN gctSIZE_T NumPages,
+ IN gctUINT32 Gfp
+ )
+{
+ struct page ** pages;
+ struct page *p;
+ gctSIZE_T i, size;
+
+ gcmkHEADER_ARG("NumPages=%zx", NumPages);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
+ if (NumPages > totalram_pages())
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32)
+ if (NumPages > totalram_pages)
+#else
+ if (NumPages > num_physpages)
+#endif
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ size = NumPages * sizeof(struct page *);
+
+ pages = kmalloc(size, GFP_KERNEL | gcdNOWARN);
+
+ if (!pages)
+ {
+ pages = vmalloc(size);
+
+ if (!pages)
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OUT_OF_MEMORY;
+ }
+ }
+
+ for (i = 0; i < NumPages; i++)
+ {
+ p = alloc_page(Gfp);
+
+ if (!p)
+ {
+ _NonContiguousFree(pages, i);
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OUT_OF_MEMORY;
+ }
+
+#if gcdDISCRETE_PAGES
+ if (i != 0)
+ {
+ if (page_to_pfn(pages[i-1]) == page_to_pfn(p)-1)
+ {
+ /* Replaced page. */
+ struct page *l = p;
+
+ /* Allocate a page which is not contiguous to previous one. */
+ p = alloc_page(Gfp);
+
+ /* Give replaced page back. */
+ __free_page(l);
+
+ if (!p)
+ {
+ _NonContiguousFree(pages, i);
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OUT_OF_MEMORY;
+ }
+ }
+ }
+#endif
+
+ pages[i] = p;
+ }
+
+ MdlPriv->contiguousPages = (struct page *)pages;
+
+ gcmkFOOTER_ARG("pages=0x%X", pages);
+ return gcvSTATUS_OK;
+}
+
+static void
+_NonContiguous1MPagesFree(
+ IN struct gfp_mdl_priv *MdlPriv,
+ IN gctUINT32 NumPages1M
+ )
+{
+ gctINT i;
+
+ if (MdlPriv->Pages1M && MdlPriv->isExact)
+ {
+ for (i = 0; i < NumPages1M && MdlPriv->Pages1M[i]; i++)
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
+ if (MdlPriv->isExact[i] == gcvTRUE)
+ {
+ free_pages_exact(page_address(MdlPriv->Pages1M[i]), gcd1M_PAGE_SIZE);
+ }
+ else
+#endif
+ {
+ __free_pages(MdlPriv->Pages1M[i], get_order(gcd1M_PAGE_SIZE));
+ }
+ }
+ }
+
+ if (MdlPriv->Pages1M)
+ {
+ if (is_vmalloc_addr(MdlPriv->Pages1M))
+ {
+ vfree(MdlPriv->Pages1M);
+ }
+ else
+ {
+ kfree(MdlPriv->Pages1M);
+ }
+ MdlPriv->Pages1M = gcvNULL;
+ }
+
+ if (MdlPriv->isExact)
+ {
+ if (is_vmalloc_addr(MdlPriv->isExact))
+ {
+ vfree(MdlPriv->isExact);
+ }
+ else
+ {
+ kfree(MdlPriv->isExact);
+ }
+ }
+
+ if (MdlPriv->nonContiguousPages)
+ {
+ if (is_vmalloc_addr(MdlPriv->nonContiguousPages))
+ {
+ vfree(MdlPriv->nonContiguousPages);
+ }
+ else
+ {
+ kfree(MdlPriv->nonContiguousPages);
+ }
+ MdlPriv->nonContiguousPages = gcvNULL;
+ }
+}
+
+static gceSTATUS
+_NonContiguous1MPagesAlloc(
+ IN struct gfp_mdl_priv *MdlPriv,
+ IN gctSIZE_T *NumPages,
+ IN gctUINT32 Gfp
+ )
+{
+ gceSTATUS status;
+ size_t numPages1M, num, size;
+ struct page **pages;
+ struct page *page;
+ void *addr = NULL;
+ gctINT i, j;
+
+ MdlPriv->numPages1M = 0;
+
+ numPages1M = ((*NumPages << PAGE_SHIFT) + (gcd1M_PAGE_SIZE - 1)) >> gcd1M_PAGE_SHIFT;
+
+ *NumPages = (numPages1M << gcd1M_PAGE_SHIFT) >> PAGE_SHIFT;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
+ if (*NumPages > totalram_pages())
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32)
+ if (*NumPages > totalram_pages)
+#else
+ if (*NumPages > num_physpages)
+#endif
+ {
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ num = gcd1M_PAGE_SIZE / PAGE_SIZE;
+
+ size = numPages1M * sizeof(struct page *);
+ MdlPriv->Pages1M = kmalloc(size, GFP_KERNEL | gcdNOWARN);
+ if (!MdlPriv->Pages1M)
+ {
+ MdlPriv->Pages1M = vmalloc(size);
+
+ if (!MdlPriv->Pages1M)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ }
+
+ size = numPages1M * sizeof(int);
+ MdlPriv->isExact = kmalloc(size, GFP_KERNEL | gcdNOWARN);
+ if (!MdlPriv->isExact)
+ {
+ MdlPriv->isExact = vmalloc(size);
+ if (!MdlPriv->isExact)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ }
+
+ size = *NumPages * sizeof(struct page *);
+ pages = kmalloc(size, GFP_KERNEL | gcdNOWARN);
+ if (!pages)
+ {
+ pages = vmalloc(size);
+ if (!pages)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ }
+ MdlPriv->contiguousPages = (struct page *)pages;
+
+ for (i = 0; i < numPages1M; i++)
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
+ addr = alloc_pages_exact(gcd1M_PAGE_SIZE, (Gfp & ~__GFP_HIGHMEM) | __GFP_NORETRY);
+
+ MdlPriv->Pages1M[i] = addr ? virt_to_page(addr) : gcvNULL;
+ if (MdlPriv->Pages1M[i])
+ {
+ MdlPriv->isExact[i] = gcvTRUE;
+ }
+#endif
+
+ if (MdlPriv->Pages1M[i] == gcvNULL)
+ {
+ int order = get_order(gcd1M_PAGE_SIZE);
+
+ if (order >= MAX_ORDER)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ MdlPriv->Pages1M[i] = alloc_pages(Gfp, order);
+ }
+
+ if (MdlPriv->Pages1M[i] == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ MdlPriv->numPages1M += 1;
+
+ for (j = 0; j < num; j++)
+ {
+ page = nth_page(MdlPriv->Pages1M[i], j);
+ pages[i * num + j] = page;
+ }
+ }
+
+ return gcvSTATUS_OK;
+OnError:
+ _NonContiguous1MPagesFree(MdlPriv, MdlPriv->numPages1M);
+
+ return status;
+}
+
+/***************************************************************************\
+************************ GFP Allocator **********************************
+\***************************************************************************/
+static gceSTATUS
+_GFPAlloc(
+ IN gckALLOCATOR Allocator,
+ INOUT PLINUX_MDL Mdl,
+ IN gctSIZE_T NumPages,
+ IN gctUINT32 Flags
+ )
+{
+ gceSTATUS status;
+ gctSIZE_T i = 0;
+ gctBOOL contiguous = Flags & gcvALLOC_FLAG_CONTIGUOUS;
+ u32 gfp = (contiguous ? (__GFP_HIGH | __GFP_ATOMIC) : GFP_KERNEL) | __GFP_HIGHMEM | gcdNOWARN;
+
+ struct gfp_alloc *priv = (struct gfp_alloc *)Allocator->privateData;
+ struct gfp_mdl_priv *mdlPriv = gcvNULL;
+ int result;
+ int low = 0;
+ int high = 0;
+
+ gcmkHEADER_ARG("Allocator=%p Mdl=%p NumPages=%zu Flags=0x%x", Allocator, Mdl, NumPages, Flags);
+
+#ifdef gcdSYS_FREE_MEMORY_LIMIT
+ if (Flags & gcvALLOC_FLAG_MEMLIMIT)
+ {
+ struct sysinfo temsysinfo;
+ si_meminfo(&temsysinfo);
+
+ if ((temsysinfo.freeram < NumPages) || ((temsysinfo.freeram-NumPages) < gcdSYS_FREE_MEMORY_LIMIT))
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ }
+#endif
+
+ mdlPriv = kzalloc(sizeof(struct gfp_mdl_priv), GFP_KERNEL | __GFP_NORETRY);
+
+ if (!mdlPriv)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
+ if ((Flags & gcvALLOC_FLAG_4GB_ADDR) || (Allocator->os->device->platform->flagBits & gcvPLATFORM_FLAG_LIMIT_4G_ADDRESS))
+ {
+ /* remove __GFP_HIGHMEM bit, add __GFP_DMA32 bit */
+ gfp &= ~__GFP_HIGHMEM;
+ gfp |= __GFP_DMA32;
+ }
+#else
+ if (Flags & gcvALLOC_FLAG_4GB_ADDR || (Allocator->os->device->platform->flagBits & gcvPLATFORM_FLAG_LIMIT_4G_ADDRESS))
+ {
+ /* remove __GFP_HIGHMEM bit, add __GFP_DMA bit */
+ gfp &= ~__GFP_HIGHMEM;
+ gfp |= __GFP_DMA;
+ }
+
+#endif
+
+ if ((Flags & gcvALLOC_FLAG_NON_CONTIGUOUS) && (Flags & gcvALLOC_FLAG_1M_PAGES))
+ {
+ Mdl->pageUnit1M = gcvTRUE;
+ }
+ else
+ {
+ Mdl->pageUnit1M = gcvFALSE;
+ }
+
+ if (contiguous)
+ {
+ size_t bytes = NumPages << PAGE_SHIFT;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
+ void *addr = NULL;
+
+ addr = alloc_pages_exact(bytes, (gfp & ~__GFP_HIGHMEM) | __GFP_NORETRY);
+
+ mdlPriv->contiguousPages = addr ? virt_to_page(addr) : gcvNULL;
+
+ if (mdlPriv->contiguousPages)
+ {
+ mdlPriv->exact = gcvTRUE;
+ }
+#endif
+
+ if (mdlPriv->contiguousPages == gcvNULL)
+ {
+ int order = get_order(bytes);
+
+ if (order >= MAX_ORDER)
+ {
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ goto OnError;
+ }
+
+ mdlPriv->contiguousPages = alloc_pages(gfp, order);
+ }
+
+ if (mdlPriv->contiguousPages == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ mdlPriv->dma_addr = dma_map_page(galcore_device,
+ mdlPriv->contiguousPages, 0, NumPages * PAGE_SIZE,
+ DMA_FROM_DEVICE);
+
+ if (dma_mapping_error(galcore_device, mdlPriv->dma_addr))
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
+ if (mdlPriv->exact)
+ {
+ free_pages_exact(page_address(mdlPriv->contiguousPages), bytes);
+ }
+ else
+#endif
+ {
+ __free_pages(mdlPriv->contiguousPages, get_order(bytes));
+ }
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+#if defined(CONFIG_X86)
+ if (!PageHighMem(mdlPriv->contiguousPages))
+ {
+ if (set_memory_wc((unsigned long)page_address(mdlPriv->contiguousPages), NumPages) != 0)
+ {
+ printk("%s(%d): failed to set_memory_wc\n", __func__, __LINE__);
+ }
+ }
+#endif
+ }
+ else
+ {
+ if (Mdl->pageUnit1M)
+ {
+ gcmkONERROR(_NonContiguous1MPagesAlloc(mdlPriv, &NumPages, gfp));
+ }
+ else
+ {
+ gcmkONERROR(_NonContiguousAlloc(mdlPriv, NumPages, gfp));
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \
+ && (defined(ARCH_HAS_SG_CHAIN) || defined(CONFIG_ARCH_HAS_SG_CHAIN))
+ result = sg_alloc_table_from_pages(&mdlPriv->sgt,
+ mdlPriv->nonContiguousPages, NumPages, 0,
+ NumPages << PAGE_SHIFT, GFP_KERNEL);
+
+#else
+ result = alloc_sg_list_from_pages(&mdlPriv->sgt.sgl,
+ mdlPriv->nonContiguousPages, NumPages, 0,
+ NumPages << PAGE_SHIFT, &mdlPriv->sgt.nents);
+
+ mdlPriv->sgt.orig_nents = mdlPriv->sgt.nents;
+#endif
+ if (result < 0)
+ {
+ if (Mdl->pageUnit1M)
+ {
+ _NonContiguous1MPagesFree(mdlPriv, mdlPriv->numPages1M);
+ }
+ else
+ {
+ _NonContiguousFree(mdlPriv->nonContiguousPages, NumPages);
+ }
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ result = dma_map_sg(galcore_device,
+ mdlPriv->sgt.sgl, mdlPriv->sgt.nents, DMA_FROM_DEVICE);
+
+ if (result != mdlPriv->sgt.nents)
+ {
+ if (Mdl->pageUnit1M)
+ {
+ _NonContiguous1MPagesFree(mdlPriv, mdlPriv->numPages1M);
+ }
+ else
+ {
+ _NonContiguousFree(mdlPriv->nonContiguousPages, NumPages);
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \
+ && (defined (ARCH_HAS_SG_CHAIN) || defined (CONFIG_ARCH_HAS_SG_CHAIN))
+ sg_free_table(&mdlPriv->sgt);
+#else
+ kfree(mdlPriv->sgt.sgl);
+#endif
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+#if defined(CONFIG_X86)
+ if (set_pages_array_wc(mdlPriv->nonContiguousPages, NumPages))
+ {
+ printk("%s(%d): failed to set_pages_array_wc\n", __func__, __LINE__);
+ }
+#endif
+ }
+
+ for (i = 0; i < NumPages; i++)
+ {
+ struct page *page;
+ gctPHYS_ADDR_T phys = 0U;
+
+ if (contiguous)
+ {
+ page = nth_page(mdlPriv->contiguousPages, i);
+ }
+ else
+ {
+ page = mdlPriv->nonContiguousPages[i];
+ }
+
+ SetPageReserved(page);
+
+ phys = page_to_phys(page);
+
+ BUG_ON(!phys);
+
+ if (PageHighMem(page))
+ {
+ high++;
+ }
+ else
+ {
+ low++;
+ }
+ }
+
+ mdlPriv->platform = Allocator->os->device->platform;
+ mdlPriv->contiguous = contiguous;
+ atomic_add(low, &priv->low);
+ atomic_add(high, &priv->high);
+
+ Mdl->priv = mdlPriv;
+ Mdl->numPages = NumPages;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (mdlPriv)
+ {
+ kfree(mdlPriv);
+ }
+
+ gcmkFOOTER();
+ 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 */
+ gctSIZE_T skipPages = Offset >> PAGE_SHIFT; /* skipped pages */
+ gctSIZE_T numPages = (PAGE_ALIGN(Offset + Bytes) >> PAGE_SHIFT) - skipPages;
+ gctSIZE_T 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,
+ IN OUT PLINUX_MDL Mdl
+ )
+{
+ gctSIZE_T i;
+ struct page * page;
+ struct gfp_alloc *priv = (struct gfp_alloc *)Allocator->privateData;
+ struct gfp_mdl_priv *mdlPriv = Mdl->priv;
+ int low = 0;
+ int high = 0;
+
+ if (Mdl->contiguous)
+ {
+ dma_unmap_page(galcore_device, mdlPriv->dma_addr,
+ Mdl->numPages << PAGE_SHIFT, DMA_FROM_DEVICE);
+ }
+ else
+ {
+ dma_unmap_sg(galcore_device, mdlPriv->sgt.sgl, mdlPriv->sgt.nents,
+ DMA_FROM_DEVICE);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \
+ && (defined (ARCH_HAS_SG_CHAIN) || defined (CONFIG_ARCH_HAS_SG_CHAIN))
+ sg_free_table(&mdlPriv->sgt);
+#else
+ kfree(mdlPriv->sgt.sgl);
+#endif
+ }
+
+ for (i = 0; i < Mdl->numPages; i++)
+ {
+ if (Mdl->contiguous)
+ {
+ page = nth_page(mdlPriv->contiguousPages, i);
+ }
+ else
+ {
+ page = mdlPriv->nonContiguousPages[i];
+ }
+
+ ClearPageReserved(page);
+
+ if (PageHighMem(page))
+ {
+ high++;
+ }
+ else
+ {
+ low++;
+ }
+ }
+
+ atomic_sub(low, &priv->low);
+ atomic_sub(high, &priv->high);
+
+ if (Mdl->contiguous)
+ {
+#if defined(CONFIG_X86)
+ if (!PageHighMem(mdlPriv->contiguousPages))
+ {
+ set_memory_wb((unsigned long)page_address(mdlPriv->contiguousPages), Mdl->numPages);
+ }
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
+ if (mdlPriv->exact == gcvTRUE)
+ {
+ free_pages_exact(page_address(mdlPriv->contiguousPages), Mdl->numPages * PAGE_SIZE);
+ }
+ else
+#endif
+ {
+ __free_pages(mdlPriv->contiguousPages, get_order(Mdl->numPages * PAGE_SIZE));
+ }
+ }
+ else
+ {
+#if defined(CONFIG_X86)
+ set_pages_array_wb(mdlPriv->nonContiguousPages, Mdl->numPages);
+#endif
+
+ if (Mdl->pageUnit1M)
+ {
+ _NonContiguous1MPagesFree(mdlPriv, mdlPriv->numPages1M);
+ }
+ else
+ {
+ _NonContiguousFree(mdlPriv->nonContiguousPages, Mdl->numPages);
+ }
+ }
+
+ kfree(Mdl->priv);
+}
+
+static gceSTATUS
+_GFPMmap(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctBOOL Cacheable,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ IN 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 (Cacheable == gcvFALSE)
+ {
+ /* Make this mapping non-cached. */
+#if gcdENABLE_BUFFERABLE_VIDEO_MEMORY
+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+#else
+ vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+#endif
+ }
+
+ 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
+ {
+ gctSIZE_T 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 PLINUX_MDL_MAP MdlMap,
+ IN gctUINT32 Size
+ )
+{
+ MdlMap->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)MdlMap->vmaAddr, 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)MdlMap->vmaAddr, Size) < 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_WARNING, gcvZONE_OS,
+ "%s(%d): do_munmap failed",
+ __FUNCTION__, __LINE__
+ );
+ }
+ up_write(&current->mm->mmap_sem);
+#endif
+
+ MdlMap->vma = NULL;
+}
+
+static gceSTATUS
+_GFPMapUser(
+ gckALLOCATOR Allocator,
+ PLINUX_MDL Mdl,
+ PLINUX_MDL_MAP MdlMap,
+ gctBOOL Cacheable
+ )
+{
+ 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(NULL,
+ 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(NULL,
+ 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__
+ );
+
+ userLogical = gcvNULL;
+
+ 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(_GFPMmap(Allocator, Mdl, Cacheable, 0, Mdl->numPages, vma));
+ MdlMap->vma = vma;
+ }
+ while (gcvFALSE);
+ up_write(&current->mm->mmap_sem);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ MdlMap->vmaAddr = userLogical;
+ MdlMap->cacheable = Cacheable;
+ }
+
+OnError:
+ if (gcmIS_ERROR(status) && userLogical)
+ {
+ _GFPUnmapUser(Allocator, Mdl, userLogical, Mdl->numPages * PAGE_SIZE);
+ }
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_GFPMapKernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *Logical
+ )
+{
+ void *addr = 0;
+ gctSIZE_T numPages = Mdl->numPages;
+ struct gfp_mdl_priv *mdlPriv = Mdl->priv;
+ unsigned long pgoff = (Offset >> PAGE_SHIFT);
+ struct page ** pages;
+ gctBOOL free = gcvFALSE;
+ pgprot_t pgprot;
+
+ if (Offset + Bytes > (numPages << PAGE_SHIFT))
+ {
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ numPages = ((Offset & ~PAGE_MASK) + Bytes + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
+
+ if (Mdl->contiguous)
+ {
+ gctSIZE_T i;
+
+ pages = kmalloc(sizeof(struct page *) * numPages, GFP_KERNEL | gcdNOWARN);
+
+ if (!pages)
+ {
+ return gcvSTATUS_OUT_OF_MEMORY;
+ }
+
+ for (i = 0; i < numPages; i++)
+ {
+ pages[i] = nth_page(mdlPriv->contiguousPages, i + pgoff);
+ }
+
+ free = gcvTRUE;
+ }
+ else
+ {
+ pages = &mdlPriv->nonContiguousPages[pgoff];
+ }
+
+ /* ioremap() can't work on system memory since 2.6.38. */
+ if (Mdl->cacheable)
+ {
+ pgprot = PAGE_KERNEL;
+ }
+ else
+ {
+#if gcdENABLE_BUFFERABLE_VIDEO_MEMORY
+ pgprot = pgprot_writecombine(PAGE_KERNEL);
+#else
+ pgprot = pgprot_noncached(PAGE_KERNEL);
+#endif
+ }
+
+ addr = vmap(pages, numPages, 0, pgprot);
+
+ if (free)
+ {
+ kfree(pages);
+ }
+
+ if (addr)
+ {
+ /* Append offset in page. */
+ *Logical = (uint8_t *)addr + (Offset & ~PAGE_MASK);
+ return gcvSTATUS_OK;
+ }
+ else
+ {
+ return gcvSTATUS_OUT_OF_MEMORY;
+ }
+}
+
+static gceSTATUS
+_GFPUnmapKernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctPOINTER Logical
+ )
+{
+ vunmap((void *)((uintptr_t)Logical & PAGE_MASK));
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_GFPCache(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes,
+ IN gceCACHEOPERATION Operation
+ )
+{
+ struct gfp_mdl_priv *mdlPriv = Mdl->priv;
+ enum dma_data_direction dir;
+ dma_addr_t dma_addr = (mdlPriv->dma_addr + Offset) & PAGE_MASK;
+ gctSIZE_T bytes = (mdlPriv->dma_addr + Offset + Bytes) - dma_addr;
+ gctINT numPages = GetPageCount(bytes, 0);
+
+ switch (Operation)
+ {
+ case gcvCACHE_CLEAN:
+ dir = DMA_TO_DEVICE;
+
+ if (mdlPriv->contiguous)
+ {
+ dma_sync_single_for_device(galcore_device,
+ dma_addr, numPages << PAGE_SHIFT, dir);
+ }
+ else
+ {
+ dma_sync_sg_for_device(galcore_device,
+ mdlPriv->sgt.sgl, mdlPriv->sgt.nents, dir);
+ }
+
+ break;
+ case gcvCACHE_FLUSH:
+ dir = DMA_TO_DEVICE;
+
+ if (mdlPriv->contiguous)
+ {
+ dma_sync_single_for_device(galcore_device,
+ dma_addr, numPages << PAGE_SHIFT, dir);
+ }
+ else
+ {
+ dma_sync_sg_for_device(galcore_device,
+ mdlPriv->sgt.sgl, mdlPriv->sgt.nents, dir);
+ }
+
+ dir = DMA_FROM_DEVICE;
+
+ if (mdlPriv->contiguous)
+ {
+ dma_sync_single_for_cpu(galcore_device,
+ dma_addr, numPages << PAGE_SHIFT, dir);
+ }
+ else
+ {
+ dma_sync_sg_for_cpu(galcore_device,
+ mdlPriv->sgt.sgl, mdlPriv->sgt.nents, dir);
+ }
+
+ break;
+ case gcvCACHE_INVALIDATE:
+ dir = DMA_FROM_DEVICE;
+
+ if (mdlPriv->contiguous)
+ {
+ dma_sync_single_for_cpu(galcore_device,
+ dma_addr, numPages << PAGE_SHIFT, dir);
+ }
+ else
+ {
+ dma_sync_sg_for_cpu(galcore_device,
+ mdlPriv->sgt.sgl, mdlPriv->sgt.nents, dir);
+ }
+
+ break;
+ default:
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_GFPPhysical(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * Physical
+ )
+{
+ struct gfp_mdl_priv *mdlPriv = Mdl->priv;
+ gctUINT32 offsetInPage = Offset & ~PAGE_MASK;
+ gctUINT32 index = Offset / PAGE_SIZE;
+
+ if (Mdl->contiguous)
+ {
+ *Physical = page_to_phys(nth_page(mdlPriv->contiguousPages, index));
+ }
+ else
+ {
+ *Physical = page_to_phys(mdlPriv->nonContiguousPages[index]);
+ }
+
+ *Physical += offsetInPage;
+
+ return gcvSTATUS_OK;
+}
+
+static void
+_GFPAllocatorDestructor(
+ gcsALLOCATOR *Allocator
+ )
+{
+ _GFPAllocatorDebugfsCleanup(Allocator);
+
+ if (Allocator->privateData)
+ {
+ kfree(Allocator->privateData);
+ }
+
+ kfree(Allocator);
+}
+
+/* GFP allocator operations. */
+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. */
+gceSTATUS
+_GFPAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ )
+{
+ gceSTATUS status;
+ gckALLOCATOR allocator = gcvNULL;
+ struct gfp_alloc *priv = gcvNULL;
+
+ gcmkONERROR(
+ gckALLOCATOR_Construct(Os, &GFPAllocatorOperations, &allocator));
+
+ priv = kzalloc(sizeof(struct gfp_alloc), GFP_KERNEL | gcdNOWARN);
+
+ if (!priv)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ atomic_set(&priv->low, 0);
+ atomic_set(&priv->high, 0);
+
+ /* Register private data. */
+ allocator->privateData = priv;
+ allocator->destructor = _GFPAllocatorDestructor;
+
+ _GFPAllocatorDebugfsInit(allocator, Parent);
+
+ allocator->capability = gcvALLOC_FLAG_CONTIGUOUS
+ | gcvALLOC_FLAG_NON_CONTIGUOUS
+ | gcvALLOC_FLAG_CACHEABLE
+ | gcvALLOC_FLAG_MEMLIMIT
+ | gcvALLOC_FLAG_ALLOC_ON_FAULT
+ | gcvALLOC_FLAG_DMABUF_EXPORTABLE
+#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
+ | gcvALLOC_FLAG_4GB_ADDR
+#endif
+ | gcvALLOC_FLAG_1M_PAGES
+ ;
+
+#if defined(gcdEMULATE_SECURE_ALLOCATOR)
+ allocator->capability |= gcvALLOC_FLAG_SECURITY;
+#endif
+
+ *Allocator = allocator;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (allocator)
+ {
+ kfree(allocator);
+ }
+ return status;
+}
+
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
new file mode 100644
index 000000000000..2587c476578d
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_reserved_mem.c
@@ -0,0 +1,544 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_allocator.h"
+#include <linux/pagemap.h>
+#include <linux/seq_file.h>
+#include <linux/mman.h>
+#include <asm/atomic.h>
+#include <linux/dma-mapping.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+/*
+ * reserved_mem is for contiguous pool, internal pool and external pool, etc.
+ */
+
+/* mdl private. */
+struct reserved_mem
+{
+ unsigned long start;
+ unsigned long size;
+ unsigned int offset_in_page;
+ char name[32];
+ int release;
+
+ /* Link together. */
+ struct list_head link;
+};
+
+/* allocator info. */
+struct reserved_mem_alloc
+{
+ /* Record allocated reserved memory regions. */
+ struct list_head region;
+ struct mutex lock;
+};
+
+static int reserved_mem_show(struct seq_file* m, void* data)
+{
+ struct list_head *pos;
+ gcsINFO_NODE *node = m->private;
+ gckALLOCATOR Allocator = node->device;
+ struct reserved_mem_alloc *alloc = Allocator->privateData;
+
+ list_for_each(pos, &alloc->region)
+ {
+ struct reserved_mem * res= list_entry(pos, struct reserved_mem, link);
+
+ seq_printf(m, "0x%08lx-0x%08lx : %s\n",
+ res->start, res->start + res->size -1, res->name);
+ }
+
+ return 0;
+}
+
+static gcsINFO info_list[] =
+{
+ {"reserved-mem", reserved_mem_show},
+};
+
+static void
+reserved_mem_debugfs_init(
+ IN gckALLOCATOR Allocator,
+ IN gckDEBUGFS_DIR Root
+ )
+{
+ gcmkVERIFY_OK(
+ gckDEBUGFS_DIR_Init(&Allocator->debugfsDir, Root->root, "reserved-mem"));
+
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_CreateFiles(
+ &Allocator->debugfsDir,
+ info_list,
+ gcmCOUNTOF(info_list),
+ Allocator
+ ));
+}
+
+static void
+reserved_mem_debugfs_cleanup(
+ IN gckALLOCATOR Allocator
+ )
+{
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_RemoveFiles(
+ &Allocator->debugfsDir,
+ info_list,
+ gcmCOUNTOF(info_list)
+ ));
+
+ gckDEBUGFS_DIR_Deinit(&Allocator->debugfsDir);
+}
+
+static gceSTATUS
+reserved_mem_alloc(
+ IN gckALLOCATOR Allocator,
+ INOUT PLINUX_MDL Mdl,
+ IN gctSIZE_T NumPages,
+ IN gctUINT32 Flags
+ )
+{
+ return gcvSTATUS_NOT_SUPPORTED;
+}
+
+static gceSTATUS
+reserved_mem_attach(
+ IN gckALLOCATOR Allocator,
+ IN gcsATTACH_DESC_PTR Desc,
+ IN PLINUX_MDL Mdl
+ )
+{
+ struct reserved_mem_alloc *alloc = Allocator->privateData;
+ struct reserved_mem *res;
+ struct resource *region = NULL;
+
+ if (Desc == gcvNULL)
+ {
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ res = kzalloc(sizeof(struct reserved_mem), GFP_KERNEL | gcdNOWARN);
+
+ if (!res)
+ return gcvSTATUS_OUT_OF_MEMORY;
+
+ res->start = Desc->reservedMem.start;
+ res->size = Desc->reservedMem.size;
+ res->offset_in_page = Desc->reservedMem.start & (PAGE_SIZE - 1);
+ strncpy(res->name, Desc->reservedMem.name, sizeof(res->name)-1);
+ res->release = 0;
+
+ if (!Desc->reservedMem.requested)
+ {
+ region = request_mem_region(res->start, res->size, res->name);
+
+ if (!region)
+ {
+ printk("request mem %s(0x%lx - 0x%lx) failed\n",
+ res->name, res->start, res->start + res->size - 1);
+
+ kfree(res);
+ return gcvSTATUS_OUT_OF_RESOURCES;
+ }
+
+ res->release = 1;
+ }
+
+ mutex_lock(&alloc->lock);
+ list_add(&res->link, &alloc->region);
+ mutex_unlock(&alloc->lock);
+
+ Mdl->priv = res;
+
+ if (res->start < 0xFFFFFFFF)
+ {
+ Allocator->capability |= gcvALLOC_FLAG_4GB_ADDR;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static void
+reserved_mem_detach(
+ IN gckALLOCATOR Allocator,
+ IN OUT PLINUX_MDL Mdl
+ )
+{
+ struct reserved_mem_alloc *alloc = Allocator->privateData;
+ struct reserved_mem *res = Mdl->priv;
+
+ /* unlink from region list. */
+ mutex_lock(&alloc->lock);
+ list_del_init(&res->link);
+ mutex_unlock(&alloc->lock);
+
+ if (res->release)
+ {
+ release_mem_region(res->start, res->size);
+ }
+
+ kfree(res);
+}
+
+static gceSTATUS
+reserved_mem_mmap(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctBOOL Cacheable,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ IN struct vm_area_struct *vma
+ )
+{
+ 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);
+
+ 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)
+ {
+ gcmkTRACE(
+ gcvLEVEL_ERROR,
+ "%s(%d): remap_pfn_range error.",
+ __FUNCTION__, __LINE__
+ );
+
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+static void
+reserved_mem_unmap_user(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap,
+ IN gctUINT32 Size
+ )
+{
+ struct reserved_mem *res = (struct reserved_mem*)Mdl->priv;
+
+ if (unlikely(!current->mm))
+ return;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)
+ if (vm_munmap((unsigned long)MdlMap->vmaAddr - res->offset_in_page, res->size) < 0)
+ {
+ printk("%s: vm_munmap failed\n", __func__);
+ }
+#else
+ down_write(&current->mm->mmap_sem);
+ if (do_munmap(current->mm, (unsigned long)MdlMap->vmaAddr - res->offset_in_page, res->size) < 0)
+ {
+ printk("%s: do_munmap failed\n", __func__);
+ }
+ up_write(&current->mm->mmap_sem);
+#endif
+}
+
+static gceSTATUS
+reserved_mem_map_user(
+ gckALLOCATOR Allocator,
+ PLINUX_MDL Mdl,
+ PLINUX_MDL_MAP MdlMap,
+ gctBOOL Cacheable
+ )
+{
+ 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);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
+ userLogical = (gctPOINTER)vm_mmap(NULL, 0L, res->size,
+ PROT_READ | PROT_WRITE, MAP_SHARED | MAP_NORESERVE, 0);
+#else
+ down_write(&current->mm->mmap_sem);
+ userLogical = (gctPOINTER)do_mmap_pgoff(NULL, 0L, res->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(reserved_mem_mmap(Allocator, Mdl, gcvFALSE, 0, Mdl->numPages, vma));
+
+ MdlMap->vmaAddr = userLogical + res->offset_in_page;
+ MdlMap->cacheable = gcvFALSE;
+ MdlMap->vma = vma;
+ }
+ while (gcvFALSE);
+ up_write(&current->mm->mmap_sem);
+
+OnError:
+ if (gcmIS_ERROR(status) && userLogical)
+ {
+ reserved_mem_unmap_user(Allocator, Mdl, userLogical, res->size);
+ }
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+reserved_mem_map_kernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *Logical
+ )
+{
+ struct reserved_mem *res = Mdl->priv;
+ void *vaddr;
+
+ if (Offset + Bytes > res->size)
+ {
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0)
+ vaddr = memremap(res->start + Offset, Bytes, MEMREMAP_WC);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)
+ vaddr = memremap(res->start + Offset, Bytes, MEMREMAP_WT);
+#else
+ vaddr = ioremap_nocache(res->start + Offset, Bytes);
+#endif
+
+ if (!vaddr)
+ {
+ return gcvSTATUS_OUT_OF_MEMORY;
+ }
+
+ *Logical = vaddr;
+ return gcvSTATUS_OK;;
+}
+
+static gceSTATUS
+reserved_mem_unmap_kernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctPOINTER Logical
+ )
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)
+ memunmap((void *)Logical);
+#else
+ iounmap((void *)Logical);
+#endif
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+reserved_mem_cache_op(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes,
+ IN gceCACHEOPERATION Operation
+ )
+{
+ /* Always WC or UC, safe to use mb. */
+ switch (Operation)
+ {
+ case gcvCACHE_CLEAN:
+ case gcvCACHE_FLUSH:
+ _MemoryBarrier();
+ break;
+ case gcvCACHE_INVALIDATE:
+ break;
+ default:
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+reserved_mem_get_physical(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * Physical
+ )
+{
+ struct reserved_mem *res = Mdl->priv;
+ *Physical = res->start + Offset;
+
+ return gcvSTATUS_OK;
+}
+
+static void
+reserved_mem_dtor(
+ gcsALLOCATOR *Allocator
+ )
+{
+ reserved_mem_debugfs_cleanup(Allocator);
+
+ if (Allocator->privateData)
+ {
+ kfree(Allocator->privateData);
+ }
+
+ kfree(Allocator);
+}
+
+/* GFP allocator operations. */
+static gcsALLOCATOR_OPERATIONS reserved_mem_ops = {
+ .Alloc = reserved_mem_alloc,
+ .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,
+ .UnmapKernel = reserved_mem_unmap_kernel,
+ .Cache = reserved_mem_cache_op,
+ .Physical = reserved_mem_get_physical,
+};
+
+/* GFP allocator entry. */
+gceSTATUS
+_ReservedMemoryAllocatorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ )
+{
+ gceSTATUS status;
+ gckALLOCATOR allocator = gcvNULL;
+ struct reserved_mem_alloc *alloc = NULL;
+
+ gcmkONERROR(
+ gckALLOCATOR_Construct(Os, &reserved_mem_ops, &allocator));
+
+ alloc = kzalloc(sizeof(*alloc), GFP_KERNEL | gcdNOWARN);
+
+ if (!alloc)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ INIT_LIST_HEAD(&alloc->region);
+ mutex_init(&alloc->lock);
+
+ /* Register private data. */
+ allocator->privateData = alloc;
+ allocator->destructor = reserved_mem_dtor;
+
+ reserved_mem_debugfs_init(allocator, Parent);
+
+ allocator->capability = gcvALLOC_FLAG_LINUX_RESERVED_MEM
+ | gcvALLOC_FLAG_CONTIGUOUS
+ | gcvALLOC_FLAG_CPU_ACCESS;
+
+ *Allocator = allocator;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (allocator)
+ {
+ kfree(allocator);
+ }
+ return status;
+}
+
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
new file mode 100644
index 000000000000..5e5e2c0da0d6
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/default/gc_hal_kernel_allocator_user_memory.c
@@ -0,0 +1,876 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_allocator.h"
+#include <linux/scatterlist.h>
+
+#include <linux/slab.h>
+#include <linux/pagemap.h>
+#include <linux/cache.h>
+
+#define _GC_OBJ_ZONE gcvZONE_ALLOCATOR
+
+enum um_desc_type
+{
+ UM_PHYSICAL_MAP,
+ UM_PAGE_MAP,
+ UM_PFN_MAP,
+};
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION (2,6,24)
+struct sg_table
+{
+ struct scatterlist *sgl;
+ unsigned int nents;
+ unsigned int orig_nents;
+};
+#endif
+
+/* Descriptor of a user memory imported. */
+struct um_desc
+{
+ int type;
+
+ union
+ {
+ /* UM_PHYSICAL_MAP. */
+ unsigned long physical;
+
+ /* UM_PAGE_MAP. */
+ struct
+ {
+ struct page **pages;
+ struct sg_table sgt;
+ };
+
+ /* UM_PFN_MAP. */
+ struct
+ {
+ unsigned long *pfns;
+ int *refs;
+ };
+ };
+
+ /* contiguous chunks, does not include padding pages. */
+ int chunk_count;
+
+ unsigned long vm_flags;
+ unsigned long user_vaddr;
+ size_t size;
+ unsigned long offset;
+
+ size_t pageCount;
+ size_t extraPage;
+};
+
+static int import_physical_map(struct um_desc *um, unsigned long phys)
+{
+ um->type = UM_PHYSICAL_MAP;
+ um->physical = phys & PAGE_MASK;
+ um->chunk_count = 1;
+ return 0;
+}
+
+static int import_page_map(struct um_desc *um,
+ unsigned long addr, size_t page_count, size_t size)
+{
+ int i;
+ int result;
+ struct page **pages;
+
+ if ((addr & (cache_line_size() - 1)) || (size & (cache_line_size() - 1)))
+ {
+ /* Not cpu cacheline size aligned, can not support. */
+ return -EINVAL;
+ }
+
+ pages = kzalloc(page_count * sizeof(void *), GFP_KERNEL | gcdNOWARN);
+ if (!pages)
+ return -ENOMEM;
+
+ down_read(&current->mm->mmap_sem);
+
+ result = get_user_pages(
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
+ current,
+ current->mm,
+#endif
+ addr & PAGE_MASK,
+ page_count,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
+ FOLL_WRITE,
+#else
+ 1,
+ 0,
+#endif
+ pages,
+ NULL);
+
+ up_read(&current->mm->mmap_sem);
+
+ if (result < page_count)
+ {
+ for (i = 0; i < result; i++)
+ {
+ if (pages[i])
+ {
+ put_page(pages[i]);
+ }
+ }
+
+ kfree(pages);
+ return -ENODEV;
+ }
+
+ um->chunk_count = 1;
+ for (i = 1; i < page_count; i++)
+ {
+ if (page_to_pfn(pages[i]) != page_to_pfn(pages[i - 1]) + 1)
+ {
+ ++um->chunk_count;
+ }
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \
+ && (defined(ARCH_HAS_SG_CHAIN) || defined(CONFIG_ARCH_HAS_SG_CHAIN))
+ result = sg_alloc_table_from_pages(&um->sgt, pages, page_count,
+ addr & ~PAGE_MASK, size, GFP_KERNEL | gcdNOWARN);
+
+#else
+ result = alloc_sg_list_from_pages(&um->sgt.sgl, pages, page_count,
+ addr & ~PAGE_MASK, size, &um->sgt.nents);
+
+ um->sgt.orig_nents = um->sgt.nents;
+#endif
+ if (unlikely(result < 0))
+ {
+ printk("[galcore]: %s: sg_alloc_table_from_pages failed\n", __FUNCTION__);
+ goto error;
+ }
+
+ result = dma_map_sg(galcore_device, um->sgt.sgl, um->sgt.nents, DMA_TO_DEVICE);
+ if (unlikely(result != um->sgt.nents))
+ {
+ printk("[galcore]: %s: dma_map_sg failed\n", __FUNCTION__);
+ goto error;
+ }
+
+ um->type = UM_PAGE_MAP;
+ um->pages = pages;
+
+ return 0;
+
+error:
+#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \
+ && (defined(ARCH_HAS_SG_CHAIN) || defined(CONFIG_ARCH_HAS_SG_CHAIN))
+ sg_free_table(&um->sgt);
+#else
+ kfree(um->sgt.sgl);
+#endif
+
+ if (pages)
+ {
+ kfree(pages);
+ }
+ return result;
+}
+
+
+static int import_pfn_map(struct um_desc *um,
+ unsigned long addr, size_t pfn_count)
+{
+ int i;
+ struct vm_area_struct *vma;
+ unsigned long *pfns;
+ int *refs;
+
+ if (!current->mm)
+ return -ENOTTY;
+
+ down_read(&current->mm->mmap_sem);
+ vma = find_vma(current->mm, addr);
+ up_read(&current->mm->mmap_sem);
+
+ if (!vma)
+ return -ENOTTY;
+
+ pfns = kzalloc(pfn_count * sizeof(unsigned long), GFP_KERNEL | gcdNOWARN);
+
+ if (!pfns)
+ return -ENOMEM;
+
+ refs = kzalloc(pfn_count * sizeof(int), GFP_KERNEL | gcdNOWARN);
+
+ if (!refs)
+ {
+ kfree(pfns);
+ return -ENOMEM;
+ }
+
+ for (i = 0; i < pfn_count; i++)
+ {
+ spinlock_t *ptl;
+ pgd_t *pgd;
+ pud_t *pud;
+ pmd_t *pmd;
+ pte_t *pte;
+
+ pgd = pgd_offset(current->mm, addr);
+ if (pgd_none(*pgd) || pgd_bad(*pgd))
+ goto err;
+
+#if (defined(CONFIG_CPU_CSKYV2) || defined(CONFIG_X86)) \
+ && LINUX_VERSION_CODE >= KERNEL_VERSION (4,12,0)
+ pud = pud_offset((p4d_t*)pgd, addr);
+#elif (defined(CONFIG_CPU_CSKYV2)) \
+ && LINUX_VERSION_CODE >= KERNEL_VERSION (4,11,0)
+ pud = pud_offset((p4d_t*)pgd, addr);
+#else
+ pud = pud_offset(pgd, addr);
+#endif
+ if (pud_none(*pud) || pud_bad(*pud))
+ goto err;
+
+ pmd = pmd_offset(pud, addr);
+ if (pmd_none(*pmd) || pmd_bad(*pmd))
+ goto err;
+
+ pte = pte_offset_map_lock(current->mm, pmd, addr, &ptl);
+ if (!pte)
+ {
+ spin_unlock(ptl);
+ goto err;
+ }
+
+ if (!pte_present(*pte))
+ {
+ pte_unmap_unlock(pte, ptl);
+ goto err;
+ }
+
+ pfns[i] = pte_pfn(*pte);
+ pte_unmap_unlock(pte, ptl);
+
+ /* Advance to next. */
+ addr += PAGE_SIZE;
+ }
+
+ for (i = 0; i < pfn_count; i++)
+ {
+ if (pfn_valid(pfns[i]))
+ {
+ struct page *page = pfn_to_page(pfns[i]);
+ refs[i] = get_page_unless_zero(page);
+ }
+ }
+
+ um->chunk_count = 1;
+ for (i = 1; i < pfn_count; i++)
+ {
+ if (pfns[i] != pfns[i - 1] + 1)
+ {
+ ++um->chunk_count;
+ }
+ }
+
+ um->type = UM_PFN_MAP;
+ um->pfns = pfns;
+ um->refs = refs;
+ return 0;
+
+err:
+ if (pfns)
+ kfree(pfns);
+
+ if (refs)
+ kfree(refs);
+
+ return -ENOTTY;
+}
+
+static gceSTATUS
+_Import(
+ IN gckOS Os,
+ IN gctPOINTER Memory,
+ IN gctPHYS_ADDR_T Physical,
+ IN gctSIZE_T Size,
+ IN struct um_desc * UserMemory
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ unsigned long vm_flags = 0;
+ struct vm_area_struct *vma = NULL;
+ unsigned long start, end, memory;
+ int result = 0;
+
+ gctSIZE_T extraPage;
+ gctSIZE_T pageCount, i;
+
+ gcmkHEADER_ARG("Os=%p Memory=%p Physical=0x%llx Size=%lu", Os, Memory, Physical, Size);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Memory != gcvNULL || Physical != ~0ULL);
+ gcmkVERIFY_ARGUMENT(Size > 0);
+
+ memory = (unsigned long)Memory;
+
+ /* Get the number of required pages. */
+ end = (memory + Size + PAGE_SIZE - 1) >> PAGE_SHIFT;
+ start = memory >> PAGE_SHIFT;
+ pageCount = end - start;
+
+ /* Allocate extra page to avoid cache overflow */
+#if gcdENABLE_2D
+ extraPage = 2;
+#else
+ extraPage = (((memory + gcmALIGN(Size + 64, 64) + PAGE_SIZE - 1) >> PAGE_SHIFT) > end) ? 1 : 0;
+#endif
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, _GC_OBJ_ZONE,
+ "%s(%d): pageCount: %d. extraPage: %d",
+ __FUNCTION__, __LINE__,
+ pageCount, extraPage
+ );
+
+ /* Overflow. */
+ if ((memory + Size) < memory)
+ {
+ gcmkFOOTER_ARG("status=%d", gcvSTATUS_INVALID_ARGUMENT);
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ if (memory)
+ {
+ unsigned long vaddr = memory;
+
+ for (i = 0; i < pageCount; i++)
+ {
+ u32 data = 0;
+
+ get_user(data, (u32 *)vaddr);
+ put_user(data, (u32 *)vaddr);
+ vaddr += PAGE_SIZE;
+
+ /* Fix QM crash with test_buffers */
+ if (vaddr > memory + Size - 4)
+ {
+ vaddr = memory + Size - 4;
+ }
+ }
+
+ vma = find_vma(current->mm, memory);
+
+ if (!vma)
+ {
+ /* No such memory, or across vmas. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+#ifdef CONFIG_ARM
+ /* coherent cache in case vivt or vipt-aliasing cache. */
+ __cpuc_flush_user_range(memory, memory + Size, vma->vm_flags);
+#endif
+
+ vm_flags = vma->vm_flags;
+ vaddr = vma->vm_end;
+
+ while (vaddr < memory + Size)
+ {
+ vma = find_vma(current->mm, vaddr);
+
+ if (!vma)
+ {
+ /* No such memory. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if ((vma->vm_flags & VM_PFNMAP) != (vm_flags & VM_PFNMAP))
+ {
+ /* Can not support different map type: both PFN and PAGE detected. */
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ vaddr = vma->vm_end;
+ }
+ }
+
+ if (Physical != gcvINVALID_PHYSICAL_ADDRESS)
+ {
+ result = import_physical_map(UserMemory, Physical);
+ }
+ else
+ {
+ if (vm_flags & VM_PFNMAP)
+ {
+ result = import_pfn_map(UserMemory, memory, pageCount);
+ }
+ else
+ {
+ result = import_page_map(UserMemory, memory, pageCount, Size);
+ }
+ }
+
+ if (result == -EINVAL)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+ else if (result == -ENOMEM)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ else if (result < 0)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ if(Os->device->platform->flagBits & gcvPLATFORM_FLAG_LIMIT_4G_ADDRESS )
+ {
+ gctPHYS_ADDR_T addr;
+
+ if (Physical != gcvINVALID_PHYSICAL_ADDRESS)
+ {
+ if(Physical > 0xFFFFFFFFu || Physical + Size > 0xFFFFFFFFu )
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+ }
+ else if (vm_flags & VM_PFNMAP)
+ {
+ for(i = 0; i < pageCount; i++)
+ {
+ addr = UserMemory->pfns[i] << PAGE_SHIFT;
+ if( addr > 0xFFFFFFFFu)
+ {
+ kfree(UserMemory->pfns);
+ UserMemory->pfns = gcvNULL;
+ kfree(UserMemory->refs) ;
+ UserMemory->refs = gcvNULL;
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i< pageCount; i++)
+ {
+ addr = page_to_phys(UserMemory->pages[i]);
+ if(addr > 0xFFFFFFFFu )
+ {
+ kfree(UserMemory->pages);
+ UserMemory->pages = gcvNULL;
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+ }
+ }
+ }
+
+ UserMemory->vm_flags = vm_flags;
+ UserMemory->user_vaddr = (unsigned long)Memory;
+ UserMemory->size = Size;
+ UserMemory->offset = (Physical != gcvINVALID_PHYSICAL_ADDRESS)
+ ? (Physical & ~PAGE_MASK)
+ : (memory & ~PAGE_MASK);
+
+ UserMemory->pageCount = pageCount;
+ UserMemory->extraPage = extraPage;
+
+ if (extraPage && UserMemory->type == UM_PAGE_MAP)
+ {
+ /*Add the padding pages */
+ UserMemory->chunk_count++;
+ }
+
+ /* Success. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_UserMemoryAttach(
+ IN gckALLOCATOR Allocator,
+ IN gcsATTACH_DESC_PTR Desc,
+ IN PLINUX_MDL Mdl
+ )
+{
+ gceSTATUS status;
+ struct um_desc * userMemory = gcvNULL;
+
+ gckOS os = Allocator->os;
+
+ gcmkHEADER();
+
+ /* Handle is meangless for this importer. */
+ gcmkVERIFY_ARGUMENT(Desc != gcvNULL);
+
+ gcmkONERROR(gckOS_Allocate(os, gcmSIZEOF(struct um_desc), (gctPOINTER *)&userMemory));
+
+ gckOS_ZeroMemory(userMemory, gcmSIZEOF(struct um_desc));
+
+ gcmkONERROR(_Import(os, Desc->userMem.memory, Desc->userMem.physical, Desc->userMem.size, userMemory));
+
+ Mdl->priv = userMemory;
+ Mdl->numPages = userMemory->pageCount + userMemory->extraPage;
+ Mdl->contiguous = (userMemory->chunk_count == 1);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (userMemory != gcvNULL)
+ {
+ gckOS_Free(os,(gctPOINTER)userMemory);
+ }
+ gcmkFOOTER();
+ return status;
+}
+
+static void release_physical_map(struct um_desc *um)
+{
+}
+
+static void release_page_map(struct um_desc *um)
+{
+ int i;
+ dma_sync_sg_for_device(galcore_device,
+ um->sgt.sgl, um->sgt.nents, DMA_TO_DEVICE);
+
+ dma_sync_sg_for_cpu(galcore_device,
+ um->sgt.sgl, um->sgt.nents, DMA_FROM_DEVICE);
+
+ dma_unmap_sg(galcore_device, um->sgt.sgl, um->sgt.nents, DMA_FROM_DEVICE);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,6,0) \
+ && (defined(ARCH_HAS_SG_CHAIN) || defined(CONFIG_ARCH_HAS_SG_CHAIN))
+ sg_free_table(&um->sgt);
+#else
+ kfree(um->sgt.sgl);
+#endif
+
+ for (i = 0; i < um->pageCount; i++)
+ {
+ if (!PageReserved(um->pages[i]))
+ {
+ SetPageDirty(um->pages[i]);
+ }
+
+ put_page(um->pages[i]);
+ }
+
+ kfree(um->pages);
+}
+
+static void release_pfn_map(struct um_desc *um)
+{
+
+ int i;
+
+ for (i = 0; i < um->pageCount; i++)
+ {
+ if (pfn_valid(um->pfns[i]))
+ {
+ struct page *page = pfn_to_page(um->pfns[i]);
+ if (!PageReserved(page))
+ {
+ SetPageDirty(page);
+ }
+
+ if (um->refs[i])
+ {
+ put_page(page);
+ }
+ }
+ }
+
+ kfree(um->pfns);
+ kfree(um->refs);
+}
+
+static void
+_UserMemoryFree(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl
+ )
+{
+ gckOS os = Allocator->os;
+ struct um_desc *userMemory = Mdl->priv;
+
+ gcmkHEADER();
+
+ if (userMemory)
+ {
+ switch (userMemory->type)
+ {
+ case UM_PHYSICAL_MAP:
+ release_physical_map(userMemory);
+ break;
+ case UM_PAGE_MAP:
+ release_page_map(userMemory);
+ break;
+ case UM_PFN_MAP:
+ release_pfn_map(userMemory);
+ break;
+ }
+
+ gcmkOS_SAFE_FREE(os, userMemory);
+ }
+
+ gcmkFOOTER_NO();
+}
+
+static gceSTATUS
+_UserMemoryMapUser(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap,
+ IN gctBOOL Cacheable
+ )
+{
+ struct um_desc *userMemory = Mdl->priv;
+
+ MdlMap->vmaAddr = (gctPOINTER)userMemory->user_vaddr;
+ MdlMap->cacheable = gcvTRUE;
+
+ return gcvSTATUS_OK;
+}
+
+static void
+_UserMemoryUnmapUser(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap,
+ IN gctUINT32 Size
+ )
+{
+ return;
+}
+
+static gceSTATUS
+_UserMemoryMapKernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *Logical
+ )
+{
+ /* Kernel doesn't acess video memory. */
+ return gcvSTATUS_NOT_SUPPORTED;
+}
+
+static gceSTATUS
+_UserMemoryUnmapKernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctPOINTER Logical
+ )
+{
+ /* Kernel doesn't acess video memory. */
+ return gcvSTATUS_NOT_SUPPORTED;
+}
+
+static gceSTATUS
+_UserMemoryCache(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes,
+ IN gceCACHEOPERATION Operation
+ )
+{
+ struct um_desc *um = Mdl->priv;
+ enum dma_data_direction dir;
+
+ if (um->type != UM_PAGE_MAP)
+ {
+ _MemoryBarrier();
+ return gcvSTATUS_OK;
+ }
+
+#ifdef CONFIG_ARM
+ /* coherent cache in case vivt or vipt-aliasing cache. */
+ __cpuc_flush_user_range(um->user_vaddr,
+ um->user_vaddr + um->size, um->vm_flags);
+#endif
+
+ switch (Operation)
+ {
+ case gcvCACHE_CLEAN:
+ dir = DMA_TO_DEVICE;
+ dma_sync_sg_for_device(galcore_device, um->sgt.sgl, um->sgt.nents, dir);
+ break;
+ case gcvCACHE_FLUSH:
+ dir = DMA_TO_DEVICE;
+ dma_sync_sg_for_device(galcore_device, um->sgt.sgl, um->sgt.nents, dir);
+ dir = DMA_FROM_DEVICE;
+ dma_sync_sg_for_cpu(galcore_device, um->sgt.sgl, um->sgt.nents, dir);
+ break;
+ case gcvCACHE_INVALIDATE:
+ dir = DMA_FROM_DEVICE;
+ dma_sync_sg_for_cpu(galcore_device, um->sgt.sgl, um->sgt.nents, dir);
+ break;
+ default:
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_UserMemoryPhysical(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * Physical
+ )
+{
+ gckOS os = Allocator->os;
+ struct um_desc *userMemory = Mdl->priv;
+ unsigned long offset = Offset + userMemory->offset;
+ gctUINT32 offsetInPage = offset & ~PAGE_MASK;
+ gctUINT32 index = offset / PAGE_SIZE;
+
+ if (index >= userMemory->pageCount)
+ {
+ if (index < userMemory->pageCount + userMemory->extraPage)
+ {
+ *Physical = page_to_phys(os->paddingPage);
+ }
+ else
+ {
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+ }
+ else
+ {
+ switch (userMemory->type)
+ {
+ case UM_PHYSICAL_MAP:
+ *Physical = userMemory->physical + (gctPHYS_ADDR_T)index * PAGE_SIZE;
+ break;
+ case UM_PAGE_MAP:
+ *Physical = page_to_phys(userMemory->pages[index]);
+ break;
+ case UM_PFN_MAP:
+ *Physical = (gctPHYS_ADDR_T)userMemory->pfns[index] << PAGE_SHIFT;
+ break;
+ }
+ }
+
+ *Physical += offsetInPage;
+
+ return gcvSTATUS_OK;
+}
+
+static void
+_UserMemoryAllocatorDestructor(
+ gcsALLOCATOR *Allocator
+ )
+{
+ if (Allocator->privateData)
+ {
+ kfree(Allocator->privateData);
+ }
+
+ kfree(Allocator);
+}
+
+/* User memory allocator (importer) operations. */
+static gcsALLOCATOR_OPERATIONS UserMemoryAllocatorOperations =
+{
+ .Attach = _UserMemoryAttach,
+ .Free = _UserMemoryFree,
+ .MapUser = _UserMemoryMapUser,
+ .UnmapUser = _UserMemoryUnmapUser,
+ .MapKernel = _UserMemoryMapKernel,
+ .UnmapKernel = _UserMemoryUnmapKernel,
+ .Cache = _UserMemoryCache,
+ .Physical = _UserMemoryPhysical,
+};
+
+/* Default allocator entry. */
+gceSTATUS
+_UserMemoryAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ )
+{
+ gceSTATUS status;
+ gckALLOCATOR allocator;
+
+ gcmkONERROR(
+ gckALLOCATOR_Construct(Os, &UserMemoryAllocatorOperations, &allocator));
+
+ allocator->destructor = _UserMemoryAllocatorDestructor;
+
+ allocator->capability = gcvALLOC_FLAG_USERMEMORY;
+
+ *Allocator = allocator;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_array.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_array.h
new file mode 100644
index 000000000000..ab28fa804bcd
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_array.h
@@ -0,0 +1,131 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_allocator_array_h_
+#define __gc_hal_kernel_allocator_array_h_
+
+extern gceSTATUS
+_GFPAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+
+extern gceSTATUS
+_UserMemoryAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+
+extern gceSTATUS
+_ReservedMemoryAllocatorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+
+#if LINUX_CMA_FSL
+extern gceSTATUS
+_CMAFSLAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+#endif
+
+#ifdef CONFIG_DMA_SHARED_BUFFER
+extern gceSTATUS
+_DmabufAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+#endif
+
+#ifndef NO_DMA_COHERENT
+extern gceSTATUS
+_DmaAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ );
+#endif
+
+gcsALLOCATOR_DESC allocatorArray[] =
+{
+ /* GFP allocator. */
+ gcmkDEFINE_ALLOCATOR_DESC("gfp", _GFPAlloctorInit),
+
+#if LINUX_CMA_FSL
+ gcmkDEFINE_ALLOCATOR_DESC("cmafsl", _CMAFSLAlloctorInit),
+#endif
+
+ /* User memory importer. */
+ gcmkDEFINE_ALLOCATOR_DESC("user", _UserMemoryAlloctorInit),
+
+#ifdef CONFIG_DMA_SHARED_BUFFER
+ /* Dmabuf allocator. */
+ gcmkDEFINE_ALLOCATOR_DESC("dmabuf", _DmabufAlloctorInit),
+#endif
+
+#ifndef NO_DMA_COHERENT
+ gcmkDEFINE_ALLOCATOR_DESC("dma", _DmaAlloctorInit),
+#endif
+
+ gcmkDEFINE_ALLOCATOR_DESC("reserved-mem", _ReservedMemoryAllocatorInit),
+};
+
+#endif
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
new file mode 100644
index 000000000000..495ac34a5114
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/allocator/freescale/gc_hal_kernel_allocator_cma.c
@@ -0,0 +1,611 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_allocator.h"
+
+#include <linux/pagemap.h>
+#include <linux/seq_file.h>
+#include <linux/mman.h>
+#include <asm/atomic.h>
+#include <linux/dma-mapping.h>
+#include <linux/slab.h>
+#include <linux/platform_device.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,16,0)
+#include <linux/dma-direct.h>
+#endif
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+typedef struct _gcsCMA_PRIV * gcsCMA_PRIV_PTR;
+typedef struct _gcsCMA_PRIV {
+ atomic_t cmasize;
+ gctBOOL cmaLimitRequest;
+}
+gcsCMA_PRIV;
+
+struct mdl_cma_priv {
+ gctPOINTER kvaddr;
+ dma_addr_t physical;
+};
+
+static int gc_cma_usage_show(struct seq_file* m, void* data)
+{
+ gcsINFO_NODE *node = m->private;
+ gckALLOCATOR Allocator = node->device;
+ gcsCMA_PRIV_PTR priv = Allocator->privateData;
+ long long size = (long long)atomic_read(&priv->cmasize);
+
+ seq_printf(m, "type n pages bytes\n");
+ seq_printf(m, "cma %10llu %12llu\n", size, size * PAGE_SIZE);
+
+ return 0;
+}
+
+static gcsINFO InfoList[] =
+{
+ {"cmausage", gc_cma_usage_show},
+};
+
+static void
+_CMAAllocatorDebugfsInit(
+ IN gckALLOCATOR Allocator,
+ IN gckDEBUGFS_DIR Root
+ )
+{
+ gcmkVERIFY_OK(
+ gckDEBUGFS_DIR_Init(&Allocator->debugfsDir, Root->root, "cma"));
+
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_CreateFiles(
+ &Allocator->debugfsDir,
+ InfoList,
+ gcmCOUNTOF(InfoList),
+ Allocator
+ ));
+}
+
+static void
+_CMAAllocatorDebugfsCleanup(
+ IN gckALLOCATOR Allocator
+ )
+{
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_RemoveFiles(
+ &Allocator->debugfsDir,
+ InfoList,
+ gcmCOUNTOF(InfoList)
+ ));
+
+ gckDEBUGFS_DIR_Deinit(&Allocator->debugfsDir);
+}
+
+static gceSTATUS
+_CMAFSLAlloc(
+ IN gckALLOCATOR Allocator,
+ INOUT PLINUX_MDL Mdl,
+ IN gctSIZE_T NumPages,
+ IN gctUINT32 Flags
+ )
+{
+ gceSTATUS status;
+ u32 gfp = GFP_KERNEL | gcdNOWARN;
+ gcsCMA_PRIV_PTR priv = (gcsCMA_PRIV_PTR)Allocator->privateData;
+
+ struct mdl_cma_priv *mdl_priv=gcvNULL;
+ gckOS os = Allocator->os;
+
+ gcmkHEADER_ARG("Mdl=%p NumPages=0x%zx", Mdl, NumPages);
+
+ if (os->allocatorLimitMarker && !(Flags & gcvALLOC_FLAG_CMA_PREEMPT))
+ {
+ if (Flags & gcvALLOC_FLAG_CMA_LIMIT)
+ {
+ priv->cmaLimitRequest = gcvTRUE;
+ }
+ else if (priv->cmaLimitRequest == gcvTRUE)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+ }
+
+ gcmkONERROR(gckOS_Allocate(os, sizeof(struct mdl_cma_priv), (gctPOINTER *)&mdl_priv));
+ mdl_priv->kvaddr = gcvNULL;
+
+#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
+ if (Flags & gcvALLOC_FLAG_4GB_ADDR)
+ {
+ gfp |= __GFP_DMA32;
+ }
+#endif
+
+ mdl_priv->kvaddr = dma_alloc_writecombine(&os->device->platform->device->dev,
+ NumPages * PAGE_SIZE,
+ &mdl_priv->physical,
+ gfp);
+
+ if (mdl_priv->kvaddr == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ Mdl->priv = mdl_priv;
+ Mdl->dmaHandle = mdl_priv->physical;
+ atomic_add(NumPages, &priv->cmasize);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (mdl_priv)
+ {
+ gckOS_Free(os, mdl_priv);
+ }
+ gcmkFOOTER();
+ 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);
+ }
+
+#if !defined(phys_to_page)
+ page = virt_to_page(mdlPriv->kvaddr);
+#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0)
+ page = phys_to_page(mdlPriv->physical);
+#else
+ page = phys_to_page(dma_to_phys(&Allocator->os->device->platform->device->dev, mdl_priv->physical));
+#endif
+
+ 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,
+ IN OUT PLINUX_MDL Mdl
+ )
+{
+ gckOS os = Allocator->os;
+ 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,
+ mdlPriv->kvaddr,
+ mdlPriv->physical);
+ gckOS_Free(os, mdlPriv);
+ atomic_sub(Mdl->numPages, &priv->cmasize);
+}
+
+static gceSTATUS
+_CMAFSLMmap(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctBOOL Cacheable,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ IN struct vm_area_struct *vma
+ )
+{
+ gckOS os = Allocator->os;
+ struct mdl_cma_priv *mdlPriv = (struct mdl_cma_priv*)Mdl->priv;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Allocator=%p Mdl=%p vma=%p", Allocator, Mdl, vma);
+
+ gcmkASSERT(skipPages + numPages <= Mdl->numPages);
+
+ /* Now map all the vmalloc pages to this user address. */
+ if (Mdl->contiguous)
+ {
+ /* map kernel memory to user space.. */
+ if (dma_mmap_writecombine(&os->device->platform->device->dev,
+ vma,
+ (gctINT8_PTR)mdlPriv->kvaddr + (skipPages << PAGE_SHIFT),
+ mdlPriv->physical + (skipPages << PAGE_SHIFT),
+ numPages << PAGE_SHIFT) < 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_WARNING, gcvZONE_OS,
+ "%s(%d): dma_mmap_attrs error",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ }
+ else
+ {
+ gcmkFATAL("%s(%d): unexpected noncontiguous mdl\n");
+ gcmkONERROR(gcvSTATUS_HEAP_CORRUPTED);
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static void
+_CMAFSLUnmapUser(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap,
+ IN gctUINT32 Size
+ )
+{
+ if (unlikely(current->mm == gcvNULL))
+ {
+ /* Do nothing if process is exiting. */
+ return;
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)
+ if (vm_munmap((unsigned long)MdlMap->vmaAddr, 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)MdlMap->vmaAddr, Size) < 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_WARNING, gcvZONE_OS,
+ "%s(%d): do_munmap failed",
+ __FUNCTION__, __LINE__
+ );
+ }
+ up_write(&current->mm->mmap_sem);
+#endif
+}
+
+static gceSTATUS
+_CMAFSLMapUser(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap,
+ IN gctBOOL Cacheable
+ )
+{
+ 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, Cacheable, 0, Mdl->numPages, vma));
+ MdlMap->vmaAddr = userLogical;
+ MdlMap->cacheable = Cacheable;
+ MdlMap->vma = vma;
+ }
+ while (gcvFALSE);
+ up_write(&current->mm->mmap_sem);
+
+OnError:
+ if (gcmIS_ERROR(status) && userLogical && !IS_ERR(userLogical))
+ {
+ _CMAFSLUnmapUser(Allocator, Mdl, userLogical, Mdl->numPages * PAGE_SIZE);
+ }
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_CMAMapKernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *Logical
+ )
+{
+ struct mdl_cma_priv *mdl_priv=(struct mdl_cma_priv *)Mdl->priv;
+ *Logical = (uint8_t *)mdl_priv->kvaddr + Offset;
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_CMAUnmapKernel(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctPOINTER Logical
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_CMACache(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes,
+ IN gceCACHEOPERATION Operation
+ )
+{
+ switch (Operation)
+ {
+ case gcvCACHE_CLEAN:
+ case gcvCACHE_FLUSH:
+ _MemoryBarrier();
+ break;
+ case gcvCACHE_INVALIDATE:
+ break;
+ default:
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_CMAPhysical(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * Physical
+ )
+{
+ struct mdl_cma_priv *mdl_priv=(struct mdl_cma_priv *)Mdl->priv;
+
+ *Physical = mdl_priv->physical + Offset;
+
+ return gcvSTATUS_OK;
+}
+
+static void
+_CMAAllocatorDestructor(
+ gcsALLOCATOR *Allocator
+ )
+{
+ _CMAAllocatorDebugfsCleanup(Allocator);
+
+ if (Allocator->privateData)
+ {
+ kfree(Allocator->privateData);
+ }
+
+ kfree(Allocator);
+}
+
+/* Default allocator operations. */
+static gcsALLOCATOR_OPERATIONS CMAFSLAllocatorOperations =
+{
+ .Alloc = _CMAFSLAlloc,
+ .Free = _CMAFSLFree,
+ .Mmap = _CMAFSLMmap,
+ .MapUser = _CMAFSLMapUser,
+ .UnmapUser = _CMAFSLUnmapUser,
+ .MapKernel = _CMAMapKernel,
+ .UnmapKernel = _CMAUnmapKernel,
+ .Cache = _CMACache,
+ .Physical = _CMAPhysical,
+ .GetSGT = _CMAFSLGetSGT,
+};
+
+/* Default allocator entry. */
+gceSTATUS
+_CMAFSLAlloctorInit(
+ IN gckOS Os,
+ IN gcsDEBUGFS_DIR *Parent,
+ OUT gckALLOCATOR * Allocator
+ )
+{
+ gceSTATUS status;
+ gckALLOCATOR allocator = gcvNULL;
+ gcsCMA_PRIV_PTR priv = gcvNULL;
+
+ gcmkONERROR(
+ gckALLOCATOR_Construct(Os, &CMAFSLAllocatorOperations, &allocator));
+
+ priv = kzalloc(gcmSIZEOF(gcsCMA_PRIV), GFP_KERNEL | gcdNOWARN);
+
+ if (!priv)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ atomic_set(&priv->cmasize, 0);
+
+ /* Register private data. */
+ allocator->privateData = priv;
+ allocator->destructor = _CMAAllocatorDestructor;
+
+ _CMAAllocatorDebugfsInit(allocator, Parent);
+
+ allocator->capability = gcvALLOC_FLAG_CONTIGUOUS
+ | gcvALLOC_FLAG_DMABUF_EXPORTABLE
+#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
+ | gcvALLOC_FLAG_4GB_ADDR
+#endif
+ ;
+#if defined(CONFIG_ARM64)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)
+ Os->allocatorLimitMarker = (Os->device->baseAddress + totalram_pages() * PAGE_SIZE) > 0x100000000;
+#else
+ Os->allocatorLimitMarker = (Os->device->baseAddress + totalram_pages * PAGE_SIZE) > 0x100000000;
+#endif
+#else
+ Os->allocatorLimitMarker = gcvFALSE;
+#endif
+ priv->cmaLimitRequest = gcvFALSE;
+
+ if (Os->allocatorLimitMarker)
+ {
+ allocator->capability |= gcvALLOC_FLAG_CMA_LIMIT;
+ }
+
+ allocator->capability |= gcvALLOC_FLAG_CMA_PREEMPT;
+
+ *Allocator = allocator;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (allocator)
+ {
+ kfree(allocator);
+ }
+ return status;
+}
+
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c
new file mode 100644
index 000000000000..3a1cb1e8a2d5
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.c
@@ -0,0 +1,260 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_allocator.h"
+#include <linux/pagemap.h>
+#include <linux/seq_file.h>
+#include <linux/mman.h>
+#include <asm/atomic.h>
+#include <linux/dma-mapping.h>
+#include <linux/slab.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32)
+#include <linux/anon_inodes.h>
+#endif
+#include <linux/file.h>
+
+#include "gc_hal_kernel_allocator_array.h"
+#include "gc_hal_kernel_platform.h"
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+
+/******************************************************************************\
+******************************** Debugfs Support *******************************
+\******************************************************************************/
+
+static gceSTATUS
+_AllocatorDebugfsInit(
+ IN gckOS Os
+ )
+{
+ gceSTATUS status;
+ gckGALDEVICE device = Os->device;
+
+ gckDEBUGFS_DIR dir = &Os->allocatorDebugfsDir;
+
+ gcmkONERROR(gckDEBUGFS_DIR_Init(dir, device->debugfsDir.root, "allocators"));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+static void
+_AllocatorDebugfsCleanup(
+ IN gckOS Os
+ )
+{
+ gckDEBUGFS_DIR dir = &Os->allocatorDebugfsDir;
+
+ gckDEBUGFS_DIR_Deinit(dir);
+}
+
+/***************************************************************************\
+************************ Allocator management *******************************
+\***************************************************************************/
+
+gceSTATUS
+gckOS_ImportAllocators(
+ gckOS Os
+ )
+{
+ gceSTATUS status;
+ gctUINT i;
+ gckALLOCATOR allocator;
+
+ _AllocatorDebugfsInit(Os);
+
+ INIT_LIST_HEAD(&Os->allocatorList);
+
+ for (i = 0; i < gcmCOUNTOF(allocatorArray); i++)
+ {
+ if (allocatorArray[i].construct)
+ {
+ /* Construct allocator. */
+ status = allocatorArray[i].construct(Os, &Os->allocatorDebugfsDir, &allocator);
+
+ if (gcmIS_ERROR(status))
+ {
+ gcmkPRINT("["DEVICE_NAME"]: Can't construct allocator(%s)",
+ allocatorArray[i].name);
+
+ continue;
+ }
+
+ allocator->name = allocatorArray[i].name;
+
+ list_add_tail(&allocator->link, &Os->allocatorList);
+ }
+ }
+
+#if gcdDEBUG
+ list_for_each_entry(allocator, &Os->allocatorList, link)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_WARNING, gcvZONE_OS,
+ "%s(%d) Allocator: %s",
+ __FUNCTION__, __LINE__,
+ allocator->name
+ );
+ }
+#endif
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_FreeAllocators(
+ gckOS Os
+ )
+{
+ gckALLOCATOR allocator;
+ gckALLOCATOR temp;
+
+ list_for_each_entry_safe(allocator, temp, &Os->allocatorList, link)
+ {
+ list_del(&allocator->link);
+
+ /* Destroy allocator. */
+ allocator->destructor(allocator);
+ }
+
+ _AllocatorDebugfsCleanup(Os);
+
+ return gcvSTATUS_OK;
+}
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION (3,6,0) \
+ || (!defined (ARCH_HAS_SG_CHAIN) && !defined (CONFIG_ARCH_HAS_SG_CHAIN))
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,23)
+static inline void sg_set_page(struct scatterlist *sg, struct page *page,
+ unsigned int len, unsigned int offset)
+{
+ sg->page = page;
+ sg->offset = offset;
+ sg->length = len;
+}
+
+static inline void sg_mark_end(struct scatterlist *sg)
+{
+ (void)sg;
+}
+# endif
+
+int
+alloc_sg_list_from_pages(
+ struct scatterlist **sgl,
+ struct page **pages,
+ unsigned int n_pages,
+ unsigned long offset,
+ unsigned long size,
+ unsigned int *nents
+ )
+{
+ unsigned int chunks;
+ unsigned int i;
+ unsigned int cur_page;
+ struct scatterlist *s;
+
+ chunks = 1;
+
+ for (i = 1; i < n_pages; ++i)
+ {
+ if (page_to_pfn(pages[i]) != page_to_pfn(pages[i - 1]) + 1)
+ {
+ ++chunks;
+ }
+ }
+
+ s = kzalloc(sizeof(struct scatterlist) * chunks, GFP_KERNEL);
+ if (unlikely(!s))
+ {
+ return -ENOMEM;
+ }
+
+ *sgl = s;
+ *nents = chunks;
+
+ cur_page = 0;
+
+ for (i = 0; i < chunks; i++, s++)
+ {
+ unsigned long chunk_size;
+ unsigned int j;
+
+ for (j = cur_page + 1; j < n_pages; j++)
+ {
+ if (page_to_pfn(pages[j]) != page_to_pfn(pages[j - 1]) + 1)
+ {
+ break;
+ }
+ }
+
+ chunk_size = ((j - cur_page) << PAGE_SHIFT) - offset;
+ sg_set_page(s, pages[cur_page], min(size, chunk_size), offset);
+ size -= chunk_size;
+ offset = 0;
+ cur_page = j;
+ }
+
+ sg_mark_end(s - 1);
+
+ return 0;
+}
+#endif
+
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
new file mode 100644
index 000000000000..b68d84e139dc
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_allocator.h
@@ -0,0 +1,608 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_allocator_h_
+#define __gc_hal_kernel_allocator_h_
+
+#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;
+
+typedef struct _gcsALLOCATOR_OPERATIONS
+{
+ /**************************************************************************
+ **
+ ** Alloc
+ **
+ ** Allocte memory, request size is page aligned.
+ **
+ ** INPUT:
+ **
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** PLINUX_Mdl
+ ** Pointer to Mdl whichs stores information
+ ** about allocated memory.
+ **
+ ** gctSIZE_T NumPages
+ ** Number of pages need to allocate.
+ **
+ ** gctUINT32 Flag
+ ** Allocation option.
+ **
+ ** OUTPUT:
+ **
+ ** Nothing.
+ **
+ */
+ gceSTATUS
+ (*Alloc)(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T NumPages,
+ IN gctUINT32 Flag
+ );
+
+ /**************************************************************************
+ **
+ ** Free
+ **
+ ** Free memory.
+ **
+ ** INPUT:
+ **
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** PLINUX_MDL Mdl
+ ** Mdl which stores information.
+ **
+ ** OUTPUT:
+ **
+ ** Nothing.
+ **
+ */
+ void
+ (*Free)(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl
+ );
+
+ /**************************************************************************
+ **
+ ** 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 gctBOOL Cacheable,
+ IN gctSIZE_T skipPages,
+ IN gctSIZE_T numPages,
+ IN struct vm_area_struct *vma
+ );
+
+ /**************************************************************************
+ **
+ ** MapUser
+ **
+ ** Map memory to user space.
+ **
+ ** INPUT:
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** PLINUX_MDL Mdl
+ ** Pointer to a Mdl.
+ **
+ ** gctBOOL Cacheable
+ ** Whether this mapping is cacheable.
+ **
+ ** OUTPUT:
+ **
+ ** gctPOINTER * UserLogical
+ ** Pointer to user logical address.
+ **
+ ** Nothing.
+ **
+ */
+ gceSTATUS
+ (*MapUser)(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap,
+ IN gctBOOL Cacheable
+ );
+
+ /**************************************************************************
+ **
+ ** UnmapUser
+ **
+ ** Unmap address from user address space.
+ **
+ ** INPUT:
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** gctPOINTER Logical
+ ** Address to be unmap
+ **
+ ** gctUINT32 Size
+ ** Size of address space
+ **
+ ** OUTPUT:
+ **
+ ** Nothing.
+ **
+ */
+ void
+ (*UnmapUser)(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap,
+ IN gctUINT32 Size
+ );
+
+ /**************************************************************************
+ **
+ ** MapKernel
+ **
+ ** Map memory to kernel space.
+ **
+ ** INPUT:
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** PLINUX_MDL Mdl
+ ** Pointer to a Mdl object.
+ **
+ ** OUTPUT:
+ ** gctPOINTER * Logical
+ ** Mapped kernel address.
+ */
+ gceSTATUS
+ (*MapKernel)(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *Logical
+ );
+
+ /**************************************************************************
+ **
+ ** UnmapKernel
+ **
+ ** Unmap memory from kernel space.
+ **
+ ** INPUT:
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** PLINUX_MDL Mdl
+ ** Pointer to a Mdl object.
+ **
+ ** gctPOINTER Logical
+ ** Mapped kernel address.
+ **
+ ** OUTPUT:
+ **
+ ** Nothing.
+ **
+ */
+ gceSTATUS
+ (*UnmapKernel)(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctPOINTER Logical
+ );
+
+ /**************************************************************************
+ **
+ ** Cache
+ **
+ ** Maintain cache coherency.
+ **
+ ** INPUT:
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** PLINUX_MDL Mdl
+ ** Pointer to a Mdl object.
+ **
+ ** gctPOINTER Logical
+ ** Logical address, could be user address or kernel address
+ **
+ ** gctSIZE_T Offset
+ ** Physical address.
+ **
+ ** gctUINT32 Bytes
+ ** Size of memory region.
+ **
+ ** gceCACHEOPERATION Opertaion
+ ** Cache operation.
+ **
+ ** OUTPUT:
+ **
+ ** Nothing.
+ **
+ */
+ gceSTATUS (*Cache)(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes,
+ IN gceCACHEOPERATION Operation
+ );
+
+ /**************************************************************************
+ **
+ ** Physical
+ **
+ ** Get physical address from a offset in memory region.
+ **
+ ** INPUT:
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** PLINUX_MDL Mdl
+ ** Pointer to a Mdl object.
+ **
+ ** gctUINT32 Offset
+ ** Offset in this memory region.
+ **
+ ** OUTPUT:
+ ** gctUINT32_PTR Physical
+ ** Physical address.
+ **
+ */
+ gceSTATUS (*Physical)(
+ IN gckALLOCATOR Allocator,
+ IN PLINUX_MDL Mdl,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * Physical
+ );
+
+ /**************************************************************************
+ **
+ ** Attach
+ **
+ ** Import memory allocated by an external allocator.
+ **
+ ** INPUT:
+ ** gckALLOCATOR Allocator
+ ** Pointer to an gckALLOCATOER object.
+ **
+ ** gctUINT32 Handle
+ ** Handle of the memory.
+ **
+ ** OUTPUT:
+ ** None.
+ **
+ */
+ gceSTATUS (*Attach)(
+ IN gckALLOCATOR Allocator,
+ 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;
+
+/* defination of allocator operations wrapper*/
+#define gcmALLOCATOR_Alloc(Allocator, Mdl, NumPages, Flag) \
+ (Allocator)->ops->Alloc((Allocator), (Mdl), (NumPages), (Flag))
+
+#define gcmALLOCATOR_Free(Allocator, Mdl) \
+ (Allocator)->ops->Free((Allocator), (Mdl))
+
+#define gcmALLOCATOR_Mmap(Allocator, Mdl, Cacheable, skipPages, numPages, vma) \
+ (Allocator)->ops->Mmap((Allocator), (Mdl), (Cacheable), (skipPages), (numPages), (vma))
+
+#define gcmALLOCATOR_MapUser(Allocator, Mdl, MdlMap, Cacheable) \
+ (Allocator)->ops->MapUser((Allocator), (Mdl), (MdlMap), (Cacheable))
+
+#define gcmALLOCATOR_UnmapUser(Allocator, Mdl, MdlMap, Size) \
+ (Allocator)->ops->UnmapUser((Allocator), (Mdl), (MdlMap), (Size))
+
+#define gcmALLOCATOR_MapKernel(Allocator, Mdl, Offset, Bytes, Logical) \
+ (Allocator)->ops->MapKernel((Allocator), (Mdl), (Offset), (Bytes), (Logical))
+
+#define gcmALLOCATOR_UnmapKernel(Allocator, Mdl, Logical) \
+ (Allocator)->ops->UnmapKernel((Allocator), (Mdl), (Logical))
+
+#define gcmALLOCATOR_Cache(Allocator, Mdl, Offset, Logical, Bytes, Operation) \
+ (Allocator)->ops->Cache((Allocator), (Mdl), (Offset), (Logical), (Bytes), (Operation))
+
+#define gcmALLOCATOR_Physical(Allocator, Mdl, Offset, Phys) \
+ (Allocator)->ops->Physical((Allocator), (Mdl), (Offset), (Phys))
+
+#define gcmALLOCATOR_Attach(Allocator, Desc, Mdl) \
+ (Allocator)->ops->Attach((Allocator), (Desc), (Mdl))
+
+#define gcmALLOCATOR_GetSGT(Allocator, Mdl, Offset, Bytes, SGT) \
+ (Allocator)->ops->GetSGT((Allocator), (Mdl), (Offset), (Bytes), (SGT))
+
+typedef struct _gcsALLOCATOR
+{
+ /* Pointer to gckOS Object. */
+ gckOS os;
+
+ /* Name. */
+ gctSTRING name;
+
+ /* Operations. */
+ gcsALLOCATOR_OPERATIONS * ops;
+
+ /* Capability of this allocator. */
+ gctUINT32 capability;
+
+ /* Debugfs entry of this allocator. */
+ gcsDEBUGFS_DIR debugfsDir;
+
+ /* Private data used by customer allocator. */
+ void * privateData;
+
+ /* Allocator destructor. */
+ void (*destructor)(struct _gcsALLOCATOR *);
+
+ struct list_head link;
+}
+gcsALLOCATOR;
+
+typedef struct _gcsALLOCATOR_DESC
+{
+ /* Name of a allocator. */
+ char * name;
+
+ /* Entry function to construct a allocator. */
+ gceSTATUS (*construct)(gckOS, gcsDEBUGFS_DIR *, gckALLOCATOR *);
+}
+gcsALLOCATOR_DESC;
+
+typedef union _gcsATTACH_DESC
+{
+ /* gcvALLOC_FLAG_DMABUF */
+ struct
+ {
+ gctPOINTER dmabuf;
+ }
+ dmaBuf;
+
+ /* gcvALLOC_FLAG_USERMEMORY */
+ struct
+ {
+ gctPOINTER memory;
+ gctPHYS_ADDR_T physical;
+ gctSIZE_T size;
+ }
+ userMem;
+
+ /* gcvALLOC_FLAG_EXTERNAL_MEMORY */
+ struct
+ {
+ gcsEXTERNAL_MEMORY_INFO info;
+ }
+ externalMem;
+
+ /* Reserved memory. */
+ struct
+ {
+ unsigned long start;
+ unsigned long size;
+ const char * name;
+ int requested;
+ }
+ reservedMem;
+}
+gcsATTACH_DESC;
+
+/*
+* Helpers
+*/
+
+/* Fill a gcsALLOCATOR_DESC structure. */
+#define gcmkDEFINE_ALLOCATOR_DESC(Name, Construct) \
+ { \
+ .name = Name, \
+ .construct = Construct, \
+ }
+
+/* Construct a allocator. */
+static inline gceSTATUS
+gckALLOCATOR_Construct(
+ IN gckOS Os,
+ IN gcsALLOCATOR_OPERATIONS * Operations,
+ OUT gckALLOCATOR * Allocator
+ )
+{
+ gceSTATUS status;
+ gckALLOCATOR allocator;
+
+ gcmkASSERT(Allocator != gcvNULL);
+ gcmkASSERT
+ ( Operations
+ && (Operations->Alloc || Operations->Attach)
+ && (Operations->Free)
+ && Operations->MapUser
+ && Operations->UnmapUser
+ && Operations->MapKernel
+ && Operations->UnmapKernel
+ && Operations->Cache
+ && Operations->Physical
+ );
+
+ allocator = kzalloc(sizeof(gcsALLOCATOR), GFP_KERNEL | gcdNOWARN);
+ if (unlikely(!allocator))
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Record os. */
+ allocator->os = Os;
+
+ /* Set operations. */
+ allocator->ops = Operations;
+
+ *Allocator = allocator;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION (3,6,0) \
+ || (!defined (ARCH_HAS_SG_CHAIN) && !defined (CONFIG_ARCH_HAS_SG_CHAIN))
+int
+alloc_sg_list_from_pages(
+ struct scatterlist **sgl,
+ struct page **pages,
+ unsigned int n_pages,
+ unsigned long offset,
+ unsigned long size,
+ unsigned int *nents
+ );
+#endif
+
+/*
+ How to implement customer allocator
+
+ Build in customer alloctor
+
+ It is recommanded that customer allocator is implmented in independent
+ source file(s) which is specified by CUSOMTER_ALLOCATOR_OBJS in Kbuld.
+
+ Register gcsALLOCATOR
+
+ For each customer specified allocator, a desciption entry must be added
+ to allocatorArray defined in gc_hal_kernel_allocator_array.h.
+
+ An entry in allocatorArray is a gcsALLOCATOR_DESC structure which describes
+ name and constructor of a gckALLOCATOR object.
+
+
+ Implement gcsALLOCATOR_DESC.init()
+
+ In gcsALLOCATOR_DESC.init(), gckALLOCATOR_Construct should be called
+ to create a gckALLOCATOR object, customer specified private data can
+ be put in gcsALLOCATOR.privateData.
+
+
+ Implement gcsALLOCATOR_OPERATIONS
+
+ When call gckALLOCATOR_Construct to create a gckALLOCATOR object, a
+ gcsALLOCATOR_OPERATIONS structure must be provided whose all members
+ implemented.
+
+*/
+#endif
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debug.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debug.h
new file mode 100644
index 000000000000..d607ee222e3c
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debug.h
@@ -0,0 +1,176 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_debug_h_
+#define __gc_hal_kernel_debug_h_
+
+#include <gc_hal_kernel_linux.h>
+#include <linux/spinlock.h>
+#include <linux/time.h>
+#include <stdarg.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,14,0)
+#include <linux/nmi.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************\
+****************************** OS-dependent Macros *****************************
+\******************************************************************************/
+
+typedef va_list gctARGUMENTS;
+
+#define gcmkARGUMENTS_START(Arguments, Pointer) \
+ va_start(Arguments, Pointer)
+
+#define gcmkARGUMENTS_END(Arguments) \
+ va_end(Arguments)
+
+#define gcmkARGUMENTS_ARG(Arguments, Type) \
+ va_arg(Arguments, Type)
+
+#define gcmkDECLARE_MUTEX(__mutex__) \
+ DEFINE_MUTEX(__mutex__)
+
+#define gcmkMUTEX_LOCK(__mutex__) \
+ mutex_lock(&__mutex__)
+
+#define gcmkMUTEX_UNLOCK(__mutex__) \
+ mutex_unlock(&__mutex__)
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+# define gcmkGETPROCESSID() \
+ task_tgid_vnr(current)
+#else
+# define gcmkGETPROCESSID() \
+ current->tgid
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+# define gcmkGETTHREADID() \
+ task_pid_vnr(current)
+#else
+# define gcmkGETTHREADID() \
+ current->pid
+#endif
+
+#define gcmkOUTPUT_STRING(String) \
+ printk("%s", String); \
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,14,0)
+#define gcmkDUMP_STRING(Os, String) \
+ do \
+ { \
+ mutex_lock(&Os->dumpFilpMutex); \
+ if (Os->dumpTarget == 0) \
+ { \
+ printk("%s", String); \
+ } \
+ else if (Os->dumpFilp && Os->dumpTarget == 1) \
+ { \
+ kernel_write(Os->dumpFilp, String, strlen(String), &Os->dumpFilp->f_pos); \
+ } \
+ mutex_unlock(&Os->dumpFilpMutex); \
+ } \
+ while (0)
+#else
+#define gcmkDUMP_STRING(Os, String) \
+ do \
+ { \
+ mutex_lock(&Os->dumpFilpMutex); \
+ if (Os->dumpTarget == 0) \
+ { \
+ printk("%s", String); \
+ } \
+ else if (Os->dumpFilp && Os->dumpTarget == 1) \
+ { \
+ mm_segment_t oldFs; \
+ oldFs = get_fs(); \
+ set_fs(KERNEL_DS); \
+ vfs_write(Os->dumpFilp, String, strlen(String), &Os->dumpFilp->f_pos); \
+ set_fs(oldFs); \
+ } \
+ mutex_unlock(&Os->dumpFilpMutex); \
+ } \
+ while (0)
+#endif
+
+#define gcmkSPRINTF(Destination, Size, ...) \
+ snprintf(Destination, Size, __VA_ARGS__)
+
+#define gcmkVSPRINTF(Destination, Size, Message, Arguments) \
+ vsnprintf(Destination, Size, Message, *((va_list*)Arguments))
+
+#define gcmkSTRCATSAFE(Destination, Size, String) \
+ strncat(Destination, String, (Size) - 1)
+
+#define gcmkMEMCPY(Destination, Source, Size) \
+ memcpy(Destination, Source, Size)
+
+#define gcmkSTRLEN(String) \
+ strlen(String)
+
+/* If not zero, forces data alignment in the variable argument list
+ by its individual size. */
+#define gcdALIGNBYSIZE 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __gc_hal_kernel_debug_h_ */
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.c
new file mode 100644
index 000000000000..7bc22a3c5669
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.c
@@ -0,0 +1,229 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifdef MODULE
+#include <linux/module.h>
+#endif
+#include <linux/init.h>
+#include <linux/debugfs.h>
+#include <linux/slab.h>
+#ifdef MODVERSIONS
+#include <linux/modversions.h>
+#endif
+#include <linux/stddef.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/timer.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/mutex.h>
+#include <linux/vmalloc.h>
+#include <linux/types.h>
+#include <linux/fs.h>
+#include <linux/poll.h>
+#include <asm/uaccess.h>
+#include <linux/completion.h>
+#include <linux/seq_file.h>
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel.h"
+#include "gc_hal_kernel_debug.h"
+
+
+#define _GC_OBJ_ZONE gcvZONE_KERNEL
+
+static int gc_debugfs_open(struct inode *inode, struct file *file)
+{
+ gcsINFO_NODE *node = inode->i_private;
+
+ return single_open(file, node->info->show, node);
+}
+
+static ssize_t
+gc_debugfs_write(
+ struct file *file,
+ const char __user *buf,
+ size_t count,
+ loff_t *pos
+ )
+{
+ struct seq_file *s = file->private_data;
+ gcsINFO_NODE *node = s->private;
+ gcsINFO *info = node->info;
+
+ if (info->write)
+ {
+ info->write(buf, count, node);
+ }
+
+ return count;
+}
+
+static const struct file_operations gc_debugfs_operations = {
+ .owner = THIS_MODULE,
+ .open = gc_debugfs_open,
+ .write = gc_debugfs_write,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+gceSTATUS
+gckDEBUGFS_DIR_Init(
+ IN gckDEBUGFS_DIR Dir,
+ IN struct dentry *root,
+ IN gctCONST_STRING Name
+ )
+{
+ Dir->root = debugfs_create_dir(Name, root);
+
+ if (!Dir->root)
+ {
+ return gcvSTATUS_NOT_SUPPORTED;
+ }
+
+ INIT_LIST_HEAD(&Dir->nodeList);
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckDEBUGFS_DIR_CreateFiles(
+ IN gckDEBUGFS_DIR Dir,
+ IN gcsINFO * List,
+ IN int count,
+ IN gctPOINTER Data
+ )
+{
+ int i;
+ gcsINFO_NODE * node;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Dir=%p List=%p count=%d Data=%p", Dir, List, count, Data);
+
+ for (i = 0; i < count; i++)
+ {
+ umode_t mode = 0;
+
+ /* Create a node. */
+ node = (gcsINFO_NODE *)kzalloc(sizeof(gcsINFO_NODE), GFP_KERNEL);
+
+ node->info = &List[i];
+ node->device = Data;
+
+ mode |= List[i].show ? S_IRUGO : 0;
+ mode |= List[i].write ? S_IWUSR : 0;
+
+ node->entry = debugfs_create_file(
+ List[i].name, mode, Dir->root, node, &gc_debugfs_operations);
+
+ if (!node->entry)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ list_add(&(node->head), &(Dir->nodeList));
+ }
+
+OnError:
+ if (gcmIS_ERROR(status))
+ {
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_RemoveFiles(Dir, List, count));
+ }
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckDEBUGFS_DIR_RemoveFiles(
+ IN gckDEBUGFS_DIR Dir,
+ IN gcsINFO * List,
+ IN int count
+ )
+{
+ int i;
+ gcsINFO_NODE * node;
+ gcsINFO_NODE * temp;
+
+ gcmkHEADER_ARG("Dir=%p List=%p count=%d", Dir, List, count);
+
+ for (i = 0; i < count; i++)
+ {
+ list_for_each_entry_safe(node, temp, &Dir->nodeList, head)
+ {
+ if (node->info == &List[i])
+ {
+ debugfs_remove(node->entry);
+ list_del(&node->head);
+ kfree(node);
+ }
+ }
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+void
+gckDEBUGFS_DIR_Deinit(
+ IN gckDEBUGFS_DIR Dir
+ )
+{
+ if (Dir->root != NULL)
+ {
+ debugfs_remove(Dir->root);
+ Dir->root = NULL;
+ }
+}
+
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.h
new file mode 100644
index 000000000000..6a5809eb0e15
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_debugfs.h
@@ -0,0 +1,115 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include <stdarg.h>
+
+#ifndef __gc_hal_kernel_debugfs_h_
+#define __gc_hal_kernel_debugfs_h_
+
+ #define MAX_LINE_SIZE 768 /* Max bytes for a line of debug info */
+
+typedef struct _gcsDEBUGFS_DIR *gckDEBUGFS_DIR;
+typedef struct _gcsDEBUGFS_DIR
+{
+ struct dentry * root;
+ struct list_head nodeList;
+}
+gcsDEBUGFS_DIR;
+
+typedef struct _gcsINFO
+{
+ const char * name;
+ int (*show)(struct seq_file*, void*);
+ int (*write)(const char __user *buf, size_t count, void*);
+}
+gcsINFO;
+
+typedef struct _gcsINFO_NODE
+{
+ gcsINFO * info;
+ gctPOINTER device;
+ struct dentry * entry;
+ struct list_head head;
+}
+gcsINFO_NODE;
+
+gceSTATUS
+gckDEBUGFS_DIR_Init(
+ IN gckDEBUGFS_DIR Dir,
+ IN struct dentry *root,
+ IN gctCONST_STRING Name
+ );
+
+gceSTATUS
+gckDEBUGFS_DIR_CreateFiles(
+ IN gckDEBUGFS_DIR Dir,
+ IN gcsINFO * List,
+ IN int count,
+ IN gctPOINTER Data
+ );
+
+gceSTATUS
+gckDEBUGFS_DIR_RemoveFiles(
+ IN gckDEBUGFS_DIR Dir,
+ IN gcsINFO * List,
+ IN int count
+ );
+
+void
+gckDEBUGFS_DIR_Deinit(
+ IN gckDEBUGFS_DIR Dir
+ );
+
+#endif
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
new file mode 100644
index 000000000000..806e7d5a596e
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.c
@@ -0,0 +1,2314 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_allocator.h"
+#include <linux/pagemap.h>
+#include <linux/seq_file.h>
+#include <linux/mman.h>
+#include <linux/slab.h>
+
+#define _GC_OBJ_ZONE gcvZONE_DEVICE
+
+#define DEBUG_FILE "galcore_trace"
+#define PARENT_FILE "gpu"
+
+#define gcdDEBUG_FS_WARN "Experimental debug entry, may be removed in future release, do NOT rely on it!\n"
+
+static gckGALDEVICE galDevice;
+
+extern gcTA globalTA[16];
+
+/******************************************************************************\
+******************************** Debugfs Support *******************************
+\******************************************************************************/
+
+/******************************************************************************\
+***************************** DEBUG SHOW FUNCTIONS *****************************
+\******************************************************************************/
+
+int gc_info_show(struct seq_file* m, void* data)
+{
+ gcsINFO_NODE *node = m->private;
+ gckGALDEVICE device = node->device;
+ int i = 0;
+ gceCHIPMODEL chipModel = 0;
+ gctUINT32 chipRevision = 0;
+ gctUINT32 productID = 0;
+ gctUINT32 ecoID = 0;
+
+ if (!device)
+ return -ENXIO;
+
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (device->kernels[i])
+ {
+ if (i == gcvCORE_VG)
+ {
+#if gcdENABLE_VG
+ chipModel = device->kernels[i]->vg->hardware->chipModel;
+ chipRevision = device->kernels[i]->vg->hardware->chipRevision;
+#endif
+ }
+ else
+ {
+ chipModel = device->kernels[i]->hardware->identity.chipModel;
+ chipRevision = device->kernels[i]->hardware->identity.chipRevision;
+ productID = device->kernels[i]->hardware->identity.productID;
+ ecoID = device->kernels[i]->hardware->identity.ecoID;
+ }
+
+ seq_printf(m, "gpu : %d\n", i);
+ seq_printf(m, "model : %4x\n", chipModel);
+ seq_printf(m, "revision : %4x\n", chipRevision);
+ seq_printf(m, "product : %4x\n", productID);
+ seq_printf(m, "eco : %4x\n", ecoID);
+ seq_printf(m, "\n");
+ }
+ }
+
+ return 0;
+}
+
+int gc_clients_show(struct seq_file* m, void* data)
+{
+ gcsINFO_NODE *node = m->private;
+ gckGALDEVICE device = node->device;
+
+ gckKERNEL kernel = _GetValidKernel(device);
+
+ gcsDATABASE_PTR database;
+ gctINT i, pid;
+ char name[24];
+
+ if (!kernel)
+ return -ENXIO;
+
+ seq_printf(m, "%-8s%s\n", "PID", "NAME");
+ seq_printf(m, "------------------------\n");
+
+ /* Acquire the database mutex. */
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(kernel->os, kernel->db->dbMutex, gcvINFINITE));
+
+ /* Walk the databases. */
+ for (i = 0; i < gcmCOUNTOF(kernel->db->db); ++i)
+ {
+ for (database = kernel->db->db[i];
+ database != gcvNULL;
+ database = database->next)
+ {
+ pid = database->processID;
+
+ gcmkVERIFY_OK(gckOS_GetProcessNameByPid(pid, gcmSIZEOF(name), name));
+
+ seq_printf(m, "%-8d%s\n", pid, name);
+ }
+ }
+
+ /* Release the database mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(kernel->os, kernel->db->dbMutex));
+
+ /* Success. */
+ return 0;
+}
+
+int gc_meminfo_show(struct seq_file* m, void* data)
+{
+ gcsINFO_NODE *node = m->private;
+ gckGALDEVICE device = node->device;
+ gckKERNEL kernel = _GetValidKernel(device);
+ gckVIDMEM memory;
+ gceSTATUS status;
+ gcsDATABASE_PTR database;
+ gctUINT32 i;
+
+ gctUINT32 free = 0, used = 0, total = 0, minFree = 0, maxUsed = 0;
+
+ gcsDATABASE_COUNTERS virtualCounter = {0, 0, 0};
+ gcsDATABASE_COUNTERS nonPagedCounter = {0, 0, 0};
+
+ if (!kernel)
+ return -ENXIO;
+
+ status = gckKERNEL_GetVideoMemoryPool(kernel, gcvPOOL_SYSTEM, &memory);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(memory->os, memory->mutex, gcvINFINITE));
+
+ free = memory->freeBytes;
+ minFree = memory->minFreeBytes;
+ used = memory->bytes - memory->freeBytes;
+ maxUsed = memory->bytes - memory->minFreeBytes;
+ total = memory->bytes;
+
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(memory->os, memory->mutex));
+ }
+
+ seq_printf(m, "VIDEO MEMORY:\n");
+ seq_printf(m, " POOL SYSTEM:\n");
+ seq_printf(m, " Free : %10u B\n", free);
+ seq_printf(m, " Used : %10u B\n", used);
+ seq_printf(m, " MinFree : %10u B\n", minFree);
+ seq_printf(m, " MaxUsed : %10u B\n", maxUsed);
+ seq_printf(m, " Total : %10u B\n", total);
+
+ /* Acquire the database mutex. */
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(kernel->os, kernel->db->dbMutex, gcvINFINITE));
+
+ /* Walk the databases. */
+ for (i = 0; i < gcmCOUNTOF(kernel->db->db); ++i)
+ {
+ for (database = kernel->db->db[i];
+ database != gcvNULL;
+ database = database->next)
+ {
+ gcsDATABASE_COUNTERS * counter;
+ counter = &database->vidMemPool[gcvPOOL_VIRTUAL];
+ virtualCounter.bytes += counter->bytes;
+ virtualCounter.maxBytes += counter->maxBytes;
+
+ counter = &database->nonPaged;
+ nonPagedCounter.bytes += counter->bytes;
+ nonPagedCounter.bytes += counter->maxBytes;
+ }
+ }
+
+ /* Release the database mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(kernel->os, kernel->db->dbMutex));
+
+ seq_printf(m, " POOL VIRTUAL:\n");
+ seq_printf(m, " Used : %10llu B\n", virtualCounter.bytes);
+ seq_printf(m, " MaxUsed : %10llu B\n", virtualCounter.bytes);
+
+ return 0;
+}
+
+static const char * vidmemTypeStr[gcvVIDMEM_TYPE_COUNT] =
+{
+ "Generic",
+ "Index",
+ "Vertex",
+ "Texture",
+ "RenderTarget",
+ "Depth",
+ "Bitmap",
+ "TileStatus",
+ "Image",
+ "Mask",
+ "Scissor",
+ "HZ",
+ "ICache",
+ "TxDesc",
+ "Fence",
+ "TFBHeader",
+ "Command",
+};
+
+static const char * poolStr[gcvPOOL_NUMBER_OF_POOLS] =
+{
+ "Unknown",
+ "Default",
+ "Local",
+ "Internal",
+ "External",
+ "Unified",
+ "System",
+ "Virtual",
+ "User",
+};
+
+static void
+_ShowDummyRecord(
+ IN struct seq_file *File,
+ IN gcsDATABASE_PTR Database
+ )
+{
+}
+
+static void
+_ShowVideoMemoryRecord(
+ IN struct seq_file *m,
+ IN gcsDATABASE_PTR Database
+ )
+{
+ gctUINT i;
+ gctUINT32 handle;
+ gckVIDMEM_NODE nodeObject;
+ gctPHYS_ADDR_T physical;
+ gctINT32 refCount = 0;
+ gctINT32 lockCount = 0;
+ gceSTATUS status;
+
+ seq_printf(m, "Video Memory Node:\n");
+ seq_printf(m, " handle nodeObject size type pool physical ref lock\n");
+
+ for (i = 0; i < gcmCOUNTOF(Database->list); i++)
+ {
+ gcsDATABASE_RECORD_PTR r = Database->list[i];
+
+ while (r != NULL)
+ {
+ gcsDATABASE_RECORD_PTR record = r;
+ r = r->next;
+
+ if (record->type != gcvDB_VIDEO_MEMORY)
+ {
+ continue;
+ }
+
+ handle = gcmPTR2INT32(record->data);
+
+ status = gckVIDMEM_HANDLE_Lookup2(
+ record->kernel,
+ Database,
+ handle,
+ &nodeObject
+ );
+
+ if (gcmIS_ERROR(status))
+ {
+ seq_printf(m, "%6u Invalid Node\n", handle);
+ continue;
+ }
+
+ gcmkONERROR(gckVIDMEM_NODE_GetPhysical(record->kernel, nodeObject, 0, &physical));
+ gcmkONERROR(gckVIDMEM_NODE_GetReference(record->kernel, nodeObject, &refCount));
+ gcmkONERROR(gckVIDMEM_NODE_GetLockCount(record->kernel, nodeObject, &lockCount));
+
+ seq_printf(m, "%#8x %#18lx %10lu %12s %8s %#12llx %4d %4d\n",
+ handle,
+ (unsigned long)nodeObject,
+ (unsigned long)record->bytes,
+ vidmemTypeStr[nodeObject->type],
+ poolStr[nodeObject->pool],
+ physical,
+ refCount,
+ lockCount
+ );
+ }
+ }
+
+OnError:
+ return;
+}
+
+static void
+_ShowNonPagedRecord(
+ IN struct seq_file *m,
+ IN gcsDATABASE_PTR Database
+ )
+{
+ gctUINT i;
+
+ seq_printf(m, "NonPaged Memory:\n");
+ seq_printf(m, " name vaddr size\n");
+
+ for (i = 0; i < gcmCOUNTOF(Database->list); i++)
+ {
+ gcsDATABASE_RECORD_PTR r = Database->list[i];
+
+ while (r != NULL)
+ {
+ gcsDATABASE_RECORD_PTR record = r;
+ r = r->next;
+
+ if (record->type != gcvDB_NON_PAGED)
+ {
+ continue;
+ }
+
+ seq_printf(m, "%6u %#18lx %10lu\n",
+ gcmPTR2INT32(record->physical),
+ (unsigned long)record->data,
+ (unsigned long)record->bytes
+ );
+ }
+ }
+}
+
+static void
+_ShowSignalRecord(
+ IN struct seq_file *m,
+ IN gcsDATABASE_PTR Database
+ )
+{
+ gctUINT i;
+
+ seq_printf(m, "User signal:\n");
+
+ for (i = 0; i < gcmCOUNTOF(Database->list); i++)
+ {
+ gcsDATABASE_RECORD_PTR r = Database->list[i];
+
+ while (r != NULL)
+ {
+ gcsDATABASE_RECORD_PTR record = r;
+ r = r->next;
+
+ if (record->type != gcvDB_SIGNAL)
+ {
+ continue;
+ }
+
+ seq_printf(m, "%#10x\n", gcmPTR2INT32(record->data));
+ }
+ }
+}
+
+static void
+_ShowLockRecord(
+ IN struct seq_file *m,
+ IN gcsDATABASE_PTR Database
+ )
+{
+ gctUINT i;
+ gceSTATUS status;
+ gctUINT32 handle;
+ gckVIDMEM_NODE nodeObject;
+
+ seq_printf(m, "Video Memory Lock:\n");
+ seq_printf(m, " handle nodeObject vaddr\n");
+
+ for (i = 0; i < gcmCOUNTOF(Database->list); i++)
+ {
+ gcsDATABASE_RECORD_PTR r = Database->list[i];
+
+ while (r != NULL)
+ {
+ gcsDATABASE_RECORD_PTR record = r;
+ r = r->next;
+
+ if (record->type != gcvDB_VIDEO_MEMORY_LOCKED)
+ {
+ continue;
+ }
+
+ handle = gcmPTR2INT32(record->data);
+
+ status = gckVIDMEM_HANDLE_Lookup2(
+ record->kernel,
+ Database,
+ handle,
+ &nodeObject
+ );
+
+ if (gcmIS_ERROR(status))
+ {
+ nodeObject = gcvNULL;
+ }
+
+ seq_printf(m, "%#8x %#18lx %#18lx\n",
+ handle,
+ (unsigned long)nodeObject,
+ (unsigned long)record->physical
+ );
+ }
+ }
+}
+
+static void
+_ShowContextRecord(
+ IN struct seq_file *m,
+ IN gcsDATABASE_PTR Database
+ )
+{
+ gctUINT i;
+
+ seq_printf(m, "Context:\n");
+
+ for (i = 0; i < gcmCOUNTOF(Database->list); i++)
+ {
+ gcsDATABASE_RECORD_PTR r = Database->list[i];
+
+ while (r != NULL)
+ {
+ gcsDATABASE_RECORD_PTR record = r;
+ r = r->next;
+
+ if (record->type != gcvDB_CONTEXT)
+ {
+ continue;
+ }
+
+ seq_printf(m, "%6u\n", gcmPTR2INT32(record->data));
+ }
+ }
+}
+
+static void
+_ShowMapMemoryRecord(
+ IN struct seq_file *m,
+ IN gcsDATABASE_PTR Database
+ )
+{
+ gctUINT i;
+
+ seq_printf(m, "Map Memory:\n");
+ seq_printf(m, " name vaddr size\n");
+
+ for (i = 0; i < gcmCOUNTOF(Database->list); i++)
+ {
+ gcsDATABASE_RECORD_PTR r = Database->list[i];
+
+ while (r != NULL)
+ {
+ gcsDATABASE_RECORD_PTR record = r;
+ r = r->next;
+
+ if (record->type != gcvDB_MAP_MEMORY)
+ {
+ continue;
+ }
+
+ seq_printf(m, "%#6lx %#18lx %10lu\n",
+ (unsigned long)record->physical,
+ (unsigned long)record->data,
+ (unsigned long)record->bytes
+ );
+ }
+ }
+}
+
+static void
+_ShowShbufRecord(
+ IN struct seq_file *m,
+ IN gcsDATABASE_PTR Database
+ )
+{
+ gctUINT i;
+
+ seq_printf(m, "ShBuf:\n");
+
+ for (i = 0; i < gcmCOUNTOF(Database->list); i++)
+ {
+ gcsDATABASE_RECORD_PTR r = Database->list[i];
+
+ while (r != NULL)
+ {
+ gcsDATABASE_RECORD_PTR record = r;
+ r = r->next;
+
+ if (record->type != gcvDB_SHBUF)
+ {
+ continue;
+ }
+
+ seq_printf(m, "%#8x\n", gcmPTR2INT32(record->data));
+ }
+ }
+}
+
+static void
+_ShowDatabase(
+ IN struct seq_file *File,
+ IN gcsDATABASE_PTR Database
+ )
+{
+ gctINT pid;
+ gctUINT i;
+ char name[24];
+ gctBOOL hasType[gcvDB_NUM_TYPES] = {0,};
+ void (* showFuncs[])(struct seq_file *, gcsDATABASE_PTR) =
+ {
+ _ShowDummyRecord,
+ _ShowVideoMemoryRecord,
+ _ShowNonPagedRecord,
+ _ShowSignalRecord,
+ _ShowLockRecord,
+ _ShowContextRecord,
+ _ShowDummyRecord,
+ _ShowMapMemoryRecord,
+ _ShowShbufRecord,
+ };
+
+ gcmSTATIC_ASSERT(gcmCOUNTOF(showFuncs) == gcvDB_NUM_TYPES,
+ "DB type mismatch");
+
+ /* Process ID and name */
+ pid = Database->processID;
+ gcmkVERIFY_OK(gckOS_GetProcessNameByPid(pid, gcmSIZEOF(name), name));
+
+ seq_printf(File, "--------------------------------------------------------------------------------\n");
+ seq_printf(File, "Process: %-8d %s\n", pid, name);
+
+ for (i = 0; i < gcmCOUNTOF(Database->list); i++)
+ {
+ gcsDATABASE_RECORD_PTR record = Database->list[i];
+
+ while (record != NULL)
+ {
+ hasType[record->type] = gcvTRUE;
+ record = record->next;
+ }
+ }
+
+ for (i = 0; i < gcvDB_NUM_TYPES; i++)
+ {
+ if (hasType[i])
+ {
+ showFuncs[i](File, Database);
+ }
+ }
+}
+
+static int
+gc_db_show(struct seq_file *m, void *data)
+{
+ gcsDATABASE_PTR database;
+ gctINT i;
+ static gctUINT64 idleTime = 0;
+ gcsINFO_NODE *node = m->private;
+ gckGALDEVICE device = node->device;
+ gckKERNEL kernel = _GetValidKernel(device);
+
+ if (!kernel)
+ return -ENXIO;
+
+ /* Acquire the database mutex. */
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(kernel->os, kernel->db->dbMutex, gcvINFINITE));
+
+ if (kernel->db->idleTime)
+ {
+ /* Record idle time if DB upated. */
+ idleTime = kernel->db->idleTime;
+ kernel->db->idleTime = 0;
+ }
+
+ /* Idle time since last call */
+ seq_printf(m, "GPU Idle: %llu ns\n", idleTime);
+
+ /* Walk the databases. */
+ for (i = 0; i < gcmCOUNTOF(kernel->db->db); ++i)
+ {
+ for (database = kernel->db->db[i];
+ database != gcvNULL;
+ database = database->next)
+ {
+ _ShowDatabase(m, database);
+ }
+ }
+
+ /* Release the database mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(kernel->os, kernel->db->dbMutex));
+
+ return 0 ;
+}
+
+static int
+gc_version_show(struct seq_file *m, void *data)
+{
+ gcsINFO_NODE *node = m->private;
+ gckGALDEVICE device = node->device;
+ gcsPLATFORM * platform = gcvNULL;
+
+ if (!device)
+ return -ENXIO;
+
+ platform = device->platform;
+ if (!platform)
+ return -ENXIO;
+
+ seq_printf(m, "%s built at %s\n", gcvVERSION_STRING, HOST);
+
+ if (platform->name)
+ {
+ seq_printf(m, "Platform path: %s\n", platform->name);
+ }
+ else
+ {
+ seq_printf(m, "Code path: %s\n", __FILE__);
+ }
+
+ return 0 ;
+}
+
+static void print_ull(char dest[32], unsigned long long u)
+{
+ unsigned t[7];
+ int i;
+
+ if (u < 1000)
+ {
+ sprintf(dest, "%27llu", u);
+ return;
+ }
+
+ for (i = 0; i < 7 && u; i++)
+ {
+ t[i] = do_div(u, 1000);
+ }
+
+ dest += sprintf(dest, "%*s", (7 - i) * 4, "");
+ dest += sprintf(dest, "%3u", t[--i]);
+
+ for (i--; i >= 0; i--)
+ {
+ dest += sprintf(dest, ",%03u", t[i]);
+ }
+}
+
+/*******************************************************************************
+**
+** Show PM state timer.
+**
+** Entry is called as 'idle' for compatible reason, it shows more information
+** than idle actually.
+**
+** Start: Start time of this counting period.
+** End: End time of this counting peroid.
+** On: Time GPU stays in gcvPOWER_0N.
+** Off: Time GPU stays in gcvPOWER_0FF.
+** Idle: Time GPU stays in gcvPOWER_IDLE.
+** Suspend: Time GPU stays in gcvPOWER_SUSPEND.
+*/
+static int
+gc_idle_show(struct seq_file *m, void *data)
+{
+ gcsINFO_NODE *node = m->private;
+ gckGALDEVICE device = node->device;
+ gckKERNEL kernel = _GetValidKernel(device);
+ char str[32];
+
+ gctUINT64 on;
+ gctUINT64 off;
+ gctUINT64 idle;
+ gctUINT64 suspend;
+
+ if (!kernel)
+ return -ENXIO;
+
+ gckHARDWARE_QueryStateTimer(kernel->hardware, &on, &off, &idle, &suspend);
+
+ /* Idle time since last call */
+ print_ull(str, on);
+ seq_printf(m, "On: %s ns\n", str);
+ print_ull(str, off);
+ seq_printf(m, "Off: %s ns\n", str);
+ print_ull(str, idle);
+ seq_printf(m, "Idle: %s ns\n", str);
+ print_ull(str, suspend);
+ seq_printf(m, "Suspend: %s ns\n", str);
+
+ return 0 ;
+}
+
+extern void
+_DumpState(
+ IN gckKERNEL Kernel
+ );
+
+/*******************************************************************************
+**
+** Show PM state timer.
+**
+** Entry is called as 'idle' for compatible reason, it shows more information
+** than idle actually.
+**
+** Start: Start time of this counting period.
+** End: End time of this counting peroid.
+** On: Time GPU stays in gcvPOWER_0N.
+** Off: Time GPU stays in gcvPOWER_0FF.
+** Idle: Time GPU stays in gcvPOWER_IDLE.
+** Suspend: Time GPU stays in gcvPOWER_SUSPEND.
+*/
+
+static int dumpCore = 0;
+
+static int
+gc_dump_trigger_show(struct seq_file *m, void *data)
+{
+#if gcdENABLE_3D || gcdENABLE_2D
+ gcsINFO_NODE *node = m->private;
+ gckGALDEVICE device = node->device;
+ gckKERNEL kernel = gcvNULL;
+
+ if (dumpCore >= gcvCORE_MAJOR && dumpCore < gcvCORE_COUNT)
+ {
+ kernel = device->kernels[dumpCore];
+ }
+
+ if (!kernel)
+ return -ENXIO;
+
+#endif
+
+ seq_printf(m, gcdDEBUG_FS_WARN);
+
+#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->options.powerManagement == gcvFALSE)
+ {
+ _DumpState(kernel);
+ }
+#endif
+
+ return 0;
+}
+
+static int dumpProcess = 0;
+
+static void
+_ShowVideoMemory(
+ struct seq_file *File,
+ gcsDATABASE_PTR Database
+ )
+{
+ gctUINT i = 0;
+
+ static const char * otherCounterNames[] = {
+ "AllocNonPaged",
+ "MapMemory",
+ };
+
+ gcsDATABASE_COUNTERS * otherCounters[] = {
+ &Database->nonPaged,
+ &Database->mapMemory,
+ };
+
+ seq_printf(File, "%-16s %16s %16s %16s\n", "", "Current", "Maximum", "Total");
+
+ /* Print surface type counters. */
+ seq_printf(File, "%-16s %16llu %16llu %16llu\n",
+ "All-Types",
+ Database->vidMem.bytes,
+ Database->vidMem.maxBytes,
+ Database->vidMem.totalBytes);
+
+ for (i = 1; i < gcvVIDMEM_TYPE_COUNT; i++)
+ {
+ seq_printf(File, "%-16s %16llu %16llu %16llu\n",
+ vidmemTypeStr[i],
+ Database->vidMemType[i].bytes,
+ Database->vidMemType[i].maxBytes,
+ Database->vidMemType[i].totalBytes);
+ }
+ seq_puts(File, "\n");
+
+ /* Print surface pool counters. */
+ seq_printf(File, "%-16s %16llu %16llu %16llu\n",
+ "All-Pools",
+ Database->vidMem.bytes,
+ Database->vidMem.maxBytes,
+ Database->vidMem.totalBytes);
+
+ for (i = 1; i < gcvPOOL_NUMBER_OF_POOLS; i++)
+ {
+ seq_printf(File, "%-16s %16llu %16llu %16llu\n",
+ poolStr[i],
+ Database->vidMemPool[i].bytes,
+ Database->vidMemPool[i].maxBytes,
+ Database->vidMemPool[i].totalBytes);
+ }
+ seq_puts(File, "\n");
+
+ /* Print other counters. */
+ for (i = 0; i < gcmCOUNTOF(otherCounterNames); i++)
+ {
+ seq_printf(File, "%-16s %16llu %16llu %16llu\n",
+ otherCounterNames[i],
+ otherCounters[i]->bytes,
+ otherCounters[i]->maxBytes,
+ otherCounters[i]->totalBytes);
+ }
+ seq_puts(File, "\n");
+}
+
+static int gc_vidmem_show(struct seq_file *m, void *unused)
+{
+ gceSTATUS status;
+ gcsDATABASE_PTR database;
+ gcsINFO_NODE *node = m->private;
+ gckGALDEVICE device = node->device;
+ char name[64];
+ int i;
+
+ gckKERNEL kernel = _GetValidKernel(device);
+
+ if (!kernel)
+ return -ENXIO;
+
+ if (dumpProcess == 0)
+ {
+ /* Acquire the database mutex. */
+ gcmkVERIFY_OK(
+ gckOS_AcquireMutex(kernel->os, kernel->db->dbMutex, gcvINFINITE));
+
+ for (i = 0; i < gcmCOUNTOF(kernel->db->db); i++)
+ {
+ for (database = kernel->db->db[i];
+ database != gcvNULL;
+ database = database->next)
+ {
+ gckOS_GetProcessNameByPid(database->processID, gcmSIZEOF(name), name);
+ seq_printf(m, "Memory Usage (Process %u: %s):\n", database->processID, name);
+ _ShowVideoMemory(m, database);
+ seq_puts(m, "\n");
+ }
+ }
+
+ /* Release the database mutex. */
+ gcmkVERIFY_OK(gckOS_ReleaseMutex(kernel->os, kernel->db->dbMutex));
+ }
+ else
+ {
+ /* Find the database. */
+ status = gckKERNEL_FindDatabase(kernel, dumpProcess, gcvFALSE, &database);
+
+ if (gcmIS_ERROR(status))
+ {
+ seq_printf(m, "ERROR: process %d not found\n", dumpProcess);
+ return 0;
+ }
+
+ gckOS_GetProcessNameByPid(dumpProcess, gcmSIZEOF(name), name);
+ seq_printf(m, "Memory Usage (Process %d: %s):\n", dumpProcess, name);
+ _ShowVideoMemory(m, database);
+ }
+
+ return 0;
+}
+
+static inline int strtoint_from_user(const char __user *s,
+ size_t count, int *res)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
+ int ret = kstrtoint_from_user(s, count, 10, res);
+
+ return ret < 0 ? ret : count;
+#else
+ /* sign, base 2 representation, newline, terminator */
+ char buf[1 + sizeof(long) * 8 + 1 + 1];
+
+ size_t len = min(count, sizeof(buf) - 1);
+
+ if (copy_from_user(buf, s, len))
+ return -EFAULT;
+ buf[len] = '\0';
+
+ *res = (int) simple_strtol(buf, NULL, 0);
+
+ return count;
+#endif
+}
+
+static int gc_vidmem_write(const char __user *buf, size_t count, void* data)
+{
+ return strtoint_from_user(buf, count, &dumpProcess);
+}
+
+static int gc_dump_trigger_write(const char __user *buf, size_t count, void* data)
+{
+ return strtoint_from_user(buf, count, &dumpCore);
+}
+
+static int gc_clk_show(struct seq_file* m, void* data)
+{
+ gcsINFO_NODE *node = m->private;
+ gckGALDEVICE device = node->device;
+ gctUINT i;
+ gceSTATUS status;
+
+ if (!device)
+ return -ENXIO;
+
+ for (i = gcvCORE_MAJOR; i < gcvCORE_COUNT; i++)
+ {
+ if (device->kernels[i])
+ {
+ gckHARDWARE hardware = device->kernels[i]->hardware;
+
+ if (i == gcvCORE_VG)
+ {
+ continue;
+ }
+
+ status = gckHARDWARE_QueryFrequency(hardware);
+ if (gcmIS_ERROR(status))
+ {
+ seq_printf(m, "query gpu%d clock fail.\n", i);
+ continue;
+ }
+
+ if (hardware->mcClk)
+ {
+ seq_printf(m, "gpu%d mc clock: %d HZ.\n", i, hardware->mcClk);
+ }
+
+ if (hardware->shClk)
+ {
+ seq_printf(m, "gpu%d sh clock: %d HZ.\n", i, hardware->shClk);
+ }
+ }
+ }
+
+ return 0;
+}
+
+static gcsINFO InfoList[] =
+{
+ {"info", gc_info_show},
+ {"clients", gc_clients_show},
+ {"meminfo", gc_meminfo_show},
+ {"idle", gc_idle_show},
+ {"database", gc_db_show},
+ {"version", gc_version_show},
+ {"vidmem", gc_vidmem_show, gc_vidmem_write},
+ {"dump_trigger", gc_dump_trigger_show, gc_dump_trigger_write},
+ {"clk", gc_clk_show},
+};
+
+static gceSTATUS
+_DebugfsInit(
+ IN gckGALDEVICE Device
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gckDEBUGFS_DIR dir = &Device->debugfsDir;
+
+ gcmkONERROR(gckDEBUGFS_DIR_Init(dir, gcvNULL, "gc"));
+ gcmkONERROR(gckDEBUGFS_DIR_CreateFiles(dir, InfoList, gcmCOUNTOF(InfoList), Device));
+
+OnError:
+ return status;
+}
+
+static void
+_DebugfsCleanup(
+ IN gckGALDEVICE Device
+ )
+{
+ gckDEBUGFS_DIR dir = &Device->debugfsDir;
+
+ if (Device->debugfsDir.root)
+ {
+ gcmkVERIFY_OK(gckDEBUGFS_DIR_RemoveFiles(dir, InfoList, gcmCOUNTOF(InfoList)));
+
+ gckDEBUGFS_DIR_Deinit(dir);
+ }
+}
+
+
+/******************************************************************************\
+*************************** Memory Allocation Wrappers *************************
+\******************************************************************************/
+
+static gceSTATUS
+_AllocateMemory(
+ IN gckGALDEVICE Device,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER *Logical,
+ OUT gctPHYS_ADDR *Physical,
+ OUT gctUINT64 *PhysAddr
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctPHYS_ADDR_T physAddr;
+
+ gcmkHEADER_ARG("Device=%p Bytes=0x%zx", Device, Bytes);
+
+ gcmkVERIFY_ARGUMENT(Device != NULL);
+ gcmkVERIFY_ARGUMENT(Logical != NULL);
+ gcmkVERIFY_ARGUMENT(Physical != NULL);
+ gcmkVERIFY_ARGUMENT(PhysAddr != NULL);
+
+ gcmkONERROR(gckOS_AllocateNonPagedMemory(
+ Device->os, gcvFALSE, gcvALLOC_FLAG_CONTIGUOUS, &Bytes, Physical, Logical
+ ));
+
+ gcmkONERROR(gckOS_GetPhysicalFromHandle(
+ Device->os, *Physical, 0, &physAddr
+ ));
+
+ *PhysAddr = physAddr;
+
+OnError:
+ gcmkFOOTER_ARG(
+ "*Logical=%p *Physical=%p *PhysAddr=0x%llx",
+ gcmOPT_POINTER(Logical), gcmOPT_POINTER(Physical), gcmOPT_VALUE(PhysAddr)
+ );
+
+ return status;
+}
+
+static gceSTATUS
+_FreeMemory(
+ IN gckGALDEVICE Device,
+ IN gctPOINTER Logical,
+ IN gctPHYS_ADDR Physical
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Device=%p Logical=%p Physical=%p",
+ Device, Logical, Physical);
+
+ gcmkVERIFY_ARGUMENT(Device != NULL);
+
+ status = gckOS_FreeNonPagedMemory(
+ Device->os, Physical, Logical,
+ ((PLINUX_MDL) Physical)->numPages * PAGE_SIZE
+ );
+
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_SetupContiguousVidMem(
+ IN gckGALDEVICE Device,
+ IN const gcsMODULE_PARAMETERS * Args
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT64 physAddr = ~0ULL;
+ gckGALDEVICE device = Device;
+
+ gcmkHEADER_ARG("Device=%p Args=%p", Device, Args);
+
+ /* set up the contiguous memory */
+ device->contiguousBase = Args->contiguousBase;
+ device->contiguousSize = Args->contiguousSize;
+
+ if (Args->contiguousSize == 0)
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+
+ if (Args->contiguousBase == 0)
+ {
+ while (device->contiguousSize > 0)
+ {
+ /* Allocate contiguous memory. */
+ status = _AllocateMemory(
+ device,
+ device->contiguousSize,
+ &device->contiguousLogical,
+ &device->contiguousPhysical,
+ &physAddr
+ );
+
+ if (gcmIS_SUCCESS(status))
+ {
+ status = gckVIDMEM_Construct(
+ device->os,
+ physAddr,
+ device->contiguousSize,
+ 64,
+ Args->bankSize,
+ &device->contiguousVidMem
+ );
+
+ if (gcmIS_SUCCESS(status))
+ {
+ gckALLOCATOR allocator = ((PLINUX_MDL)device->contiguousPhysical)->allocator;
+ device->contiguousVidMem->capability = allocator->capability | gcvALLOC_FLAG_MEMLIMIT;
+ device->contiguousVidMem->physical = device->contiguousPhysical;
+ device->contiguousBase = physAddr;
+ if (device->contiguousBase > 0xFFFFFFFFULL)
+ {
+ device->contiguousVidMem->capability &= ~gcvALLOC_FLAG_4GB_ADDR;
+ }
+ break;
+ }
+
+ gcmkONERROR(_FreeMemory(
+ device,
+ device->contiguousLogical,
+ device->contiguousPhysical
+ ));
+
+ device->contiguousLogical = gcvNULL;
+ device->contiguousPhysical = gcvNULL;
+ }
+
+ if (device->contiguousSize <= (4 << 20))
+ {
+ device->contiguousSize = 0;
+ }
+ else
+ {
+ device->contiguousSize -= (4 << 20);
+ }
+ }
+ }
+ else
+ {
+ /* Create the contiguous memory heap. */
+ status = gckVIDMEM_Construct(
+ device->os,
+ Args->contiguousBase,
+ Args->contiguousSize,
+ 64,
+ Args->bankSize,
+ &device->contiguousVidMem
+ );
+
+ if (gcmIS_ERROR(status))
+ {
+ /* Error, disable contiguous memory pool. */
+ device->contiguousVidMem = gcvNULL;
+ device->contiguousSize = 0;
+ }
+ else
+ {
+ gckALLOCATOR allocator;
+
+ gcmkONERROR(gckOS_RequestReservedMemory(
+ device->os, Args->contiguousBase, Args->contiguousSize,
+ "galcore contiguous memory",
+ Args->contiguousRequested,
+ &device->contiguousPhysical
+ ));
+
+ allocator = ((PLINUX_MDL)device->contiguousPhysical)->allocator;
+
+ device->contiguousVidMem->capability = allocator->capability | gcvALLOC_FLAG_MEMLIMIT;
+ device->contiguousVidMem->physical = device->contiguousPhysical;
+ device->requestedContiguousBase = Args->contiguousBase;
+ device->requestedContiguousSize = Args->contiguousSize;
+
+ device->contiguousPhysName = 0;
+ device->contiguousSize = Args->contiguousSize;
+ }
+ }
+
+ if (Args->showArgs)
+ {
+ gcmkPRINT("Galcore Info: ContiguousBase=0x%llx ContiguousSize=0x%zx\n", device->contiguousBase, device->contiguousSize);
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/******************************************************************************\
+******************************* Interrupt Handler ******************************
+\******************************************************************************/
+static irqreturn_t isrRoutine(int irq, void *ctxt)
+{
+ gceSTATUS status;
+ gckGALDEVICE device;
+ gceCORE core = (gceCORE)gcmPTR2INT32(ctxt) - 1;
+
+ device = galDevice;
+
+ /* Call kernel interrupt notification. */
+ status = gckHARDWARE_Interrupt(device->kernels[core]->hardware);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ up(&device->semas[core]);
+ return IRQ_HANDLED;
+ }
+
+ return IRQ_NONE;
+}
+
+static irqreturn_t isrRoutineVG(int irq, void *ctxt)
+{
+#if gcdENABLE_VG
+ gceSTATUS status;
+ gckGALDEVICE device;
+
+ device = galDevice;
+
+ /* Serve the interrupt. */
+ status = gckVGINTERRUPT_Enque(device->kernels[gcvCORE_VG]->vg->interrupt);
+
+ /* Determine the return value. */
+ return (status == gcvSTATUS_NOT_OUR_INTERRUPT)
+ ? IRQ_RETVAL(0)
+ : IRQ_RETVAL(1);
+#else
+ return IRQ_NONE;
+#endif
+}
+
+static const char *isrNames[] =
+{
+ "galcore:0",
+ "galcore:3d-1",
+ "galcore:3d-2",
+ "galcore:3d-3",
+ "galcore:3d-4",
+ "galcore:3d-5",
+ "galcore:3d-6",
+ "galcore:3d-7",
+ "galcore:2d",
+ "galcore:vg",
+#if gcdDEC_ENABLE_AHB
+ "galcore:dec"
+#endif
+};
+
+static gceSTATUS
+_SetupIsr(
+ IN gceCORE Core
+ )
+{
+ gctINT ret = 0;
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE Device = galDevice;
+ irq_handler_t handler;
+
+ gcmkHEADER_ARG("Device=%p Core=%d", Device, Core);
+
+ gcmkVERIFY_ARGUMENT(Device != NULL);
+
+ if (Device->irqLines[Core] < 0)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ gcmSTATIC_ASSERT(gcvCORE_COUNT == gcmCOUNTOF(isrNames),
+ "isrNames array does not match core types");
+
+ handler = (Core == gcvCORE_VG) ? isrRoutineVG : isrRoutine;
+
+ /*
+ * Hook up the isr based on the irq line.
+ * For shared irq, device-id can not be 0, but CORE_MAJOR value is.
+ * Add by 1 here and subtract by 1 in isr to fix the issue.
+ */
+ ret = request_irq(
+ Device->irqLines[Core], handler, gcdIRQF_FLAG,
+ isrNames[Core], (void *)(uintptr_t)(Core + 1)
+ );
+
+ if (ret != 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): Could not register irq line %d (error=%d)\n",
+ __FUNCTION__, __LINE__,
+ Device->irqLines[Core], ret
+ );
+
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ /* Mark ISR as initialized. */
+ Device->isrInitializeds[Core] = gcvTRUE;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+static gceSTATUS
+_ReleaseIsr(
+ IN gceCORE Core
+ )
+{
+ gckGALDEVICE Device = galDevice;
+
+ gcmkHEADER_ARG("Device=%p Core=%d", Device, Core);
+
+ gcmkVERIFY_ARGUMENT(Device != NULL);
+
+ /* release the irq */
+ if (Device->isrInitializeds[Core])
+ {
+ free_irq(Device->irqLines[Core], (void *)(uintptr_t)(Core + 1));
+ Device->isrInitializeds[Core] = gcvFALSE;
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+static int threadRoutine(void *ctxt)
+{
+ gckGALDEVICE device = galDevice;
+ gceCORE core = (gceCORE) gcmPTR2INT32(ctxt);
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_DRIVER,
+ "Starting isr Thread with extension=%p",
+ device);
+
+
+ for (;;)
+ {
+ int down;
+
+ down = down_interruptible(&device->semas[core]);
+ if (down && down != -EINTR)
+ {
+ return down;
+ }
+
+ if (unlikely(device->killThread))
+ {
+ /* The daemon exits. */
+ while (!kthread_should_stop())
+ {
+ gckOS_Delay(device->os, 1);
+ }
+
+ return 0;
+ }
+
+ gckKERNEL_Notify(device->kernels[core], gcvNOTIFY_INTERRUPT);
+ }
+}
+
+static gceSTATUS
+_StartThread(
+ IN gckGALDEVICE Device,
+ IN gceCORE Core
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE device = galDevice;
+ struct task_struct * task;
+
+ if (device->kernels[Core] != gcvNULL)
+ {
+ /* Start the kernel thread. */
+ task = kthread_run(threadRoutine, (void *)Core,
+ "galcore_deamon/%d", Core);
+
+ if (IS_ERR(task))
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): Could not start the kernel thread.\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ device->threadCtxts[Core] = task;
+ device->threadInitializeds[Core] = gcvTRUE;
+ }
+ else
+ {
+ device->threadInitializeds[Core] = gcvFALSE;
+ }
+
+OnError:
+ return status;
+}
+
+static void
+_StopThread(
+ gckGALDEVICE Device,
+ gceCORE Core
+ )
+{
+ if (Device->threadInitializeds[Core])
+ {
+ Device->killThread = gcvTRUE;
+ up(&Device->semas[Core]);
+
+ kthread_stop(Device->threadCtxts[Core]);
+ Device->threadCtxts[Core] = gcvNULL;
+ Device->threadInitializeds[Core] = gcvFALSE;
+ }
+}
+
+/*******************************************************************************
+**
+** gckGALDEVICE_Construct
+**
+** Constructor.
+**
+** INPUT:
+**
+** OUTPUT:
+**
+** gckGALDEVICE * Device
+** Pointer to a variable receiving the gckGALDEVICE object pointer on
+** success.
+*/
+gceSTATUS
+gckGALDEVICE_Construct(
+ IN gcsPLATFORM * Platform,
+ IN const gcsMODULE_PARAMETERS * Args,
+ OUT gckGALDEVICE *Device
+ )
+{
+ gckKERNEL kernel = gcvNULL;
+ gckGALDEVICE device;
+ gctINT32 i, j;
+ gceHARDWARE_TYPE type;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Platform=%p Args=%p", Platform, Args);
+
+ /* Allocate device structure. */
+ device = kmalloc(sizeof(struct _gckGALDEVICE), GFP_KERNEL | __GFP_NOWARN);
+
+ if (!device)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ memset(device, 0, sizeof(struct _gckGALDEVICE));
+
+ device->platform = Platform;
+ device->platform->dev = gcvNULL;
+
+ device->args = *Args;
+
+ /* Clear irq lines. */
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ device->irqLines[i] = -1;
+#if USE_LINUX_PCIE
+ device->bars[i] = -1;
+#endif
+ }
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ device->irqLines[i] = Args->irqs[i];
+ device->requestedRegisterMemBases[i] = Args->registerBases[i];
+ device->requestedRegisterMemSizes[i] = Args->registerSizes[i];
+#if USE_LINUX_PCIE
+ device->bars[i] = Args->bars[i];
+#endif
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, _GC_OBJ_ZONE,
+ "Get register base %llx of core %d",
+ Args->registerBases[i], i);
+ }
+
+ device->requestedContiguousBase = 0;
+ device->requestedContiguousSize = 0;
+
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ unsigned long physical;
+ physical = (unsigned long)device->requestedRegisterMemBases[i];
+
+ /* Set up register memory region. */
+ if (physical != 0)
+ {
+ if (Args->registerBasesMapped[i])
+ {
+ device->registerBases[i] = Args->registerBasesMapped[i];
+ device->requestedRegisterMemBases[i] = 0;
+ }
+ else
+ {
+#if USE_LINUX_PCIE
+ gcmkPRINT("register should be mapped in platform layer");
+#endif
+ if (!request_mem_region(physical,
+ device->requestedRegisterMemSizes[i],
+ "galcore register region"))
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): Failed to claim %lu bytes @ 0x%llx\n",
+ __FUNCTION__, __LINE__,
+ device->requestedRegisterMemSizes[i], physical
+ );
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ device->registerBases[i] = (gctPOINTER)ioremap_nocache(
+ physical, device->requestedRegisterMemSizes[i]);
+
+ if (device->registerBases[i] == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): Unable to map %ld bytes @ 0x%zx\n",
+ __FUNCTION__, __LINE__,
+ physical, device->requestedRegisterMemSizes[i]
+ );
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+ }
+ }
+ }
+
+ /* Set the base address */
+ device->baseAddress = device->physBase = Args->baseAddress;
+ device->physSize = Args->physSize;
+
+ for (i = 0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ device->extSRAMBases[i] = Args->extSRAMBases[i];
+ device->extSRAMSizes[i] = Args->extSRAMSizes[i];
+ }
+
+ /* Construct the gckOS object. */
+ gcmkONERROR(gckOS_Construct(device, &device->os));
+
+ /* Construct the gckDEVICE object for os independent core management. */
+ gcmkONERROR(gckDEVICE_Construct(device->os, &device->device));
+
+ device->device->showSRAMMapInfo = Args->showArgs;
+
+ device->platform->dev = device->device;
+
+ if (device->irqLines[gcvCORE_MAJOR] != -1)
+ {
+ gcmkONERROR(gctaOS_ConstructOS(device->os, &device->taos));
+ }
+
+ /* Setup contiguous video memory pool. */
+ gcmkONERROR(_SetupContiguousVidMem(device, Args));
+
+ /* Set external base and size */
+ device->externalBase = Args->externalBase;
+ device->externalSize = Args->externalSize;
+
+ if (device->irqLines[gcvCORE_MAJOR] != -1)
+ {
+ gcmkONERROR(gcTA_Construct(
+ device->taos,
+ gcvCORE_MAJOR,
+ &globalTA[gcvCORE_MAJOR]
+ ));
+
+ gcmkONERROR(gckDEVICE_AddCore(
+ device->device,
+ gcvCORE_MAJOR,
+ Args->chipIDs[gcvCORE_MAJOR],
+ device,
+ &device->kernels[gcvCORE_MAJOR]
+ ));
+
+ gcmkONERROR(gckHARDWARE_SetFastClear(
+ device->kernels[gcvCORE_MAJOR]->hardware,
+ Args->fastClear,
+ Args->compression
+ ));
+
+ gcmkONERROR(gckHARDWARE_EnablePowerManagement(
+ device->kernels[gcvCORE_MAJOR]->hardware,
+ Args->powerManagement
+ ));
+
+#if gcdENABLE_FSCALE_VAL_ADJUST
+ gcmkONERROR(gckHARDWARE_SetMinFscaleValue(
+ device->kernels[gcvCORE_MAJOR]->hardware,
+ Args->gpu3DMinClock
+ ));
+#endif
+
+ gcmkONERROR(gckHARDWARE_SetGpuProfiler(
+ device->kernels[gcvCORE_MAJOR]->hardware,
+ Args->gpuProfiler
+ ));
+ }
+ else
+ {
+ device->kernels[gcvCORE_MAJOR] = gcvNULL;
+ }
+
+ if (device->irqLines[gcvCORE_2D] != -1)
+ {
+ gcmkONERROR(gckDEVICE_AddCore(
+ device->device,
+ gcvCORE_2D,
+ gcvCHIP_ID_DEFAULT,
+ device,
+ &device->kernels[gcvCORE_2D]
+ ));
+
+ /* Verify the hardware type */
+ gcmkONERROR(gckHARDWARE_GetType(
+ device->kernels[gcvCORE_2D]->hardware,
+ &type
+ ));
+
+ if (type != gcvHARDWARE_2D)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): Unexpected hardware type: %d\n",
+ __FUNCTION__, __LINE__,
+ type
+ );
+
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ gcmkONERROR(gckHARDWARE_EnablePowerManagement(
+ device->kernels[gcvCORE_2D]->hardware,
+ Args->powerManagement
+ ));
+
+#if gcdENABLE_FSCALE_VAL_ADJUST
+ gcmkONERROR(gckHARDWARE_SetMinFscaleValue(
+ device->kernels[gcvCORE_2D]->hardware, 1
+ ));
+#endif
+ }
+ else
+ {
+ device->kernels[gcvCORE_2D] = gcvNULL;
+ }
+
+ if (device->irqLines[gcvCORE_VG] != -1)
+ {
+#if gcdENABLE_VG
+ gcmkONERROR(gckDEVICE_AddCore(
+ device->device,
+ gcvCORE_VG,
+ gcvCHIP_ID_DEFAULT,
+ device,
+ &device->kernels[gcvCORE_VG]
+ ));
+
+ gcmkONERROR(gckVGHARDWARE_EnablePowerManagement(
+ device->kernels[gcvCORE_VG]->vg->hardware,
+ Args->powerManagement
+ ));
+#endif
+ }
+ else
+ {
+ device->kernels[gcvCORE_VG] = gcvNULL;
+ }
+
+ /* Add core for multiple core. */
+ for (i = gcvCORE_3D1; i <= gcvCORE_3D_MAX; i++)
+ {
+ if (device->irqLines[i] != -1)
+ {
+ gcmkONERROR(gcTA_Construct(
+ device->taos,
+ (gceCORE)i,
+ &globalTA[i]
+ ));
+
+ gckDEVICE_AddCore(
+ device->device,
+ i,
+ Args->chipIDs[i],
+ device,
+ &device->kernels[i]
+ );
+
+ gcmkONERROR(gckHARDWARE_SetFastClear(
+ device->kernels[i]->hardware,
+ Args->fastClear,
+ Args->compression
+ ));
+
+ gcmkONERROR(gckHARDWARE_EnablePowerManagement(
+ device->kernels[i]->hardware,
+ Args->powerManagement
+ ));
+
+ gcmkONERROR(gckHARDWARE_SetGpuProfiler(
+ device->kernels[i]->hardware,
+ Args->gpuProfiler
+ ));
+ }
+ }
+
+ /* Setup external SRAM memory region. */
+ for (i = 0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ if (!device->extSRAMSizes[i])
+ {
+ /* Keep this path for internal test, read from feature database. */
+ device->extSRAMSizes[i] = device->device->extSRAMSizes[i];
+ }
+
+ if (device->extSRAMSizes[i] > 0)
+ {
+ /* create the external SRAM memory heap */
+ status = gckVIDMEM_Construct(
+ device->os,
+ device->extSRAMBases[i],
+ device->extSRAMSizes[i],
+ 64,
+ 0,
+ &device->extSRAMVidMem[i]
+ );
+
+ if (gcmIS_ERROR(status))
+ {
+ /* Error, disable external SRAM heap. */
+ device->extSRAMSizes[i] = 0;
+ }
+ else
+ {
+ char sRAMName[20];
+ snprintf(sRAMName, gcmSIZEOF(sRAMName) - 1, "Galcore external sram%d", i);
+
+ /* Map external SRAM memory. */
+ gcmkONERROR(gckOS_RequestReservedMemory(
+ device->os,
+ device->extSRAMBases[i], device->extSRAMSizes[i],
+ sRAMName,
+ device->args.sRAMRequested,
+ &device->extSRAMPhysical[i]
+ ));
+
+ device->extSRAMVidMem[i]->physical = device->extSRAMPhysical[i];
+ device->device->extSRAMPhysical[i] = device->extSRAMPhysical[i];
+
+ for (j = 0; j < gcdMAX_GPU_COUNT; j++)
+ {
+ if (device->irqLines[j] != -1 && device->kernels[j])
+ {
+ device->kernels[j]->hardware->options.extSRAMGPUPhysNames[i] = gckKERNEL_AllocateNameFromPointer(device->kernels[j], device->extSRAMPhysical[i]);
+ }
+ }
+ }
+ }
+ }
+
+ /* Initialize the kernel thread semaphores. */
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (device->irqLines[i] != -1 && device->kernels[i])
+ {
+ sema_init(&device->semas[i], 0);
+ }
+ }
+
+ /* Grab the first valid kernel. */
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (device->kernels[i] != gcvNULL)
+ {
+ kernel = device->kernels[i];
+ break;
+ }
+ }
+
+ if (!kernel)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+
+ if (device->externalSize > 0)
+ {
+ /* create the external memory heap */
+ status = gckVIDMEM_Construct(
+ device->os,
+ device->externalBase,
+ device->externalSize,
+ 64,
+ 0,
+ &device->externalVidMem
+ );
+
+ if (gcmIS_ERROR(status))
+ {
+ /* Error, disable external heap. */
+ device->externalSize = 0;
+ }
+ else
+ {
+ /* Map external memory. */
+ gcmkONERROR(gckOS_RequestReservedMemory(
+ device->os,
+ device->externalBase, device->externalSize,
+ "galcore external memory",
+ gcvTRUE,
+ &device->externalPhysical
+ ));
+
+ device->externalVidMem->physical = device->externalPhysical;
+ }
+ }
+
+ if (device->internalPhysical)
+ {
+ device->internalPhysName = gcmPTR_TO_NAME(device->internalPhysical);
+ }
+
+ if (device->externalPhysical)
+ {
+ device->externalPhysName = gcmPTR_TO_NAME(device->externalPhysical);
+ }
+
+ if (device->contiguousPhysical)
+ {
+ device->contiguousPhysName = gcmPTR_TO_NAME(device->contiguousPhysical);
+ }
+
+ gcmkONERROR(_DebugfsInit(device));
+
+ /* Return pointer to the device. */
+ *Device = galDevice = device;
+
+OnError:
+ if (gcmIS_ERROR(status))
+ {
+ /* Roll back. */
+ gcmkVERIFY_OK(gckGALDEVICE_Destroy(device));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckGALDEVICE_Destroy
+**
+** Class destructor.
+**
+** INPUT:
+**
+** Nothing.
+**
+** OUTPUT:
+**
+** Nothing.
+**
+** RETURNS:
+**
+** Nothing.
+*/
+gceSTATUS
+gckGALDEVICE_Destroy(
+ gckGALDEVICE Device)
+{
+ gctINT i, j = 0;
+ gckKERNEL kernel = gcvNULL;
+
+ gcmkHEADER_ARG("Device=%p", Device);
+
+ if (Device != gcvNULL)
+ {
+ /* Grab the first available kernel */
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (Device->kernels[i])
+ {
+ kernel = Device->kernels[i];
+ break;
+ }
+ }
+
+ if (kernel)
+ {
+ if (Device->internalPhysName != 0)
+ {
+ gcmRELEASE_NAME(Device->internalPhysName);
+ Device->internalPhysName = 0;
+ }
+ if (Device->externalPhysName != 0)
+ {
+ gcmRELEASE_NAME(Device->externalPhysName);
+ Device->externalPhysName = 0;
+ }
+ if (Device->contiguousPhysName != 0)
+ {
+ gcmRELEASE_NAME(Device->contiguousPhysName);
+ Device->contiguousPhysName = 0;
+ }
+ }
+
+ /* Destroy per-core SRAM heap. */
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ if (Device->kernels[i])
+ {
+ kernel = Device->kernels[i];
+
+ for (j = gcvSRAM_INTERNAL0; j < gcvSRAM_INTER_COUNT; j++)
+ {
+ if (kernel->sRAMPhysical[j] != gcvNULL)
+ {
+ /* Release reserved SRAM memory. */
+ gckOS_ReleaseReservedMemory(
+ Device->os,
+ kernel->sRAMPhysical[j]
+ );
+
+ kernel->sRAMPhysical[j] = gcvNULL;
+ }
+
+ if (kernel->sRAMVidMem[j] != gcvNULL)
+ {
+ /* Destroy the SRAM contiguous heap. */
+ gcmkVERIFY_OK(gckVIDMEM_Destroy(kernel->sRAMVidMem[j]));
+ kernel->sRAMVidMem[j] = gcvNULL;
+ }
+ }
+ }
+ }
+
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (Device->kernels[i] != gcvNULL)
+ {
+ Device->kernels[i] = gcvNULL;
+ }
+ }
+
+ if (Device->internalLogical != gcvNULL)
+ {
+ /* Unmap the internal memory. */
+ iounmap(Device->internalLogical);
+ Device->internalLogical = gcvNULL;
+ }
+
+ if (Device->internalVidMem != gcvNULL)
+ {
+ /* Destroy the internal heap. */
+ gcmkVERIFY_OK(gckVIDMEM_Destroy(Device->internalVidMem));
+ Device->internalVidMem = gcvNULL;
+ }
+
+ for (i = 0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ if (Device->extSRAMPhysical[i] != gcvNULL)
+ {
+ gckOS_ReleaseReservedMemory(
+ Device->os,
+ Device->extSRAMPhysical[i]
+ );
+ Device->extSRAMPhysical[i] = gcvNULL;
+ }
+
+ if (Device->extSRAMVidMem[i] != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckVIDMEM_Destroy(Device->extSRAMVidMem[i]));
+ Device->extSRAMVidMem[i] = gcvNULL;
+ }
+ }
+
+ if (Device->externalPhysical != gcvNULL)
+ {
+ gckOS_ReleaseReservedMemory(
+ Device->os,
+ Device->externalPhysical
+ );
+ Device->externalPhysical = gcvNULL;
+ }
+
+ if (Device->externalLogical != gcvNULL)
+ {
+ Device->externalLogical = gcvNULL;
+ }
+
+ if (Device->externalVidMem != gcvNULL)
+ {
+ /* destroy the external heap */
+ gcmkVERIFY_OK(gckVIDMEM_Destroy(Device->externalVidMem));
+ Device->externalVidMem = gcvNULL;
+ }
+
+ if (Device->device)
+ {
+ gcmkVERIFY_OK(gckDEVICE_Destroy(Device->os, Device->device));
+
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (globalTA[i])
+ {
+ gcTA_Destroy(globalTA[i]);
+ globalTA[i] = gcvNULL;
+ }
+ }
+
+ Device->device = gcvNULL;
+ }
+
+ /*
+ * Destroy contiguous memory pool after gckDEVICE destroyed. gckDEVICE
+ * may allocates GPU memory types from SYSTEM pool.
+ */
+ if (Device->contiguousPhysical != gcvNULL)
+ {
+ if (Device->requestedContiguousBase == 0)
+ {
+ gcmkVERIFY_OK(_FreeMemory(
+ Device,
+ Device->contiguousLogical,
+ Device->contiguousPhysical
+ ));
+ }
+ else
+ {
+ gckOS_ReleaseReservedMemory(
+ Device->os,
+ Device->contiguousPhysical
+ );
+ Device->contiguousPhysical = gcvNULL;
+ Device->requestedContiguousBase = 0;
+ Device->requestedContiguousSize = 0;
+ }
+
+ Device->contiguousLogical = gcvNULL;
+ Device->contiguousPhysical = gcvNULL;
+ }
+
+ if (Device->contiguousVidMem != gcvNULL)
+ {
+ /* Destroy the contiguous heap. */
+ gcmkVERIFY_OK(gckVIDMEM_Destroy(Device->contiguousVidMem));
+ Device->contiguousVidMem = gcvNULL;
+ }
+
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (Device->registerBases[i])
+ {
+ /* Unmap register memory. */
+ if (Device->requestedRegisterMemBases[i] != 0)
+ {
+ iounmap(Device->registerBases[i]);
+ release_mem_region(Device->requestedRegisterMemBases[i],
+ Device->requestedRegisterMemSizes[i]);
+ }
+
+ Device->registerBases[i] = gcvNULL;
+ Device->requestedRegisterMemBases[i] = 0;
+ Device->requestedRegisterMemSizes[i] = 0;
+ }
+ }
+
+
+ if (Device->taos)
+ {
+ gcmkVERIFY_OK(gctaOS_DestroyOS(Device->taos));
+ Device->taos = gcvNULL;
+ }
+
+ /* Destroy the gckOS object. */
+ if (Device->os != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_Destroy(Device->os));
+ Device->os = gcvNULL;
+ }
+
+ _DebugfsCleanup(Device);
+
+ /* Free the device. */
+ kfree(Device);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckGALDEVICE_Start
+**
+** Start the gal device, including the following actions: setup the isr routine
+** and start the daemoni thread.
+**
+** INPUT:
+**
+** gckGALDEVICE Device
+** Pointer to an gckGALDEVICE object.
+**
+** OUTPUT:
+**
+** Nothing.
+**
+** RETURNS:
+**
+** gcvSTATUS_OK
+** Start successfully.
+*/
+gceSTATUS
+gckGALDEVICE_Start(
+ IN gckGALDEVICE Device
+ )
+{
+ gctUINT i;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Device=%p", Device);
+
+ /* Start the kernel threads. */
+ for (i = 0; i < gcvCORE_COUNT; ++i)
+ {
+ if (i == gcvCORE_VG)
+ {
+ continue;
+ }
+
+ gcmkONERROR(_StartThread(Device, i));
+ }
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ if (Device->kernels[i] == gcvNULL)
+ {
+ continue;
+ }
+
+ /* Setup the ISR routine. */
+ gcmkONERROR(_SetupIsr(i));
+
+ if (i == gcvCORE_VG)
+ {
+#if gcdENABLE_VG
+ /* Switch to SUSPEND power state. */
+ gcmkONERROR(gckVGHARDWARE_SetPowerState(
+ Device->kernels[gcvCORE_VG]->vg->hardware, gcvPOWER_OFF_BROADCAST
+ ));
+#endif
+ }
+ else
+ {
+ /* Switch to SUSPEND power state. */
+ gcmkONERROR(gckHARDWARE_SetPowerState(
+ Device->kernels[i]->hardware, gcvPOWER_OFF_BROADCAST
+ ));
+
+ gcmkONERROR(gckHARDWARE_StartTimerReset(Device->kernels[i]->hardware));
+ }
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckGALDEVICE_Stop
+**
+** Stop the gal device, including the following actions: stop the daemon
+** thread, release the irq.
+**
+** INPUT:
+**
+** gckGALDEVICE Device
+** Pointer to an gckGALDEVICE object.
+**
+** OUTPUT:
+**
+** Nothing.
+**
+** RETURNS:
+**
+** Nothing.
+*/
+gceSTATUS
+gckGALDEVICE_Stop(
+ gckGALDEVICE Device
+ )
+{
+ gctUINT i;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Device=%p", Device);
+
+ gcmkVERIFY_ARGUMENT(Device != NULL);
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ if (Device->kernels[i] == gcvNULL)
+ {
+ continue;
+ }
+
+ if (Device->isrInitializeds[i] == gcvFALSE)
+ {
+ continue;
+ }
+
+ if (i == gcvCORE_VG)
+ {
+#if gcdENABLE_VG
+ /* Switch to OFF power state. */
+ gcmkONERROR(gckVGHARDWARE_SetPowerState(
+ Device->kernels[i]->vg->hardware, gcvPOWER_OFF
+ ));
+#endif
+ }
+ else
+ {
+ gcmkONERROR(gckHARDWARE_EnablePowerManagement(
+ Device->kernels[i]->hardware, gcvTRUE
+ ));
+
+ /* Switch to OFF power state. */
+ gcmkONERROR(gckHARDWARE_SetPowerState(
+ Device->kernels[i]->hardware, gcvPOWER_OFF
+ ));
+
+ gckHARDWARE_StartTimerReset(Device->kernels[i]->hardware);
+ }
+
+ /* Stop the ISR routine. */
+ gcmkONERROR(_ReleaseIsr(i));
+
+ }
+
+ /* Stop the kernel thread. */
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ _StopThread(Device, i);
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
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
new file mode 100644
index 000000000000..4d96458bbbe2
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_device.h
@@ -0,0 +1,209 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_device_h_
+#define __gc_hal_kernel_device_h_
+
+#include "gc_hal_kernel_debugfs.h"
+#include "gc_hal_ta.h"
+
+/******************************************************************************\
+************************** gckGALDEVICE Structure ******************************
+\******************************************************************************/
+
+typedef struct _gckGALDEVICE
+{
+ /* Objects. */
+ gckOS os;
+ gckKERNEL kernels[gcdMAX_GPU_COUNT];
+
+ gcsPLATFORM* platform;
+
+ /* Attributes. */
+ gctPHYS_ADDR_T internalBase;
+ gctSIZE_T internalSize;
+ gctPHYS_ADDR internalPhysical;
+ gctUINT32 internalPhysName;
+ gctPOINTER internalLogical;
+ gckVIDMEM internalVidMem;
+
+ gctPHYS_ADDR_T externalBase;
+ gctSIZE_T externalSize;
+ gctPHYS_ADDR externalPhysical;
+ gctUINT32 externalPhysName;
+ gctPOINTER externalLogical;
+ gckVIDMEM externalVidMem;
+
+ /* Shared external SRAMs. */
+ gctPHYS_ADDR_T extSRAMBases[gcvSRAM_EXT_COUNT];
+ gctSIZE_T extSRAMSizes[gcvSRAM_EXT_COUNT];
+ gctPHYS_ADDR extSRAMPhysical[gcvSRAM_EXT_COUNT];
+ gckVIDMEM extSRAMVidMem[gcvSRAM_EXT_COUNT];
+
+ gctPHYS_ADDR_T contiguousBase;
+ gctSIZE_T contiguousSize;
+ gctPHYS_ADDR contiguousPhysical;
+ gctUINT32 contiguousPhysName;
+ gctPOINTER contiguousLogical;
+ gckVIDMEM contiguousVidMem;
+
+ /* By request_mem_region. */
+ gctUINT64 requestedContiguousBase;
+ gctSIZE_T requestedContiguousSize;
+
+ /* IRQ management. */
+ gctINT irqLines[gcdMAX_GPU_COUNT];
+ gctBOOL isrInitializeds[gcdMAX_GPU_COUNT];
+
+ /* Register memory. */
+ gctPOINTER registerBases[gcdMAX_GPU_COUNT];
+ gctSIZE_T registerSizes[gcdMAX_GPU_COUNT];
+
+ /* By request_mem_region. */
+ gctUINT64 requestedRegisterMemBases[gcdMAX_GPU_COUNT];
+ gctSIZE_T requestedRegisterMemSizes[gcdMAX_GPU_COUNT];
+
+ gctUINT32 baseAddress;
+ gctUINT32 physBase;
+ gctUINT32 physSize;
+
+
+ /* PCIE Bar */
+ gctINT bars[gcdMAX_GPU_COUNT];
+
+ /* Thread management. */
+ struct task_struct *threadCtxts[gcdMAX_GPU_COUNT];
+ struct semaphore semas[gcdMAX_GPU_COUNT];
+ gctBOOL threadInitializeds[gcdMAX_GPU_COUNT];
+ gctBOOL killThread;
+
+ /* States before suspend. */
+ gceCHIPPOWERSTATE statesStored[gcdMAX_GPU_COUNT];
+
+ gcsDEBUGFS_DIR debugfsDir;
+
+ gckDEVICE device;
+
+ gcsMODULE_PARAMETERS args;
+
+ /* gctsOs object for trust application. */
+ gctaOS taos;
+
+#if gcdENABLE_DRM
+ void * drm;
+#endif
+}
+* gckGALDEVICE;
+
+typedef struct _gcsHAL_PRIVATE_DATA
+{
+ gckGALDEVICE device;
+ /*
+ * 'fput' schedules actual work in '__fput' in a different thread.
+ * So the process opens the device may not be the same as the one that
+ * closes it.
+ */
+ gctUINT32 pidOpen;
+ gctBOOL isLocked;
+}
+gcsHAL_PRIVATE_DATA, * gcsHAL_PRIVATE_DATA_PTR;
+
+gceSTATUS
+gckGALDEVICE_Start(
+ IN gckGALDEVICE Device
+ );
+
+gceSTATUS
+gckGALDEVICE_Stop(
+ gckGALDEVICE Device
+ );
+
+gceSTATUS
+gckGALDEVICE_Construct(
+ IN gcsPLATFORM * Platform,
+ IN const gcsMODULE_PARAMETERS * Args,
+ OUT gckGALDEVICE *Device
+ );
+
+gceSTATUS
+gckGALDEVICE_Destroy(
+ IN gckGALDEVICE Device
+ );
+
+static gcmINLINE gckKERNEL
+_GetValidKernel(
+ gckGALDEVICE Device
+ )
+{
+ if (Device->kernels[gcvCORE_MAJOR])
+ {
+ return Device->kernels[gcvCORE_MAJOR];
+ }
+ else if (Device->kernels[gcvCORE_2D])
+ {
+ return Device->kernels[gcvCORE_2D];
+ }
+ else if (Device->kernels[gcvCORE_VG])
+ {
+ return Device->kernels[gcvCORE_VG];
+ }
+ else
+ {
+ gcmkASSERT(gcvFALSE);
+ return gcvNULL;
+ }
+}
+
+#endif /* __gc_hal_kernel_device_h_ */
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
new file mode 100644
index 000000000000..88b50e8908bf
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_driver.c
@@ -0,0 +1,1462 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include <linux/device.h>
+#include <linux/slab.h>
+#include <linux/miscdevice.h>
+#include <linux/uaccess.h>
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_driver.h"
+
+#include <linux/platform_device.h>
+
+/* Zone used for header/footer. */
+#define _GC_OBJ_ZONE gcvZONE_DRIVER
+
+MODULE_DESCRIPTION("Vivante Graphics Driver");
+MODULE_LICENSE("Dual MIT/GPL");
+
+
+static struct class* gpuClass = NULL;
+
+static gcsPLATFORM *platform = NULL;
+
+static gckGALDEVICE galDevice;
+
+static uint major = 199;
+module_param(major, uint, 0644);
+MODULE_PARM_DESC(major, "major device number for GC device");
+
+static int irqLine = -1;
+module_param(irqLine, int, 0644);
+MODULE_PARM_DESC(irqLine, "IRQ number of GC core");
+
+static ulong registerMemBase = 0x80000000;
+module_param(registerMemBase, ulong, 0644);
+MODULE_PARM_DESC(registerMemBase, "Base of bus address of GC core AHB register");
+
+static ulong registerMemSize = 2 << 16;
+module_param(registerMemSize, ulong, 0644);
+MODULE_PARM_DESC(registerMemSize, "Size of bus address range of GC core AHB register");
+
+static int irqLine2D = -1;
+module_param(irqLine2D, int, 0644);
+MODULE_PARM_DESC(irqLine2D, "IRQ number of G2D core if irqLine is used for a G3D core");
+
+static ulong registerMemBase2D = 0x00000000;
+module_param(registerMemBase2D, ulong, 0644);
+MODULE_PARM_DESC(registerMemBase2D, "Base of bus address of G2D core if registerMemBase2D is used for a G3D core");
+
+static ulong registerMemSize2D = 2 << 16;
+module_param(registerMemSize2D, ulong, 0644);
+MODULE_PARM_DESC(registerMemSize2D, "Size of bus address range of G2D core if registerMemSize is used for a G3D core");
+
+static int irqLineVG = -1;
+module_param(irqLineVG, int, 0644);
+MODULE_PARM_DESC(irqLineVG, "IRQ number of VG core");
+
+static ulong registerMemBaseVG = 0x00000000;
+module_param(registerMemBaseVG, ulong, 0644);
+MODULE_PARM_DESC(registerMemBaseVG, "Base of bus address of VG core");
+
+static ulong registerMemSizeVG = 2 << 10;
+module_param(registerMemSizeVG, ulong, 0644);
+MODULE_PARM_DESC(registerMemSizeVG, "Size of bus address range of VG core");
+
+#if gcdDEC_ENABLE_AHB
+static ulong registerMemBaseDEC300 = 0x00000000;
+module_param(registerMemBaseDEC300, ulong, 0644);
+
+static ulong registerMemSizeDEC300 = 2 << 10;
+module_param(registerMemSizeDEC300, ulong, 0644);
+#endif
+
+#ifndef gcdDEFAULT_CONTIGUOUS_SIZE
+#define gcdDEFAULT_CONTIGUOUS_SIZE (4 << 20)
+#endif
+static ulong contiguousSize = gcdDEFAULT_CONTIGUOUS_SIZE;
+module_param(contiguousSize, ulong, 0644);
+MODULE_PARM_DESC(contiguousSize, "Size of memory reserved for GC");
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
+static gctPHYS_ADDR_T contiguousBase = 0;
+module_param(contiguousBase, ullong, 0644);
+#else
+static ulong contiguousBase = 0;
+module_param(contiguousBase, ulong, 0644);
+#endif
+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");
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
+static gctPHYS_ADDR_T externalBase = 0;
+module_param(externalBase, ullong, 0644);
+#else
+static ulong externalBase = 0;
+module_param(externalBase, ulong, 0644);
+#endif
+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");
+
+static int compression = -1;
+module_param(compression, int, 0644);
+MODULE_PARM_DESC(compression, "Disable compression if set it to 0, enabled by default");
+
+static int powerManagement = 1;
+module_param(powerManagement, int, 0644);
+MODULE_PARM_DESC(powerManagement, "Disable auto power saving if set it to 0, enabled by default");
+
+static int gpuProfiler = 0;
+module_param(gpuProfiler, int, 0644);
+MODULE_PARM_DESC(gpuProfiler, "Enable profiling support, disabled by default");
+
+static ulong baseAddress = 0;
+module_param(baseAddress, ulong, 0644);
+MODULE_PARM_DESC(baseAddress, "Only used for old MMU, set it to 0 if memory which can be accessed by GPU falls into 0 - 2G, otherwise set it to 0x80000000");
+
+static ulong physSize = 0;
+module_param(physSize, ulong, 0644);
+MODULE_PARM_DESC(physSize, "Obsolete");
+
+static uint recovery = 0;
+module_param(recovery, uint, 0644);
+MODULE_PARM_DESC(recovery, "Recover GPU from stuck (1: Enable, 0: Disable)");
+
+/* Middle needs about 40KB buffer, Maximal may need more than 200KB buffer. */
+static uint stuckDump = 0;
+module_param(stuckDump, uint, 0644);
+MODULE_PARM_DESC(stuckDump, "Level of stuck dump content (1: Minimal, 2: Middle, 3: Maximal)");
+
+static int showArgs = 0;
+module_param(showArgs, int, 0644);
+MODULE_PARM_DESC(showArgs, "Display parameters value when driver loaded");
+
+static int mmu = 1;
+module_param(mmu, int, 0644);
+MODULE_PARM_DESC(mmu, "Disable MMU if set it to 0, enabled by default [Obsolete]");
+
+static int irqs[gcvCORE_COUNT] = {[0 ... gcvCORE_COUNT - 1] = -1};
+module_param_array(irqs, int, NULL, 0644);
+MODULE_PARM_DESC(irqs, "Array of IRQ numbers of multi-GPU");
+
+static uint registerBases[gcvCORE_COUNT];
+module_param_array(registerBases, uint, NULL, 0644);
+MODULE_PARM_DESC(registerBases, "Array of bases of bus address of register of multi-GPU");
+
+static uint registerSizes[gcvCORE_COUNT] = {[0 ... gcvCORE_COUNT - 1] = 2 << 16};
+module_param_array(registerSizes, uint, NULL, 0644);
+MODULE_PARM_DESC(registerSizes, "Array of sizes of bus address range of register of multi-GPU");
+
+static uint chipIDs[gcvCORE_COUNT] = {[0 ... gcvCORE_COUNT - 1] = gcvCHIP_ID_DEFAULT};
+module_param_array(chipIDs, uint, NULL, 0644);
+MODULE_PARM_DESC(chipIDs, "Array of chipIDs of multi-GPU");
+
+static uint type = 0;
+module_param(type, uint, 0664);
+MODULE_PARM_DESC(type, "0 - Char Driver (Default), 1 - Misc Driver");
+
+static int userClusterMask = 0;
+module_param(userClusterMask, int, 0644);
+MODULE_PARM_DESC(userClusterMask, "User defined cluster enable mask");
+
+static int smallBatch = 1;
+module_param(smallBatch, int, 0644);
+MODULE_PARM_DESC(smallBatch, "Enable/disable small batch");
+
+static int allMapInOne = 1;
+module_param(allMapInOne, int, 0644);
+MODULE_PARM_DESC(allMapInOne, "Mapping kernel video memory to user, 0 means mapping every time, otherwise only mapping one time");
+/*******************************************************************************
+***************************** SRAM description *********************************
+*******************************************************************************/
+
+/* Per-core SRAM physical address base, the order of configuration is according to access speed, gcvINVALID_PHYSICAL_ADDRESS means no bus address. */
+static gctPHYS_ADDR_T sRAMBases[gcvSRAM_INTER_COUNT * gcvCORE_COUNT] = {[0 ... gcvSRAM_INTER_COUNT * gcvCORE_COUNT - 1] = gcvINVALID_PHYSICAL_ADDRESS};
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
+module_param_array(sRAMBases, ullong, NULL, 0644);
+MODULE_PARM_DESC(sRAMBases, "Array of base of bus address of SRAM,INTERNAL, EXTERNAL0, EXTERNAL1..., gcvINVALID_PHYSICAL_ADDRESS means no bus address");
+#endif
+
+/* Per-core SRAM size. */
+static uint sRAMSizes[gcvSRAM_INTER_COUNT * gcvCORE_COUNT] = {[0 ... gcvSRAM_INTER_COUNT * gcvCORE_COUNT - 1] = 0};
+module_param_array(sRAMSizes, uint, NULL, 0644);
+MODULE_PARM_DESC(sRAMSizes, "Array of size of per-core SRAMs, 0 means no SRAM");
+
+/* Shared SRAM physical address bases. */
+static gctPHYS_ADDR_T extSRAMBases[gcvSRAM_EXT_COUNT] = {[0 ... gcvSRAM_EXT_COUNT - 1] = gcvINVALID_PHYSICAL_ADDRESS};
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
+module_param_array(extSRAMBases, ullong, NULL, 0644);
+MODULE_PARM_DESC(extSRAMBases, "Shared SRAM physical address bases.");
+#endif
+
+/* Shared SRAM sizes. */
+static uint extSRAMSizes[gcvSRAM_EXT_COUNT] = {[0 ... gcvSRAM_EXT_COUNT - 1] = 0};
+module_param_array(extSRAMSizes, uint, NULL, 0644);
+MODULE_PARM_DESC(extSRAMSizes, "Shared SRAM sizes.");
+
+static uint sRAMRequested = 1;
+module_param(sRAMRequested, uint, 0644);
+MODULE_PARM_DESC(sRAMRequested, "Default 1 means AXI-SRAM is already reserved for GPU, 0 means GPU driver need request the memory region.");
+
+static uint mmuPageTablePool = 1;
+module_param(mmuPageTablePool, uint, 0644);
+MODULE_PARM_DESC(mmuPageTablePool, "Default 1 means alloc mmu page table in virsual memory, 0 means auto select memory pool.");
+
+static uint sRAMLoopMode = 0;
+module_param(sRAMLoopMode, uint, 0644);
+MODULE_PARM_DESC(sRAMLoopMode, "Default 0 means SRAM pool must be specified when allocating SRAM memory, 1 means SRAM memory will be looped as default pool.");
+
+static uint mmuDynamicMap = 1;
+module_param(mmuDynamicMap, uint, 0644);
+MODULE_PARM_DESC(mmuDynamicMap, "Default 1 means enable mmu dynamic mapping in virsual memory, 0 means disable dynnamic mapping.");
+
+#if USE_LINUX_PCIE
+static int bar = 1;
+module_param(bar, int, 0644);
+MODULE_PARM_DESC(bar, "PCIE Bar index of GC core");
+
+static int bars[gcvCORE_COUNT] = {[0 ... gcvCORE_COUNT - 1] = -1};
+module_param_array(bars, int, NULL, 0644);
+MODULE_PARM_DESC(bars, "Array of bar index of PCIE platform for multi-GPU");
+
+static uint regOffsets[gcvCORE_COUNT] = {[0 ... gcvCORE_COUNT - 1] = 0};
+module_param_array(regOffsets, uint, NULL, 0644);
+MODULE_PARM_DESC(regOffsets, "Array of register offsets in corresponding BAR space");
+
+static int sRAMBars[gcvSRAM_EXT_COUNT] = {[0 ... gcvSRAM_EXT_COUNT - 1] = -1};
+module_param_array(sRAMBars, int, NULL, 0644);
+MODULE_PARM_DESC(sRAMBars, "Array of SRAM bar index of shared external SRAMs.");
+
+static int sRAMOffsets[gcvSRAM_EXT_COUNT] = {[0 ... gcvSRAM_EXT_COUNT - 1] = -1};
+module_param_array(sRAMOffsets, int, NULL, 0644);
+MODULE_PARM_DESC(sRAMOffsets, "Array of SRAM offset inside bar of shared external SRAMs.");
+#endif
+
+static int gpu3DMinClock = 1;
+static int contiguousRequested = 0;
+static ulong bankSize = 0;
+
+
+static gcsMODULE_PARAMETERS moduleParam;
+
+static void
+_InitModuleParam(
+ gcsMODULE_PARAMETERS * ModuleParam
+ )
+{
+ gctUINT i, j;
+ gcsMODULE_PARAMETERS *p = ModuleParam;
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ p->irqs[i] = irqs[i];
+
+ if (irqs[i] != -1)
+ {
+ p->registerBases[i] = registerBases[i];
+ p->registerSizes[i] = registerSizes[i];
+ }
+#if USE_LINUX_PCIE
+ p->bars[i] = bars[i];
+ p->regOffsets[i] = regOffsets[i];
+#endif
+ }
+
+ /* Check legacy style. */
+#if USE_LINUX_PCIE
+ if (bar != -1)
+ {
+ p->bars[gcvCORE_MAJOR] = bar;
+ }
+#endif
+
+ if (irqLine != -1)
+ {
+ p->irqs[gcvCORE_MAJOR] = irqLine;
+ p->registerBases[gcvCORE_MAJOR] = registerMemBase;
+ p->registerSizes[gcvCORE_MAJOR] = registerMemSize;
+ }
+
+ if (irqLine2D != -1)
+ {
+ p->irqs[gcvCORE_2D] = irqLine2D;
+ p->registerBases[gcvCORE_2D] = registerMemBase2D;
+ p->registerSizes[gcvCORE_2D] = registerMemSize2D;
+ }
+
+ if (irqLineVG != -1)
+ {
+ p->irqs[gcvCORE_VG] = irqLineVG;
+ p->registerBases[gcvCORE_VG] = registerMemBaseVG;
+ p->registerSizes[gcvCORE_VG] = registerMemSizeVG;
+ }
+
+#if gcdDEC_ENABLE_AHB
+ if (registerMemBaseDEC300 && registerMemSizeDEC300)
+ {
+ p->registerBases[gcvCORE_DEC] = registerMemBaseDEC300;
+ p->registerSizes[gcvCORE_DEC] = registerMemSizeDEC300;
+ }
+#endif
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ /* Not a module param. */
+ p->registerBasesMapped[i] = gcvNULL;
+ }
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ p->chipIDs[i] = chipIDs[i];
+ }
+
+ p->contiguousBase = contiguousBase;
+ p->contiguousSize = contiguousSize;
+ p->contiguousRequested = contiguousRequested; /* not a module param. */
+
+ p->externalBase = externalBase;
+ p->externalSize = externalSize;
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ for (j = 0; j < gcvSRAM_INTER_COUNT; j++)
+ {
+ p->sRAMBases[i][j] = sRAMBases[i * gcvSRAM_INTER_COUNT + j];
+ p->sRAMSizes[i][j] = sRAMSizes[i * gcvSRAM_INTER_COUNT + j];
+ }
+ }
+
+ for (i = 0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ p->extSRAMBases[i] = extSRAMBases[i];
+ p->extSRAMSizes[i] = extSRAMSizes[i];
+#if USE_LINUX_PCIE
+ p->sRAMBars[i] = sRAMBars[i];
+ p->sRAMOffsets[i] = sRAMOffsets[i];
+#endif
+ }
+
+ p->sRAMRequested = sRAMRequested;
+ p->sRAMLoopMode = sRAMLoopMode;
+
+ p->baseAddress = baseAddress;
+ p->physSize = physSize;
+ p->bankSize = bankSize; /* not a module param. */
+
+ p->recovery = recovery;
+ p->powerManagement = powerManagement;
+
+ p->enableMmu = mmu;
+ p->fastClear = fastClear;
+
+ p->compression = (compression == -1) ? gcvCOMPRESSION_OPTION_DEFAULT
+ : (gceCOMPRESSION_OPTION)compression;
+ p->gpu3DMinClock = gpu3DMinClock; /* not a module param. */
+ p->userClusterMask = userClusterMask;
+ p->smallBatch = smallBatch;
+
+ p->stuckDump = stuckDump;
+ p->gpuProfiler = gpuProfiler;
+
+ p->deviceType = type;
+ p->showArgs = showArgs;
+
+ p->mmuPageTablePool = mmuPageTablePool;
+
+ p->mmuDynamicMap = mmuDynamicMap;
+ p->allMapInOne = allMapInOne;
+#if !gcdENABLE_3D
+ p->irqs[gcvCORE_MAJOR] = irqLine = -1;
+ p->registerBases[gcvCORE_MAJOR] = registerMemBase = 0;
+ p->registerSizes[gcvCORE_MAJOR] = registerMemSize = 0;
+#endif
+
+#if !gcdENABLE_2D
+ p->irqs[gcvCORE_2D] = irqLine2D = -1;
+ p->registerBases[gcvCORE_2D] = registerMemBase2D = 0;
+ p->registerSizes[gcvCORE_2D] = registerMemSize2D = 0;
+#endif
+
+#if !gcdENABLE_VG
+ p->irqs[gcvCORE_VG] = irqLineVG = -1;
+ p->registerBases[gcvCORE_VG] = registerMemBaseVG = 0;
+ p->registerSizes[gcvCORE_VG] = registerMemSizeVG = 0;
+#endif
+}
+
+static void
+_SyncModuleParam(
+ const gcsMODULE_PARAMETERS * ModuleParam
+ )
+{
+ gctUINT i, j;
+ gcsMODULE_PARAMETERS *p = &moduleParam;
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ irqs[i] = p->irqs[i];
+ registerBases[i] = (ulong)p->registerBases[i];
+ registerSizes[i] = (ulong)p->registerSizes[i];
+ #if USE_LINUX_PCIE
+ bars[i] = p->bars[i];
+ regOffsets[i] = p->regOffsets[i];
+ #endif
+ }
+
+ /* Sync to legacy style. */
+
+#if USE_LINUX_PCIE
+ bar = p->bars[gcvCORE_MAJOR];
+#endif
+ irqLine = p->irqs[gcvCORE_MAJOR];
+ registerMemBase = (ulong)p->registerBases[gcvCORE_MAJOR];
+ registerMemSize = (ulong)p->registerSizes[gcvCORE_MAJOR];
+
+ irqLine2D = p->irqs[gcvCORE_2D];
+ registerMemBase2D = (ulong)p->registerBases[gcvCORE_2D];
+ registerMemSize2D = (ulong)p->registerSizes[gcvCORE_2D];
+
+ irqLineVG = p->irqs[gcvCORE_VG];
+ registerMemBaseVG = (ulong)p->registerBases[gcvCORE_VG];
+ registerMemSizeVG = (ulong)p->registerSizes[gcvCORE_VG];
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ p->chipIDs[i] = chipIDs[i];
+ }
+
+ contiguousBase = (ulong)p->contiguousBase;
+ contiguousSize = (ulong)p->contiguousSize;
+ contiguousRequested = p->contiguousRequested; /* not a module param. */
+
+ externalBase = p->externalBase;
+ externalSize = p->externalSize;
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ for (j = 0; j < gcvSRAM_INTER_COUNT; j++)
+ {
+ sRAMBases[i * gcvSRAM_INTER_COUNT + j] = p->sRAMBases[i][j];
+ sRAMSizes[i * gcvSRAM_INTER_COUNT + j] = p->sRAMSizes[i][j];
+ }
+ }
+
+ for (i = 0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ extSRAMBases[i] = p->extSRAMBases[i];
+ extSRAMSizes[i] = p->extSRAMSizes[i];
+
+#if USE_LINUX_PCIE
+ sRAMBars[i] = p->sRAMBars[i];
+ sRAMOffsets[i] = p->sRAMOffsets[i];
+#endif
+ }
+
+ sRAMRequested = p->sRAMRequested;
+ sRAMLoopMode = p->sRAMLoopMode;
+
+ baseAddress = (ulong)p->baseAddress;
+ physSize = p->physSize;
+ bankSize = p->bankSize; /* not a module param. */
+
+ recovery = p->recovery;
+ powerManagement = p->powerManagement;
+
+ mmu = p->enableMmu;
+ fastClear = p->fastClear;
+ compression = p->compression;
+ gpu3DMinClock = p->gpu3DMinClock; /* not a module param. */
+ userClusterMask = p->userClusterMask;
+ smallBatch = p->smallBatch;
+
+ stuckDump = p->stuckDump;
+ gpuProfiler = p->gpuProfiler;
+
+ type = p->deviceType;
+ showArgs = p->showArgs;
+
+ mmuPageTablePool = p->mmuDynamicMap;
+ mmuDynamicMap = p->mmuDynamicMap;
+ allMapInOne = p->allMapInOne;
+}
+
+void
+gckOS_DumpParam(
+ void
+ )
+{
+ gctINT i, j;
+
+ printk("Galcore options:\n");
+ if (irqLine != -1)
+ {
+ printk(" irqLine = %d\n", irqLine);
+ printk(" registerMemBase = 0x%08lX\n", registerMemBase);
+ printk(" registerMemSize = 0x%08lX\n", registerMemSize);
+ }
+
+ if (irqLine2D != -1)
+ {
+ printk(" irqLine2D = %d\n", irqLine2D);
+ printk(" registerMemBase2D = 0x%08lX\n", registerMemBase2D);
+ printk(" registerMemSize2D = 0x%08lX\n", registerMemSize2D);
+ }
+
+ if (irqLineVG != -1)
+ {
+ printk(" irqLineVG = %d\n", irqLineVG);
+ printk(" registerMemBaseVG = 0x%08lX\n", registerMemBaseVG);
+ printk(" registerMemSizeVG = 0x%08lX\n", registerMemSizeVG);
+ }
+#if USE_LINUX_PCIE
+ if (bar != -1)
+ {
+ printk(" bar = %d\n", bar);
+ }
+#endif
+#if gcdDEC_ENABLE_AHB
+ printk(" registerMemBaseDEC300 = 0x%08lX\n", registerMemBaseDEC300);
+ printk(" registerMemSizeDEC300 = 0x%08lX\n", registerMemSizeDEC300);
+#endif
+
+ printk(" contiguousSize = 0x%08lX\n", contiguousSize);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
+ printk(" contiguousBase = 0x%llX\n", contiguousBase);
+#else
+ printk(" contiguousBase = 0x%lX\n", contiguousBase);
+#endif
+ printk(" externalSize = 0x%08lX\n", externalSize);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
+ printk(" externalBase = 0x%llX\n", externalBase);
+#else
+ printk(" externalBase = 0x%lX\n", externalBase);
+#endif
+ printk(" bankSize = 0x%08lX\n", bankSize);
+ printk(" fastClear = %d\n", fastClear);
+ printk(" compression = %d\n", compression);
+ printk(" powerManagement = %d\n", powerManagement);
+ printk(" baseAddress = 0x%08lX\n", baseAddress);
+ printk(" physSize = 0x%08lX\n", physSize);
+ printk(" recovery = %d\n", recovery);
+ printk(" stuckDump = %d\n", stuckDump);
+ printk(" gpuProfiler = %d\n", gpuProfiler);
+ printk(" userClusterMask = 0x%x\n", userClusterMask);
+ printk(" smallBatch = %d\n", smallBatch);
+ printk(" allMapInOne = %d\n", allMapInOne);
+
+ printk(" irqs = ");
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ printk("%d, ", irqs[i]);
+ }
+ printk("\n");
+
+#if USE_LINUX_PCIE
+ printk(" bars = ");
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ printk("%d, ", bars[i]);
+ }
+ printk("\n");
+
+ printk(" regOffsets = ");
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ printk("%d, ", regOffsets[i]);
+ }
+ printk("\n");
+
+#endif
+ printk(" registerBases = ");
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ printk("0x%08X, ", registerBases[i]);
+ }
+ printk("\n");
+
+ printk(" registerSizes = ");
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ printk("0x%08X, ", registerSizes[i]);
+ }
+ printk("\n");
+
+ printk(" chipIDs = ");
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ printk("0x%08X, ", chipIDs[i]);
+ }
+ printk("\n");
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ printk(" core %d internal sRAMBases = ", i);
+
+ for (j = 0; j < gcvSRAM_INTER_COUNT; j++)
+ {
+ printk("0x%llX, ", sRAMBases[i * gcvSRAM_INTER_COUNT + j]);
+ }
+ printk("\n");
+ }
+
+ printk(" External sRAMBases = ");
+ for (i = 0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ printk("0x%llx, ", extSRAMBases[i]);
+ }
+ printk("\n");
+
+ printk(" mmuPageTablePool = %d\n", mmuPageTablePool);
+ printk(" mmuDynamicMap = %d\n", mmuDynamicMap);
+
+ printk("Build options:\n");
+ printk(" gcdGPU_TIMEOUT = %d\n", gcdGPU_TIMEOUT);
+ printk(" gcdGPU_2D_TIMEOUT = %d\n", gcdGPU_2D_TIMEOUT);
+ printk(" gcdINTERRUPT_STATISTIC = %d\n", gcdINTERRUPT_STATISTIC);
+}
+
+static int drv_open(
+ struct inode* inode,
+ struct file* filp
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsHAL_PRIVATE_DATA_PTR data = gcvNULL;
+ gctINT i;
+ gctINT attached = 0;
+
+ gcmkHEADER_ARG("inode=%p filp=%p", inode, filp);
+
+ data = kmalloc(sizeof(gcsHAL_PRIVATE_DATA), GFP_KERNEL | __GFP_NOWARN);
+
+ if (data == gcvNULL)
+ {
+ gcmkFOOTER_ARG("status=%d", gcvSTATUS_OUT_OF_MEMORY);
+ return -ENOMEM;
+ }
+
+ data->isLocked = gcvFALSE;
+ data->device = galDevice;
+ data->pidOpen = _GetProcessID();
+
+ /* Attached the process. */
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (galDevice->kernels[i] != gcvNULL)
+ {
+ status = gckKERNEL_AttachProcess(galDevice->kernels[i], gcvTRUE);
+
+ if (gcmIS_ERROR(status))
+ {
+ break;
+ }
+
+ attached = i;
+ }
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ /* Error. */
+ for (i = 0; i < attached; i++)
+ {
+ if (galDevice->kernels[i] != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckKERNEL_AttachProcess(galDevice->kernels[i], gcvFALSE));
+ }
+ }
+ kfree(data);
+ gcmkFOOTER_ARG("status=%d", status);
+ return -ENOTTY;
+ }
+
+ filp->private_data = data;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return 0;
+}
+
+static int drv_release(
+ struct inode* inode,
+ struct file* filp
+ )
+{
+ int ret = -ENOTTY;
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsHAL_PRIVATE_DATA_PTR data;
+ gckGALDEVICE device;
+ gctINT i;
+
+ gcmkHEADER_ARG("inode=%p filp=%p", inode, filp);
+
+ data = filp->private_data;
+
+ if (data == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): private_data is NULL\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ device = data->device;
+
+ if (device == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): device is NULL\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (data->isLocked)
+ {
+ /* Release the mutex. */
+ gcmkONERROR(gckOS_ReleaseMutex(gcvNULL, device->device->commitMutex));
+ data->isLocked = gcvFALSE;
+ }
+
+ /* A process gets detached. */
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (galDevice->kernels[i] != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckKERNEL_AttachProcessEx(
+ galDevice->kernels[i],
+ gcvFALSE,
+ data->pidOpen
+ ));
+ }
+ }
+
+ kfree(data);
+ filp->private_data = NULL;
+
+ /* Success. */
+ ret = 0;
+
+OnError:
+ gcmkFOOTER();
+ return ret;
+}
+
+static long drv_ioctl(
+ struct file* filp,
+ unsigned int ioctlCode,
+ unsigned long arg
+ )
+{
+ long ret = -ENOTTY;
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsHAL_INTERFACE iface;
+ gctUINT32 copyLen;
+ DRIVER_ARGS drvArgs;
+ gckGALDEVICE device;
+ gcsHAL_PRIVATE_DATA_PTR data;
+
+ gcmkHEADER_ARG("filp=%p ioctlCode=%u arg=%lu",filp, ioctlCode, arg);
+
+ data = filp->private_data;
+
+ if (data == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): private_data is NULL\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ device = data->device;
+
+ if (device == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): device is NULL\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if ((ioctlCode != IOCTL_GCHAL_INTERFACE)
+ && (ioctlCode != IOCTL_GCHAL_KERNEL_INTERFACE)
+ )
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): unknown command %d\n",
+ __FUNCTION__, __LINE__,
+ ioctlCode
+ );
+
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ /* Get the drvArgs. */
+ copyLen = copy_from_user(
+ &drvArgs, (void *) arg, sizeof(DRIVER_ARGS)
+ );
+
+ if (copyLen != 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): error copying of the input arguments.\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ /* Now bring in the gcsHAL_INTERFACE structure. */
+ if ((drvArgs.InputBufferSize != sizeof(gcsHAL_INTERFACE))
+ || (drvArgs.OutputBufferSize != sizeof(gcsHAL_INTERFACE))
+ )
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): input or/and output structures are invalid.\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ copyLen = copy_from_user(
+ &iface, gcmUINT64_TO_PTR(drvArgs.InputBuffer), sizeof(gcsHAL_INTERFACE)
+ );
+
+ if (copyLen != 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): error copying of input HAL interface.\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (iface.command == gcvHAL_DEVICE_MUTEX)
+ {
+ if (iface.u.DeviceMutex.isMutexLocked == gcvTRUE)
+ {
+ data->isLocked = gcvTRUE;
+ }
+ else
+ {
+ data->isLocked = gcvFALSE;
+ }
+ }
+
+ status = gckDEVICE_Dispatch(device->device, &iface);
+
+ /* Redo system call after pending signal is handled. */
+ if (status == gcvSTATUS_INTERRUPTED)
+ {
+ ret = -ERESTARTSYS;
+ gcmkONERROR(status);
+ }
+
+ /* Copy data back to the user. */
+ copyLen = copy_to_user(
+ gcmUINT64_TO_PTR(drvArgs.OutputBuffer), &iface, sizeof(gcsHAL_INTERFACE)
+ );
+
+ if (copyLen != 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): error copying of output HAL interface.\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ /* Success. */
+ ret = 0;
+
+OnError:
+ gcmkFOOTER();
+ return ret;
+}
+
+static struct file_operations driver_fops =
+{
+ .owner = THIS_MODULE,
+ .open = drv_open,
+ .release = drv_release,
+ .unlocked_ioctl = drv_ioctl,
+#ifdef HAVE_COMPAT_IOCTL
+ .compat_ioctl = drv_ioctl,
+#endif
+};
+
+static struct miscdevice gal_device = {
+ .minor = MISC_DYNAMIC_MINOR,
+ .name = DEVICE_NAME,
+ .fops = &driver_fops,
+};
+
+static int drv_init(void)
+{
+ int ret = -EINVAL;
+ gceSTATUS status;
+ gckGALDEVICE device = gcvNULL;
+ struct class* device_class = gcvNULL;
+
+ gcmkHEADER();
+
+ printk(KERN_INFO "Galcore version %d.%d.%d.%d\n",
+ gcvVERSION_MAJOR, gcvVERSION_MINOR, gcvVERSION_PATCH, gcvVERSION_BUILD);
+
+ if (showArgs)
+ {
+ gckOS_DumpParam();
+ }
+
+ /* Create the GAL device. */
+ status = gckGALDEVICE_Construct(platform, &moduleParam, &device);
+
+ if (gcmIS_ERROR(status))
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): Failed to create the GAL device: status=%d\n",
+ __FUNCTION__, __LINE__, status);
+
+ goto OnError;
+ }
+
+ /* Start the GAL device. */
+ gcmkONERROR(gckGALDEVICE_Start(device));
+
+ if ((physSize != 0)
+ && (device->kernels[gcvCORE_MAJOR] != gcvNULL)
+ && (device->kernels[gcvCORE_MAJOR]->hardware->mmuVersion != 0))
+ {
+ /* Reset the base address */
+ device->baseAddress = 0;
+ }
+
+ /* Set global galDevice pointer. */
+ galDevice = device;
+
+ if (type == 1)
+ {
+ /* Register as misc driver. */
+ if (misc_register(&gal_device) < 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): misc_register fails.\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ }
+ else
+ {
+ /* Register the character device. */
+ int result = register_chrdev(major, DEVICE_NAME, &driver_fops);
+
+ if (result < 0)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): Could not allocate major number for mmap.\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ if (major == 0)
+ {
+ major = result;
+ }
+
+ /* Create the device class. */
+ device_class = class_create(THIS_MODULE, CLASS_NAME);
+
+ if (IS_ERR(device_class))
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_DRIVER,
+ "%s(%d): Failed to create the class.\n",
+ __FUNCTION__, __LINE__
+ );
+
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+ device_create(device_class, NULL, MKDEV(major, 0), NULL, DEVICE_NAME);
+#else
+ device_create(device_class, NULL, MKDEV(major, 0), DEVICE_NAME);
+#endif
+
+ gpuClass = device_class;
+ }
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_DRIVER,
+ "%s(%d): irqLine=%d, contiguousSize=%lu, memBase=0x%lX\n",
+ __FUNCTION__, __LINE__,
+ irqLine, contiguousSize, registerMemBase
+ );
+
+ /* Success. */
+ ret = 0;
+
+OnError:
+ if (ret)
+ {
+ /* Roll back. */
+ if (device_class)
+ {
+ device_destroy(device_class, MKDEV(major, 0));
+ class_destroy(device_class);
+ }
+
+ if (device)
+ {
+ gcmkVERIFY_OK(gckGALDEVICE_Stop(device));
+ gcmkVERIFY_OK(gckGALDEVICE_Destroy(device));
+ }
+ }
+
+ gcmkFOOTER();
+ return ret;
+}
+
+static void drv_exit(void)
+{
+ gcmkHEADER();
+
+ if (type == 1)
+ {
+ misc_deregister(&gal_device);
+ }
+ else
+ {
+ gcmkASSERT(gpuClass != gcvNULL);
+ device_destroy(gpuClass, MKDEV(major, 0));
+ class_destroy(gpuClass);
+
+ unregister_chrdev(major, DEVICE_NAME);
+ }
+
+ gcmkVERIFY_OK(gckGALDEVICE_Stop(galDevice));
+ gcmkVERIFY_OK(gckGALDEVICE_Destroy(galDevice));
+
+ gcmkFOOTER_NO();
+}
+
+#if gcdENABLE_DRM
+int viv_drm_probe(struct device *dev);
+int viv_drm_remove(struct device *dev);
+#endif
+
+struct device *galcore_device = NULL;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
+static int gpu_probe(struct platform_device *pdev)
+#else
+static int __devinit gpu_probe(struct platform_device *pdev)
+#endif
+{
+ int ret = -ENODEV;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
+ static u64 dma_mask = DMA_BIT_MASK(40);
+#else
+ static u64 dma_mask = DMA_40BIT_MASK;
+#endif
+
+ gcmkHEADER();
+
+ platform->device = pdev;
+ galcore_device = &pdev->dev;
+
+ galcore_device->dma_mask = &dma_mask;
+
+ if (platform->ops->getPower)
+ {
+ if (gcmIS_ERROR(platform->ops->getPower(platform)))
+ {
+ gcmkFOOTER_NO();
+ return ret;
+ }
+ }
+
+ /* Gather module parameters. */
+ _InitModuleParam(&moduleParam);
+
+ if (platform->ops->adjustParam)
+ {
+ /* Override default module param. */
+ platform->ops->adjustParam(platform, &moduleParam);
+ }
+
+ /* Update module param because drv_init() uses them directly. */
+ _SyncModuleParam(&moduleParam);
+
+ ret = drv_init();
+
+ if (!ret)
+ {
+ platform_set_drvdata(pdev, galDevice);
+
+#if gcdENABLE_DRM
+ ret = viv_drm_probe(&pdev->dev);
+#endif
+ }
+
+ if (ret < 0)
+ {
+ gcmkFOOTER_ARG(KERN_INFO "Failed to register gpu driver: %d\n", ret);
+ }
+ else
+ {
+ gcmkFOOTER_NO();
+ }
+
+ gcmkFOOTER_ARG(KERN_INFO "Success ret=%d", ret);
+ return ret;
+}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
+static int gpu_remove(struct platform_device *pdev)
+#else
+ static int __devexit gpu_remove(struct platform_device *pdev)
+#endif
+{
+ gcmkHEADER();
+
+#if gcdENABLE_DRM
+ viv_drm_remove(&pdev->dev);
+#endif
+
+ drv_exit();
+
+ if (platform->ops->putPower)
+ {
+ platform->ops->putPower(platform);
+ }
+
+ galcore_device->dma_mask = NULL;
+ galcore_device = NULL;
+ gcmkFOOTER_NO();
+ return 0;
+}
+
+static int gpu_suspend(struct platform_device *dev, pm_message_t state)
+{
+ gceSTATUS status;
+ gckGALDEVICE device;
+ gctINT i;
+
+ device = platform_get_drvdata(dev);
+
+ if (!device)
+ {
+ return -1;
+ }
+
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (device->kernels[i] != gcvNULL)
+ {
+ /* Store states. */
+#if gcdENABLE_VG
+ if (i == gcvCORE_VG)
+ {
+ status = gckVGHARDWARE_QueryPowerManagementState(device->kernels[i]->vg->hardware, &device->statesStored[i]);
+ }
+ else
+#endif
+ {
+ status = gckHARDWARE_QueryPowerState(device->kernels[i]->hardware, &device->statesStored[i]);
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ return -1;
+ }
+
+ /* need pull up power to flush gpu command buffer before suspend */
+#if gcdENABLE_VG
+ if (i == gcvCORE_VG)
+ {
+ status = gckVGHARDWARE_SetPowerState(device->kernels[i]->vg->hardware, gcvPOWER_ON);
+ }
+ else
+#endif
+ {
+ status = gckHARDWARE_SetPowerState(device->kernels[i]->hardware, gcvPOWER_ON);
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ return -1;
+ }
+
+#if gcdENABLE_VG
+ if (i == gcvCORE_VG)
+ {
+ status = gckVGHARDWARE_SetPowerState(device->kernels[i]->vg->hardware, gcvPOWER_OFF);
+ }
+ else
+#endif
+ {
+ status = gckHARDWARE_SetPowerState(device->kernels[i]->hardware, gcvPOWER_OFF);
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ return -1;
+ }
+
+ }
+ }
+
+ return 0;
+}
+
+static int gpu_resume(struct platform_device *dev)
+{
+ gceSTATUS status;
+ gckGALDEVICE device;
+ gctINT i;
+ gceCHIPPOWERSTATE statesStored;
+
+ device = platform_get_drvdata(dev);
+
+ if (!device)
+ {
+ return -1;
+ }
+
+ for (i = 0; i < gcdMAX_GPU_COUNT; i++)
+ {
+ if (device->kernels[i] != gcvNULL)
+ {
+#if gcdENABLE_VG
+ if (i == gcvCORE_VG)
+ {
+ status = gckVGHARDWARE_SetPowerState(device->kernels[i]->vg->hardware, gcvPOWER_ON);
+ }
+ else
+#endif
+ {
+ status = gckHARDWARE_SetPowerState(device->kernels[i]->hardware, gcvPOWER_ON);
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ return -1;
+ }
+
+ /* Convert global state to crossponding internal state. */
+ switch(device->statesStored[i])
+ {
+ case gcvPOWER_ON:
+ statesStored = gcvPOWER_ON_AUTO;
+ break;
+ case gcvPOWER_IDLE:
+ statesStored = gcvPOWER_IDLE_BROADCAST;
+ break;
+ case gcvPOWER_SUSPEND:
+ statesStored = gcvPOWER_SUSPEND_BROADCAST;
+ break;
+ case gcvPOWER_OFF:
+ statesStored = gcvPOWER_OFF_BROADCAST;
+ break;
+ default:
+ statesStored = device->statesStored[i];
+ break;
+ }
+
+ /* Restore states. */
+#if gcdENABLE_VG
+ if (i == gcvCORE_VG)
+ {
+ status = gckVGHARDWARE_SetPowerState(device->kernels[i]->vg->hardware, statesStored);
+ }
+ else
+#endif
+ {
+ gctINT j = 0;
+
+ for (; j < 100; j++)
+ {
+ status = gckHARDWARE_SetPowerState(device->kernels[i]->hardware, statesStored);
+
+ if (( statesStored != gcvPOWER_OFF_BROADCAST
+ && statesStored != gcvPOWER_SUSPEND_BROADCAST)
+ || status != gcvSTATUS_CHIP_NOT_READY)
+ {
+ break;
+ }
+
+ gcmkVERIFY_OK(gckOS_Delay(device->kernels[i]->os, 10));
+ };
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ return -1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+#if defined(CONFIG_PM) && LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)
+#ifdef CONFIG_PM_SLEEP
+static int gpu_system_suspend(struct device *dev)
+{
+ pm_message_t state={0};
+ return gpu_suspend(to_platform_device(dev), state);
+}
+
+static int gpu_system_resume(struct device *dev)
+{
+ return gpu_resume(to_platform_device(dev));
+}
+#endif
+
+static const struct dev_pm_ops gpu_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(gpu_system_suspend, gpu_system_resume)
+};
+#endif
+
+static struct platform_driver gpu_driver = {
+ .probe = gpu_probe,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
+ .remove = gpu_remove,
+#else
+ .remove = __devexit_p(gpu_remove),
+#endif
+
+ .suspend = gpu_suspend,
+ .resume = gpu_resume,
+
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = DEVICE_NAME,
+#if defined(CONFIG_PM) && LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30)
+ .pm = &gpu_pm_ops,
+#endif
+ }
+};
+
+static int __init gpu_init(void)
+{
+ int ret = 0;
+
+ ret = gckPLATFORM_Init(&gpu_driver, &platform);
+
+ if (ret || !platform)
+ {
+ printk(KERN_ERR "galcore: Soc platform init failed.\n");
+ return -ENODEV;
+ }
+
+ ret = platform_driver_register(&gpu_driver);
+
+ if (ret)
+ {
+ printk(KERN_ERR "galcore: gpu_init() failed to register driver!\n");
+ gckPLATFORM_Terminate(platform);
+ platform = NULL;
+ return -ENODEV;
+ }
+
+ platform->driver = &gpu_driver;
+ return 0;
+}
+
+static void __exit gpu_exit(void)
+{
+ platform_driver_unregister(&gpu_driver);
+
+ gckPLATFORM_Terminate(platform);
+ platform = NULL;
+}
+
+module_init(gpu_init);
+module_exit(gpu_exit);
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..16c581b1815d
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_drm.c
@@ -0,0 +1,858 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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_handle;
+ gckVIDMEM_NODE node_object;
+ gctBOOL cacheable;
+};
+
+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_object, 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;
+ gckGALDEVICE gal_dev;
+ gckKERNEL kernel;
+ gctUINT32 processID;
+ gckVIDMEM_NODE nodeObject;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ 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));
+
+ kernel = gal_dev->device->map[gal_dev->device->defaultHwType].kernels[0];
+ gcmkONERROR(gckOS_GetProcessID(&processID));
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(kernel, processID, iface.u.WrapUserMemory.node, &nodeObject));
+
+ /* 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_handle = iface.u.WrapUserMemory.node;
+ viv_obj->node_object = nodeObject;
+
+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_handle;
+ 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 = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+
+ gcsHAL_INTERFACE iface;
+ gckGALDEVICE gal_dev;
+ gckKERNEL kernel;
+ gctUINT32 processID;
+ gckVIDMEM_NODE nodeObject;
+ gctUINT32 flags = gcvALLOC_FLAG_DMABUF_EXPORTABLE;
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT64 alignSize = PAGE_ALIGN(args->size);
+
+ gal_dev = (gckGALDEVICE)drm->dev_private;
+ if (!gal_dev)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (args->flags & DRM_VIV_GEM_CONTIGUOUS)
+ {
+ flags |= gcvALLOC_FLAG_CONTIGUOUS;
+ }
+ if (args->flags & DRM_VIV_GEM_CACHED)
+ {
+ flags |= gcvALLOC_FLAG_CACHEABLE;
+ }
+ if (args->flags & DRM_VIV_GEM_SECURE)
+ {
+ flags |= gcvALLOC_FLAG_SECURITY;
+ }
+ if (args->flags & DRM_VIV_GEM_CMA_LIMIT)
+ {
+ flags |= gcvALLOC_FLAG_CMA_LIMIT;
+ }
+
+ gckOS_ZeroMemory(&iface, sizeof(iface));
+ iface.command = gcvHAL_ALLOCATE_LINEAR_VIDEO_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.AllocateLinearVideoMemory.bytes = alignSize;
+ iface.u.AllocateLinearVideoMemory.alignment = 256;
+ iface.u.AllocateLinearVideoMemory.type = gcvVIDMEM_TYPE_GENERIC;
+ iface.u.AllocateLinearVideoMemory.flag = flags;
+ iface.u.AllocateLinearVideoMemory.pool = gcvPOOL_DEFAULT;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+ kernel = gal_dev->device->map[gal_dev->device->defaultHwType].kernels[0];
+ gcmkONERROR(gckOS_GetProcessID(&processID));
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(kernel, processID, iface.u.AllocateLinearVideoMemory.node, &nodeObject));
+
+ /* ioctl output */
+ gem_obj = kzalloc(sizeof(struct viv_gem_object), GFP_KERNEL);
+ drm_gem_private_object_init(drm, gem_obj, (size_t)alignSize);
+ ret = drm_gem_handle_create(file, gem_obj, &args->handle);
+
+ viv_obj = container_of(gem_obj, struct viv_gem_object, base);
+ viv_obj->node_handle = iface.u.AllocateLinearVideoMemory.node;
+ viv_obj->node_object = nodeObject;
+ viv_obj->cacheable = flags & gcvALLOC_FLAG_CACHEABLE;
+
+ /* 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 = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+
+ 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_handle;
+ iface.u.LockVideoMemory.cacheable = args->cacheable;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+ args->logical = iface.u.LockVideoMemory.memory;
+
+OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
+ 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 = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+
+ 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);
+
+ memset(&iface, 0, sizeof(iface));
+ iface.command = gcvHAL_UNLOCK_VIDEO_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.UnlockVideoMemory.node = (gctUINT64)viv_obj->node_handle;
+ iface.u.UnlockVideoMemory.type = gcvVIDMEM_TYPE_GENERIC;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+ memset(&iface, 0, sizeof(iface));
+ iface.command = gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.BottomHalfUnlockVideoMemory.node = (gctUINT64)viv_obj->node_handle;
+ iface.u.BottomHalfUnlockVideoMemory.type = gcvVIDMEM_TYPE_GENERIC;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
+ 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 = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+
+ gcsHAL_INTERFACE iface;
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE gal_dev = gcvNULL;
+ gceCACHEOPERATION cache_op = 0;
+
+ 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);
+
+ switch (args->op)
+ {
+ case DRM_VIV_GEM_CLEAN_CACHE:
+ cache_op = gcvCACHE_CLEAN;
+ break;
+ case DRM_VIV_GEM_INVALIDATE_CACHE:
+ cache_op = gcvCACHE_INVALIDATE;
+ break;
+ case DRM_VIV_GEM_FLUSH_CACHE:
+ cache_op = gcvCACHE_FLUSH;
+ break;
+ case DRM_VIV_GEM_MEMORY_BARRIER:
+ cache_op = gcvCACHE_MEMORY_BARRIER;
+ break;
+ default:
+ break;
+ }
+
+ gckOS_ZeroMemory(&iface, sizeof(iface));
+ iface.command = gcvHAL_CACHE;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.Cache.node = viv_obj->node_handle;
+ iface.u.Cache.operation = cache_op;
+ iface.u.Cache.logical = args->logical;
+ iface.u.Cache.bytes = args->bytes;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static int viv_ioctl_gem_query(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ struct drm_viv_gem_query *args = (struct drm_viv_gem_query*)data;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+
+ 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);
+
+ switch (args->param)
+ {
+ case DRM_VIV_GEM_PARAM_POOL:
+ args->value = (__u64)viv_obj->node_object->pool;
+ break;
+ case DRM_VIV_GEM_PARAM_SIZE:
+ args->value = (__u64)gem_obj->size;
+ break;
+ default:
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static int viv_ioctl_gem_timestamp(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ struct drm_viv_gem_timestamp *args = (struct drm_viv_gem_timestamp *)data;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+
+ 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);
+
+ viv_obj->node_object->timeStamp += args->inc;
+ args->timestamp = viv_obj->node_object->timeStamp;
+
+OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static int viv_ioctl_gem_set_tiling(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ struct drm_viv_gem_set_tiling *args = (struct drm_viv_gem_set_tiling*)data;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+
+ 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);
+
+ viv_obj->node_object->tilingMode = args->tiling_mode;
+ viv_obj->node_object->tsMode = args->ts_mode;
+ viv_obj->node_object->clearValue = args->clear_value;
+
+OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static int viv_ioctl_gem_get_tiling(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ struct drm_viv_gem_get_tiling *args = (struct drm_viv_gem_get_tiling*)data;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+
+ 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);
+
+ args->tiling_mode = viv_obj->node_object->tilingMode;
+ args->ts_mode = viv_obj->node_object->tsMode;
+ args->clear_value = viv_obj->node_object->clearValue;
+
+OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static int viv_ioctl_gem_attach_aux(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ struct drm_viv_gem_attach_aux *args = (struct drm_viv_gem_attach_aux*)data;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+ struct drm_gem_object *gem_ts_obj = gcvNULL;
+
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE gal_dev = gcvNULL;
+ gckVIDMEM_NODE nodeObj = 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);
+ nodeObj = viv_obj->node_object;
+
+ /* do not support re-attach */
+ if (nodeObj->tsNode)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ if (args->ts_handle)
+ {
+ struct viv_gem_object *viv_ts_obj;
+ gckKERNEL kernel = gal_dev->device->map[gal_dev->device->defaultHwType].kernels[0];
+ gcsHAL_INTERFACE iface;
+ gctBOOL is128BTILE = gckHARDWARE_IsFeatureAvailable(kernel->hardware , gcvFEATURE_128BTILE);
+ gctBOOL is2BitPerTile = is128BTILE ? gcvFALSE : gckHARDWARE_IsFeatureAvailable(kernel->hardware , gcvFEATURE_TILE_STATUS_2BITS);
+ gctBOOL isCompressionDEC400 = gckHARDWARE_IsFeatureAvailable(kernel->hardware , gcvFEATURE_COMPRESSION_DEC400);
+ gctPOINTER entry = gcvNULL;
+ gckVIDMEM_NODE ObjNode = gcvNULL;
+ gctUINT32 processID = 0;
+ gctUINT32 tileStatusFiller = (isCompressionDEC400 || ((kernel->hardware->identity.chipModel == gcv500) && (kernel->hardware->identity.chipRevision > 2)))
+ ? 0xFFFFFFFF
+ : is2BitPerTile ? 0x55555555 : 0x11111111;
+
+ gem_ts_obj = drm_gem_object_lookup(file, args->ts_handle);
+ if (!gem_ts_obj)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+ viv_ts_obj = container_of(gem_ts_obj, struct viv_gem_object, base);
+
+ gcmkONERROR(gckVIDMEM_NODE_Reference(kernel, viv_ts_obj->node_object));
+ nodeObj->tsNode = viv_ts_obj->node_object;
+
+ /* Fill tile status node with tileStatusFiller value first time to avoid GPU hang. */
+ /* Lock tile status node. */
+ gckOS_ZeroMemory(&iface, sizeof(iface));
+ iface.command = gcvHAL_LOCK_VIDEO_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.LockVideoMemory.node = viv_ts_obj->node_handle;
+ iface.u.LockVideoMemory.cacheable = viv_ts_obj->cacheable;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+ gcmkONERROR(gckOS_GetProcessID(&processID));
+ gcmkONERROR(gckVIDMEM_HANDLE_Lookup(kernel, processID, viv_ts_obj->node_handle, &ObjNode));
+ gcmkONERROR(gckVIDMEM_NODE_LockCPU(kernel, ObjNode, gcvFALSE, gcvFALSE, &entry));
+
+ /* Fill tile status node with tileStatusFiller. */
+ memset(entry , tileStatusFiller , (__u64)gem_ts_obj->size);
+ gcmkONERROR(gckVIDMEM_NODE_UnlockCPU(kernel, ObjNode, 0, gcvFALSE, gcvFALSE));
+
+ /* UnLock tile status node. */
+ memset(&iface, 0, sizeof(iface));
+ iface.command = gcvHAL_UNLOCK_VIDEO_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.UnlockVideoMemory.node = (gctUINT64)viv_ts_obj->node_handle;
+ iface.u.UnlockVideoMemory.type = gcvSURF_TYPE_UNKNOWN;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+
+ memset(&iface, 0, sizeof(iface));
+ iface.command = gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY;
+ iface.hardwareType = gal_dev->device->defaultHwType;
+ iface.u.BottomHalfUnlockVideoMemory.node = (gctUINT64)viv_ts_obj->node_handle;
+ iface.u.BottomHalfUnlockVideoMemory.type = gcvSURF_TYPE_UNKNOWN;
+ gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
+ }
+
+OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+
+ if (gem_ts_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_ts_obj);
+ }
+ }
+ return gcmIS_ERROR(status) ? -ENOTTY : 0;
+}
+
+static int viv_ioctl_gem_ref_node(struct drm_device *drm, void *data,
+ struct drm_file *file)
+{
+ struct drm_viv_gem_ref_node *args = (struct drm_viv_gem_ref_node*)data;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE gal_dev = gcvNULL;
+ gckKERNEL kernel = gcvNULL;
+ gctUINT32 processID;
+ gckVIDMEM_NODE nodeObj;
+ gctUINT32 nodeHandle = 0, tsNodeHandle = 0;
+ gctBOOL refered = gcvFALSE;
+ int ret = 0;
+
+ 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);
+ }
+ viv_obj = container_of(gem_obj, struct viv_gem_object, base);
+ nodeObj = viv_obj->node_object;
+
+ gcmkONERROR(gckOS_GetProcessID(&processID));
+ gcmkONERROR(gckVIDMEM_HANDLE_Allocate(kernel, nodeObj, &nodeHandle));
+ gcmkONERROR(
+ gckKERNEL_AddProcessDB(kernel,
+ processID, gcvDB_VIDEO_MEMORY,
+ gcmINT2PTR(nodeHandle),
+ gcvNULL,
+ 0));
+ gcmkONERROR(gckVIDMEM_NODE_Reference(kernel, nodeObj));
+ refered = gcvTRUE;
+
+ if (nodeObj->tsNode)
+ {
+ gcmkONERROR(gckVIDMEM_HANDLE_Allocate(kernel, nodeObj->tsNode, &tsNodeHandle));
+ gcmkONERROR(
+ gckKERNEL_AddProcessDB(kernel,
+ processID, gcvDB_VIDEO_MEMORY,
+ gcmINT2PTR(tsNodeHandle),
+ gcvNULL,
+ 0));
+ gcmkONERROR(gckVIDMEM_NODE_Reference(kernel, nodeObj->tsNode));
+ }
+ args->node = nodeHandle;
+ args->ts_node = tsNodeHandle;
+
+OnError:
+ if (gcmIS_ERROR(status) && kernel)
+ {
+ gctUINT32 processID;
+
+ gcmkVERIFY_OK(gckOS_GetProcessID(&processID));
+
+ if (tsNodeHandle)
+ {
+ gckVIDMEM_HANDLE_Dereference(kernel, processID, tsNodeHandle);
+ }
+
+ if (nodeHandle)
+ {
+ gckVIDMEM_HANDLE_Dereference(kernel, processID, nodeHandle);
+ }
+
+ if (refered)
+ {
+ gcmkONERROR(gckVIDMEM_NODE_Dereference(kernel, nodeObj));
+ }
+
+ args->node = 0;
+ args->ts_node = 0;
+
+ ret = -ENOTTY;
+ }
+
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
+
+ return ret;
+}
+
+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_QUERY, viv_ioctl_gem_query, DRM_AUTH | DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(VIV_GEM_TIMESTAMP, viv_ioctl_gem_timestamp, DRM_AUTH | DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(VIV_GEM_SET_TILING, viv_ioctl_gem_set_tiling, DRM_AUTH | DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(VIV_GEM_GET_TILING, viv_ioctl_gem_get_tiling, DRM_AUTH | DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(VIV_GEM_ATTACH_AUX, viv_ioctl_gem_attach_aux, DRM_AUTH | DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(VIV_GEM_REF_NODE, viv_ioctl_gem_ref_node, 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 = gcmPTR2SIZE(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,
+#ifdef CONFIG_COMPAT
+ .compat_ioctl = drm_compat_ioctl,
+#endif
+ .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_iommu.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_iommu.c
new file mode 100644
index 000000000000..ae86dd24f8cf
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_iommu.c
@@ -0,0 +1,236 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_device.h"
+
+#include <linux/iommu.h>
+#include <linux/platform_device.h>
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+typedef struct _gcsIOMMU
+{
+ struct iommu_domain * domain;
+ struct device * device;
+}
+gcsIOMMU;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+static int
+_IOMMU_Fault_Handler(
+ struct iommu_domain * Domain,
+ struct device * Dev,
+ unsigned long DomainAddress,
+ int flags,
+ void * args
+ )
+#else
+static int
+_IOMMU_Fault_Handler(
+ struct iommu_domain * Domain,
+ struct device * Dev,
+ unsigned long DomainAddress,
+ int flags
+ )
+#endif
+{
+ return 0;
+}
+
+static int
+_FlatMapping(
+ IN gckIOMMU Iommu
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gctUINT32 physical;
+
+ gcmkHEADER_ARG("Iommu=%p", Iommu);
+
+ for (physical = 0; physical < 0x80000000; physical += PAGE_SIZE)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "Map %x => %x bytes = %d",
+ physical, physical, PAGE_SIZE
+ );
+
+ gcmkONERROR(gckIOMMU_Map(Iommu, physical, physical, PAGE_SIZE));
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+void
+gckIOMMU_Destory(
+ IN gckOS Os,
+ IN gckIOMMU Iommu
+ )
+{
+ gcmkHEADER_ARG("Os=%p Iommu=%p", Os, Iommu);
+
+ if (Iommu->domain && Iommu->device)
+ {
+ iommu_attach_device(Iommu->domain, Iommu->device);
+ }
+
+ if (Iommu->domain)
+ {
+ iommu_domain_free(Iommu->domain);
+ }
+
+ if (Iommu)
+ {
+ gcmkOS_SAFE_FREE(Os, Iommu);
+ }
+
+ gcmkFOOTER_NO();
+}
+
+gceSTATUS
+gckIOMMU_Construct(
+ IN gckOS Os,
+ OUT gckIOMMU * Iommu
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gckIOMMU iommu = gcvNULL;
+ struct device *dev;
+
+ gcmkHEADER_ARG("Os=%p", Os);
+
+ dev = &Os->device->platform->device->dev;
+
+ gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(gcsIOMMU), (gctPOINTER *)&iommu));
+
+ gckOS_ZeroMemory(iommu, gcmSIZEOF(gcsIOMMU));
+
+ iommu->domain = iommu_domain_alloc(&platform_bus_type);
+
+ if (!iommu->domain)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS, "iommu_domain_alloc() fail");
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+ iommu_set_fault_handler(iommu->domain, _IOMMU_Fault_Handler, dev);
+#else
+ iommu_set_fault_handler(iommu->domain, _IOMMU_Fault_Handler);
+#endif
+
+ if (iommu_attach_device(iommu->domain, dev))
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS, "iommu_attach_device() fail");
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ iommu->device = dev;
+
+ _FlatMapping(iommu);
+
+ *Iommu = iommu;
+
+OnError:
+ if (gcmIS_ERROR(status))
+ {
+ gckIOMMU_Destory(Os, iommu);
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckIOMMU_Map(
+ IN gckIOMMU Iommu,
+ IN gctUINT32 DomainAddress,
+ IN gctUINT32 Physical,
+ IN gctUINT32 Bytes
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("DomainAddress=%#X, Physical=%#X, Bytes=%d",
+ DomainAddress, Physical, Bytes);
+
+ if (iommu_map(Iommu->domain, DomainAddress, Physical, Bytes, 0))
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckIOMMU_Unmap(
+ IN gckIOMMU Iommu,
+ IN gctUINT32 DomainAddress,
+ IN gctUINT32 Bytes
+ )
+{
+ gcmkHEADER();
+
+ iommu_unmap(Iommu->domain, DomainAddress, Bytes);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
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
new file mode 100644
index 000000000000..fb9de5765905
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.c
@@ -0,0 +1,575 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+
+#define _GC_OBJ_ZONE gcvZONE_KERNEL
+
+/******************************************************************************\
+******************************* gckKERNEL API Code ******************************
+\******************************************************************************/
+
+/*******************************************************************************
+**
+** gckKERNEL_QueryVideoMemory
+**
+** Query the amount of video memory.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** OUTPUT:
+**
+** gcsHAL_INTERFACE * Interface
+** Pointer to an gcsHAL_INTERFACE structure that will be filled in with
+** the memory information.
+*/
+gceSTATUS
+gckKERNEL_QueryVideoMemory(
+ IN gckKERNEL Kernel,
+ OUT gcsHAL_INTERFACE * Interface
+ )
+{
+ gckGALDEVICE device;
+
+ gcmkHEADER_ARG("Kernel=%p", Kernel);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Interface != NULL);
+
+ /* Extract the pointer to the gckGALDEVICE class. */
+ device = (gckGALDEVICE) Kernel->context;
+
+ /* Get internal memory size and physical address. */
+ Interface->u.QueryVideoMemory.internalSize = device->internalSize;
+ Interface->u.QueryVideoMemory.internalPhysName = device->internalPhysName;
+
+ /* Get external memory size and physical address. */
+ Interface->u.QueryVideoMemory.externalSize = device->externalSize;
+ Interface->u.QueryVideoMemory.externalPhysName = device->externalPhysName;
+
+ /* Get contiguous memory size and physical address. */
+ Interface->u.QueryVideoMemory.contiguousSize = device->contiguousSize;
+ Interface->u.QueryVideoMemory.contiguousPhysName = device->contiguousPhysName;
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_GetVideoMemoryPool
+**
+** Get the gckVIDMEM object belonging to the specified pool.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gcePOOL Pool
+** Pool to query gckVIDMEM object for.
+**
+** OUTPUT:
+**
+** gckVIDMEM * VideoMemory
+** Pointer to a variable that will hold the pointer to the gckVIDMEM
+** object belonging to the requested pool.
+*/
+gceSTATUS
+gckKERNEL_GetVideoMemoryPool(
+ IN gckKERNEL Kernel,
+ IN gcePOOL Pool,
+ OUT gckVIDMEM * VideoMemory
+ )
+{
+ gckGALDEVICE device;
+ gckVIDMEM videoMemory;
+
+ gcmkHEADER_ARG("Kernel=%p Pool=%d", Kernel, Pool);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(VideoMemory != NULL);
+
+ /* Extract the pointer to the gckGALDEVICE class. */
+ device = (gckGALDEVICE) Kernel->context;
+
+ /* Dispatch on pool. */
+ switch (Pool)
+ {
+ case gcvPOOL_LOCAL_INTERNAL:
+ /* Internal memory. */
+ videoMemory = device->internalVidMem;
+ break;
+
+ case gcvPOOL_LOCAL_EXTERNAL:
+ /* External memory. */
+ videoMemory = device->externalVidMem;
+ break;
+
+ case gcvPOOL_SYSTEM:
+ /* System memory. */
+ videoMemory = device->contiguousVidMem;
+ break;
+
+ case gcvPOOL_INTERNAL_SRAM:
+ /* Internal SRAM memory. */
+ videoMemory = Kernel->sRAMVidMem[Kernel->sRAMIndex];
+ break;
+
+ case gcvPOOL_EXTERNAL_SRAM:
+ /* External SRAM memory. */
+ videoMemory = device->extSRAMVidMem[Kernel->extSRAMIndex];
+ break;
+
+ default:
+ /* Unknown pool. */
+ videoMemory = NULL;
+ }
+
+ /* Return pointer to the gckVIDMEM object. */
+ *VideoMemory = videoMemory;
+
+ /* Return status. */
+ gcmkFOOTER_ARG("*VideoMemory=%p", *VideoMemory);
+ return (videoMemory == NULL) ? gcvSTATUS_OUT_OF_MEMORY : gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_MapMemory
+**
+** Map video memory into the current process space.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctPHYS_ADDR Physical
+** Physical address of video memory to map.
+**
+** gctSIZE_T Bytes
+** Number of bytes to map.
+**
+** OUTPUT:
+**
+** gctPOINTER * Logical
+** Pointer to a variable that will hold the base address of the mapped
+** memory region.
+*/
+gceSTATUS
+gckKERNEL_MapMemory(
+ IN gckKERNEL Kernel,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Logical
+ )
+{
+ gckKERNEL kernel = Kernel;
+ gctPHYS_ADDR physical = gcmNAME_TO_PTR(Physical);
+
+ return gckOS_MapMemory(Kernel->os, physical, Bytes, Logical);
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_UnmapMemory
+**
+** Unmap video memory from the current process space.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctPHYS_ADDR Physical
+** Physical address of video memory to map.
+**
+** gctSIZE_T Bytes
+** Number of bytes to map.
+**
+** gctPOINTER Logical
+** Base address of the mapped memory region.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_UnmapMemory(
+ IN gckKERNEL Kernel,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical,
+ IN gctUINT32 ProcessID
+ )
+{
+ gckKERNEL kernel = Kernel;
+ gctPHYS_ADDR physical = gcmNAME_TO_PTR(Physical);
+
+ return gckOS_UnmapMemoryEx(Kernel->os, physical, Bytes, Logical, ProcessID);
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_MapVideoMemory
+**
+** Get the logical address for a hardware specific memory address for the
+** current process.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gctBOOL InUserSpace
+** gcvTRUE to map the memory into the user space.
+**
+** gcePOOL Pool
+** Specify pool type.
+**
+** gctUINT32 Offset
+** Offset to pool start.
+**
+** gctUINT32 Bytes
+** Number of bytes to map.
+**
+** OUTPUT:
+**
+** gctPOINTER * Logical
+** Pointer to a variable that will hold the logical address of the
+** specified memory address.
+*/
+gceSTATUS
+gckKERNEL_MapVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gctBOOL InUserSpace,
+ IN gcePOOL Pool,
+ IN gctPHYS_ADDR Physical,
+ IN gctUINT32 Offset,
+ IN gctUINT32 Bytes,
+ OUT gctPOINTER * Logical
+ )
+{
+ gckGALDEVICE device = gcvNULL;
+ gctSIZE_T bytes = 0;
+ gctPHYS_ADDR physHandle = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
+ gctPOINTER logical = gcvNULL;
+ gctUINT64 mappingInOne = 1;
+
+ gcmkHEADER_ARG("Kernel=%p InUserSpace=%d Pool=%d Offset=%X Bytes=%X",
+ Kernel, InUserSpace, Pool, Offset, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+ gcmkVERIFY_ARGUMENT(Logical != NULL);
+
+ if (Physical)
+ {
+ gcmkONERROR(gckOS_QueryOption(Kernel->os, "allMapInOne", &mappingInOne));
+ }
+
+ if (mappingInOne)
+ {
+ /* Extract the pointer to the gckGALDEVICE class. */
+ device = (gckGALDEVICE) Kernel->context;
+
+ /* Dispatch on pool. */
+ switch (Pool)
+ {
+ case gcvPOOL_LOCAL_INTERNAL:
+ physHandle = (PLINUX_MDL)device->internalPhysical;
+ bytes = device->internalSize;
+ break;
+
+ case gcvPOOL_LOCAL_EXTERNAL:
+ physHandle = (PLINUX_MDL)device->externalPhysical;
+ bytes = device->externalSize;
+ break;
+
+ case gcvPOOL_SYSTEM:
+ /* System memory. */
+ physHandle = (PLINUX_MDL)device->contiguousPhysical;
+ bytes = device->contiguousSize;
+ break;
+
+ case gcvPOOL_EXTERNAL_SRAM:
+ /* External shared SRAM memory. */
+ physHandle = (PLINUX_MDL)device->extSRAMPhysical[Kernel->extSRAMIndex];
+ bytes = device->extSRAMSizes[Kernel->extSRAMIndex];
+ break;
+
+ case gcvPOOL_INTERNAL_SRAM:
+ /* Per core SRAM reserved usage. */
+ if (Kernel->sRAMPhysFaked[Kernel->sRAMIndex])
+ {
+ *Logical = gcvNULL;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ /* Per core SRAM memory block. */
+ else
+ {
+ physHandle = (PLINUX_MDL)Kernel->sRAMPhysical[Kernel->sRAMIndex];
+ bytes = Kernel->sRAMSizes[Kernel->sRAMIndex];
+ break;
+ }
+
+ default:
+ /* Invalid memory pool. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ }
+ else
+ {
+ physHandle = (PLINUX_MDL)Physical;
+ bytes = Bytes;
+ Offset = 0;
+ }
+
+ gcmkONERROR(gckOS_LockPages(Kernel->os, physHandle, bytes, gcvFALSE, &logical));
+ /* Build logical address of specified address. */
+ *Logical = (gctPOINTER)((gctUINT8_PTR)logical + Offset);
+OnError:
+ /* Retunn the status. */
+ gcmkFOOTER_ARG("*Logical=%p", gcmOPT_POINTER(Logical));
+ return status;
+}
+
+
+/*******************************************************************************
+**
+** gckKERNEL_UnmapVideoMemory
+**
+** Unmap video memory for the current process.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gcePOOL Pool
+** Specify pool type.
+
+** gctUINT32 Address
+** Hardware specific memory address.
+**
+** gctUINT32 Pid
+** Process ID of the current process.
+**
+** gctSIZE_T Bytes
+** Number of bytes to map.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_UnmapVideoMemory(
+ IN gckKERNEL Kernel,
+ IN gcePOOL Pool,
+ IN gctPHYS_ADDR Physical,
+ IN gctPOINTER Logical,
+ IN gctUINT32 Pid,
+ IN gctSIZE_T Bytes
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gckGALDEVICE device = gcvNULL;
+ gctSIZE_T bytes = 0;
+ gctPHYS_ADDR physHandle = gcvNULL;
+ gctUINT64 mappingInOne = 1;
+
+ gcmkHEADER_ARG("Logical=0x%08x pid=%u Bytes=%u",
+ Logical, Pid, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ if (Logical == gcvNULL)
+ {
+ return gcvSTATUS_OK;
+ }
+
+ if (Physical)
+ {
+ gcmkONERROR(gckOS_QueryOption(Kernel->os, "allMapInOne", &mappingInOne));
+ }
+
+ if (mappingInOne)
+ {
+ /* Extract the pointer to the gckGALDEVICE class. */
+ device = (gckGALDEVICE) Kernel->context;
+
+ /* Dispatch on pool. */
+ switch (Pool)
+ {
+ case gcvPOOL_LOCAL_INTERNAL:
+ physHandle = (PLINUX_MDL)device->internalPhysical;
+ bytes = device->internalSize;
+ break;
+
+ case gcvPOOL_LOCAL_EXTERNAL:
+ physHandle = (PLINUX_MDL)device->externalPhysical;
+ bytes = device->externalSize;
+ break;
+
+ case gcvPOOL_SYSTEM:
+ /* System memory. */
+ physHandle = (PLINUX_MDL)device->contiguousPhysical;
+ bytes = device->contiguousSize;
+ break;
+
+ case gcvPOOL_EXTERNAL_SRAM:
+ /* External shared SRAM memory. */
+ physHandle = (PLINUX_MDL)device->extSRAMPhysical[Kernel->extSRAMIndex];
+ bytes = device->extSRAMSizes[Kernel->extSRAMIndex];
+ break;
+
+ case gcvPOOL_INTERNAL_SRAM:
+ /* Per core SRAM reserved usage. */
+ if (Kernel->sRAMPhysFaked[Kernel->sRAMIndex])
+ {
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+ }
+ /* Per core SRAM memory block. */
+ else
+ {
+ physHandle = (PLINUX_MDL)Kernel->sRAMPhysical[Kernel->sRAMIndex];
+ bytes = Kernel->sRAMSizes[Kernel->sRAMIndex];
+ break;
+ }
+
+ default:
+ /* Invalid memory pool. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+ }
+ else
+ {
+ physHandle = (PLINUX_MDL)Physical;
+ bytes = Bytes;
+ }
+
+ gcmkONERROR(gckOS_UnlockPages(Kernel->os, physHandle, bytes, Logical));
+
+OnError:
+ /* Retunn the status. */
+ gcmkFOOTER_NO();
+ return status;
+
+}
+
+/*******************************************************************************
+**
+** gckKERNEL_Notify
+**
+** This function iscalled by clients to notify the gckKERNRL object of an event.
+**
+** INPUT:
+**
+** gckKERNEL Kernel
+** Pointer to an gckKERNEL object.
+**
+** gceNOTIFY Notification
+** Notification event.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckKERNEL_Notify(
+ IN gckKERNEL Kernel,
+ IN gceNOTIFY Notification
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Kernel=%p Notification=%d", Kernel, Notification);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Kernel, gcvOBJ_KERNEL);
+
+ /* Dispatch on notifcation. */
+ switch (Notification)
+ {
+ case gcvNOTIFY_INTERRUPT:
+ /* Process the interrupt. */
+#if COMMAND_PROCESSOR_VERSION > 1
+ status = gckINTERRUPT_Notify(Kernel->interrupt, 0);
+#else
+ status = gckHARDWARE_Notify(Kernel->hardware);
+#endif
+ break;
+
+ default:
+ break;
+ }
+
+ /* Success. */
+ gcmkFOOTER();
+ return status;
+}
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h
new file mode 100644
index 000000000000..9f677da24aa0
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_linux.h
@@ -0,0 +1,393 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_linux_h_
+#define __gc_hal_kernel_linux_h_
+
+#include <linux/version.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/mm.h>
+#include <linux/sched.h>
+#include <linux/signal.h>
+#include <linux/interrupt.h>
+#include <linux/vmalloc.h>
+#include <linux/dma-mapping.h>
+#include <linux/kthread.h>
+
+#include <linux/idr.h>
+
+#ifdef MODVERSIONS
+# include <linux/modversions.h>
+#endif
+#include <asm/io.h>
+#if LINUX_VERSION_CODE > KERNEL_VERSION(4,7,0)
+ #include <linux/uaccess.h>
+#else
+ #include <asm/uaccess.h>
+#endif
+
+#if ENABLE_GPU_CLOCK_BY_DRIVER && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28)
+#include <linux/clk.h>
+#endif
+
+#define NTSTRSAFE_NO_CCH_FUNCTIONS
+#include "gc_hal.h"
+#include "gc_hal_driver.h"
+#include "gc_hal_kernel.h"
+#include "gc_hal_kernel_platform.h"
+#include "gc_hal_kernel_device.h"
+#include "gc_hal_kernel_os.h"
+#include "gc_hal_kernel_debugfs.h"
+#include "gc_hal_ta.h"
+
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
+#define FIND_TASK_BY_PID(x) pid_task(find_vpid(x), PIDTYPE_PID)
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+#define FIND_TASK_BY_PID(x) find_task_by_vpid(x)
+#else
+#define FIND_TASK_BY_PID(x) find_task_by_pid(x)
+#endif
+
+#ifndef DEVICE_NAME
+# define DEVICE_NAME "galcore"
+#endif
+
+#ifndef CLASS_NAME
+# define CLASS_NAME "graphics_class"
+#endif
+
+#define GetPageCount(size, offset) ((((size) + ((offset) & ~PAGE_MASK)) + PAGE_SIZE - 1) >> PAGE_SHIFT)
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION (3,7,0)
+#define gcdVM_FLAGS (VM_IO | VM_DONTCOPY | VM_DONTEXPAND | VM_DONTDUMP)
+#else
+#define gcdVM_FLAGS (VM_IO | VM_DONTCOPY | VM_DONTEXPAND | VM_RESERVED)
+#endif
+
+/* Protection bit when mapping memroy to user sapce */
+#define gcmkPAGED_MEMROY_PROT(x) pgprot_writecombine(x)
+
+#define gcdSUPPRESS_OOM_MESSAGE 1
+
+#if gcdSUPPRESS_OOM_MESSAGE
+#define gcdNOWARN __GFP_NOWARN
+#else
+#define gcdNOWARN 0
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION (4, 1, 0)
+#ifdef gcdIRQ_SHARED
+# define gcdIRQF_FLAG (IRQF_SHARED | IRQF_TRIGGER_HIGH)
+# else
+# define gcdIRQF_FLAG (IRQF_TRIGGER_HIGH)
+# endif
+#else
+#ifdef gcdIRQ_SHARED
+# define gcdIRQF_FLAG (IRQF_DISABLED | IRQF_SHARED | IRQF_TRIGGER_HIGH)
+# else
+# define gcdIRQF_FLAG (IRQF_DISABLED | IRQF_TRIGGER_HIGH)
+# endif
+#endif
+
+/* gcdLINUX_SYNC_FILE and CONFIG_SYNC_FILE. */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)
+# define dma_fence fence
+# define dma_fence_array fence_array
+# define dma_fence_ops fence_ops
+
+# define dma_fence_default_wait fence_default_wait
+
+# define dma_fence_signal(f) fence_signal(f)
+# define dma_fence_signal_locked(f) fence_signal_locked(f)
+# define dma_fence_get(f) fence_get(f)
+# define dma_fence_put(f) fence_put(f)
+# define dma_fence_is_array(f) fence_is_array(f)
+# define dma_fence_is_signaled(f) fence_is_signaled(f)
+# define to_dma_fence_array(f) to_fence_array(f)
+# define dma_fence_wait_timeout(f, n, t) fence_wait_timeout((f), (n), (t))
+# define dma_fence_init(f, o, l, t, s) fence_init((f), (o), (l), (t), (s))
+# define dma_fence_context_alloc(s) fence_context_alloc(s)
+
+#endif
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(5,0,0)
+#ifndef dma_alloc_writecombine
+#define dma_alloc_writecombine dma_alloc_wc
+#endif
+#ifndef dma_free_writecombine
+#define dma_free_writecombine dma_free_wc
+#endif
+#ifndef dma_mmap_writecombine
+#define dma_mmap_writecombine dma_mmap_wc
+#endif
+#endif
+
+extern struct device *galcore_device;
+
+/******************************************************************************\
+********************************** Structures **********************************
+\******************************************************************************/
+typedef struct _gcsIOMMU * gckIOMMU;
+
+typedef struct _gcsINTEGER_DB * gcsINTEGER_DB_PTR;
+typedef struct _gcsINTEGER_DB
+{
+ struct idr idr;
+ spinlock_t lock;
+ gctINT curr;
+}
+gcsINTEGER_DB;
+
+struct _gckOS
+{
+ /* Object. */
+ gcsOBJECT object;
+
+ /* Pointer to device */
+ gckGALDEVICE device;
+
+ /* Memory management */
+ struct mutex mdlMutex;
+ struct list_head mdlHead;
+
+ /* Kernel process ID. */
+ gctUINT32 kernelProcessID;
+
+ /* Signal management. */
+
+ /* Lock. */
+ spinlock_t signalLock;
+
+ /* signal id database. */
+ gcsINTEGER_DB signalDB;
+
+ /* workqueue for os timer. */
+ struct workqueue_struct * workqueue;
+
+ /* Allocate extra page to avoid cache overflow */
+ struct page* paddingPage;
+
+ /* Detect unfreed allocation. */
+ atomic_t allocateCount;
+
+ struct list_head allocatorList;
+
+ gcsDEBUGFS_DIR allocatorDebugfsDir;
+
+ gctBOOL allocatorLimitMarker;
+
+ /* Lock for register access check. */
+ spinlock_t registerAccessLock;
+
+ /* External power states. */
+ gctBOOL powerStates[gcdMAX_GPU_COUNT];
+
+ /* External clock states. */
+ gctBOOL clockStates[gcdMAX_GPU_COUNT];
+
+ /* IOMMU. */
+ gckIOMMU iommu;
+
+ /* Dump in kernel. */
+ struct file * dumpFilp;
+ struct mutex dumpFilpMutex;
+
+ int dumpTarget;
+ char dumpFileName[256];
+ gcsDEBUGFS_DIR dumpDebugfsDir;
+};
+
+typedef struct _gcsSIGNAL * gcsSIGNAL_PTR;
+typedef struct _gcsSIGNAL
+{
+ /* Kernel sync primitive. */
+ volatile unsigned int done;
+ spinlock_t lock;
+
+ wait_queue_head_t wait;
+
+ /* Manual reset flag. */
+ gctBOOL manualReset;
+
+ /* The reference counter. */
+ atomic_t ref;
+
+ /* The owner of the signal. */
+ gctHANDLE process;
+
+ /* ID. */
+ gctUINT32 id;
+
+#if gcdLINUX_SYNC_FILE
+#ifndef CONFIG_SYNC_FILE
+ /* Parent timeline. */
+ struct sync_timeline * timeline;
+# else
+ struct dma_fence *fence;
+# endif
+#endif
+}
+gcsSIGNAL;
+
+typedef struct _gcsOSTIMER * gcsOSTIMER_PTR;
+typedef struct _gcsOSTIMER
+{
+ struct delayed_work work;
+ gctTIMERFUNCTION function;
+ gctPOINTER data;
+} gcsOSTIMER;
+
+gceSTATUS
+gckOS_ImportAllocators(
+ gckOS Os
+ );
+
+gceSTATUS
+gckOS_FreeAllocators(
+ gckOS Os
+ );
+
+gceSTATUS
+_ConvertLogical2Physical(
+ IN gckOS Os,
+ IN gctPOINTER Logical,
+ IN gctUINT32 ProcessID,
+ IN PLINUX_MDL Mdl,
+ OUT gctPHYS_ADDR_T * Physical
+ );
+
+gctBOOL
+_QuerySignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal
+ );
+
+static inline gctINT
+_GetProcessID(
+ void
+ )
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+ return task_tgid_vnr(current);
+#else
+ return current->tgid;
+#endif
+}
+
+static inline void
+_MemoryBarrier(
+ void
+ )
+{
+#if defined(CONFIG_ARM) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34))
+ dsb();
+#else
+ mb();
+#endif
+}
+
+static inline void
+_Barrier(
+ void
+ )
+{
+ barrier();
+}
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
+static inline int
+is_vmalloc_addr(
+ void *Addr
+ )
+{
+ unsigned long addr = (unsigned long)Addr;
+
+ return addr >= VMALLOC_START && addr < VMALLOC_END;
+}
+#endif
+
+#ifdef CONFIG_IOMMU_SUPPORT
+void
+gckIOMMU_Destory(
+ IN gckOS Os,
+ IN gckIOMMU Iommu
+ );
+
+gceSTATUS
+gckIOMMU_Construct(
+ IN gckOS Os,
+ OUT gckIOMMU * Iommu
+ );
+
+gceSTATUS
+gckIOMMU_Map(
+ IN gckIOMMU Iommu,
+ IN gctUINT32 DomainAddress,
+ IN gctUINT32 Physical,
+ IN gctUINT32 Bytes
+ );
+
+gceSTATUS
+gckIOMMU_Unmap(
+ IN gckIOMMU Iommu,
+ IN gctUINT32 DomainAddress,
+ IN gctUINT32 Bytes
+ );
+#endif
+
+#endif /* __gc_hal_kernel_linux_h_ */
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_math.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_math.c
new file mode 100644
index 000000000000..3e72ea317bdf
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_math.c
@@ -0,0 +1,66 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+
+gctINT
+gckMATH_ModuloInt(
+ IN gctINT X,
+ IN gctINT Y
+ )
+{
+ if(Y ==0) {return 0;}
+ else {return X % Y;}
+}
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_mutex.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_mutex.h
new file mode 100644
index 000000000000..b2d9e6c5b65d
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_mutex.h
@@ -0,0 +1,80 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef _gc_hal_kernel_mutex_h_
+#define _gc_hal_kernel_mutex_h_
+
+#include "gc_hal.h"
+#include <linux/mutex.h>
+
+/* Create a new mutex. */
+#define gckOS_CreateMutex(Os, Mutex) \
+({ \
+ /* Allocate the mutex structure. */ \
+ gceSTATUS _status = gckOS_Allocate(Os, gcmSIZEOF(struct mutex), Mutex); \
+ \
+ if (gcmIS_SUCCESS(_status)) \
+ { \
+ /* Initialize the mutex. */ \
+ mutex_init(*(struct mutex **)Mutex); \
+ } \
+ \
+ _status; \
+})
+
+#endif
+
+
+
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
new file mode 100644
index 000000000000..5b675b303ae2
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.c
@@ -0,0 +1,7494 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_dump.h"
+
+#include <linux/pagemap.h>
+#include <linux/seq_file.h>
+#include <linux/mman.h>
+#include <asm/atomic.h>
+#include <linux/dma-mapping.h>
+#include <linux/slab.h>
+#include <linux/workqueue.h>
+#include <linux/irqflags.h>
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,23)
+#include <linux/math64.h>
+#endif
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+#include <linux/anon_inodes.h>
+#endif
+
+#if gcdLINUX_SYNC_FILE
+# include <linux/file.h>
+# include "gc_hal_kernel_sync.h"
+#endif
+
+#if defined(CONFIG_DMA_SHARED_BUFFER)
+#include <linux/dma-buf.h>
+#endif
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+#include "gc_hal_kernel_allocator.h"
+
+#define gcmkBUG_ON(x) \
+ do { \
+ if (unlikely(!!(x))) \
+ { \
+ printk("[galcore]: BUG ON @ %s(%d)\n", __func__, __LINE__); \
+ dump_stack(); \
+ } \
+ } while (0)
+
+/******************************************************************************\
+******************************* Private Functions ******************************
+\******************************************************************************/
+static gctINT
+_GetThreadID(
+ void
+ )
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+ return task_pid_vnr(current);
+#else
+ return current->pid;
+#endif
+}
+
+/* Must hold Mdl->mpasMutex before call this function. */
+static inline PLINUX_MDL_MAP
+_CreateMdlMap(
+ IN PLINUX_MDL Mdl,
+ IN gctINT ProcessID
+ )
+{
+ PLINUX_MDL_MAP mdlMap = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Mdl=%p ProcessID=%d", Mdl, ProcessID);
+
+ mdlMap = (PLINUX_MDL_MAP)kmalloc(sizeof(struct _LINUX_MDL_MAP), GFP_KERNEL | gcdNOWARN);
+ if (mdlMap == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ mdlMap->pid = ProcessID;
+ mdlMap->vmaAddr = gcvNULL;
+ mdlMap->count = 0;
+
+ list_add(&mdlMap->link, &Mdl->mapsHead);
+
+OnError:
+ gcmkFOOTER_ARG("ret=%p", mdlMap);
+ return mdlMap;
+}
+
+/* Must hold Mdl->mpasMutex before call this function. */
+static inline gceSTATUS
+_DestroyMdlMap(
+ IN PLINUX_MDL Mdl,
+ IN PLINUX_MDL_MAP MdlMap
+ )
+{
+ gcmkHEADER_ARG("Mdl=%p MdlMap=%p", Mdl, MdlMap);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(MdlMap != gcvNULL);
+
+ list_del(&MdlMap->link);
+ kfree(MdlMap);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/* Must hold Mdl->mpasMutex before call this function. */
+extern PLINUX_MDL_MAP
+FindMdlMap(
+ IN PLINUX_MDL Mdl,
+ IN gctINT ProcessID
+ )
+{
+ PLINUX_MDL_MAP mdlMap = gcvNULL;
+
+ gcmkHEADER_ARG("Mdl=%p ProcessID=%d", Mdl, ProcessID);
+
+ if (Mdl)
+ {
+ PLINUX_MDL_MAP iter = gcvNULL;
+ list_for_each_entry(iter, &Mdl->mapsHead, link)
+ {
+ if (iter->pid == ProcessID)
+ {
+ mdlMap = iter;
+ break;
+ }
+ }
+ }
+
+ gcmkFOOTER_ARG("ret=%p", mdlMap);
+ return mdlMap;
+}
+
+
+static PLINUX_MDL
+_CreateMdl(
+ IN gckOS Os
+ )
+{
+ PLINUX_MDL mdl;
+
+ gcmkHEADER();
+
+ mdl = (PLINUX_MDL)kzalloc(sizeof(struct _LINUX_MDL), GFP_KERNEL | gcdNOWARN);
+
+ if (mdl)
+ {
+ mdl->os = Os;
+ atomic_set(&mdl->refs, 1);
+ mutex_init(&mdl->mapsMutex);
+ INIT_LIST_HEAD(&mdl->mapsHead);
+ }
+
+ gcmkFOOTER_ARG("%p", mdl);
+ return mdl;
+}
+
+static gceSTATUS
+_DestroyMdl(
+ IN PLINUX_MDL Mdl
+ )
+{
+ gcmkHEADER_ARG("Mdl=%p", Mdl);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(Mdl != gcvNULL);
+
+ if (atomic_dec_and_test(&Mdl->refs))
+ {
+ 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)
+ {
+ gcmALLOCATOR_UnmapKernel(allocator, Mdl, Mdl->addr);
+ }
+ gcmALLOCATOR_Free(allocator, Mdl);
+ }
+
+ mutex_lock(&Mdl->mapsMutex);
+ list_for_each_entry_safe(mdlMap, next, &Mdl->mapsHead, link)
+ {
+ gcmkVERIFY_OK(_DestroyMdlMap(Mdl, mdlMap));
+ }
+ mutex_unlock(&Mdl->mapsMutex);
+
+ if (Mdl->link.next)
+ {
+ /* Remove the node from global list.. */
+ mutex_lock(&os->mdlMutex);
+ list_del(&Mdl->link);
+ mutex_unlock(&os->mdlMutex);
+ }
+
+ kfree(Mdl);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+** Integer Id Management.
+*/
+gceSTATUS
+_AllocateIntegerId(
+ IN gcsINTEGER_DB_PTR Database,
+ IN gctPOINTER KernelPointer,
+ OUT gctUINT32 *Id
+ )
+{
+ int result;
+ gctINT next;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
+ idr_preload(GFP_KERNEL | gcdNOWARN);
+
+ spin_lock(&Database->lock);
+
+ next = (Database->curr + 1 <= 0) ? 1 : Database->curr + 1;
+
+ result = idr_alloc(&Database->idr, KernelPointer, next, 0, GFP_ATOMIC);
+
+ /* ID allocated should not be 0. */
+ gcmkASSERT(result != 0);
+
+ if (result > 0)
+ {
+ Database->curr = *Id = result;
+ }
+
+ spin_unlock(&Database->lock);
+
+ idr_preload_end();
+
+ if (result < 0)
+ {
+ return gcvSTATUS_OUT_OF_RESOURCES;
+ }
+#else
+again:
+ if (idr_pre_get(&Database->idr, GFP_KERNEL | gcdNOWARN) == 0)
+ {
+ return gcvSTATUS_OUT_OF_MEMORY;
+ }
+
+ spin_lock(&Database->lock);
+
+ next = (Database->curr + 1 <= 0) ? 1 : Database->curr + 1;
+
+ /* Try to get a id greater than 0. */
+ result = idr_get_new_above(&Database->idr, KernelPointer, next, Id);
+
+ if (!result)
+ {
+ Database->curr = *Id;
+ }
+
+ spin_unlock(&Database->lock);
+
+ if (result == -EAGAIN)
+ {
+ goto again;
+ }
+
+ if (result != 0)
+ {
+ return gcvSTATUS_OUT_OF_RESOURCES;
+ }
+#endif
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+_QueryIntegerId(
+ IN gcsINTEGER_DB_PTR Database,
+ IN gctUINT32 Id,
+ OUT gctPOINTER * KernelPointer
+ )
+{
+ gctPOINTER pointer;
+
+ spin_lock(&Database->lock);
+
+ pointer = idr_find(&Database->idr, Id);
+
+ spin_unlock(&Database->lock);
+
+ if (pointer)
+ {
+ *KernelPointer = pointer;
+ return gcvSTATUS_OK;
+ }
+ else
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_ERROR, gcvZONE_OS,
+ "%s(%d) Id = %d is not found",
+ __FUNCTION__, __LINE__, Id);
+
+ return gcvSTATUS_NOT_FOUND;
+ }
+}
+
+gceSTATUS
+_DestroyIntegerId(
+ IN gcsINTEGER_DB_PTR Database,
+ IN gctUINT32 Id
+ )
+{
+ spin_lock(&Database->lock);
+
+ idr_remove(&Database->idr, Id);
+
+ spin_unlock(&Database->lock);
+
+ return gcvSTATUS_OK;
+}
+
+static inline gceSTATUS
+_QueryProcessPageTable(
+ IN gctPOINTER Logical,
+ OUT gctPHYS_ADDR_T * Address
+ )
+{
+ unsigned long logical = (unsigned long)Logical;
+ unsigned long offset = logical & ~PAGE_MASK;
+
+ if (is_vmalloc_addr(Logical))
+ {
+ /* vmalloc area. */
+ *Address = page_to_phys(vmalloc_to_page(Logical)) | offset;
+ return gcvSTATUS_OK;
+ }
+ else if (virt_addr_valid(logical))
+ {
+ /* Kernel logical address. */
+ *Address = virt_to_phys(Logical);
+ return gcvSTATUS_OK;
+ }
+ else
+ {
+ /* Try user VM area. */
+ struct vm_area_struct *vma;
+ spinlock_t *ptl;
+ pgd_t *pgd;
+ pud_t *pud;
+ pmd_t *pmd;
+ pte_t *pte;
+
+ if (!current->mm)
+ return gcvSTATUS_NOT_FOUND;
+
+ down_read(&current->mm->mmap_sem);
+ vma = find_vma(current->mm, logical);
+ up_read(&current->mm->mmap_sem);
+
+ /* To check if mapped to user. */
+ if (!vma)
+ return gcvSTATUS_NOT_FOUND;
+
+ pgd = pgd_offset(current->mm, logical);
+ if (pgd_none(*pgd) || pgd_bad(*pgd))
+ return gcvSTATUS_NOT_FOUND;
+
+#if (defined(CONFIG_CPU_CSKYV2) || defined(CONFIG_X86)) \
+ && LINUX_VERSION_CODE >= KERNEL_VERSION (4,12,0)
+ pud = pud_offset((p4d_t*)pgd, logical);
+#elif (defined(CONFIG_CPU_CSKYV2)) \
+ && LINUX_VERSION_CODE >= KERNEL_VERSION (4,11,0)
+ pud = pud_offset((p4d_t*)pgd, logical);
+#else
+ pud = pud_offset(pgd, logical);
+#endif
+ if (pud_none(*pud) || pud_bad(*pud))
+ return gcvSTATUS_NOT_FOUND;
+
+ pmd = pmd_offset(pud, logical);
+ if (pmd_none(*pmd) || pmd_bad(*pmd))
+ return gcvSTATUS_NOT_FOUND;
+
+ pte = pte_offset_map_lock(current->mm, pmd, logical, &ptl);
+ if (!pte)
+ {
+ spin_unlock(ptl);
+ return gcvSTATUS_NOT_FOUND;
+ }
+
+ if (!pte_present(*pte))
+ {
+ pte_unmap_unlock(pte, ptl);
+ return gcvSTATUS_NOT_FOUND;
+ }
+
+ *Address = (pte_pfn(*pte) << PAGE_SHIFT) | offset;
+ pte_unmap_unlock(pte, ptl);
+
+ return gcvSTATUS_OK;
+ }
+}
+
+
+static gceSTATUS
+_ShrinkMemory(
+ IN gckOS Os
+ )
+{
+ gcsPLATFORM * platform;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p", Os);
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+
+ platform = Os->device->platform;
+
+ if (platform && platform->ops->shrinkMemory)
+ {
+ status = platform->ops->shrinkMemory(platform);
+ }
+ else
+ {
+ status = gcvSTATUS_NOT_SUPPORTED;
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+#if gcdDUMP_IN_KERNEL
+
+#define DUMP_TO_KERNEL_DMESG 0
+#define DUMP_TO_FILE 1
+#define DUMP_IGNORE 2
+
+static void set_dump_file(gckOS os, char * fname)
+{
+ if (os->dumpFilp)
+ {
+ /* close exist opened file. */
+ printk("galcore: end dump to file: %s\n", os->dumpFileName);
+
+ filp_close(os->dumpFilp, NULL);
+ os->dumpFilp = NULL;
+ }
+
+ if (fname[0] == '\0' || !strcmp(fname, "[ignored]"))
+ {
+ /* empty or [ignored] means ignored. */
+ printk("galcore: dump ignored\n");
+
+ os->dumpTarget = DUMP_IGNORE;
+ strcpy(os->dumpFileName, "[ignored]");
+ }
+ else if (!strcmp(fname, "[dmesg]"))
+ {
+ /* [dmesg] means dump to kernel dmesg. */
+ printk("galcore: dump to kernel dmesg\n");
+
+ os->dumpTarget = DUMP_TO_KERNEL_DMESG;
+ strcpy(os->dumpFileName, "[dmesg]");
+ }
+ else if (fname[0] != '/')
+ {
+ /* invalid path, switch to kernel dmesg. */
+ printk(KERN_ERR "galcore: invalid path: %s\n", fname);
+ printk(KERN_ERR "galcore: must be absolute path start with '/'\n");
+ printk("galcore: dump to kernel dmesg\n");
+
+ os->dumpTarget = DUMP_TO_KERNEL_DMESG;
+ strcpy(os->dumpFileName, "[dmesg]");
+ }
+ else
+ {
+ /* try open file. */
+ os->dumpFilp = filp_open(fname, O_RDWR | O_CREAT, 0644);
+
+ if (IS_ERR(os->dumpFilp))
+ {
+ printk(KERN_ERR "galcore: failed to open file: %s\n", fname);
+ printk("galcore: dump to kernel dmesg\n");
+
+ os->dumpFilp = NULL;
+ os->dumpTarget = DUMP_TO_KERNEL_DMESG;
+ strcpy(os->dumpFileName, "[dmesg]");
+ }
+ else
+ {
+ printk("galcore: start dump to file: %s\n", fname);
+
+ os->dumpTarget = DUMP_TO_FILE;
+ strcpy(os->dumpFileName, fname);
+ }
+ }
+}
+
+static int dump_file_show(struct seq_file *m, void *unused)
+{
+ gcsINFO_NODE *node = m->private;
+ gckOS os = node->device;
+
+ seq_printf(m, "%s\n", os->dumpFileName);
+ return 0;
+}
+
+static int dump_file_write(const char __user *buf, size_t count, void* data)
+{
+ gcsINFO_NODE *node = data;
+ gckOS os = node->device;
+ char fname[256];
+ size_t len = min(count, sizeof(fname) - 1);
+
+ if (copy_from_user(fname, buf, len))
+ {
+ return -EFAULT;
+ }
+
+ /* Remove tailing space. */
+ while (len > 0 && (fname[len - 1] == '\n' || fname[len - 1] == ' '))
+ {
+ fname[len - 1] = '\0';
+ }
+
+ fname[len] = '\0';
+
+ mutex_lock(&os->dumpFilpMutex);
+ set_dump_file(os, fname);
+ mutex_unlock(&os->dumpFilpMutex);
+
+ return count;
+}
+
+static gcsINFO dumpDebugList[] =
+{
+ {"dump_file", dump_file_show, dump_file_write},
+};
+
+static gceSTATUS
+_DumpDebugfsInit(
+ IN gckOS Os
+ )
+{
+ gceSTATUS status;
+ gckGALDEVICE device = Os->device;
+ gckDEBUGFS_DIR dir = &Os->dumpDebugfsDir;
+
+ gcmkONERROR(gckDEBUGFS_DIR_Init(dir, device->debugfsDir.root, "dump"));
+
+ gcmkONERROR(
+ gckDEBUGFS_DIR_CreateFiles(dir, dumpDebugList,
+ gcmCOUNTOF(dumpDebugList), Os));
+
+OnError:
+ return status;
+}
+
+static void
+_DumpDebugfsCleanup(
+ IN gckOS Os
+ )
+{
+ gckDEBUGFS_DIR dir = &Os->dumpDebugfsDir;
+
+ if (dir->root)
+ {
+ gckDEBUGFS_DIR_RemoveFiles(dir, dumpDebugList, gcmCOUNTOF(dumpDebugList));
+ gckDEBUGFS_DIR_Deinit(dir);
+ }
+}
+#endif
+
+/*******************************************************************************
+**
+** gckOS_Construct
+**
+** Construct a new gckOS object.
+**
+** INPUT:
+**
+** gctPOINTER Context
+** Pointer to the gckGALDEVICE class.
+**
+** OUTPUT:
+**
+** gckOS * Os
+** Pointer to a variable that will hold the pointer to the gckOS object.
+*/
+gceSTATUS
+gckOS_Construct(
+ IN gctPOINTER Context,
+ OUT gckOS * Os
+ )
+{
+ gckOS os = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Context=%p", Context);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(Os != gcvNULL);
+
+ /* Allocate the gckOS object. */
+ os = (gckOS)kmalloc(gcmSIZEOF(struct _gckOS), GFP_KERNEL | gcdNOWARN);
+
+ if (os == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Zero the memory. */
+ gckOS_ZeroMemory(os, gcmSIZEOF(struct _gckOS));
+
+ /* Initialize the gckOS object. */
+ os->object.type = gcvOBJ_OS;
+
+ /* Set device device. */
+ os->device = Context;
+
+ /* Set allocateCount to 0, gckOS_Allocate has not been used yet. */
+ atomic_set(&os->allocateCount, 0);
+
+ /* Initialize the memory lock. */
+ mutex_init(&os->mdlMutex);
+
+ INIT_LIST_HEAD(&os->mdlHead);
+
+ /* Get the kernel process ID. */
+ os->kernelProcessID = _GetProcessID();
+
+ /*
+ * Initialize the signal manager.
+ */
+
+ /* Initialize spinlock. */
+ spin_lock_init(&os->signalLock);
+
+ /* Initialize signal id database lock. */
+ spin_lock_init(&os->signalDB.lock);
+
+ /* Initialize signal id database. */
+ idr_init(&os->signalDB.idr);
+
+ /* Create a workqueue for os timer. */
+ os->workqueue = create_singlethread_workqueue("galcore workqueue");
+
+ if (os->workqueue == gcvNULL)
+ {
+ /* Out of memory. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ os->paddingPage = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | gcdNOWARN);
+ if (os->paddingPage == gcvNULL)
+ {
+ /* Out of memory. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ else
+ {
+ SetPageReserved(os->paddingPage);
+ }
+
+ spin_lock_init(&os->registerAccessLock);
+
+ gckOS_ImportAllocators(os);
+
+#if defined(CONFIG_IOMMU_SUPPORT)
+ if (0)
+ {
+ /* Only use IOMMU when internal MMU is not enabled. */
+ if (gcmIS_ERROR(gckIOMMU_Construct(os, &os->iommu)))
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): Fail to setup IOMMU",
+ __FUNCTION__, __LINE__
+ );
+ }
+ }
+#endif
+
+#if gcdDUMP_IN_KERNEL
+ mutex_init(&os->dumpFilpMutex);
+
+ /* Set default dump file. */
+ set_dump_file(os, gcdDUMP_FILE_IN_KERNEL);
+
+ /* Init debugfs for kernel dump feature. */
+ _DumpDebugfsInit(os);
+#endif
+
+ /* Return pointer to the gckOS object. */
+ *Os = os;
+
+OnError:
+ if (gcmIS_ERROR(status) && os)
+ {
+ if (os->workqueue != gcvNULL)
+ {
+ destroy_workqueue(os->workqueue);
+ }
+
+ kfree(os);
+ os = gcvNULL;
+ }
+
+ /* Return the error. */
+ gcmkFOOTER_ARG("*Os=%p", os);
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_Destroy
+**
+** Destroy an gckOS object.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object that needs to be destroyed.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_Destroy(
+ IN gckOS Os
+ )
+{
+ gcmkHEADER_ARG("Os=%p", Os);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+
+ if (Os->paddingPage != gcvNULL)
+ {
+ ClearPageReserved(Os->paddingPage);
+ __free_page(Os->paddingPage);
+ Os->paddingPage = gcvNULL;
+ }
+
+ /*
+ * Destroy the signal manager.
+ */
+
+ /* Wait for all works done. */
+ flush_workqueue(Os->workqueue);
+
+ /* Destory work queue. */
+ destroy_workqueue(Os->workqueue);
+
+ gckOS_FreeAllocators(Os);
+
+#ifdef CONFIG_IOMMU_SUPPORT
+ if (Os->iommu)
+ {
+ gckIOMMU_Destory(Os, Os->iommu);
+ }
+#endif
+
+ /* Mark the gckOS object as unknown. */
+ Os->object.type = gcvOBJ_UNKNOWN;
+
+
+#if gcdDUMP_IN_KERNEL
+ mutex_lock(&Os->dumpFilpMutex);
+
+ if (Os->dumpFilp)
+ {
+ filp_close(Os->dumpFilp, NULL);
+ Os->dumpFilp = NULL;
+ Os->dumpTarget = DUMP_IGNORE;
+ }
+
+ mutex_unlock(&Os->dumpFilpMutex);
+
+ /* Cleanup debugfs for kernel dump feature. */
+ _DumpDebugfsCleanup(Os);
+#endif
+
+ /* Free the gckOS object. */
+ kfree(Os);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_CreateKernelMapping(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Offset,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Logical
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ PLINUX_MDL mdl = (PLINUX_MDL)Physical;
+ gckALLOCATOR allocator = mdl->allocator;
+
+ gcmkHEADER_ARG("Os=%p Physical=%p Offset=0x%zx Bytes=0x%zx",
+ Os, Physical, Offset, Bytes);
+
+ if (mdl->addr)
+ {
+ /* Already mapped whole memory. */
+ *Logical = (gctUINT8_PTR)mdl->addr + Offset;
+ }
+ else
+ {
+ gcmkONERROR(gcmALLOCATOR_MapKernel(allocator, mdl, Offset, Bytes, Logical));
+ }
+
+OnError:
+ gcmkFOOTER_ARG("*Logical=%p", gcmOPT_POINTER(Logical));
+ return status;
+}
+
+gceSTATUS
+gckOS_DestroyKernelMapping(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctPOINTER Logical
+ )
+{
+ PLINUX_MDL mdl = (PLINUX_MDL)Physical;
+ gckALLOCATOR allocator = mdl->allocator;
+
+ gcmkHEADER_ARG("Os=%p Physical=%p Logical=%p", Os, Physical, Logical);
+
+ if (mdl->addr)
+ {
+ /* Nothing to do. */
+ }
+ else
+ {
+ gcmALLOCATOR_UnmapKernel(allocator, mdl, Logical);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_Allocate
+**
+** Allocate memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctSIZE_T Bytes
+** Number of bytes to allocate.
+**
+** OUTPUT:
+**
+** gctPOINTER * Memory
+** Pointer to a variable that will hold the allocated memory location.
+*/
+gceSTATUS
+gckOS_Allocate(
+ IN gckOS Os,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Memory
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p Bytes=0x%zx", Os, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Memory != gcvNULL);
+
+ gcmkONERROR(gckOS_AllocateMemory(Os, Bytes, Memory));
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER_ARG("*Memory=%p", gcmOPT_POINTER(Memory));
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_Free
+**
+** Free allocated memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Memory
+** Pointer to memory allocation to free.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_Free(
+ IN gckOS Os,
+ IN gctPOINTER Memory
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p Memory=%p", Os, Memory);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Memory != gcvNULL);
+
+ gcmkONERROR(gckOS_FreeMemory(Os, Memory));
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_AllocateMemory
+**
+** Allocate memory wrapper.
+**
+** INPUT:
+**
+** gctSIZE_T Bytes
+** Number of bytes to allocate.
+**
+** OUTPUT:
+**
+** gctPOINTER * Memory
+** Pointer to a variable that will hold the allocated memory location.
+*/
+gceSTATUS
+gckOS_AllocateMemory(
+ IN gckOS Os,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Memory
+ )
+{
+ gctPOINTER memory = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p Bytes=0x%zx", Os, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Memory != gcvNULL);
+
+ if (Bytes > PAGE_SIZE)
+ {
+ memory = (gctPOINTER) vmalloc(Bytes);
+ }
+ else
+ {
+ memory = (gctPOINTER) kmalloc(Bytes, GFP_KERNEL | gcdNOWARN);
+ }
+
+ if (memory == gcvNULL)
+ {
+ /* Out of memory. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Increase count. */
+ atomic_inc(&Os->allocateCount);
+
+ /* Return pointer to the memory allocation. */
+ *Memory = memory;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER_ARG("*Memory=%p", gcmOPT_POINTER(Memory));
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_FreeMemory
+**
+** Free allocated memory wrapper.
+**
+** INPUT:
+**
+** gctPOINTER Memory
+** Pointer to memory allocation to free.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_FreeMemory(
+ IN gckOS Os,
+ IN gctPOINTER Memory
+ )
+{
+ gcmkHEADER_ARG("Os=%p Memory=%p", Os, Memory);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(Memory != gcvNULL);
+
+ /* Free the memory from the OS pool. */
+ if (is_vmalloc_addr(Memory))
+ {
+ vfree(Memory);
+ }
+ else
+ {
+ kfree(Memory);
+ }
+
+ /* Decrease count. */
+ atomic_dec(&Os->allocateCount);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_MapMemory
+**
+** Map physical memory into the current process.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPHYS_ADDR Physical
+** Start of physical address memory.
+**
+** gctSIZE_T Bytes
+** Number of bytes to map.
+**
+** OUTPUT:
+**
+** gctPOINTER * Memory
+** Pointer to a variable that will hold the logical address of the
+** mapped memory.
+*/
+gceSTATUS
+gckOS_MapMemory(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Logical
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ PLINUX_MDL_MAP mdlMap;
+ PLINUX_MDL mdl = (PLINUX_MDL) Physical;
+ gckALLOCATOR allocator;
+ gctINT pid = _GetProcessID();
+
+ gcmkHEADER_ARG("Os=%p Physical=%p Bytes=0x%zx", Os, Physical, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Physical != 0);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+
+ mutex_lock(&mdl->mapsMutex);
+
+ mdlMap = FindMdlMap(mdl, pid);
+
+ if (mdlMap == gcvNULL)
+ {
+ mdlMap = _CreateMdlMap(mdl, pid);
+ if (mdlMap == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ }
+
+ if (mdlMap->vmaAddr == gcvNULL)
+ {
+ allocator = mdl->allocator;
+
+ gcmkONERROR(gcmALLOCATOR_MapUser(allocator, mdl, mdlMap, gcvFALSE));
+ }
+
+ mutex_unlock(&mdl->mapsMutex);
+
+ *Logical = mdlMap->vmaAddr;
+ gcmkFOOTER_ARG("*Logical=%p", Logical);
+ return gcvSTATUS_OK;
+
+OnError:
+ mutex_unlock(&mdl->mapsMutex);
+
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_UnmapMemory
+**
+** Unmap physical memory out of the current process.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPHYS_ADDR Physical
+** Start of physical address memory.
+**
+** gctSIZE_T Bytes
+** Number of bytes to unmap.
+**
+** gctPOINTER Memory
+** Pointer to a previously mapped memory region.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_UnmapMemory(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical
+ )
+{
+ gcmkHEADER_ARG("Os=%p Physical=0%p Bytes=0x%zx Logical=%p",
+ Os, Physical, Bytes, Logical);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Physical != 0);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+
+ gckOS_UnmapMemoryEx(Os, Physical, Bytes, Logical, _GetProcessID());
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+
+/*******************************************************************************
+**
+** gckOS_UnmapMemoryEx
+**
+** Unmap physical memory in the specified process.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPHYS_ADDR Physical
+** Start of physical address memory.
+**
+** gctSIZE_T Bytes
+** Number of bytes to unmap.
+**
+** gctPOINTER Memory
+** Pointer to a previously mapped memory region.
+**
+** gctUINT32 PID
+** Pid of the process that opened the device and mapped this memory.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_UnmapMemoryEx(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical,
+ IN gctUINT32 PID
+ )
+{
+ PLINUX_MDL_MAP mdlMap;
+ PLINUX_MDL mdl = (PLINUX_MDL)Physical;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p Physical=%p Bytes=0x%zx Logical=%p PID=%d",
+ Os, Physical, Bytes, Logical, PID);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Physical != 0);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(PID != 0);
+
+ if (Logical)
+ {
+ gckALLOCATOR allocator = mdl->allocator;
+
+ mutex_lock(&mdl->mapsMutex);
+
+ mdlMap = FindMdlMap(mdl, PID);
+
+ if (mdlMap == gcvNULL)
+ {
+ mutex_unlock(&mdl->mapsMutex);
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (mdlMap->vmaAddr != gcvNULL)
+ {
+ BUG_ON(!allocator || !allocator->ops->UnmapUser);
+ gcmALLOCATOR_UnmapUser(allocator, mdl, mdlMap, mdl->bytes);
+ }
+
+ gcmkVERIFY_OK(_DestroyMdlMap(mdl, mdlMap));
+
+ mutex_unlock(&mdl->mapsMutex);
+ }
+
+OnError:
+ gcmkFOOTER_NO();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_AllocateNonPagedMemory
+**
+** Allocate a number of pages from non-paged memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctBOOL InUserSpace
+** gcvTRUE if the pages need to be mapped into user space.
+**
+** gctUINT32 Flag
+** Allocation attribute.
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that holds the number of bytes to allocate.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that hold the number of bytes allocated.
+**
+** gctPHYS_ADDR * Physical
+** Pointer to a variable that will hold the physical address of the
+** allocation.
+**
+** gctPOINTER * Logical
+** Pointer to a variable that will hold the logical address of the
+** allocation.
+*/
+gceSTATUS
+gckOS_AllocateNonPagedMemory(
+ IN gckOS Os,
+ IN gctBOOL InUserSpace,
+ IN gctUINT32 Flag,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gctPHYS_ADDR * Physical,
+ OUT gctPOINTER * Logical
+ )
+{
+ gctSIZE_T bytes;
+ gctSIZE_T numPages;
+ PLINUX_MDL mdl = gcvNULL;
+ PLINUX_MDL_MAP mdlMap = gcvNULL;
+ gctPOINTER addr;
+ gceSTATUS status = gcvSTATUS_NOT_SUPPORTED;
+ gckALLOCATOR allocator;
+
+ gcmkHEADER_ARG("Os=%p InUserSpace=%d *Bytes=0x%zx",
+ Os, InUserSpace, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Bytes != gcvNULL);
+ gcmkVERIFY_ARGUMENT(*Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+
+ /* Align number of bytes to page size. */
+ bytes = gcmALIGN(*Bytes, PAGE_SIZE);
+
+ /* Get total number of pages.. */
+ numPages = GetPageCount(bytes, 0);
+
+ /* Allocate mdl structure */
+ mdl = _CreateMdl(Os);
+ if (mdl == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ gcmkASSERT(Flag & gcvALLOC_FLAG_CONTIGUOUS);
+
+#if gcdENABLE_CACHEABLE_COMMAND_BUFFER
+ Flag &= ~gcvALLOC_FLAG_CACHEABLE;
+#endif
+
+#if LINUX_CMA_FSL
+ Flag |= gcvALLOC_FLAG_CMA_PREEMPT;
+#else
+ Flag |= gcvALLOC_FLAG_4GB_ADDR | gcvALLOC_FLAG_CONTIGUOUS;
+#endif
+
+ /* Walk all allocators. */
+ list_for_each_entry(allocator, &Os->allocatorList, link)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d) flag = %x allocator->capability = %x",
+ __FUNCTION__, __LINE__, Flag, allocator->capability);
+
+#ifndef NO_DMA_COHERENT
+ /* Point to dma coherent allocator. */
+ if (!strcmp(allocator->name, "dma") ||
+ ((Flag & allocator->capability) == Flag && numPages == 1))
+ {
+ status = gcmALLOCATOR_Alloc(allocator, mdl, numPages, Flag);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ mdl->allocator = allocator;
+ break;
+ }
+ }
+#else
+ if ((Flag & allocator->capability) == Flag)
+ {
+ status = gcmALLOCATOR_Alloc(allocator, mdl, numPages, Flag);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ mdl->allocator = allocator;
+ break;
+ }
+ }
+#endif
+ }
+
+ /* Check status. */
+ gcmkONERROR(status);
+
+ mdl->cacheable = Flag & gcvALLOC_FLAG_CACHEABLE;
+
+ mdl->bytes = bytes;
+ mdl->numPages = numPages;
+
+ mdl->contiguous = gcvTRUE;
+
+ gcmkONERROR(gcmALLOCATOR_MapKernel(allocator, mdl, 0, bytes, &addr));
+
+ if (!strcmp(allocator->name, "gfp"))
+ {
+ /* Trigger a page fault. */
+ memset(addr, 0, numPages * PAGE_SIZE);
+ }
+
+ mdl->addr = addr;
+
+ if (InUserSpace)
+ {
+ mdlMap = _CreateMdlMap(mdl, _GetProcessID());
+
+ if (mdlMap == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ gcmkONERROR(gcmALLOCATOR_MapUser(allocator, mdl, mdlMap, gcvFALSE));
+
+ *Logical = mdlMap->vmaAddr;
+ }
+ else
+ {
+ *Logical = addr;
+ }
+
+ /*
+ * 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. */
+ *Bytes = bytes;
+ *Physical = (gctPHYS_ADDR) mdl;
+
+ /* Success. */
+ status = gcvSTATUS_OK;
+
+OnError:
+ if (gcmIS_ERROR(status))
+ {
+ if (mdlMap)
+ {
+ /* Free LINUX_MDL_MAP. */
+ gcmkVERIFY_OK(_DestroyMdlMap(mdl, mdlMap));
+ }
+
+ if (mdl)
+ {
+ /* Free LINUX_MDL. */
+ gcmkVERIFY_OK(_DestroyMdl(mdl));
+ }
+ }
+ /* Return the status. */
+ gcmkFOOTER_ARG("*Bytes=0x%zx *Physical=%p *Logical=%p",
+ gcmOPT_VALUE(Bytes), gcmOPT_POINTER(Physical), gcmOPT_POINTER(Logical));
+ return status;
+}
+
+
+/*******************************************************************************
+**
+** gckOS_FreeNonPagedMemory
+**
+** Free previously allocated and mapped pages from non-paged memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPHYS_ADDR Physical
+** Physical address of the allocated memory.
+**
+** gctPOINTER Logical
+** Logical address of the allocated memory.
+**
+** gctSIZE_T Bytes
+** Number of bytes allocated.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS gckOS_FreeNonPagedMemory(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ )
+{
+ PLINUX_MDL mdl = (PLINUX_MDL)Physical;
+
+ gcmkHEADER_ARG("Os=%p Bytes=0x%zx Physical=%p Logical=%p",
+ Os, Bytes, Physical, Logical);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Physical != 0);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+
+ gcmkVERIFY_OK(_DestroyMdl(mdl));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+static inline gckALLOCATOR
+_FindAllocator(
+ gckOS Os,
+ gctUINT Flag
+ )
+{
+ gckALLOCATOR allocator;
+
+ list_for_each_entry(allocator, &Os->allocatorList, link)
+ {
+ if ((allocator->capability & Flag) == Flag)
+ {
+ return allocator;
+ }
+ }
+
+ return gcvNULL;
+}
+
+gceSTATUS
+gckOS_RequestReservedMemory(
+ gckOS Os,
+ gctPHYS_ADDR_T Start,
+ gctSIZE_T Size,
+ const char * Name,
+ gctBOOL Requested,
+ gctPOINTER * MemoryHandle
+ )
+{
+ PLINUX_MDL mdl = gcvNULL;
+ gceSTATUS status;
+ gckALLOCATOR allocator;
+ gcsATTACH_DESC desc;
+
+ gcmkHEADER_ARG("start=0x%lx size=0x%lx name=%s", Start, Size, Name);
+
+ /* Round up to page size. */
+ Size = (Size + ~PAGE_MASK) & PAGE_MASK;
+
+ mdl = _CreateMdl(Os);
+ if (!mdl)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ desc.reservedMem.start = Start;
+ desc.reservedMem.size = Size;
+ desc.reservedMem.name = Name;
+ desc.reservedMem.requested = Requested;
+
+ allocator = _FindAllocator(Os, gcvALLOC_FLAG_LINUX_RESERVED_MEM);
+ if (!allocator)
+ {
+ gcmkPRINT("reserved-mem allocator not integrated!");
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ /* Call attach. */
+ gcmkONERROR(gcmALLOCATOR_Attach(allocator, &desc, mdl));
+
+ /* Assign alloator. */
+ mdl->allocator = allocator;
+ mdl->bytes = Size;
+ mdl->numPages = Size >> PAGE_SHIFT;
+ mdl->contiguous = gcvTRUE;
+ mdl->addr = gcvNULL;
+ mdl->dmaHandle = Start;
+ mdl->gid = 0;
+
+ /*
+ * 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;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ if (mdl)
+ {
+ gcmkVERIFY_OK(_DestroyMdl(mdl));
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+void
+gckOS_ReleaseReservedMemory(
+ gckOS Os,
+ gctPOINTER MemoryHandle
+ )
+{
+ PLINUX_MDL mdl = (PLINUX_MDL)MemoryHandle;
+
+ if (mdl)
+ {
+ gcmkVERIFY_OK(_DestroyMdl(mdl));
+ }
+}
+
+/*******************************************************************************
+**
+** gckOS_ReadRegister
+**
+** Read data from a register.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctUINT32 Address
+** Address of register.
+**
+** OUTPUT:
+**
+** gctUINT32 * Data
+** Pointer to a variable that receives the data read from the register.
+*/
+gceSTATUS
+gckOS_ReadRegister(
+ IN gckOS Os,
+ IN gctUINT32 Address,
+ OUT gctUINT32 * Data
+ )
+{
+ return gckOS_ReadRegisterEx(Os, gcvCORE_MAJOR, Address, Data);
+}
+
+gceSTATUS
+gckOS_ReadRegisterEx(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT32 Address,
+ OUT gctUINT32 * Data
+ )
+{
+ if (Address > Os->device->registerSizes[Core] - 1)
+ {
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ if (in_irq())
+ {
+ uint32_t data;
+
+ spin_lock(&Os->registerAccessLock);
+
+ if (unlikely(Os->clockStates[Core] == gcvFALSE))
+ {
+ spin_unlock(&Os->registerAccessLock);
+
+ /*
+ * Read register when external clock off:
+ * 1. In shared IRQ, read register may be called and that's not our irq.
+ */
+ return gcvSTATUS_GENERIC_IO;
+ }
+
+ data = readl(Os->device->registerBases[Core]);
+
+ if (unlikely((data & 0x3) == 0x3))
+ {
+ spin_unlock(&Os->registerAccessLock);
+
+ /*
+ * Read register when internal clock off:
+ * a. In shared IRQ, read register may be called and that's not our irq.
+ * b. In some condition, when ISR handled normal FE/PE, PM thread could
+ * trun off internal clock before ISR read register of async FE. And
+ * then IRQ handler will call read register with internal clock off.
+ * So here we just skip for such case.
+ */
+ return gcvSTATUS_GENERIC_IO;
+ }
+
+ *Data = readl((gctUINT8 *)Os->device->registerBases[Core] + Address);
+ spin_unlock(&Os->registerAccessLock);
+ }
+ else
+ {
+ unsigned long flags;
+
+ spin_lock_irqsave(&Os->registerAccessLock, flags);
+
+ if (unlikely(Os->clockStates[Core] == gcvFALSE))
+ {
+ spin_unlock_irqrestore(&Os->registerAccessLock, flags);
+
+ /*
+ * Read register when external clock off:
+ * 2. In non-irq context, register access should not be called,
+ * otherwise it's driver bug.
+ */
+ printk(KERN_ERR "[galcore]: %s(%d) GPU[%d] external clock off",
+ __func__, __LINE__, Core);
+ gcmkBUG_ON(1);
+ return gcvSTATUS_GENERIC_IO;
+ }
+
+ *Data = readl((gctUINT8 *)Os->device->registerBases[Core] + Address);
+ spin_unlock_irqrestore(&Os->registerAccessLock, flags);
+
+#if gcdDUMP_AHB_ACCESS
+ /* Dangerous to print in interrupt context, skip. */
+ gcmkPRINT("@[RD %d] %08x %08x", Core, Address, *Data);
+#endif
+ }
+
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_WriteRegisterEx(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT32 Address,
+ IN gctUINT32 Data,
+ IN gctBOOL Dump
+ )
+{
+ if (Address > Os->device->registerSizes[Core] - 1)
+ {
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ if (in_irq())
+ {
+ spin_lock(&Os->registerAccessLock);
+
+ if (unlikely(Os->clockStates[Core] == gcvFALSE))
+ {
+ spin_unlock(&Os->registerAccessLock);
+
+ printk(KERN_ERR "[galcore]: %s(%d) GPU[%d] external clock off",
+ __func__, __LINE__, Core);
+
+ /* Driver bug: register write when clock off. */
+ gcmkBUG_ON(1);
+ return gcvSTATUS_GENERIC_IO;
+ }
+
+ writel(Data, (gctUINT8 *)Os->device->registerBases[Core] + Address);
+ spin_unlock(&Os->registerAccessLock);
+ }
+ else
+ {
+ unsigned long flags;
+
+ if (Dump)
+ {
+ gcmkDUMP(Os, "@[register.write %u 0x%05X 0x%08X]", Core, Address, Data);
+ }
+
+ spin_lock_irqsave(&Os->registerAccessLock, flags);
+
+ if (unlikely(Os->clockStates[Core] == gcvFALSE))
+ {
+ spin_unlock_irqrestore(&Os->registerAccessLock, flags);
+
+ printk(KERN_ERR "[galcore]: %s(%d) GPU[%d] external clock off",
+ __func__, __LINE__, Core);
+
+ /* Driver bug: register write when clock off. */
+ gcmkBUG_ON(1);
+ return gcvSTATUS_GENERIC_IO;
+ }
+
+ writel(Data, (gctUINT8 *)Os->device->registerBases[Core] + Address);
+ spin_unlock_irqrestore(&Os->registerAccessLock, flags);
+
+#if gcdDUMP_AHB_ACCESS
+ /* Dangerous to print in interrupt context, skip. */
+ gcmkPRINT("@[WR %d] %08x %08x", Core, Address, Data);
+#endif
+ }
+
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_WriteRegister
+**
+** Write data to a register.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctUINT32 Address
+** Address of register.
+**
+** gctUINT32 Data
+** Data for register.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_WriteRegister(
+ IN gckOS Os,
+ IN gctUINT32 Address,
+ IN gctUINT32 Data
+ )
+{
+ return _WriteRegisterEx(Os, gcvCORE_MAJOR, Address, Data, gcvTRUE);
+}
+
+gceSTATUS
+gckOS_WriteRegisterEx(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT32 Address,
+ IN gctUINT32 Data
+ )
+{
+ return _WriteRegisterEx(Os, Core, Address, Data, gcvTRUE);
+}
+
+gceSTATUS
+gckOS_WriteRegisterEx_NoDump(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT32 Address,
+ IN gctUINT32 Data
+ )
+{
+ return _WriteRegisterEx(Os, Core, Address, Data, gcvFALSE);
+}
+
+/*******************************************************************************
+**
+** gckOS_GetPageSize
+**
+** Get the system's page size.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** OUTPUT:
+**
+** gctSIZE_T * PageSize
+** Pointer to a variable that will receive the system's page size.
+*/
+gceSTATUS gckOS_GetPageSize(
+ IN gckOS Os,
+ OUT gctSIZE_T * PageSize
+ )
+{
+ gcmkHEADER_ARG("Os=%p", Os);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(PageSize != gcvNULL);
+
+ /* Return the page size. */
+ *PageSize = (gctSIZE_T) PAGE_SIZE;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*PageSize=0x%zx", *PageSize);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** _GetPhysicalAddressProcess
+**
+** Get the physical system address of a corresponding virtual address for a
+** given process.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to gckOS object.
+**
+** gctPOINTER Logical
+** Logical address.
+**
+** gctUINT32 ProcessID
+** Process ID.
+**
+** OUTPUT:
+**
+** gctUINT32 * Address
+** Poinetr to a variable that receives the 32-bit physical adress.
+*/
+static gceSTATUS
+_GetPhysicalAddressProcess(
+ IN gckOS Os,
+ IN gctPOINTER Logical,
+ IN gctUINT32 ProcessID,
+ OUT gctPHYS_ADDR_T * Address
+ )
+{
+ PLINUX_MDL mdl;
+ gceSTATUS status = gcvSTATUS_INVALID_ADDRESS;
+
+ gcmkHEADER_ARG("Os=%p Logical=%p ProcessID=%d", Os, Logical, ProcessID);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Address != gcvNULL);
+
+ mutex_lock(&Os->mdlMutex);
+
+ if (Os->device->contiguousPhysical)
+ {
+ /* Try the contiguous memory pool. */
+ mdl = (PLINUX_MDL) Os->device->contiguousPhysical;
+
+ mutex_lock(&mdl->mapsMutex);
+
+ status = _ConvertLogical2Physical(Os, Logical, ProcessID, mdl, Address);
+
+ mutex_unlock(&mdl->mapsMutex);
+ }
+
+ if (gcmIS_ERROR(status))
+ {
+ /* Walk all MDLs. */
+ list_for_each_entry(mdl, &Os->mdlHead, link)
+ {
+ mutex_lock(&mdl->mapsMutex);
+
+ status = _ConvertLogical2Physical(Os, Logical, ProcessID, mdl, Address);
+
+ mutex_unlock(&mdl->mapsMutex);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ break;
+ }
+ }
+ }
+
+ mutex_unlock(&Os->mdlMutex);
+
+ gcmkONERROR(status);
+ /* Success. */
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER_ARG("*Address=%p", *Address);
+ return status;
+}
+
+
+
+/*******************************************************************************
+**
+** gckOS_GetPhysicalAddress
+**
+** Get the physical system address of a corresponding virtual address.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Logical
+** Logical address.
+**
+** OUTPUT:
+**
+** gctUINT32 * Address
+** Poinetr to a variable that receives the 32-bit physical adress.
+*/
+gceSTATUS
+gckOS_GetPhysicalAddress(
+ IN gckOS Os,
+ IN gctPOINTER Logical,
+ OUT gctPHYS_ADDR_T * Address
+ )
+{
+ gceSTATUS status;
+ gctUINT32 processID;
+
+ gcmkHEADER_ARG("Os=%p Logical=%p", Os, Logical);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Address != gcvNULL);
+
+ /* Query page table of current process first. */
+ status = _QueryProcessPageTable(Logical, Address);
+
+ if (gcmIS_ERROR(status))
+ {
+ /* Get current process ID. */
+ processID = _GetProcessID();
+
+ /* Route through other function. */
+ gcmkONERROR(
+ _GetPhysicalAddressProcess(Os, Logical, processID, Address));
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Address=0x%llx", *Address);
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckOS_GetPhysicalFromHandle(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctUINT32 Offset,
+ OUT gctPHYS_ADDR_T * PhysicalAddress
+ )
+{
+ PLINUX_MDL mdl = (PLINUX_MDL)Physical;
+ gckALLOCATOR allocator = mdl->allocator;
+
+ return gcmALLOCATOR_Physical(allocator, mdl, Offset, PhysicalAddress);
+}
+
+
+/*******************************************************************************
+**
+** gckOS_UserLogicalToPhysical
+**
+** Get the physical system address of a corresponding user virtual address.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Logical
+** Logical address.
+**
+** OUTPUT:
+**
+** gctUINT32 * Address
+** Pointer to a variable that receives the 32-bit physical address.
+*/
+gceSTATUS gckOS_UserLogicalToPhysical(
+ IN gckOS Os,
+ IN gctPOINTER Logical,
+ OUT gctPHYS_ADDR_T * Address
+ )
+{
+ return gckOS_GetPhysicalAddress(Os, Logical, Address);
+}
+
+gceSTATUS
+_ConvertLogical2Physical(
+ IN gckOS Os,
+ IN gctPOINTER Logical,
+ IN gctUINT32 ProcessID,
+ IN PLINUX_MDL Mdl,
+ OUT gctPHYS_ADDR_T * Physical
+ )
+{
+ gckALLOCATOR allocator = Mdl->allocator;
+ gctUINT32 offset;
+ gceSTATUS status = gcvSTATUS_NOT_FOUND;
+ gctINT8_PTR vBase;
+
+ /* TASK_SIZE is userspace - kernelspace virtual memory split. */
+ if ((gctUINTPTR_T)Logical >= TASK_SIZE)
+ {
+ /* Kernel virtual address. */
+ vBase = Mdl->addr;
+ }
+ else
+ {
+ /* User virtual address. */
+ PLINUX_MDL_MAP map;
+
+ map = FindMdlMap(Mdl, (gctINT) ProcessID);
+ vBase = (map == gcvNULL) ? gcvNULL : (gctINT8_PTR) map->vmaAddr;
+ }
+
+ /* Is the given address within that range. */
+ if ((vBase != gcvNULL)
+ && ((gctINT8_PTR) Logical >= vBase)
+ && ((gctINT8_PTR) Logical < vBase + Mdl->bytes)
+ )
+ {
+ offset = (gctINT8_PTR) Logical - vBase;
+
+ gcmALLOCATOR_Physical(allocator, Mdl, offset, Physical);
+
+ status = gcvSTATUS_OK;
+ }
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_MapPhysical
+**
+** Map a physical address into kernel space.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPHYS_ADDR_T Physical
+** Physical address of the memory to map.
+**
+** gctSIZE_T Bytes
+** Number of bytes to map.
+**
+** OUTPUT:
+**
+** gctPOINTER * Logical
+** Pointer to a variable that receives the base address of the mapped
+** memory.
+*/
+gceSTATUS
+gckOS_MapPhysical(
+ IN gckOS Os,
+ IN gctPHYS_ADDR_T Physical,
+ IN gctSIZE_T Bytes,
+ OUT gctPOINTER * Logical
+ )
+{
+ gctPOINTER logical;
+ PLINUX_MDL mdl;
+ gctBOOL found = gcvFALSE;
+ dma_addr_t physical = Physical;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p Physical=0x%llx Bytes=0x%zx", Os, Physical, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+
+ mutex_lock(&Os->mdlMutex);
+
+ /* Go through our mapping to see if we know this physical address already. */
+ list_for_each_entry(mdl, &Os->mdlHead, link)
+ {
+ if (mdl->dmaHandle != 0)
+ {
+ if ((physical >= mdl->dmaHandle)
+ && (physical < mdl->dmaHandle + mdl->bytes)
+ && (mdl->addr != 0)
+ )
+ {
+ *Logical = mdl->addr + (physical - mdl->dmaHandle);
+ found = gcvTRUE;
+ break;
+ }
+ }
+ }
+
+ mutex_unlock(&Os->mdlMutex);
+
+ if (!found)
+ {
+ unsigned long pfn = physical >> PAGE_SHIFT;
+
+ if (pfn_valid(pfn))
+ {
+ gctUINT32 offset = physical & ~PAGE_MASK;
+ struct page ** pages;
+ struct page * page;
+ gctSIZE_T numPages;
+ gctSIZE_T i;
+ pgprot_t pgprot;
+
+ numPages = GetPageCount(PAGE_ALIGN(offset + Bytes), 0);
+
+ pages = kmalloc(sizeof(struct page *) * numPages, GFP_KERNEL | gcdNOWARN);
+ if (!pages)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ page = pfn_to_page(pfn);
+
+ for (i = 0; i < numPages; i++)
+ {
+ pages[i] = nth_page(page, i);
+ }
+
+#if gcdENABLE_BUFFERABLE_VIDEO_MEMORY
+ pgprot = pgprot_writecombine(PAGE_KERNEL);
+#else
+ pgprot = pgprot_noncached(PAGE_KERNEL);
+#endif
+
+ logical = vmap(pages, numPages, 0, pgprot);
+
+ kfree(pages);
+
+ if (logical == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): Failed to vmap",
+ __FUNCTION__, __LINE__
+ );
+
+ /* Out of resources. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ logical += offset;
+ }
+ else
+ {
+ /* Map memory as cached memory. */
+ request_mem_region(physical, Bytes, "MapRegion");
+ logical = (gctPOINTER) ioremap_nocache(physical, Bytes);
+
+ if (logical == gcvNULL)
+ {
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): Failed to ioremap",
+ __FUNCTION__, __LINE__
+ );
+
+ /* Out of resources. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+ }
+
+ /* Return pointer to mapped memory. */
+ *Logical = logical;
+ }
+
+OnError:
+ /* Success. */
+ gcmkFOOTER_ARG("*Logical=%p", *Logical);
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_UnmapPhysical
+**
+** Unmap a previously mapped memory region from kernel memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Logical
+** Pointer to the base address of the memory to unmap.
+**
+** gctSIZE_T Bytes
+** Number of bytes to unmap.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_UnmapPhysical(
+ IN gckOS Os,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ )
+{
+ PLINUX_MDL mdl;
+ gctBOOL found = gcvFALSE;
+
+ gcmkHEADER_ARG("Os=%p Logical=%p Bytes=0x%zx", Os, Logical, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+
+ mutex_lock(&Os->mdlMutex);
+
+ list_for_each_entry(mdl, &Os->mdlHead, link)
+ {
+ if (mdl->addr != gcvNULL)
+ {
+ if ((Logical >= (gctPOINTER)mdl->addr) &&
+ (Logical < (gctPOINTER)((gctSTRING)mdl->addr + mdl->bytes)))
+ {
+ found = gcvTRUE;
+ break;
+ }
+ }
+ }
+
+ mutex_unlock(&Os->mdlMutex);
+
+ if (!found)
+ {
+ /* Unmap the memory. */
+ vunmap((void *)((unsigned long)Logical & PAGE_MASK));
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_DeleteMutex
+**
+** Delete a mutex.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Mutex
+** Pointer to the mute to be deleted.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_DeleteMutex(
+ IN gckOS Os,
+ IN gctPOINTER Mutex
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p Mutex=%p", Os, Mutex);
+
+ /* Validate the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Mutex != gcvNULL);
+
+ /* Destroy the mutex. */
+ mutex_destroy((struct mutex *)Mutex);
+
+ /* Free the mutex structure. */
+ gcmkONERROR(gckOS_Free(Os, Mutex));
+
+OnError:
+ /* Return status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_AcquireMutex
+**
+** Acquire a mutex.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Mutex
+** Pointer to the mutex to be acquired.
+**
+** gctUINT32 Timeout
+** Timeout value specified in milliseconds.
+** Specify the value of gcvINFINITE to keep the thread suspended
+** until the mutex has been acquired.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_AcquireMutex(
+ IN gckOS Os,
+ IN gctPOINTER Mutex,
+ IN gctUINT32 Timeout
+ )
+{
+ gceSTATUS status = gcvSTATUS_TIMEOUT;
+ gcmkHEADER_ARG("Os=%p Mutex=%p Timeout=%u", Os, Mutex, Timeout);
+
+ /* Validate the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Mutex != gcvNULL);
+
+ if (Timeout == gcvINFINITE)
+ {
+ /* Lock the mutex. */
+ mutex_lock(Mutex);
+
+ /* Success. */
+ status = gcvSTATUS_OK;
+ }
+ else
+ {
+ for (;;)
+ {
+ /* Try to acquire the mutex. */
+ if (mutex_trylock(Mutex))
+ {
+ /* Success. */
+ status = gcvSTATUS_OK;
+ break;
+ }
+
+ if (Timeout-- == 0)
+ {
+ break;
+ }
+
+ /* Wait for 1 millisecond. */
+ gcmkVERIFY_OK(gckOS_Delay(Os, 1));
+ }
+ }
+
+ /* Timeout. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_ReleaseMutex
+**
+** Release an acquired mutex.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Mutex
+** Pointer to the mutex to be released.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_ReleaseMutex(
+ IN gckOS Os,
+ IN gctPOINTER Mutex
+ )
+{
+ gcmkHEADER_ARG("Os=%p Mutex=%p", Os, Mutex);
+
+ /* Validate the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Mutex != gcvNULL);
+
+ /* Release the mutex. */
+ mutex_unlock(Mutex);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_AtomicExchange
+**
+** Atomically exchange a pair of 32-bit values.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** IN OUT gctINT32_PTR Target
+** Pointer to the 32-bit value to exchange.
+**
+** IN gctINT32 NewValue
+** Specifies a new value for the 32-bit value pointed to by Target.
+**
+** OUT gctINT32_PTR OldValue
+** The old value of the 32-bit value pointed to by Target.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_AtomicExchange(
+ IN gckOS Os,
+ IN OUT gctUINT32_PTR Target,
+ IN gctUINT32 NewValue,
+ OUT gctUINT32_PTR OldValue
+ )
+{
+ /* Exchange the pair of 32-bit values. */
+ *OldValue = (gctUINT32) atomic_xchg((atomic_t *) Target, (int) NewValue);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_AtomicExchangePtr
+**
+** Atomically exchange a pair of pointers.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** IN OUT gctPOINTER * Target
+** Pointer to the 32-bit value to exchange.
+**
+** IN gctPOINTER NewValue
+** Specifies a new value for the pointer pointed to by Target.
+**
+** OUT gctPOINTER * OldValue
+** The old value of the pointer pointed to by Target.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_AtomicExchangePtr(
+ IN gckOS Os,
+ IN OUT gctPOINTER * Target,
+ IN gctPOINTER NewValue,
+ OUT gctPOINTER * OldValue
+ )
+{
+ /* Exchange the pair of pointers. */
+ *OldValue = (gctPOINTER)(gctUINTPTR_T) atomic_xchg((atomic_t *) Target, (int)(gctUINTPTR_T) NewValue);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_AtomicSetMask
+**
+** Atomically set mask to Atom
+**
+** INPUT:
+** IN OUT gctPOINTER Atom
+** Pointer to the atom to set.
+**
+** IN gctUINT32 Mask
+** Mask to set.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_AtomSetMask(
+ IN gctPOINTER Atom,
+ IN gctUINT32 Mask
+ )
+{
+ gctUINT32 oval, nval;
+
+ do
+ {
+ oval = atomic_read((atomic_t *) Atom);
+ nval = oval | Mask;
+ }
+ while (atomic_cmpxchg((atomic_t *) Atom, oval, nval) != oval);
+
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_AtomClearMask
+**
+** Atomically clear mask from Atom
+**
+** INPUT:
+** IN OUT gctPOINTER Atom
+** Pointer to the atom to clear.
+**
+** IN gctUINT32 Mask
+** Mask to clear.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_AtomClearMask(
+ IN gctPOINTER Atom,
+ IN gctUINT32 Mask
+ )
+{
+ gctUINT32 oval, nval;
+
+ do
+ {
+ oval = atomic_read((atomic_t *) Atom);
+ nval = oval & ~Mask;
+ }
+ while (atomic_cmpxchg((atomic_t *) Atom, oval, nval) != oval);
+
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_AtomConstruct
+**
+** Create an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** OUTPUT:
+**
+** gctPOINTER * Atom
+** Pointer to a variable receiving the constructed atom.
+*/
+gceSTATUS
+gckOS_AtomConstruct(
+ IN gckOS Os,
+ OUT gctPOINTER * Atom
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p", Os);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Atom != gcvNULL);
+
+ /* Allocate the atom. */
+ gcmkONERROR(gckOS_Allocate(Os, gcmSIZEOF(atomic_t), Atom));
+
+ /* Initialize the atom. */
+ atomic_set((atomic_t *) *Atom, 0);
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER_ARG("*Atom=%p", *Atom);
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_AtomDestroy
+**
+** Destroy an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctPOINTER Atom
+** Pointer to the atom to destroy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_AtomDestroy(
+ IN gckOS Os,
+ OUT gctPOINTER Atom
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p Atom=%p", Os, Atom);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Atom != gcvNULL);
+
+ /* Free the atom. */
+ gcmkONERROR(gcmkOS_SAFE_FREE(Os, Atom));
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_AtomGet
+**
+** Get the 32-bit value protected by an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctPOINTER Atom
+** Pointer to the atom.
+**
+** OUTPUT:
+**
+** gctINT32_PTR Value
+** Pointer to a variable the receives the value of the atom.
+*/
+gceSTATUS
+gckOS_AtomGet(
+ IN gckOS Os,
+ IN gctPOINTER Atom,
+ OUT gctINT32_PTR Value
+ )
+{
+ /* Return the current value of atom. */
+ *Value = atomic_read((atomic_t *) Atom);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_AtomSet
+**
+** Set the 32-bit value protected by an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctPOINTER Atom
+** Pointer to the atom.
+**
+** gctINT32 Value
+** The value of the atom.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_AtomSet(
+ IN gckOS Os,
+ IN gctPOINTER Atom,
+ IN gctINT32 Value
+ )
+{
+ /* Set the current value of atom. */
+ atomic_set((atomic_t *) Atom, Value);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_AtomIncrement
+**
+** Atomically increment the 32-bit integer value inside an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctPOINTER Atom
+** Pointer to the atom.
+**
+** OUTPUT:
+**
+** gctINT32_PTR Value
+** Pointer to a variable that receives the original value of the atom.
+*/
+gceSTATUS
+gckOS_AtomIncrement(
+ IN gckOS Os,
+ IN gctPOINTER Atom,
+ OUT gctINT32_PTR Value
+ )
+{
+ *Value = atomic_inc_return((atomic_t *) Atom) - 1;
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_AtomDecrement
+**
+** Atomically decrement the 32-bit integer value inside an atom.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gctPOINTER Atom
+** Pointer to the atom.
+**
+** OUTPUT:
+**
+** gctINT32_PTR Value
+** Pointer to a variable that receives the original value of the atom.
+*/
+gceSTATUS
+gckOS_AtomDecrement(
+ IN gckOS Os,
+ IN gctPOINTER Atom,
+ OUT gctINT32_PTR Value
+ )
+{
+ /* Decrement the atom. */
+ *Value = atomic_dec_return((atomic_t *) Atom) + 1;
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_Delay
+**
+** Delay execution of the current thread for a number of milliseconds.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctUINT32 Delay
+** Delay to sleep, specified in milliseconds.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_Delay(
+ IN gckOS Os,
+ IN gctUINT32 Delay
+ )
+{
+ gcmkHEADER_ARG("Os=%p Delay=%u", Os, Delay);
+
+ if (Delay > 0)
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
+ ktime_t delay = ktime_set((Delay / MSEC_PER_SEC), (Delay % MSEC_PER_SEC) * NSEC_PER_MSEC);
+ __set_current_state(TASK_UNINTERRUPTIBLE);
+ schedule_hrtimeout(&delay, HRTIMER_MODE_REL);
+#else
+ msleep(Delay);
+#endif
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_GetTicks
+**
+** Get the number of milliseconds since the system started.
+**
+** INPUT:
+**
+** OUTPUT:
+**
+** gctUINT32_PTR Time
+** Pointer to a variable to get time.
+**
+*/
+gceSTATUS
+gckOS_GetTicks(
+ OUT gctUINT32_PTR Time
+ )
+{
+ gcmkHEADER();
+
+ *Time = jiffies_to_msecs(jiffies);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_TicksAfter
+**
+** Compare time values got from gckOS_GetTicks.
+**
+** INPUT:
+** gctUINT32 Time1
+** First time value to be compared.
+**
+** gctUINT32 Time2
+** Second time value to be compared.
+**
+** OUTPUT:
+**
+** gctBOOL_PTR IsAfter
+** Pointer to a variable to result.
+**
+*/
+gceSTATUS
+gckOS_TicksAfter(
+ IN gctUINT32 Time1,
+ IN gctUINT32 Time2,
+ OUT gctBOOL_PTR IsAfter
+ )
+{
+ gcmkHEADER();
+
+ *IsAfter = time_after((unsigned long)Time1, (unsigned long)Time2);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_GetTime
+**
+** Get the number of microseconds since the system started.
+**
+** INPUT:
+**
+** OUTPUT:
+**
+** gctUINT64_PTR Time
+** Pointer to a variable to get time.
+**
+*/
+gceSTATUS
+gckOS_GetTime(
+ OUT gctUINT64_PTR Time
+ )
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
+ struct timespec64 tv;
+ gcmkHEADER();
+
+ /* Return the time of day in microseconds. */
+ ktime_get_real_ts64(&tv);
+ *Time = (tv.tv_sec * 1000000ULL) + (tv.tv_nsec / 1000);
+#else
+ struct timeval tv;
+ gcmkHEADER();
+
+ /* Return the time of day in microseconds. */
+ do_gettimeofday(&tv);
+ *Time = (tv.tv_sec * 1000000ULL) + tv.tv_usec;
+#endif
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_MemoryBarrier
+**
+** Make sure the CPU has executed everything up to this point and the data got
+** written to the specified pointer.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Address
+** Address of memory that needs to be barriered.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_MemoryBarrier(
+ IN gckOS Os,
+ IN gctPOINTER Address
+ )
+{
+ _MemoryBarrier();
+
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_AllocatePagedMemory
+**
+** Allocate memory from the paged pool.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctUINT32 Flag
+** Allocation attribute.
+**
+** gctSIZE_T * Bytes
+** Number of bytes to allocate.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Return number of bytes actually allocated.
+**
+** gctUINT32 * Gid
+** Save the global ID for the piece of allocated memory.
+**
+** gctPHYS_ADDR * Physical
+** Pointer to a variable that receives the physical address of the
+** memory allocation.
+*/
+gceSTATUS
+gckOS_AllocatePagedMemory(
+ IN gckOS Os,
+ IN gctUINT32 Flag,
+ IN OUT gctSIZE_T * Bytes,
+ OUT gctUINT32 * Gid,
+ OUT gctPHYS_ADDR * Physical
+ )
+{
+ gctSIZE_T numPages;
+ PLINUX_MDL mdl = gcvNULL;
+ gctSIZE_T bytes;
+ gceSTATUS status = gcvSTATUS_NOT_SUPPORTED;
+ gckALLOCATOR allocator;
+ gctBOOL zoneDMA32 = gcvFALSE;
+
+ gcmkHEADER_ARG("Os=%p Flag=%x *Bytes=0x%zx", Os, Flag, *Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(*Bytes > 0);
+ gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
+
+ bytes = gcmALIGN(*Bytes, PAGE_SIZE);
+
+ numPages = GetPageCount(bytes, 0);
+
+ mdl = _CreateMdl(Os);
+ if (mdl == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+#if defined(CONFIG_ZONE_DMA32)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
+ zoneDMA32 = gcvTRUE;
+#endif
+#endif
+
+ if ((Flag & gcvALLOC_FLAG_4GB_ADDR) && !zoneDMA32)
+ {
+ Flag &= ~gcvALLOC_FLAG_4GB_ADDR;
+ }
+
+#if defined(CONFIG_ZONE_DMA32) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37) \
+ || !defined(LINUX_CMA_FSL) || !LINUX_CMA_FSL
+ /* redirect DMA32 pool for CMA LIMIT request */
+ if (Flag & gcvALLOC_FLAG_CMA_LIMIT)
+ {
+ Flag &= ~gcvALLOC_FLAG_CMA_LIMIT;
+ Flag |= gcvALLOC_FLAG_4GB_ADDR | gcvALLOC_FLAG_CONTIGUOUS;
+ }
+#endif
+
+ if (Os->allocatorLimitMarker && (Flag & gcvALLOC_FLAG_CMA_LIMIT))
+ {
+ Flag &= ~gcvALLOC_FLAG_CACHEABLE;
+ }
+ else
+ {
+ Flag &= ~gcvALLOC_FLAG_CMA_LIMIT;
+ }
+
+ /* Walk all allocators. */
+ list_for_each_entry(allocator, &Os->allocatorList, link)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d) flag = %x allocator->capability = %x",
+ __FUNCTION__, __LINE__, Flag, allocator->capability);
+
+ if ((Flag & allocator->capability) != Flag)
+ {
+ continue;
+ }
+
+ status = gcmALLOCATOR_Alloc(allocator, mdl, numPages, Flag);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ mdl->allocator = allocator;
+ break;
+ }
+ }
+
+ /* Check status. */
+ gcmkONERROR(status);
+
+ mdl->dmaHandle = 0;
+ mdl->addr = 0;
+ mdl->bytes = bytes;
+ mdl->numPages = numPages;
+ mdl->contiguous = Flag & gcvALLOC_FLAG_CONTIGUOUS;
+ mdl->cacheable = Flag & gcvALLOC_FLAG_CACHEABLE;
+
+ /*
+ * 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 bytes. */
+ *Bytes = bytes;
+
+ if (Gid != gcvNULL)
+ {
+ *Gid = mdl->gid;
+ }
+
+ /* Return physical address. */
+ *Physical = (gctPHYS_ADDR) mdl;
+
+ /* Success. */
+ status = gcvSTATUS_OK;
+
+OnError:
+ if (gcmIS_ERROR(status) && mdl)
+ {
+ /* Free the memory. */
+ _DestroyMdl(mdl);
+ }
+
+ /* Return the status. */
+ gcmkFOOTER_ARG("*Physical=%p", *Physical);
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_FreePagedMemory
+**
+** Free memory allocated from the paged pool.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPHYS_ADDR Physical
+** Physical address of the allocation.
+**
+** gctSIZE_T Bytes
+** Number of bytes of the allocation.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_FreePagedMemory(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes
+ )
+{
+ PLINUX_MDL mdl = (PLINUX_MDL)Physical;
+
+ gcmkHEADER_ARG("Os=%p Physical=%p Bytes=0x%zx", Os, Physical, Bytes);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+
+ /* Free the structure... */
+ gcmkVERIFY_OK(_DestroyMdl(mdl));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_LockPages
+**
+** Lock memory allocated from the paged pool.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPHYS_ADDR Physical
+** Physical address of the allocation.
+**
+** gctSIZE_T Bytes
+** Number of bytes of the allocation.
+**
+** gctBOOL Cacheable
+** Cache mode of mapping.
+**
+** OUTPUT:
+**
+** gctPOINTER * Logical
+** Pointer to a variable that receives the address of the mapped
+** memory.
+*/
+gceSTATUS
+gckOS_LockPages(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctBOOL Cacheable,
+ OUT gctPOINTER * Logical
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ PLINUX_MDL mdl;
+ PLINUX_MDL_MAP mdlMap;
+ gckALLOCATOR allocator;
+
+ gcmkHEADER_ARG("Os=%p Physical=%p Bytes=0x%zx", Os, Physical, Logical);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+
+ mdl = (PLINUX_MDL)Physical;
+ allocator = mdl->allocator;
+
+ mutex_lock(&mdl->mapsMutex);
+
+ mdlMap = FindMdlMap(mdl, _GetProcessID());
+
+ if (mdlMap == gcvNULL)
+ {
+ mdlMap = _CreateMdlMap(mdl, _GetProcessID());
+
+ if (mdlMap == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+ }
+
+ if (mdlMap->vmaAddr == gcvNULL)
+ {
+ gcmkONERROR(gcmALLOCATOR_MapUser(allocator, mdl, mdlMap, Cacheable));
+ }
+
+ mdlMap->count++;
+
+ /* Convert pointer to MDL. */
+ *Logical = mdlMap->vmaAddr;
+
+OnError:
+ mutex_unlock(&mdl->mapsMutex);
+ /* Success. */
+ gcmkFOOTER_ARG("*Logical=%p", *Logical);
+ return status;
+}
+
+/* PageCount is GPU page count. */
+gceSTATUS
+gckOS_MapPagesEx(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T PageCount,
+ IN gctUINT32 Address,
+ IN gctPOINTER PageTable,
+ IN gctBOOL Writable,
+ IN gceVIDMEM_TYPE Type
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ PLINUX_MDL mdl;
+ gctUINT32* table;
+ gctUINT32 offset = 0;
+
+ gctUINT32 bytes = PageCount * 4;
+ gckALLOCATOR allocator;
+
+ gctUINT32 policyID = 0;
+ gctUINT32 axiConfig = 0;
+
+ gcsPLATFORM * platform = Os->device->platform;
+
+ gcmkHEADER_ARG("Os=%p Core=%d Physical=%p PageCount=0x%zx Address=0x%x PageTable=%p",
+ Os, Core, Physical, PageCount, Address, PageTable);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(PageCount > 0);
+ gcmkVERIFY_ARGUMENT(PageTable != gcvNULL);
+
+ /* Convert pointer to MDL. */
+ mdl = (PLINUX_MDL)Physical;
+
+ allocator = mdl->allocator;
+
+ gcmkASSERT(allocator != gcvNULL);
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): Physical->0x%X PageCount->0x%X",
+ __FUNCTION__, __LINE__,
+ (gctUINT32)(gctUINTPTR_T)Physical,
+ (gctUINT32)(gctUINTPTR_T)PageCount
+ );
+
+ table = (gctUINT32 *)PageTable;
+
+ if (platform && platform->ops->getPolicyID)
+ {
+ platform->ops->getPolicyID(platform, Type, &policyID, &axiConfig);
+
+ gcmkBUG_ON(policyID > 0x1F);
+
+ /* ID[3:0] is used in STLB. */
+ policyID &= 0xF;
+ }
+
+ /* Get all the physical addresses and store them in the page table. */
+
+ PageCount = PageCount / (PAGE_SIZE / 4096);
+
+ /* Try to get the user pages so DMA can happen. */
+ while (PageCount-- > 0)
+ {
+ gctUINT i;
+ gctPHYS_ADDR_T phys = ~0U;
+
+ gcmALLOCATOR_Physical(allocator, mdl, offset, &phys);
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Os, phys, &phys));
+
+ if (policyID)
+ {
+ /* AxUSER must not used for address currently. */
+ gcmkBUG_ON((phys >> 32) & 0xF);
+
+ /* Merge policyID to AxUSER[7:4].*/
+ phys |= ((gctPHYS_ADDR_T)policyID << 36);
+ }
+
+#ifdef CONFIG_IOMMU_SUPPORT
+ if (Os->iommu)
+ {
+ /* remove LSB. */
+ phys &= PAGE_MASK;
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): Setup mapping in IOMMU %x => %x",
+ __FUNCTION__, __LINE__,
+ Address + offset, phys
+ );
+
+ /* When use IOMMU, GPU use system PAGE_SIZE. */
+ gcmkONERROR(gckIOMMU_Map(
+ Os->iommu, Address + offset, phys, PAGE_SIZE));
+ }
+ else
+#endif
+ {
+ /* remove LSB. */
+ phys &= ~(4096ull - 1);
+
+#if gcdENABLE_VG
+ if (Core == gcvCORE_VG)
+ {
+ for (i = 0; i < (PAGE_SIZE / 4096); i++)
+ {
+ gcmkONERROR(
+ gckVGMMU_SetPage(Os->device->kernels[Core]->vg->mmu,
+ phys + (i * 4096),
+ table++));
+ }
+ }
+ else
+#endif
+ {
+ for (i = 0; i < (PAGE_SIZE / 4096); i++)
+ {
+ gcmkONERROR(
+ gckMMU_SetPage(Os->device->kernels[Core]->mmu,
+ phys + (i * 4096),
+ gcvPAGE_TYPE_4K,
+ Writable,
+ table++));
+ }
+ }
+ }
+
+ offset += PAGE_SIZE;
+ }
+
+#if gcdENABLE_VG
+ if (Core == gcvCORE_VG)
+ {
+ gckVGMMU mmu = Os->device->kernels[gcvCORE_VG]->vg->mmu;
+ gctPHYS_ADDR mmuMdl = mmu->pageTablePhysical;
+
+ offset = (gctUINT8_PTR)PageTable - (gctUINT8_PTR)mmu->pageTableLogical;
+
+ gcmkVERIFY_OK(gckOS_CacheClean(
+ Os,
+ _GetProcessID(),
+ mmuMdl,
+ offset,
+ PageTable,
+ bytes
+ ));
+ }
+ else
+# endif
+ {
+ gckMMU mmu = Os->device->kernels[Core]->mmu;
+ gcsADDRESS_AREA * area = &mmu->dynamicArea4K;
+
+ offset = (gctUINT8_PTR)PageTable - (gctUINT8_PTR)area->stlbLogical;
+
+ /* must be in dynamic area. */
+ gcmkASSERT(offset < area->stlbSize);
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_CleanCache(
+ Os->device->kernels[Core],
+ area->stlbVideoMem,
+ offset,
+ PageTable,
+ bytes
+ ));
+
+ if (mmu->mtlbVideoMem)
+ {
+ /* Flush MTLB table. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_CleanCache(
+ Os->device->kernels[Core],
+ mmu->mtlbVideoMem,
+ offset,
+ mmu->mtlbLogical,
+ mmu->mtlbSize
+ ));
+ }
+ }
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/* PageCount is GPU page count. */
+gceSTATUS
+gckOS_UnmapPages(
+ IN gckOS Os,
+ IN gctSIZE_T PageCount,
+ IN gctUINT32 Address
+ )
+{
+#ifdef CONFIG_IOMMU_SUPPORT
+ if (Os->iommu)
+ {
+ gcmkVERIFY_OK(gckIOMMU_Unmap(
+ Os->iommu, Address, PageCount * 4096));
+ }
+#endif
+
+ return gcvSTATUS_OK;
+}
+
+/* Map 1M size GPU page */
+gceSTATUS
+gckOS_Map1MPages(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T PageCount,
+ IN gctUINT32 Address,
+ IN gctPOINTER PageTable,
+ IN gctBOOL Writable,
+ IN gceVIDMEM_TYPE Type
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ PLINUX_MDL mdl;
+ gctUINT32* table;
+ gctUINT32 offset = 0;
+
+ gctSIZE_T bytes = PageCount * 4;
+ gckALLOCATOR allocator;
+
+ gctUINT32 policyID = 0;
+ gctUINT32 axiConfig = 0;
+
+ gcsPLATFORM * platform = Os->device->platform;
+
+ gcmkHEADER_ARG("Os=%p Core=%d Physical=%p PageCount=0x%zx Address=0x%x PageTable=%p",
+ Os, Core, Physical, PageCount, Address, PageTable);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(PageCount > 0);
+ gcmkVERIFY_ARGUMENT(PageTable != gcvNULL);
+
+ /* Convert pointer to MDL. */
+ mdl = (PLINUX_MDL)Physical;
+
+ allocator = mdl->allocator;
+
+ gcmkASSERT(allocator != gcvNULL);
+
+ gcmkTRACE_ZONE(
+ gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d): Physical->0x%X PageCount->0x%X",
+ __FUNCTION__, __LINE__,
+ (gctUINT32)(gctUINTPTR_T)Physical,
+ (gctUINT32)(gctUINTPTR_T)PageCount
+ );
+
+ table = (gctUINT32 *)PageTable;
+
+ if (platform && platform->ops->getPolicyID)
+ {
+ platform->ops->getPolicyID(platform, Type, &policyID, &axiConfig);
+
+ gcmkBUG_ON(policyID > 0x1F);
+
+ /* ID[3:0] is used in STLB. */
+ policyID &= 0xF;
+ }
+
+ while (PageCount-- > 0)
+ {
+ gctPHYS_ADDR_T phys = ~0U;
+
+ gcmALLOCATOR_Physical(allocator, mdl, offset, &phys);
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Os, phys, &phys));
+
+ if (policyID)
+ {
+ /* AxUSER must not used for address currently. */
+ gcmkBUG_ON((phys >> 32) & 0xF);
+
+ /* Merge policyID to AxUSER[7:4].*/
+ phys |= ((gctPHYS_ADDR_T)policyID << 36);
+ }
+
+ /* Get the start physical of 1M page. */
+ phys &= ~((1 << 20) - 1);
+
+ gcmkONERROR(
+ gckMMU_SetPage(Os->device->kernels[Core]->mmu,
+ phys,
+ gcvPAGE_TYPE_1M,
+ Writable,
+ table++));
+
+ offset += gcd1M_PAGE_SIZE;
+ }
+
+ /* Flush the page table cache. */
+ {
+ gckMMU mmu = Os->device->kernels[Core]->mmu;
+ gcsADDRESS_AREA * area = &mmu->dynamicArea1M;
+
+ offset = (gctUINT8_PTR)PageTable - (gctUINT8_PTR)area->stlbLogical;
+
+ /* must be in dynamic area. */
+ gcmkASSERT(offset < area->stlbSize);
+
+ gcmkVERIFY_OK(gckVIDMEM_NODE_CleanCache(
+ Os->device->kernels[Core],
+ area->stlbVideoMem,
+ offset,
+ PageTable,
+ bytes
+ ));
+
+ if (mmu->mtlbVideoMem)
+ {
+ /* Flush MTLB table. */
+ gcmkVERIFY_OK(gckVIDMEM_NODE_CleanCache(
+ Os->device->kernels[Core],
+ mmu->mtlbVideoMem,
+ offset,
+ mmu->mtlbLogical,
+ mmu->mtlbSize
+ ));
+ }
+ }
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_UnlockPages
+**
+** Unlock memory allocated from the paged pool.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPHYS_ADDR Physical
+** Physical address of the allocation.
+**
+** gctSIZE_T Bytes
+** Number of bytes of the allocation.
+**
+** gctPOINTER Logical
+** Address of the mapped memory.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_UnlockPages(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical
+ )
+{
+ PLINUX_MDL_MAP mdlMap;
+ PLINUX_MDL mdl = (PLINUX_MDL)Physical;
+ gckALLOCATOR allocator = mdl->allocator;
+ gctINT pid = _GetProcessID();
+
+ gcmkHEADER_ARG("Os=%p Physical=%p Bytes=0x%zx Logical=%p",
+ Os, Physical, Bytes, Logical);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Logical != gcvNULL);
+
+ mutex_lock(&mdl->mapsMutex);
+
+ list_for_each_entry(mdlMap, &mdl->mapsHead, link)
+ {
+ if ((mdlMap->vmaAddr != gcvNULL) && (mdlMap->pid == pid))
+ {
+ if (--mdlMap->count == 0)
+ {
+ gcmALLOCATOR_UnmapUser(
+ allocator,
+ mdl,
+ mdlMap,
+ mdl->bytes);
+
+ mdlMap->vmaAddr = gcvNULL;
+ }
+ }
+ }
+
+ mutex_unlock(&mdl->mapsMutex);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_MapUserPointer
+**
+** Map a pointer from the user process into the kernel address space.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Pointer
+** Pointer in user process space that needs to be mapped.
+**
+** gctSIZE_T Size
+** Number of bytes that need to be mapped.
+**
+** OUTPUT:
+**
+** gctPOINTER * KernelPointer
+** Pointer to a variable receiving the mapped pointer in kernel address
+** space.
+*/
+gceSTATUS
+gckOS_MapUserPointer(
+ IN gckOS Os,
+ IN gctPOINTER Pointer,
+ IN gctSIZE_T Size,
+ OUT gctPOINTER * KernelPointer
+ )
+{
+ gcmkHEADER_ARG("Os=%p Pointer=%p Size=0x%zx", Os, Pointer, Size);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Pointer != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Size > 0);
+ gcmkVERIFY_ARGUMENT(KernelPointer != gcvNULL);
+
+ *KernelPointer = Pointer;
+
+ gcmkFOOTER_ARG("*KernelPointer=%p", *KernelPointer);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_UnmapUserPointer
+**
+** Unmap a user process pointer from the kernel address space.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Pointer
+** Pointer in user process space that needs to be unmapped.
+**
+** gctSIZE_T Size
+** Number of bytes that need to be unmapped.
+**
+** gctPOINTER KernelPointer
+** Pointer in kernel address space that needs to be unmapped.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_UnmapUserPointer(
+ IN gckOS Os,
+ IN gctPOINTER Pointer,
+ IN gctSIZE_T Size,
+ IN gctPOINTER KernelPointer
+ )
+{
+ gcmkHEADER_ARG("Os=%p Pointer=%p Size=0x%zx KernelPointer=%p",
+ Os, Pointer, Size, KernelPointer);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_QueryNeedCopy
+**
+** Query whether the memory can be accessed or mapped directly or it has to be
+** copied.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctUINT32 ProcessID
+** Process ID of the current process.
+**
+** OUTPUT:
+**
+** gctBOOL_PTR NeedCopy
+** Pointer to a boolean receiving gcvTRUE if the memory needs a copy or
+** gcvFALSE if the memory can be accessed or mapped dircetly.
+*/
+gceSTATUS
+gckOS_QueryNeedCopy(
+ IN gckOS Os,
+ IN gctUINT32 ProcessID,
+ OUT gctBOOL_PTR NeedCopy
+ )
+{
+ gcmkHEADER_ARG("Os=%p ProcessID=%d", Os, ProcessID);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(NeedCopy != gcvNULL);
+
+ /* We need to copy data. */
+ *NeedCopy = gcvTRUE;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*NeedCopy=%d", *NeedCopy);
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_CopyFromUserData
+**
+** Copy data from user to kernel memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER KernelPointer
+** Pointer to kernel memory.
+**
+** gctPOINTER Pointer
+** Pointer to user memory.
+**
+** gctSIZE_T Size
+** Number of bytes to copy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_CopyFromUserData(
+ IN gckOS Os,
+ IN gctPOINTER KernelPointer,
+ IN gctPOINTER Pointer,
+ IN gctSIZE_T Size
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p KernelPointer=%p Pointer=%p Size=0x%zx",
+ Os, KernelPointer, Pointer, Size);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(KernelPointer != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Pointer != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Size > 0);
+
+ /* Copy data from user. */
+ if (copy_from_user(KernelPointer, Pointer, Size) != 0)
+ {
+ /* Could not copy all the bytes. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_CopyToUserData
+**
+** Copy data from kernel to user memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER KernelPointer
+** Pointer to kernel memory.
+**
+** gctPOINTER Pointer
+** Pointer to user memory.
+**
+** gctSIZE_T Size
+** Number of bytes to copy.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_CopyToUserData(
+ IN gckOS Os,
+ IN gctPOINTER KernelPointer,
+ IN gctPOINTER Pointer,
+ IN gctSIZE_T Size
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p KernelPointer=%p Pointer=%p Size=0x%zx",
+ Os, KernelPointer, Pointer, Size);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(KernelPointer != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Pointer != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Size > 0);
+
+ /* Copy data to user. */
+ if (copy_to_user(Pointer, KernelPointer, Size) != 0)
+ {
+ /* Could not copy all the bytes. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_WriteMemory
+**
+** Write data to a memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctPOINTER Address
+** Address of the memory to write to.
+**
+** gctUINT32 Data
+** Data for register.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_WriteMemory(
+ IN gckOS Os,
+ IN gctPOINTER Address,
+ IN gctUINT32 Data
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p Address=%p Data=%u", Os, Address, Data);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(Address != gcvNULL);
+
+ /* Write memory. */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
+ if (access_ok(Address, 4))
+#else
+ if (access_ok(VERIFY_WRITE, Address, 4))
+#endif
+ {
+ /* User address. */
+ if (put_user(Data, (gctUINT32*)Address))
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ADDRESS);
+ }
+ }
+ else if (virt_addr_valid(Address) || is_vmalloc_addr(Address))
+ {
+ /* Kernel address. */
+ *(gctUINT32 *)Address = Data;
+ }
+ else
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ADDRESS);
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckOS_ReadMappedPointer(
+ IN gckOS Os,
+ IN gctPOINTER Address,
+ IN gctUINT32_PTR Data
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcmkHEADER_ARG("Os=%p Address=%p Data=%u", Os, Address, Data);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(Address != gcvNULL);
+
+ /* Write memory. */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
+ if (access_ok(Address, 4))
+#else
+ if (access_ok(VERIFY_READ, Address, 4))
+#endif
+ {
+ /* User address. */
+ if (get_user(*Data, (gctUINT32*)Address))
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ADDRESS);
+ }
+ }
+ else
+ {
+ /* Kernel address. */
+ *Data = *(gctUINT32_PTR)Address;
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_GetBaseAddress
+**
+** Get the base address for the physical memory.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** OUTPUT:
+**
+** gctUINT32_PTR BaseAddress
+** Pointer to a variable that will receive the base address.
+*/
+gceSTATUS
+gckOS_GetBaseAddress(
+ IN gckOS Os,
+ OUT gctUINT32_PTR BaseAddress
+ )
+{
+ gcmkHEADER_ARG("Os=%p", Os);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(BaseAddress != gcvNULL);
+
+ /* Return base address. */
+ *BaseAddress = Os->device->baseAddress;
+
+ /* Success. */
+ gcmkFOOTER_ARG("*BaseAddress=0x%08x", *BaseAddress);
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_SuspendInterrupt(
+ IN gckOS Os
+ )
+{
+ return gckOS_SuspendInterruptEx(Os, gcvCORE_MAJOR);
+}
+
+gceSTATUS
+gckOS_SuspendInterruptEx(
+ IN gckOS Os,
+ IN gceCORE Core
+ )
+{
+ gcmkHEADER_ARG("Os=%p Core=%d", Os, Core);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+
+ disable_irq(Os->device->irqLines[Core]);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_ResumeInterrupt(
+ IN gckOS Os
+ )
+{
+ return gckOS_ResumeInterruptEx(Os, gcvCORE_MAJOR);
+}
+
+gceSTATUS
+gckOS_ResumeInterruptEx(
+ IN gckOS Os,
+ IN gceCORE Core
+ )
+{
+ gcmkHEADER_ARG("Os=%p Core=%d", Os, Core);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+
+ enable_irq(Os->device->irqLines[Core]);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_MemCopy(
+ IN gctPOINTER Destination,
+ IN gctCONST_POINTER Source,
+ IN gctSIZE_T Bytes
+ )
+{
+ gcmkHEADER_ARG("Destination=%p Source=%p Bytes=0x%zx",
+ Destination, Source, Bytes);
+
+ gcmkVERIFY_ARGUMENT(Destination != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Source != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+
+ memcpy(Destination, Source, Bytes);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_ZeroMemory(
+ IN gctPOINTER Memory,
+ IN gctSIZE_T Bytes
+ )
+{
+ gcmkHEADER_ARG("Memory=%p Bytes=0x%zx", Memory, Bytes);
+
+ gcmkVERIFY_ARGUMENT(Memory != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Bytes > 0);
+
+ memset(Memory, 0, Bytes);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+********************************* Cache Control ********************************
+*******************************************************************************/
+static gceSTATUS
+_CacheOperation(
+ IN gckOS Os,
+ IN gctUINT32 ProcessID,
+ IN gctPHYS_ADDR Handle,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes,
+ IN gceCACHEOPERATION Operation
+ )
+{
+ PLINUX_MDL mdl = (PLINUX_MDL)Handle;
+ PLINUX_MDL_MAP mdlMap = gcvNULL;
+ gckALLOCATOR allocator;
+
+ if (!mdl || !mdl->allocator)
+ {
+ gcmkPRINT("[galcore]: %s: Logical=%p no mdl", __FUNCTION__, Logical);
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ allocator = mdl->allocator;
+
+ if (allocator->ops->Cache)
+ {
+ if (ProcessID)
+ {
+ mutex_lock(&mdl->mapsMutex);
+
+ mdlMap = FindMdlMap(mdl, ProcessID);
+
+ mutex_unlock(&mdl->mapsMutex);
+ }
+
+ if (ProcessID && mdlMap == gcvNULL)
+ {
+ return gcvSTATUS_INVALID_ARGUMENT;
+ }
+
+ if ((!ProcessID && mdl->cacheable) ||
+ (mdlMap && mdlMap->cacheable))
+ {
+ gcmALLOCATOR_Cache(allocator,
+ mdl, Offset, Logical, Bytes, Operation);
+
+ return gcvSTATUS_OK;
+ }
+ }
+
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+** gckOS_CacheClean
+**
+** Clean the cache for the specified addresses. The GPU is going to need the
+** data. If the system is allocating memory as non-cachable, this function can
+** be ignored.
+**
+** ARGUMENTS:
+**
+** gckOS Os
+** Pointer to gckOS object.
+**
+** gctUINT32 ProcessID
+** Process ID Logical belongs.
+**
+** gctPHYS_ADDR Handle
+** Physical address handle. If gcvNULL it is video memory.
+**
+** gctSIZE_T Offset
+** Offset to this memory block.
+**
+** gctPOINTER Logical
+** Logical address to flush.
+**
+** gctSIZE_T Bytes
+** Size of the address range in bytes to flush.
+*/
+
+/*
+
+Following patch can be applied to kernel in case cache API is not exported.
+
+diff --git a/arch/arm/mm/proc-syms.c b/arch/arm/mm/proc-syms.c
+index 054b491..e9e74ec 100644
+--- a/arch/arm/mm/proc-syms.c
++++ b/arch/arm/mm/proc-syms.c
+@@ -30,6 +30,9 @@ EXPORT_SYMBOL(__cpuc_flush_user_all);
+ EXPORT_SYMBOL(__cpuc_flush_user_range);
+ EXPORT_SYMBOL(__cpuc_coherent_kern_range);
+ EXPORT_SYMBOL(__cpuc_flush_dcache_area);
++EXPORT_SYMBOL(__glue(_CACHE,_dma_map_area));
++EXPORT_SYMBOL(__glue(_CACHE,_dma_unmap_area));
++EXPORT_SYMBOL(__glue(_CACHE,_dma_flush_range));
+ #else
+ EXPORT_SYMBOL(cpu_cache);
+ #endif
+
+*/
+gceSTATUS
+gckOS_CacheClean(
+ IN gckOS Os,
+ IN gctUINT32 ProcessID,
+ IN gctPHYS_ADDR Handle,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Os=%p ProcessID=%d Handle=%p Offset=0x%llx Logical=%p Bytes=0x%zx",
+ Os, ProcessID, Handle, Offset, Logical, Bytes);
+
+ gcmkONERROR(_CacheOperation(Os, ProcessID,
+ Handle, Offset, Logical, Bytes,
+ gcvCACHE_CLEAN));
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** gckOS_CacheInvalidate
+**
+** Invalidate the cache for the specified addresses. The GPU is going to need
+** data. If the system is allocating memory as non-cachable, this function can
+** be ignored.
+**
+** ARGUMENTS:
+**
+** gckOS Os
+** Pointer to gckOS object.
+**
+** gctUINT32 ProcessID
+** Process ID Logical belongs.
+**
+** gctPHYS_ADDR Handle
+** Physical address handle. If gcvNULL it is video memory.
+**
+** gctPOINTER Logical
+** Logical address to flush.
+**
+** gctSIZE_T Bytes
+** Size of the address range in bytes to flush.
+*/
+gceSTATUS
+gckOS_CacheInvalidate(
+ IN gckOS Os,
+ IN gctUINT32 ProcessID,
+ IN gctPHYS_ADDR Handle,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Os=%p ProcessID=%d Handle=%p Offset=0x%llx Logical=%p Bytes=0x%zx",
+ Os, ProcessID, Handle, Offset, Logical, Bytes);
+
+ gcmkONERROR(_CacheOperation(Os, ProcessID,
+ Handle, Offset, Logical, Bytes,
+ gcvCACHE_INVALIDATE));
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+** gckOS_CacheFlush
+**
+** Clean the cache for the specified addresses and invalidate the lines as
+** well. The GPU is going to need and modify the data. If the system is
+** allocating memory as non-cachable, this function can be ignored.
+**
+** ARGUMENTS:
+**
+** gckOS Os
+** Pointer to gckOS object.
+**
+** gctUINT32 ProcessID
+** Process ID Logical belongs.
+**
+** gctPHYS_ADDR Handle
+** Physical address handle. If gcvNULL it is video memory.
+**
+** gctPOINTER Logical
+** Logical address to flush.
+**
+** gctSIZE_T Bytes
+** Size of the address range in bytes to flush.
+*/
+gceSTATUS
+gckOS_CacheFlush(
+ IN gckOS Os,
+ IN gctUINT32 ProcessID,
+ IN gctPHYS_ADDR Handle,
+ IN gctSIZE_T Offset,
+ IN gctPOINTER Logical,
+ IN gctSIZE_T Bytes
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Os=%p ProcessID=%d Handle=%p Offset=0x%llx Logical=%p Bytes=0x%zx",
+ Os, ProcessID, Handle, Offset, Logical, Bytes);
+
+ gcmkONERROR(_CacheOperation(Os, ProcessID,
+ Handle, Offset, Logical, Bytes,
+ gcvCACHE_FLUSH));
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+********************************* Broadcasting *********************************
+*******************************************************************************/
+
+/*******************************************************************************
+**
+** gckOS_Broadcast
+**
+** System hook for broadcast events from the kernel driver.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object.
+**
+** gceBROADCAST Reason
+** Reason for the broadcast. Can be one of the following values:
+**
+** gcvBROADCAST_GPU_IDLE
+** Broadcasted when the kernel driver thinks the GPU might be
+** idle. This can be used to handle power management.
+**
+** gcvBROADCAST_GPU_COMMIT
+** Broadcasted when any client process commits a command
+** buffer. This can be used to handle power management.
+**
+** gcvBROADCAST_GPU_STUCK
+** Broadcasted when the kernel driver hits the timeout waiting
+** for the GPU.
+**
+** gcvBROADCAST_FIRST_PROCESS
+** First process is trying to connect to the kernel.
+**
+** gcvBROADCAST_LAST_PROCESS
+** Last process has detached from the kernel.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_Broadcast(
+ IN gckOS Os,
+ IN gckHARDWARE Hardware,
+ IN gceBROADCAST Reason
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gceCHIPPOWERSTATE state;
+
+ gcmkHEADER_ARG("Os=%p Hardware=%p Reason=%d", Os, Hardware, Reason);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ switch (Reason)
+ {
+ case gcvBROADCAST_FIRST_PROCESS:
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS, "First process has attached");
+ break;
+
+ case gcvBROADCAST_LAST_PROCESS:
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS, "Last process has detached");
+
+ /* Put GPU OFF. */
+ gcmkONERROR(
+ gckHARDWARE_SetPowerState(Hardware,
+ gcvPOWER_OFF_BROADCAST));
+ break;
+
+ case gcvBROADCAST_GPU_IDLE:
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS, "GPU idle.");
+#if gcdPOWER_SUSPEND_WHEN_IDLE
+ state = gcvPOWER_SUSPEND_BROADCAST;
+#else
+ state = gcvPOWER_IDLE_BROADCAST;
+#endif
+
+ /* Put GPU IDLE or SUSPEND. */
+ gcmkONERROR(
+ gckHARDWARE_SetPowerState(Hardware, state));
+
+ /* Add idle process DB. */
+ gcmkONERROR(gckKERNEL_AddProcessDB(Hardware->kernel,
+ 1,
+ gcvDB_IDLE,
+ gcvNULL, gcvNULL, 0));
+ break;
+
+ case gcvBROADCAST_GPU_COMMIT:
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS, "COMMIT has arrived.");
+
+ /* Add busy process DB. */
+ gcmkONERROR(gckKERNEL_AddProcessDB(Hardware->kernel,
+ 0,
+ gcvDB_IDLE,
+ gcvNULL, gcvNULL, 0));
+
+ /* Put GPU ON. */
+ gcmkONERROR(
+ gckHARDWARE_SetPowerState(Hardware, gcvPOWER_ON_AUTO));
+ break;
+
+ case gcvBROADCAST_GPU_STUCK:
+ gcmkTRACE_N(gcvLEVEL_ERROR, 0, "gcvBROADCAST_GPU_STUCK\n");
+ gcmkONERROR(gckKERNEL_Recovery(Hardware->kernel));
+ break;
+
+ case gcvBROADCAST_AXI_BUS_ERROR:
+ gcmkTRACE_N(gcvLEVEL_ERROR, 0, "gcvBROADCAST_AXI_BUS_ERROR\n");
+ gcmkONERROR(gckHARDWARE_DumpGPUState(Hardware));
+ gcmkONERROR(gckKERNEL_Recovery(Hardware->kernel));
+ break;
+
+ case gcvBROADCAST_OUT_OF_MEMORY:
+ gcmkTRACE_N(gcvLEVEL_INFO, 0, "gcvBROADCAST_OUT_OF_MEMORY\n");
+
+ status = _ShrinkMemory(Os);
+
+ if (status == gcvSTATUS_NOT_SUPPORTED)
+ {
+ goto OnError;
+ }
+
+ gcmkONERROR(status);
+
+ break;
+
+ default:
+ /* Skip unimplemented broadcast. */
+ break;
+ }
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_BroadcastHurry
+**
+** The GPU is running too slow.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object.
+**
+** gctUINT Urgency
+** The higher the number, the higher the urgency to speed up the GPU.
+** The maximum value is defined by the gcdDYNAMIC_EVENT_THRESHOLD.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_BroadcastHurry(
+ IN gckOS Os,
+ IN gckHARDWARE Hardware,
+ IN gctUINT Urgency
+ )
+{
+ gcmkHEADER_ARG("Os=%p Hardware=%p Urgency=%u", Os, Hardware, Urgency);
+
+ /* Do whatever you need to do to speed up the GPU now. */
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_BroadcastCalibrateSpeed
+**
+** Calibrate the speed of the GPU.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gckHARDWARE Hardware
+** Pointer to the gckHARDWARE object.
+**
+** gctUINT Idle, Time
+** Idle/Time will give the percentage the GPU is idle, so you can use
+** this to calibrate the working point of the GPU.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_BroadcastCalibrateSpeed(
+ IN gckOS Os,
+ IN gckHARDWARE Hardware,
+ IN gctUINT Idle,
+ IN gctUINT Time
+ )
+{
+ gcmkHEADER_ARG("Os=%p Hardware=%p Idle=%u Time=%u",
+ Os, Hardware, Idle, Time);
+
+ /* Do whatever you need to do to callibrate the GPU speed. */
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+********************************** Semaphores **********************************
+*******************************************************************************/
+
+/*******************************************************************************
+**
+** gckOS_CreateSemaphore
+**
+** Create a semaphore.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** OUTPUT:
+**
+** gctPOINTER * Semaphore
+** Pointer to the variable that will receive the created semaphore.
+*/
+gceSTATUS
+gckOS_CreateSemaphore(
+ IN gckOS Os,
+ OUT gctPOINTER * Semaphore
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ struct semaphore *sem = gcvNULL;
+
+ gcmkHEADER_ARG("Os=%p", Os);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Semaphore != gcvNULL);
+
+ /* Allocate the semaphore structure. */
+ sem = (struct semaphore *)kmalloc(gcmSIZEOF(struct semaphore), GFP_KERNEL | gcdNOWARN);
+ if (sem == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Initialize the semaphore. */
+ sema_init(sem, 1);
+
+ /* Return to caller. */
+ *Semaphore = (gctPOINTER) sem;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_AcquireSemaphore
+**
+** Acquire a semaphore.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gctPOINTER Semaphore
+** Pointer to the semaphore thet needs to be acquired.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_AcquireSemaphore(
+ IN gckOS Os,
+ IN gctPOINTER Semaphore
+ )
+{
+ gcmkHEADER_ARG("Os=%p Semaphore=%p", Os, Semaphore);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Semaphore != gcvNULL);
+
+ /* Acquire the semaphore. */
+ down((struct semaphore *) Semaphore);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_TryAcquireSemaphore
+**
+** Try to acquire a semaphore.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gctPOINTER Semaphore
+** Pointer to the semaphore thet needs to be acquired.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_TryAcquireSemaphore(
+ IN gckOS Os,
+ IN gctPOINTER Semaphore
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p", Os);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Semaphore != gcvNULL);
+
+ /* Acquire the semaphore. */
+ if (down_trylock((struct semaphore *) Semaphore))
+ {
+ /* Timeout. */
+ status = gcvSTATUS_TIMEOUT;
+ }
+
+ /* Success. */
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_ReleaseSemaphore
+**
+** Release a previously acquired semaphore.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gctPOINTER Semaphore
+** Pointer to the semaphore thet needs to be released.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_ReleaseSemaphore(
+ IN gckOS Os,
+ IN gctPOINTER Semaphore
+ )
+{
+ gcmkHEADER_ARG("Os=%p Semaphore=%p", Os, Semaphore);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Semaphore != gcvNULL);
+
+ /* Release the semaphore. */
+ up((struct semaphore *) Semaphore);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_DestroySemaphore
+**
+** Destroy a semaphore.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gctPOINTER Semaphore
+** Pointer to the semaphore thet needs to be destroyed.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_DestroySemaphore(
+ IN gckOS Os,
+ IN gctPOINTER Semaphore
+ )
+{
+ gcmkHEADER_ARG("Os=%p Semaphore=%p", Os, Semaphore);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Semaphore != gcvNULL);
+
+ /* Free the sempahore structure. */
+ kfree(Semaphore);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_GetProcessID
+**
+** Get current process ID.
+**
+** INPUT:
+**
+** Nothing.
+**
+** OUTPUT:
+**
+** gctUINT32_PTR ProcessID
+** Pointer to the variable that receives the process ID.
+*/
+gceSTATUS
+gckOS_GetProcessID(
+ OUT gctUINT32_PTR ProcessID
+ )
+{
+ /* Get process ID. */
+ *ProcessID = _GetProcessID();
+
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_GetThreadID
+**
+** Get current thread ID.
+**
+** INPUT:
+**
+** Nothing.
+**
+** OUTPUT:
+**
+** gctUINT32_PTR ThreadID
+** Pointer to the variable that receives the thread ID.
+*/
+gceSTATUS
+gckOS_GetThreadID(
+ OUT gctUINT32_PTR ThreadID
+ )
+{
+ /* Get thread ID. */
+ if (ThreadID != gcvNULL)
+ {
+ *ThreadID = _GetThreadID();
+ }
+
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_SetGPUPower
+**
+** Set the power of the GPU on or off.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gceCORE Core
+** GPU whose power is set.
+**
+** gctBOOL Clock
+** gcvTRUE to turn on the clock, or gcvFALSE to turn off the clock.
+**
+** gctBOOL Power
+** gcvTRUE to turn on the power, or gcvFALSE to turn off the power.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_SetGPUPower(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctBOOL Clock,
+ IN gctBOOL Power
+ )
+{
+ gcsPLATFORM * platform;
+
+ gctBOOL powerChange = gcvFALSE;
+ gctBOOL clockChange = gcvFALSE;
+
+ gcmkHEADER_ARG("Os=%p Core=%d Clock=%d Power=%d", Os, Core, Clock, Power);
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+
+ platform = Os->device->platform;
+
+ powerChange = (Power != Os->powerStates[Core]);
+
+ clockChange = (Clock != Os->clockStates[Core]);
+
+ if (powerChange && (Power == gcvTRUE))
+ {
+ if (platform && platform->ops->setPower)
+ {
+ gcmkVERIFY_OK(platform->ops->setPower(platform, Core, Power));
+ }
+
+ Os->powerStates[Core] = Power;
+ }
+
+ if (clockChange)
+ {
+ unsigned long flags;
+
+ if (!Clock)
+ {
+ spin_lock_irqsave(&Os->registerAccessLock, flags);
+
+ /* Record clock off, ahead. */
+ Os->clockStates[Core] = gcvFALSE;
+
+ spin_unlock_irqrestore(&Os->registerAccessLock, flags);
+ }
+
+ if (platform && platform->ops->setClock)
+ {
+ gcmkVERIFY_OK(platform->ops->setClock(platform, Core, Clock));
+ }
+
+ if (Clock)
+ {
+ spin_lock_irqsave(&Os->registerAccessLock, flags);
+
+ /* Record clock on, behind. */
+ Os->clockStates[Core] = gcvTRUE;
+
+ spin_unlock_irqrestore(&Os->registerAccessLock, flags);
+ }
+ }
+
+ if (powerChange && (Power == gcvFALSE))
+ {
+ if (platform && platform->ops->setPower)
+ {
+ gcmkVERIFY_OK(platform->ops->setPower(platform, Core, Power));
+ }
+
+ Os->powerStates[Core] = Power;
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_ResetGPU
+**
+** Reset the GPU.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gckCORE Core
+** GPU whose power is set.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_ResetGPU(
+ IN gckOS Os,
+ IN gceCORE Core
+ )
+{
+ gceSTATUS status = gcvSTATUS_NOT_SUPPORTED;
+ gcsPLATFORM * platform;
+
+ gcmkHEADER_ARG("Os=%p Core=%d", Os, Core);
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+
+ platform = Os->device->platform;
+
+ if (platform && platform->ops->reset)
+ {
+ status = platform->ops->reset(platform, Core);
+ }
+
+ gcmkFOOTER_NO();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_PrepareGPUFrequency
+**
+** Prepare to set GPU frequency and voltage.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gckCORE Core
+** GPU whose frequency and voltage will be set.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_PrepareGPUFrequency(
+ IN gckOS Os,
+ IN gceCORE Core
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_FinishGPUFrequency
+**
+** Finish GPU frequency setting.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gckCORE Core
+** GPU whose frequency and voltage is set.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_FinishGPUFrequency(
+ IN gckOS Os,
+ IN gceCORE Core
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_QueryGPUFrequency
+**
+** Query the current frequency of the GPU.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gckCORE Core
+** GPU whose power is set.
+**
+** gctUINT32 * Frequency
+** Pointer to a gctUINT32 to obtain current frequency, in MHz.
+**
+** gctUINT8 * Scale
+** Pointer to a gctUINT8 to obtain current scale(1 - 64).
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_QueryGPUFrequency(
+ IN gckOS Os,
+ IN gceCORE Core,
+ OUT gctUINT32 * Frequency,
+ OUT gctUINT8 * Scale
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_SetGPUFrequency
+**
+** Set frequency and voltage of the GPU.
+**
+** 1. DVFS manager gives the target scale of full frequency, BSP must find
+** a real frequency according to this scale and board's configure.
+**
+** 2. BSP should find a suitable voltage for this frequency.
+**
+** 3. BSP must make sure setting take effect before this function returns.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to a gckOS object.
+**
+** gckCORE Core
+** GPU whose power is set.
+**
+** gctUINT8 Scale
+** Target scale of full frequency, range is [1, 64]. 1 means 1/64 of
+** full frequency and 64 means 64/64 of full frequency.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_SetGPUFrequency(
+ IN gckOS Os,
+ IN gceCORE Core,
+ IN gctUINT8 Scale
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+/*----------------------------------------------------------------------------*/
+/*----- Profile --------------------------------------------------------------*/
+
+gceSTATUS
+gckOS_GetProfileTick(
+ OUT gctUINT64_PTR Tick
+ )
+{
+ struct timespec time;
+
+ ktime_get_ts(&time);
+
+ *Tick = time.tv_nsec + time.tv_sec * 1000000000ULL;
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_QueryProfileTickRate(
+ OUT gctUINT64_PTR TickRate
+ )
+{
+ struct timespec res;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
+ res.tv_sec = 0;
+ res.tv_nsec = hrtimer_resolution;
+#else
+ hrtimer_get_res(CLOCK_MONOTONIC, &res);
+#endif
+
+ *TickRate = res.tv_nsec + res.tv_sec * 1000000000ULL;
+
+ return gcvSTATUS_OK;
+}
+
+gctUINT32
+gckOS_ProfileToMS(
+ IN gctUINT64 Ticks
+ )
+{
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,23)
+ return div_u64(Ticks, 1000000);
+#else
+ gctUINT64 rem = Ticks;
+ gctUINT64 b = 1000000;
+ gctUINT64 res, d = 1;
+ gctUINT32 high = rem >> 32;
+
+ /* Reduce the thing a bit first */
+ res = 0;
+ if (high >= 1000000)
+ {
+ high /= 1000000;
+ res = (gctUINT64) high << 32;
+ rem -= (gctUINT64) (high * 1000000) << 32;
+ }
+
+ while (((gctINT64) b > 0) && (b < rem))
+ {
+ b <<= 1;
+ d <<= 1;
+ }
+
+ do
+ {
+ if (rem >= b)
+ {
+ rem -= b;
+ res += d;
+ }
+
+ b >>= 1;
+ d >>= 1;
+ }
+ while (d);
+
+ return (gctUINT32) res;
+#endif
+}
+
+/******************************************************************************\
+******************************* Signal Management ******************************
+\******************************************************************************/
+
+#undef _GC_OBJ_ZONE
+#define _GC_OBJ_ZONE gcvZONE_SIGNAL
+
+/*******************************************************************************
+**
+** gckOS_CreateSignal
+**
+** Create a new signal.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctBOOL ManualReset
+** If set to gcvTRUE, gckOS_Signal with gcvFALSE must be called in
+** order to set the signal to nonsignaled state.
+** If set to gcvFALSE, the signal will automatically be set to
+** nonsignaled state by gckOS_WaitSignal function.
+**
+** OUTPUT:
+**
+** gctSIGNAL * Signal
+** Pointer to a variable receiving the created gctSIGNAL.
+*/
+gceSTATUS
+gckOS_CreateSignal(
+ IN gckOS Os,
+ IN gctBOOL ManualReset,
+ OUT gctSIGNAL * Signal
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsSIGNAL_PTR signal = gcvNULL;
+
+ gcmkHEADER_ARG("Os=%p ManualReset=%d", Os, ManualReset);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Signal != gcvNULL);
+
+ /* Create an event structure. */
+ signal = (gcsSIGNAL_PTR) kmalloc(sizeof(gcsSIGNAL), GFP_KERNEL | gcdNOWARN);
+
+ if (signal == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Save the process ID. */
+ signal->process = (gctHANDLE)(gctUINTPTR_T) _GetProcessID();
+
+ signal->done = 0;
+ init_waitqueue_head(&signal->wait);
+ spin_lock_init(&signal->lock);
+ signal->manualReset = ManualReset;
+
+ atomic_set(&signal->ref, 1);
+
+#if gcdLINUX_SYNC_FILE
+#ifndef CONFIG_SYNC_FILE
+ signal->timeline = gcvNULL;
+# else
+ signal->fence = gcvNULL;
+# endif
+#endif
+
+ gcmkONERROR(_AllocateIntegerId(&Os->signalDB, signal, &signal->id));
+
+ *Signal = (gctSIGNAL)(gctUINTPTR_T)signal->id;
+
+OnError:
+ if (gcmIS_ERROR(status) && signal)
+ {
+ kfree(signal);
+ }
+
+ gcmkFOOTER_ARG("*Signal=%p", *Signal);
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_DestroySignal
+**
+** Destroy a signal.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctSIGNAL Signal
+** Pointer to the gctSIGNAL.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_DestroySignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsSIGNAL_PTR signal;
+ gctBOOL acquired = gcvFALSE;
+ unsigned long flags = 0;
+
+ gcmkHEADER_ARG("Os=%p Signal=%p", Os, Signal);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Signal != gcvNULL);
+
+ if(in_irq()){
+ spin_lock(&Os->signalLock);
+ }else{
+ spin_lock_irqsave(&Os->signalLock, flags);
+ }
+ acquired = gcvTRUE;
+
+ gcmkONERROR(_QueryIntegerId(&Os->signalDB, (gctUINT32)(gctUINTPTR_T)Signal, (gctPOINTER)&signal));
+
+ gcmkASSERT(signal->id == (gctUINT32)(gctUINTPTR_T)Signal);
+
+ if (atomic_dec_and_test(&signal->ref))
+ {
+ gcmkVERIFY_OK(_DestroyIntegerId(&Os->signalDB, signal->id));
+
+ /* Free the sgianl. */
+ kfree(signal);
+ }
+
+ if(in_irq()){
+ spin_unlock(&Os->signalLock);
+ }else{
+ spin_unlock_irqrestore(&Os->signalLock, flags);
+ }
+ acquired = gcvFALSE;
+
+OnError:
+ if (acquired)
+ {
+ /* Release the mutex. */
+ if(in_irq()){
+ spin_unlock(&Os->signalLock);
+ }else{
+ spin_unlock_irqrestore(&Os->signalLock, flags);
+ }
+ }
+
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_Signal
+**
+** Set a state of the specified signal.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctSIGNAL Signal
+** Pointer to the gctSIGNAL.
+**
+** gctBOOL State
+** If gcvTRUE, the signal will be set to signaled state.
+** If gcvFALSE, the signal will be set to nonsignaled state.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_Signal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal,
+ IN gctBOOL State
+ )
+{
+ gceSTATUS status;
+ gcsSIGNAL_PTR signal;
+#if gcdLINUX_SYNC_FILE
+#ifndef CONFIG_SYNC_FILE
+ struct sync_timeline * timeline = gcvNULL;
+# else
+ struct dma_fence * fence = gcvNULL;
+# endif
+#endif
+ unsigned long flags = 0;
+
+ gcmkHEADER_ARG("Os=%p Signal=%p State=%d", Os, Signal, State);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Signal != gcvNULL);
+
+ spin_lock_irqsave(&Os->signalLock, flags);
+
+ status = _QueryIntegerId(&Os->signalDB,
+ (gctUINT32)(gctUINTPTR_T)Signal,
+ (gctPOINTER)&signal);
+
+ if (gcmIS_ERROR(status))
+ {
+ spin_unlock_irqrestore(&Os->signalLock, flags);
+ gcmkONERROR(status);
+ }
+
+ /*
+ * Signal saved in event is not referenced. Inc reference here to avoid
+ * concurrent issue: signaling the signal while another thread is destroying
+ * it.
+ */
+ atomic_inc(&signal->ref);
+
+ spin_unlock_irqrestore(&Os->signalLock, flags);
+
+ gcmkONERROR(status);
+
+ gcmkASSERT(signal->id == (gctUINT32)(gctUINTPTR_T)Signal);
+
+ spin_lock(&signal->lock);
+
+ if (State)
+ {
+ signal->done = 1;
+
+ wake_up(&signal->wait);
+
+#if gcdLINUX_SYNC_FILE
+#ifndef CONFIG_SYNC_FILE
+ timeline = signal->timeline;
+# else
+ fence = signal->fence;
+ signal->fence = NULL;
+# endif
+#endif
+ }
+ else
+ {
+ signal->done = 0;
+ }
+
+ spin_unlock(&signal->lock);
+
+#if gcdLINUX_SYNC_FILE
+#ifndef CONFIG_SYNC_FILE
+ /* Signal timeline. */
+ if (timeline)
+ {
+ sync_timeline_signal(timeline);
+ }
+# else
+ if (fence)
+ {
+ dma_fence_signal(fence);
+ dma_fence_put(fence);
+ }
+# endif
+#endif
+
+ spin_lock_irqsave(&Os->signalLock, flags);
+
+ if (atomic_dec_and_test(&signal->ref))
+ {
+ gcmkVERIFY_OK(_DestroyIntegerId(&Os->signalDB, signal->id));
+
+ /* Free the sgianl. */
+ kfree(signal);
+ }
+
+ spin_unlock_irqrestore(&Os->signalLock, flags);
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_UserSignal
+**
+** Set the specified signal which is owned by a process to signaled state.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctSIGNAL Signal
+** Pointer to the gctSIGNAL.
+**
+** gctHANDLE Process
+** Handle of process owning the signal.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_UserSignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal,
+ IN gctHANDLE Process
+ )
+{
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Os=%p Signal=%p Process=%p", Os, Signal, Process);
+
+ /* Signal. */
+ status = gckOS_Signal(Os, Signal, gcvTRUE);
+
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_WaitSignal
+**
+** Wait for a signal to become signaled.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctSIGNAL Signal
+** Pointer to the gctSIGNAL.
+**
+** gctUINT32 Wait
+** Number of milliseconds to wait.
+** Pass the value of gcvINFINITE for an infinite wait.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_WaitSignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal,
+ IN gctBOOL Interruptable,
+ IN gctUINT32 Wait
+ )
+{
+ gceSTATUS status;
+ gcsSIGNAL_PTR signal = gcvNULL;
+ int done;
+
+ gcmkHEADER_ARG("Os=%p Signal=%p Wait=0x%08X", Os, Signal, Wait);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Signal != gcvNULL);
+
+ gcmkONERROR(_QueryIntegerId(&Os->signalDB, (gctUINT32)(gctUINTPTR_T)Signal, (gctPOINTER)&signal));
+
+ gcmkASSERT(signal->id == (gctUINT32)(gctUINTPTR_T)Signal);
+
+ spin_lock(&signal->lock);
+ done = signal->done;
+ spin_unlock(&signal->lock);
+
+ /*
+ * Do not need to lock below:
+ * 1. If signal already done, return immediately.
+ * 2. If signal not done, wait_event_xxx will handle correctly even read of
+ * signal->done is not atomic.
+ *
+ * Rest signal->done do not require lock either:
+ * No other thread can query/wait auto-reseted signal, because that is
+ * logic error.
+ */
+ if (done)
+ {
+ status = gcvSTATUS_OK;
+
+ if (!signal->manualReset)
+ {
+ signal->done = 0;
+ }
+ }
+ else if (Wait == 0)
+ {
+ status = gcvSTATUS_TIMEOUT;
+ }
+ else
+ {
+ /* Convert wait to milliseconds. */
+ long timeout = (Wait == gcvINFINITE)
+ ? MAX_SCHEDULE_TIMEOUT
+ : msecs_to_jiffies(Wait);
+
+ long ret;
+
+ if (Interruptable)
+ {
+ ret = wait_event_interruptible_timeout(signal->wait, signal->done, timeout);
+ }
+ else
+ {
+ ret = wait_event_timeout(signal->wait, signal->done, timeout);
+ }
+
+ if (likely(ret > 0))
+ {
+ status = gcvSTATUS_OK;
+
+ if (!signal->manualReset)
+ {
+ /* Auto reset. */
+ signal->done = 0;
+ }
+ }
+ else
+ {
+ status = (ret == -ERESTARTSYS) ? gcvSTATUS_INTERRUPTED
+ : gcvSTATUS_TIMEOUT;
+ }
+ }
+
+OnError:
+ /* Return status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+_QuerySignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal
+ )
+{
+ /*
+ * This function is called by 'has_signaled' callback of sync_timeline.
+ * By design, 'has_signaled' could be called in interrupt context, but
+ * in current driver, it can be called only when 'gckOS_Signal' and
+ * 'gckOS_CreateNativeFence'. Thus its safe to use normal version of
+ * spinlock for 'Os->signalDB.lock' and 'signal->obj.wait.lock'.
+ */
+ gceSTATUS status;
+ gcsSIGNAL_PTR signal = gcvNULL;
+
+ status = _QueryIntegerId(&Os->signalDB,
+ (gctUINT32)(gctUINTPTR_T)Signal,
+ (gctPOINTER)&signal);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ spin_lock(&signal->lock);
+ status = signal->done ? gcvSTATUS_TRUE : gcvSTATUS_FALSE;
+ spin_unlock(&signal->lock);
+ }
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_MapSignal
+**
+** Map a signal in to the current process space.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctSIGNAL Signal
+** Pointer to tha gctSIGNAL to map.
+**
+** gctHANDLE Process
+** Handle of process owning the signal.
+**
+** OUTPUT:
+**
+** gctSIGNAL * MappedSignal
+** Pointer to a variable receiving the mapped gctSIGNAL.
+*/
+gceSTATUS
+gckOS_MapSignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal,
+ IN gctHANDLE Process,
+ OUT gctSIGNAL * MappedSignal
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsSIGNAL_PTR signal = gcvNULL;
+ unsigned long flags = 0;
+ gcmkHEADER_ARG("Os=%p Signal=%p Process=%p", Os, Signal, Process);
+
+ gcmkVERIFY_ARGUMENT(Signal != gcvNULL);
+ gcmkVERIFY_ARGUMENT(MappedSignal != gcvNULL);
+
+ spin_lock_irqsave(&Os->signalLock, flags);
+
+ gcmkONERROR(_QueryIntegerId(&Os->signalDB, (gctUINT32)(gctUINTPTR_T)Signal, (gctPOINTER)&signal));
+
+ if (atomic_inc_return(&signal->ref) <= 1)
+ {
+ /* The previous value is 0, it has been deleted. */
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ *MappedSignal = (gctSIGNAL) Signal;
+
+OnError:
+ spin_unlock_irqrestore(&Os->signalLock, flags);
+
+ gcmkFOOTER_ARG("*MappedSignal=%p", *MappedSignal);
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_UnmapSignal
+**
+** Unmap a signal .
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctSIGNAL Signal
+** Pointer to that gctSIGNAL mapped.
+*/
+gceSTATUS
+gckOS_UnmapSignal(
+ IN gckOS Os,
+ IN gctSIGNAL Signal
+ )
+{
+ return gckOS_DestroySignal(Os, Signal);
+}
+
+/*******************************************************************************
+**
+** gckOS_CreateUserSignal
+**
+** Create a new signal to be used in the user space.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctBOOL ManualReset
+** If set to gcvTRUE, gckOS_Signal with gcvFALSE must be called in
+** order to set the signal to nonsignaled state.
+** If set to gcvFALSE, the signal will automatically be set to
+** nonsignaled state by gckOS_WaitSignal function.
+**
+** OUTPUT:
+**
+** gctINT * SignalID
+** Pointer to a variable receiving the created signal's ID.
+*/
+gceSTATUS
+gckOS_CreateUserSignal(
+ IN gckOS Os,
+ IN gctBOOL ManualReset,
+ OUT gctINT * SignalID
+ )
+{
+ gceSTATUS status;
+ gctSIZE_T signal;
+
+ /* Create a new signal. */
+ gcmkONERROR(gckOS_CreateSignal(Os, ManualReset, (gctSIGNAL *) &signal));
+ *SignalID = (gctINT) signal;
+
+OnError:
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_DestroyUserSignal
+**
+** Destroy a signal to be used in the user space.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctINT SignalID
+** The signal's ID.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_DestroyUserSignal(
+ IN gckOS Os,
+ IN gctINT SignalID
+ )
+{
+ return gckOS_DestroySignal(Os, (gctSIGNAL)(gctUINTPTR_T)SignalID);
+}
+
+/*******************************************************************************
+**
+** gckOS_WaitUserSignal
+**
+** Wait for a signal used in the user mode to become signaled.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctINT SignalID
+** Signal ID.
+**
+** gctUINT32 Wait
+** Number of milliseconds to wait.
+** Pass the value of gcvINFINITE for an infinite wait.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_WaitUserSignal(
+ IN gckOS Os,
+ IN gctINT SignalID,
+ IN gctUINT32 Wait
+ )
+{
+ return gckOS_WaitSignal(Os, (gctSIGNAL)(gctUINTPTR_T)SignalID, gcvTRUE, Wait);
+}
+
+/*******************************************************************************
+**
+** gckOS_SignalUserSignal
+**
+** Set a state of the specified signal to be used in the user space.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctINT SignalID
+** SignalID.
+**
+** gctBOOL State
+** If gcvTRUE, the signal will be set to signaled state.
+** If gcvFALSE, the signal will be set to nonsignaled state.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_SignalUserSignal(
+ IN gckOS Os,
+ IN gctINT SignalID,
+ IN gctBOOL State
+ )
+{
+ return gckOS_Signal(Os, (gctSIGNAL)(gctUINTPTR_T)SignalID, State);
+}
+
+#if gcdENABLE_VG
+gceSTATUS
+gckOS_CreateSemaphoreVG(
+ IN gckOS Os,
+ OUT gctSEMAPHORE * Semaphore
+ )
+{
+ gceSTATUS status;
+ struct semaphore * newSemaphore;
+
+ gcmkHEADER_ARG("Os=%p Semaphore=%p", Os, Semaphore);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Semaphore != gcvNULL);
+
+ do
+ {
+ /* Allocate the semaphore structure. */
+ newSemaphore = (struct semaphore *)kmalloc(gcmSIZEOF(struct semaphore), GFP_KERNEL | gcdNOWARN);
+ if (newSemaphore == gcvNULL)
+ {
+ gcmkERR_BREAK(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Initialize the semaphore. */
+ sema_init(newSemaphore, 0);
+
+ /* Set the handle. */
+ * Semaphore = (gctSEMAPHORE) newSemaphore;
+
+ /* Success. */
+ status = gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return the status. */
+ return status;
+}
+
+
+gceSTATUS
+gckOS_IncrementSemaphore(
+ IN gckOS Os,
+ IN gctSEMAPHORE Semaphore
+ )
+{
+ gcmkHEADER_ARG("Os=%p Semaphore=%p", Os, Semaphore);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Semaphore != gcvNULL);
+
+ /* Increment the semaphore's count. */
+ up((struct semaphore *) Semaphore);
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_DecrementSemaphore(
+ IN gckOS Os,
+ IN gctSEMAPHORE Semaphore
+ )
+{
+ gceSTATUS status;
+ gctINT result;
+
+ gcmkHEADER_ARG("Os=%p Semaphore=%p", Os, Semaphore);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Semaphore != gcvNULL);
+
+ do
+ {
+ /* Decrement the semaphore's count. If the count is zero, wait
+ until it gets incremented. */
+ result = down_interruptible((struct semaphore *) Semaphore);
+
+ /* Signal received? */
+ if (result != 0)
+ {
+ status = gcvSTATUS_TERMINATE;
+ break;
+ }
+
+ /* Success. */
+ status = gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return the status. */
+ return status;
+}
+
+/******************************************************************************\
+******************************** Thread Object *********************************
+\******************************************************************************/
+
+gceSTATUS
+gckOS_StartThread(
+ IN gckOS Os,
+ IN gctTHREADFUNC ThreadFunction,
+ IN gctPOINTER ThreadParameter,
+ OUT gctTHREAD * Thread
+ )
+{
+ gceSTATUS status;
+ struct task_struct * thread;
+
+ gcmkHEADER_ARG("Os=%p", Os);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(ThreadFunction != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Thread != gcvNULL);
+
+ do
+ {
+ /* Create the thread. */
+ thread = kthread_create(
+ ThreadFunction,
+ ThreadParameter,
+ "Vivante Kernel Thread"
+ );
+
+ /* Failed? */
+ if (IS_ERR(thread))
+ {
+ status = gcvSTATUS_GENERIC_IO;
+ break;
+ }
+
+ /* Start the thread. */
+ wake_up_process(thread);
+
+ /* Set the thread handle. */
+ * Thread = (gctTHREAD) thread;
+
+ /* Success. */
+ status = gcvSTATUS_OK;
+ }
+ while (gcvFALSE);
+
+ gcmkFOOTER();
+ /* Return the status. */
+ return status;
+}
+
+gceSTATUS
+gckOS_StopThread(
+ IN gckOS Os,
+ IN gctTHREAD Thread
+ )
+{
+ gcmkHEADER_ARG("Os=%p Thread=%p", Os, Thread);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Thread != gcvNULL);
+
+ /* Thread should have already been enabled to terminate. */
+ kthread_stop((struct task_struct *) Thread);
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_VerifyThread(
+ IN gckOS Os,
+ IN gctTHREAD Thread
+ )
+{
+ gcmkHEADER_ARG("Os=%p Thread=%p", Os, Thread);
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Thread != gcvNULL);
+
+ gcmkFOOTER_NO();
+ /* Success. */
+ return gcvSTATUS_OK;
+}
+#endif
+
+/******************************************************************************\
+******************************** Software Timer ********************************
+\******************************************************************************/
+
+void
+_TimerFunction(
+ struct work_struct * work
+ )
+{
+ gcsOSTIMER_PTR timer = (gcsOSTIMER_PTR)work;
+
+ gctTIMERFUNCTION function = timer->function;
+
+ function(timer->data);
+}
+
+/*******************************************************************************
+**
+** gckOS_CreateTimer
+**
+** Create a software timer.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gctTIMERFUNCTION Function.
+** Pointer to a call back function which will be called when timer is
+** expired.
+**
+** gctPOINTER Data.
+** Private data which will be passed to call back function.
+**
+** OUTPUT:
+**
+** gctPOINTER * Timer
+** Pointer to a variable receiving the created timer.
+*/
+gceSTATUS
+gckOS_CreateTimer(
+ IN gckOS Os,
+ IN gctTIMERFUNCTION Function,
+ IN gctPOINTER Data,
+ OUT gctPOINTER * Timer
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ gcsOSTIMER_PTR pointer;
+ gcmkHEADER_ARG("Os=%p Function=0%p Data=%p", Os, Function, Data);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Timer != gcvNULL);
+
+ gcmkONERROR(gckOS_Allocate(Os, sizeof(gcsOSTIMER), (gctPOINTER)&pointer));
+
+ pointer->function = Function;
+ pointer->data = Data;
+
+ INIT_DELAYED_WORK(&pointer->work, _TimerFunction);
+
+ *Timer = pointer;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_DestroyTimer
+**
+** Destory a software timer.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gctPOINTER Timer
+** Pointer to the timer to be destoryed.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_DestroyTimer(
+ IN gckOS Os,
+ IN gctPOINTER Timer
+ )
+{
+ gcsOSTIMER_PTR timer;
+
+ gcmkHEADER_ARG("Os=%p Timer=%p", Os, Timer);
+
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Timer != gcvNULL);
+
+ timer = (gcsOSTIMER_PTR)Timer;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
+ cancel_delayed_work_sync(&timer->work);
+#else
+ cancel_delayed_work(&timer->work);
+ flush_workqueue(Os->workqueue);
+#endif
+
+ gcmkVERIFY_OK(gcmkOS_SAFE_FREE(Os, Timer));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_StartTimer
+**
+** Schedule a software timer.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gctPOINTER Timer
+** Pointer to the timer to be scheduled.
+**
+** gctUINT32 Delay
+** Delay in milliseconds.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_StartTimer(
+ IN gckOS Os,
+ IN gctPOINTER Timer,
+ IN gctUINT32 Delay
+ )
+{
+ gcsOSTIMER_PTR timer;
+
+ gcmkHEADER_ARG("Os=%p Timer=%p Delay=%u", Os, Timer, Delay);
+
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Timer != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Delay != 0);
+
+ timer = (gcsOSTIMER_PTR)Timer;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
+ mod_delayed_work(Os->workqueue, &timer->work, msecs_to_jiffies(Delay));
+#else
+ if (unlikely(delayed_work_pending(&timer->work)))
+ {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
+ cancel_delayed_work_sync(&timer->work);
+#else
+ cancel_delayed_work(&timer->work);
+ flush_workqueue(Os->workqueue);
+#endif
+ }
+
+ queue_delayed_work(Os->workqueue, &timer->work, msecs_to_jiffies(Delay));
+#endif
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_StopTimer
+**
+** Cancel a unscheduled timer.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to the gckOS object.
+**
+** gctPOINTER Timer
+** Pointer to the timer to be cancel.
+**
+** OUTPUT:
+**
+** Nothing.
+*/
+gceSTATUS
+gckOS_StopTimer(
+ IN gckOS Os,
+ IN gctPOINTER Timer
+ )
+{
+ gcsOSTIMER_PTR timer;
+ gcmkHEADER_ARG("Os=%p Timer=%p", Os, Timer);
+
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Timer != gcvNULL);
+
+ timer = (gcsOSTIMER_PTR)Timer;
+
+ cancel_delayed_work(&timer->work);
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_GetProcessNameByPid(
+ IN gctINT Pid,
+ IN gctSIZE_T Length,
+ OUT gctUINT8_PTR String
+ )
+{
+ struct task_struct *task;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ /* Get the task_struct of the task with pid. */
+ rcu_read_lock();
+
+ task = FIND_TASK_BY_PID(Pid);
+ if (task)
+ {
+ /* Get name of process. */
+ strncpy(String, task->comm, Length);
+ }
+ else
+ {
+ status = gcvSTATUS_NOT_FOUND;
+ }
+
+ rcu_read_unlock();
+
+ return status;
+}
+
+gceSTATUS
+gckOS_DumpCallStack(
+ IN gckOS Os
+ )
+{
+ gcmkHEADER_ARG("Os=%p", Os);
+
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+
+ dump_stack();
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+/*******************************************************************************
+**
+** gckOS_DetectProcessByName
+**
+** task->comm maybe part of process name, so this function
+** can only be used for debugging.
+**
+** INPUT:
+**
+** gctCONST_POINTER Name
+** Pointer to a string to hold name to be check. If the length
+** of name is longer than TASK_COMM_LEN (16), use part of name
+** to detect.
+**
+** OUTPUT:
+**
+** gcvSTATUS_TRUE if name of current process matches Name.
+**
+*/
+gceSTATUS
+gckOS_DetectProcessByName(
+ IN gctCONST_POINTER Name
+ )
+{
+ char comm[sizeof(current->comm)];
+
+ memset(comm, 0, sizeof(comm));
+
+ gcmkVERIFY_OK(
+ gckOS_GetProcessNameByPid(_GetProcessID(), sizeof(current->comm), comm));
+
+ return strstr(comm, Name) ? gcvSTATUS_TRUE
+ : gcvSTATUS_FALSE;
+}
+
+#if gcdLINUX_SYNC_FILE
+#ifndef CONFIG_SYNC_FILE
+gceSTATUS
+gckOS_CreateSyncTimeline(
+ IN gckOS Os,
+ IN gceCORE Core,
+ OUT gctHANDLE * Timeline
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ struct viv_sync_timeline * timeline;
+ char name[32];
+
+ snprintf(name, 32, "gccore-%u", (unsigned int) Core);
+
+ /* Create viv sync timeline. */
+ timeline = viv_sync_timeline_create(name, Os);
+
+ if (timeline)
+ {
+ *Timeline = (gctHANDLE)timeline;
+ }
+ else
+ {
+ /* Out of memory. */
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ }
+
+
+ return status;
+}
+
+gceSTATUS
+gckOS_DestroySyncTimeline(
+ IN gckOS Os,
+ IN gctHANDLE Timeline
+ )
+{
+ struct viv_sync_timeline * timeline;
+ gcmkASSERT(Timeline != gcvNULL);
+
+ /* Destroy timeline. */
+ timeline = (struct viv_sync_timeline *) Timeline;
+ sync_timeline_destroy(&timeline->obj);
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_CreateNativeFence(
+ IN gckOS Os,
+ IN gctHANDLE Timeline,
+ IN gctSIGNAL Signal,
+ OUT gctINT * FenceFD
+ )
+{
+ int fd = -1;
+ struct viv_sync_timeline *timeline;
+ struct sync_pt * pt = gcvNULL;
+ struct sync_fence * fence;
+ char name[32];
+ gcsSIGNAL_PTR signal;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p Timeline=%p Signal=%p", Os, Timeline, Signal);
+
+ gcmkONERROR(
+ _QueryIntegerId(&Os->signalDB,
+ (gctUINT32)(gctUINTPTR_T)Signal,
+ (gctPOINTER)&signal));
+
+ /* Cast timeline. */
+ timeline = (struct viv_sync_timeline *) Timeline;
+
+ fd = get_unused_fd_flags(O_CLOEXEC);
+
+ if (fd < 0)
+ {
+ /* Out of resources. */
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ /* Create viv_sync_pt. */
+ pt = viv_sync_pt_create(timeline, Signal);
+
+ if (pt == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Reference sync_timeline. */
+ signal->timeline = &timeline->obj;
+
+ /* Build fence name. */
+ snprintf(name, 32, "%.16s-signal_%lu",
+ current->comm,
+ (unsigned long)Signal);
+
+ /* Create sync_fence. */
+ fence = sync_fence_create(name, pt);
+
+ if (fence == NULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Install fence to fd. */
+ sync_fence_install(fence, fd);
+
+ *FenceFD = fd;
+ return gcvSTATUS_OK;
+
+OnError:
+ if (gcmIS_ERROR(status))
+ {
+ /* Error roll back. */
+ if (pt)
+ {
+ sync_pt_free(pt);
+ }
+
+ if (fd > 0)
+ {
+ put_unused_fd(fd);
+ }
+ }
+
+ gcmkFOOTER_ARG("*FenceFD=%d", fd);
+ return status;
+}
+
+static void
+_NativeFenceSignaled(
+ struct sync_fence *fence,
+ struct sync_fence_waiter *waiter
+ )
+{
+ kfree(waiter);
+ sync_fence_put(fence);
+}
+
+gceSTATUS
+gckOS_WaitNativeFence(
+ IN gckOS Os,
+ IN gctHANDLE Timeline,
+ IN gctINT FenceFD,
+ IN gctUINT32 Timeout
+ )
+{
+ struct sync_timeline * timeline;
+ struct sync_fence * fence;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ gcmkHEADER_ARG("Os=%p Timeline=%p FenceFD=%d Timeout=%u",
+ Os, Timeline, FenceFD, Timeout);
+
+ /* Get shortcut. */
+ timeline = (struct sync_timeline *) Timeline;
+
+ /* Get sync fence. */
+ fence = sync_fence_fdget(FenceFD);
+
+ if (!fence)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (sync_fence_wait(fence, 0) == 0)
+ {
+ /* Already signaled. */
+ sync_fence_put(fence);
+
+ goto OnError;
+ }
+ else
+ {
+ gctBOOL wait = gcvFALSE;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
+ int i;
+
+ for (i = 0; i < fence->num_fences; i++)
+ {
+ struct fence *f = fence->cbs[i].sync_pt;
+ struct sync_pt *pt = container_of(f, struct sync_pt, base);
+
+ /* Do not need to wait on same timeline. */
+ if ((sync_pt_parent(pt) != timeline) && !fence_is_signaled(f))
+ {
+ wait = gcvTRUE;
+ break;
+ }
+ }
+#else
+ {
+ struct list_head *pos;
+ list_for_each(pos, &fence->pt_list_head)
+ {
+ struct sync_pt * pt =
+ container_of(pos, struct sync_pt, pt_list);
+
+ /* Do not need to wait on same timeline. */
+ if (pt->parent != timeline)
+ {
+ wait = gcvTRUE;
+ break;
+ }
+ }
+ }
+#endif
+
+ if (wait)
+ {
+ int err;
+ long timeout = (Timeout == gcvINFINITE) ? - 1 : (long) Timeout;
+ err = sync_fence_wait(fence, timeout);
+
+ /* Put the fence. */
+ sync_fence_put(fence);
+
+ switch (err)
+ {
+ case 0:
+ break;
+ case -ETIME:
+ status = gcvSTATUS_TIMEOUT;
+ break;
+ default:
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ break;
+ }
+ }
+ else
+ {
+ int err;
+ struct sync_fence_waiter *waiter;
+ waiter = (struct sync_fence_waiter *)kmalloc(
+ sizeof (struct sync_fence_waiter), gcdNOWARN | GFP_KERNEL);
+
+ if (!waiter)
+ {
+ sync_fence_put(fence);
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Schedule a waiter callback. */
+ sync_fence_waiter_init(waiter, _NativeFenceSignaled);
+ err = sync_fence_wait_async(fence, waiter);
+
+ switch (err)
+ {
+ case 0:
+ /* Put fence in callback function. */
+ break;
+ case 1:
+ /* already signaled. */
+ sync_fence_put(fence);
+ break;
+ default:
+ sync_fence_put(fence);
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ break;
+ }
+ }
+ }
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+# else /* !CONFIG_SYNC_FILE */
+
+gceSTATUS
+gckOS_CreateSyncTimeline(
+ IN gckOS Os,
+ IN gceCORE Core,
+ OUT gctHANDLE * Timeline
+ )
+{
+ struct viv_sync_timeline *timeline;
+
+ char name[32];
+
+ snprintf(name, 32, "gccore-%u", (unsigned int) Core);
+ timeline = viv_sync_timeline_create(name, Os);
+
+ if (timeline == gcvNULL)
+ {
+ /* Out of memory. */
+ return gcvSTATUS_OUT_OF_MEMORY;
+ }
+
+ *Timeline = (gctHANDLE) timeline;
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_DestroySyncTimeline(
+ IN gckOS Os,
+ IN gctHANDLE Timeline
+ )
+{
+ struct viv_sync_timeline * timeline;
+
+ /* Destroy timeline. */
+ timeline = (struct viv_sync_timeline *) Timeline;
+ viv_sync_timeline_destroy(timeline);
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_CreateNativeFence(
+ IN gckOS Os,
+ IN gctHANDLE Timeline,
+ IN gctSIGNAL Signal,
+ OUT gctINT * FenceFD
+ )
+{
+ struct dma_fence *fence = NULL;
+ struct sync_file *sync = NULL;
+ int fd = -1;
+ struct viv_sync_timeline *timeline;
+ gcsSIGNAL_PTR signal = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ /* Create fence. */
+ timeline = (struct viv_sync_timeline *) Timeline;
+
+ gcmkONERROR(
+ _QueryIntegerId(&Os->signalDB,
+ (gctUINT32)(gctUINTPTR_T)Signal,
+ (gctPOINTER)&signal));
+
+ fence = viv_fence_create(timeline, signal);
+
+ if (!fence)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Create sync_file. */
+ sync = sync_file_create(fence);
+
+ if (!sync)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ /* Get a unused fd. */
+ fd = get_unused_fd_flags(O_CLOEXEC);
+
+ if (fd < 0)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ fd_install(fd, sync->file);
+
+ *FenceFD = fd;
+ return gcvSTATUS_OK;
+
+OnError:
+ if (sync)
+ {
+ fput(sync->file);
+ }
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,9,68)
+ if (fence)
+ {
+ dma_fence_put(fence);
+ }
+#endif
+
+ if (fd > 0)
+ {
+ put_unused_fd(fd);
+ }
+
+ *FenceFD = -1;
+ return status;
+}
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,9,0)
+/**
+ * sync_file_fdget() - get a sync_file from an fd
+ * @fd: fd referencing a fence
+ *
+ * Ensures @fd references a valid sync_file, increments the refcount of the
+ * backing file. Returns the sync_file or NULL in case of error.
+ */
+static struct sync_file *sync_file_fdget(int fd)
+{
+ struct file *file = fget(fd);
+
+ if (!file)
+ return NULL;
+
+ return file->private_data;
+}
+
+gceSTATUS
+gckOS_WaitNativeFence(
+ IN gckOS Os,
+ IN gctHANDLE Timeline,
+ IN gctINT FenceFD,
+ IN gctUINT32 Timeout
+ )
+{
+ struct viv_sync_timeline *timeline;
+ gceSTATUS status = gcvSTATUS_OK;
+ unsigned int i;
+ unsigned long timeout;
+ unsigned int numFences;
+ struct sync_file *sync_file;
+
+ timeline = (struct viv_sync_timeline *) Timeline;
+
+ sync_file = sync_file_fdget(FenceFD);
+
+ if (!sync_file)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ numFences = sync_file->num_fences;
+
+ timeout = msecs_to_jiffies(Timeout);
+
+ for (i = 0; i < numFences; i++)
+ {
+ struct fence *f = sync_file->cbs[i].fence;
+ fence_get(f);
+
+ if (f->context != timeline->context &&
+ !fence_is_signaled(f))
+ {
+ signed long ret;
+ ret = fence_wait_timeout(f, 1, timeout);
+
+ if (ret == -ERESTARTSYS)
+ {
+ status = gcvSTATUS_INTERRUPTED;
+ fence_put(f);
+ break;
+ }
+ else if (ret <= 0)
+ {
+ status = gcvSTATUS_TIMEOUT;
+ fence_put(f);
+ break;
+ }
+ else
+ {
+ /* wait success. */
+ timeout -= ret;
+ }
+ }
+
+ fence_put(f);
+ }
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+# else
+
+gceSTATUS
+gckOS_WaitNativeFence(
+ IN gckOS Os,
+ IN gctHANDLE Timeline,
+ IN gctINT FenceFD,
+ IN gctUINT32 Timeout
+ )
+{
+ struct viv_sync_timeline *timeline;
+ gceSTATUS status = gcvSTATUS_OK;
+ unsigned int i;
+ unsigned long timeout;
+ unsigned int numFences;
+ struct dma_fence *fence;
+ struct dma_fence **fences;
+
+ timeline = (struct viv_sync_timeline *) Timeline;
+
+ fence = sync_file_get_fence(FenceFD);
+
+ if (!fence)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ if (dma_fence_is_array(fence))
+ {
+ struct dma_fence_array *array = to_dma_fence_array(fence);
+ fences = array->fences;
+ numFences = array->num_fences;
+ }
+ else
+ {
+ fences = &fence;
+ numFences = 1;
+ }
+
+ timeout = msecs_to_jiffies(Timeout);
+
+ for (i = 0; i < numFences; i++)
+ {
+ struct dma_fence *f = fences[i];
+
+ if(!dma_fence_is_signaled(fence))
+ {
+ signed long ret;
+ ret = dma_fence_wait_timeout(f, 1, timeout);
+
+ if (ret == -ERESTARTSYS)
+ {
+ status = gcvSTATUS_INTERRUPTED;
+ break;
+ }
+ else if (ret <= 0)
+ {
+ status = gcvSTATUS_TIMEOUT;
+ break;
+ }
+ else
+ {
+ /* wait success. */
+ timeout -= ret;
+ }
+ }
+ }
+
+ dma_fence_put(fence);
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+# endif
+# endif
+#endif
+
+#if gcdSECURITY
+gceSTATUS
+gckOS_AllocatePageArray(
+ IN gckOS Os,
+ IN gctPHYS_ADDR Physical,
+ IN gctSIZE_T PageCount,
+ OUT gctPOINTER * PageArrayLogical,
+ OUT gctPHYS_ADDR * PageArrayPhysical
+ )
+{
+ gceSTATUS status = gcvSTATUS_OK;
+ PLINUX_MDL mdl;
+ gctUINT32* table;
+ gctUINT32 offset;
+ gctSIZE_T bytes;
+ gckALLOCATOR allocator;
+
+ gcmkHEADER_ARG("Os=%p Physical=%p PageCount=%u",
+ Os, Physical, PageCount);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(PageCount > 0);
+
+ bytes = PageCount * gcmSIZEOF(gctUINT32);
+ gcmkONERROR(gckOS_AllocateNonPagedMemory(
+ Os,
+ gcvFALSE,
+ gcvALLOC_FLAG_CONTIGUOUS,
+ &bytes,
+ PageArrayPhysical,
+ PageArrayLogical
+ ));
+
+ table = *PageArrayLogical;
+
+ /* Convert pointer to MDL. */
+ mdl = (PLINUX_MDL)Physical;
+
+ allocator = mdl->allocator;
+
+ /* Get all the physical addresses and store them in the page table. */
+
+ offset = 0;
+ PageCount = PageCount / (PAGE_SIZE / 4096);
+
+ /* Try to get the user pages so DMA can happen. */
+ while (PageCount-- > 0)
+ {
+ unsigned long phys = ~0;
+
+ gctPHYS_ADDR_T phys_addr;
+
+ gcmALLOCATOR_Physical(allocator, mdl, offset * PAGE_SIZE, &phys_addr);
+
+ phys = (unsigned long)phys_addr;
+
+ table[offset] = phys & PAGE_MASK;
+
+ offset += 1;
+ }
+
+OnError:
+
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+#endif
+
+gceSTATUS
+gckOS_CPUPhysicalToGPUPhysical(
+ IN gckOS Os,
+ IN gctPHYS_ADDR_T CPUPhysical,
+ IN gctPHYS_ADDR_T * GPUPhysical
+ )
+{
+ gcsPLATFORM * platform;
+ gcmkHEADER_ARG("CPUPhysical=%p", CPUPhysical);
+
+ platform = Os->device->platform;
+
+ if (platform && platform->ops->getGPUPhysical)
+ {
+ gcmkVERIFY_OK(
+ platform->ops->getGPUPhysical(platform, CPUPhysical, GPUPhysical));
+ }
+ else
+ {
+ *GPUPhysical = CPUPhysical;
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_GPUPhysicalToCPUPhysical(
+ IN gckOS Os,
+ IN gctUINT32 GPUPhysical,
+ IN gctPHYS_ADDR_T * CPUPhysical
+ )
+{
+ gcsPLATFORM * platform;
+ gcmkHEADER_ARG("Os=%p GPUPhysical=0x%x", Os, GPUPhysical);
+
+ platform = Os->device->platform;
+
+ if (platform && platform->ops->getCPUPhysical)
+ {
+ gcmkVERIFY_OK(
+ platform->ops->getCPUPhysical(platform, GPUPhysical, CPUPhysical));
+ }
+ else
+ {
+ *CPUPhysical = GPUPhysical;
+ }
+
+ gcmkFOOTER_ARG("CPUPhysical=0x%llx", gcmOPT_VALUE(CPUPhysical));
+ return gcvSTATUS_OK;
+}
+
+static int fd_release(struct inode *inode, struct file *file)
+{
+ gcsFDPRIVATE_PTR private = (gcsFDPRIVATE_PTR)file->private_data;
+
+ return (private && private->release) ? private->release(private) : 0;
+}
+
+static const struct file_operations fd_fops =
+{
+ .release = fd_release,
+};
+
+gceSTATUS
+gckOS_GetFd(
+ IN gctSTRING Name,
+ IN gcsFDPRIVATE_PTR Private,
+ OUT gctINT * Fd
+ )
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+ *Fd = anon_inode_getfd(Name, &fd_fops, Private, O_RDWR);
+
+ if (*Fd < 0)
+ {
+ return gcvSTATUS_OUT_OF_RESOURCES;
+ }
+
+ return gcvSTATUS_OK;
+#else
+ return gcvSTATUS_NOT_SUPPORTED;
+#endif
+}
+
+gceSTATUS
+gckOS_QueryOption(
+ IN gckOS Os,
+ IN gctCONST_STRING Option,
+ OUT gctUINT64 * Value
+ )
+{
+ gckGALDEVICE device = Os->device;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ if (!strcmp(Option, "physBase"))
+ {
+ *Value = device->physBase;
+ }
+ else if (!strcmp(Option, "physSize"))
+ {
+ *Value = device->physSize;
+ }
+ else if (!strcmp(Option, "mmu"))
+ {
+#if gcdSECURITY
+ *Value = 0;
+#else
+ *Value = device->args.enableMmu;
+#endif
+ }
+ else if (!strcmp(Option, "contiguousSize"))
+ {
+ *Value = device->contiguousSize;
+ }
+ else if (!strcmp(Option, "contiguousBase"))
+ {
+ *Value = device->contiguousBase;
+ }
+ 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;
+ }
+ else if (!strcmp(Option, "stuckDump"))
+ {
+ *Value = device->args.stuckDump;
+ }
+ else if (!strcmp(Option, "powerManagement"))
+ {
+ *Value = device->args.powerManagement;
+ }
+ else if (!strcmp(Option, "TA"))
+ {
+ *Value = 0;
+ }
+ else if (!strcmp(Option, "gpuProfiler"))
+ {
+ *Value = device->args.gpuProfiler;
+ }
+ else if (!strcmp(Option, "userClusterMask"))
+ {
+ *Value = device->args.userClusterMask;
+ }
+ else if (!strcmp(Option, "smallBatch"))
+ {
+ *Value = device->args.smallBatch;
+ }
+ else if (!strcmp(Option, "sRAMBases"))
+ {
+ memcpy(Value, device->args.sRAMBases, gcmSIZEOF(gctUINT64) * gcvSRAM_INTER_COUNT * gcvCORE_COUNT);
+ }
+ else if (!strcmp(Option, "sRAMSizes"))
+ {
+ memcpy(Value, device->args.sRAMSizes, gcmSIZEOF(gctUINT32) * gcvSRAM_INTER_COUNT * gcvCORE_COUNT);
+ }
+ else if (!strcmp(Option, "extSRAMBases"))
+ {
+ memcpy(Value, device->args.extSRAMBases, gcmSIZEOF(gctUINT64) * gcvSRAM_EXT_COUNT);
+ }
+ else if (!strcmp(Option, "extSRAMSizes"))
+ {
+ memcpy(Value, device->args.extSRAMSizes, gcmSIZEOF(gctUINT32) * gcvSRAM_EXT_COUNT);
+ }
+ else if (!strcmp(Option, "sRAMRequested"))
+ {
+ *Value = device->args.sRAMRequested;
+ }
+ else if (!strcmp(Option, "sRAMLoopMode"))
+ {
+ *Value = device->args.sRAMLoopMode;
+ }
+ else if (!strcmp(Option, "platformFlagBits"))
+ {
+ *Value = device->platform->flagBits;
+ }
+ else if (!strcmp(Option, "mmuPageTablePool"))
+ {
+ *Value = device->args.mmuPageTablePool;
+ }
+ else if (!strcmp(Option, "mmuDynamicMap"))
+ {
+ *Value = device->args.mmuDynamicMap;
+ }
+ else if (!strcmp(Option, "allMapInOne"))
+ {
+ *Value = device->args.allMapInOne;
+ }
+ else
+ {
+ status = gcvSTATUS_NOT_SUPPORTED;
+ }
+
+ return status;
+}
+
+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(gcmALLOCATOR_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;
+ PLINUX_MDL_MAP mdlMap;
+ gckALLOCATOR allocator;
+ gceSTATUS status = gcvSTATUS_OK;
+ gctBOOL cacheable = gcvFALSE;
+
+ if (!Physical)
+ {
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ mdl = (PLINUX_MDL)Physical;
+ allocator = mdl->allocator;
+
+ if (!allocator->ops->Mmap)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ mutex_lock(&mdl->mapsMutex);
+
+ mdlMap = FindMdlMap(mdl, _GetProcessID());
+ if (mdlMap)
+ {
+ cacheable = mdlMap->cacheable;
+ }
+
+ mutex_unlock(&mdl->mapsMutex);
+
+ gcmkONERROR(gcmALLOCATOR_Mmap(allocator, mdl, cacheable, skipPages, numPages, Vma));
+
+OnError:
+ return status;
+}
+
+/*******************************************************************************
+**
+** gckOS_WrapMemory
+**
+** Import a number of pages allocated by other allocator.
+**
+** INPUT:
+**
+** gckOS Os
+** Pointer to an gckOS object.
+**
+** gctUINT32 Flag
+** Memory type.
+**
+** OUTPUT:
+**
+** gctSIZE_T * Bytes
+** Pointer to a variable that hold the number of bytes allocated.
+**
+** gctPHYS_ADDR * Physical
+** Pointer to a variable that will hold the physical address of the
+** allocation.
+*/
+gceSTATUS
+gckOS_WrapMemory(
+ IN gckOS Os,
+ IN gcsUSER_MEMORY_DESC_PTR Desc,
+ OUT gctSIZE_T *Bytes,
+ OUT gctPHYS_ADDR * Physical,
+ OUT gctBOOL *Contiguous,
+ OUT gctSIZE_T * PageCountCpu
+ )
+{
+ PLINUX_MDL mdl = gcvNULL;
+ gceSTATUS status = gcvSTATUS_OUT_OF_MEMORY;
+ gckALLOCATOR allocator;
+ gcsATTACH_DESC desc;
+ gctSIZE_T bytes = 0;
+
+ gcmkHEADER_ARG("Os=%p ", Os);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Os, gcvOBJ_OS);
+ gcmkVERIFY_ARGUMENT(Physical != gcvNULL);
+ gcmkVERIFY_ARGUMENT(Desc != gcvNULL);
+
+ mdl = _CreateMdl(Os);
+ if (mdl == gcvNULL)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ if (Desc->flag & gcvALLOC_FLAG_DMABUF)
+ {
+ desc.dmaBuf.dmabuf = gcmUINT64_TO_PTR(Desc->dmabuf);
+
+#if defined(CONFIG_DMA_SHARED_BUFFER)
+ {
+ struct dma_buf *dmabuf = (struct dma_buf*)desc.dmaBuf.dmabuf;
+ bytes = dmabuf->size;
+ }
+#endif
+ }
+ else if (Desc->flag & gcvALLOC_FLAG_USERMEMORY)
+ {
+ desc.userMem.memory = gcmUINT64_TO_PTR(Desc->logical);
+ desc.userMem.physical = Desc->physical;
+ desc.userMem.size = Desc->size;
+ bytes = Desc->size;
+ }
+ else if (Desc->flag & gcvALLOC_FLAG_EXTERNAL_MEMORY)
+ {
+ desc.externalMem.info = Desc->externalMemoryInfo;
+ }
+ else
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ /* Walk all allocators. */
+ list_for_each_entry(allocator, &Os->allocatorList, link)
+ {
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_OS,
+ "%s(%d) Flag = %x allocator->capability = %x",
+ __FUNCTION__, __LINE__, Desc->flag, allocator->capability);
+
+ if ((Desc->flag & allocator->capability) != Desc->flag)
+ {
+ status = gcvSTATUS_NOT_SUPPORTED;
+ continue;
+ }
+
+ if (Desc->flag == gcvALLOC_FLAG_EXTERNAL_MEMORY)
+ {
+ /* Use name to match suitable allocator for external memory. */
+ if (!strncmp(Desc->externalMemoryInfo.allocatorName,
+ allocator->name, gcdEXTERNAL_MEMORY_NAME_MAX))
+ {
+ status = gcvSTATUS_NOT_SUPPORTED;
+ continue;
+ }
+ }
+
+ status = gcmALLOCATOR_Attach(allocator, &desc, mdl);
+
+ if (gcmIS_SUCCESS(status))
+ {
+ mdl->allocator = allocator;
+ break;
+ }
+ }
+
+ /* Check status. */
+ gcmkONERROR(status);
+
+ mdl->dmaHandle = 0;
+ mdl->addr = 0;
+
+ mdl->bytes = bytes ? bytes : mdl->numPages * PAGE_SIZE;
+ *Bytes = mdl->bytes;
+
+ /* Return physical address. */
+ *Physical = (gctPHYS_ADDR) mdl;
+
+ *Contiguous = mdl->contiguous;
+
+ if (PageCountCpu)
+ {
+ *PageCountCpu = mdl->numPages;
+ }
+
+ /*
+ * 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. */
+ status = gcvSTATUS_OK;
+
+OnError:
+ if (gcmIS_ERROR(status) && mdl)
+ {
+ /* Free the memory. */
+ _DestroyMdl(mdl);
+ }
+
+ /* Return the status. */
+ gcmkFOOTER_ARG("*Physical=%p", *Physical);
+ return status;
+}
+
+gceSTATUS
+gckOS_GetPolicyID(
+ IN gckOS Os,
+ IN gceVIDMEM_TYPE Type,
+ OUT gctUINT32_PTR PolicyID,
+ OUT gctUINT32_PTR AXIConfig
+ )
+{
+ gcsPLATFORM * platform = Os->device->platform;
+ gceSTATUS status = (platform && platform->ops->getPolicyID)
+ ? platform->ops->getPolicyID(platform, Type, PolicyID, AXIConfig)
+ : gcvSTATUS_NOT_SUPPORTED;
+
+ return status;
+}
+
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
new file mode 100644
index 000000000000..baa5c9cbdc18
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_os.h
@@ -0,0 +1,124 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_os_h_
+#define __gc_hal_kernel_os_h_
+
+typedef struct _LINUX_MDL LINUX_MDL, *PLINUX_MDL;
+typedef struct _LINUX_MDL_MAP LINUX_MDL_MAP, *PLINUX_MDL_MAP;
+
+struct _LINUX_MDL_MAP
+{
+ gctINT pid;
+
+ /* map references. */
+ gctUINT32 count;
+
+ struct vm_area_struct * vma;
+ gctPOINTER vmaAddr;
+ gctBOOL cacheable;
+
+ struct list_head link;
+};
+
+struct _LINUX_MDL
+{
+ gckOS os;
+
+ atomic_t refs;
+
+ /* Kernel address. */
+ char * addr;
+
+ /* Size and covered page count. */
+ size_t bytes;
+ size_t numPages;
+
+ gctBOOL contiguous;
+ dma_addr_t dmaHandle;
+ gctBOOL cacheable;
+
+ struct mutex mapsMutex;
+ struct list_head mapsHead;
+
+ /* Pointer to allocator which allocates memory for this mdl. */
+ void * allocator;
+
+ /* Private data used by allocator. */
+ void * priv;
+
+ uint gid;
+
+ struct list_head link;
+
+ gctBOOL pageUnit1M;
+};
+
+extern PLINUX_MDL_MAP
+FindMdlMap(
+ IN PLINUX_MDL Mdl,
+ IN gctINT PID
+ );
+
+typedef struct _DRIVER_ARGS
+{
+ gctUINT64 InputBuffer;
+ gctUINT64 InputBufferSize;
+ gctUINT64 OutputBuffer;
+ gctUINT64 OutputBufferSize;
+}
+DRIVER_ARGS;
+
+#endif /* __gc_hal_kernel_os_h_ */
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
new file mode 100644
index 000000000000..2e0e809dd346
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_platform.h
@@ -0,0 +1,315 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef _gc_hal_kernel_platform_h_
+#define _gc_hal_kernel_platform_h_
+#include <linux/mm.h>
+#include <linux/platform_device.h>
+#if USE_LINUX_PCIE
+#include <linux/pci.h>
+#endif
+
+typedef struct _gcsMODULE_PARAMETERS
+{
+ gctINT irqs[gcvCORE_COUNT];
+ gctPHYS_ADDR_T registerBases[gcvCORE_COUNT];
+ gctSIZE_T registerSizes[gcvCORE_COUNT];
+ gctINT bars[gcvCORE_COUNT];
+
+ gctPOINTER registerBasesMapped[gcvCORE_COUNT];
+
+ gctUINT chipIDs[gcvCORE_COUNT];
+
+ /* Contiguous memory pool. */
+ gctPHYS_ADDR_T contiguousBase;
+ gctSIZE_T contiguousSize;
+ gctBOOL contiguousRequested;
+
+ /* External memory pool. */
+ gctPHYS_ADDR_T externalBase;
+ gctSIZE_T externalSize;
+
+ /* Per-core SRAM. */
+ gctPHYS_ADDR_T sRAMBases[gcvCORE_COUNT][gcvSRAM_INTER_COUNT];
+ gctUINT32 sRAMSizes[gcvCORE_COUNT][gcvSRAM_INTER_COUNT];
+
+ /* Shared SRAM. */
+ gctPHYS_ADDR_T extSRAMBases[gcvSRAM_EXT_COUNT];
+ gctUINT32 extSRAMSizes[gcvSRAM_EXT_COUNT];
+#if USE_LINUX_PCIE
+ gctUINT32 regOffsets[gcvCORE_COUNT];
+ gctINT32 sRAMBars[gcvSRAM_EXT_COUNT];
+ gctINT32 sRAMOffsets[gcvSRAM_EXT_COUNT];
+#endif
+
+ gctBOOL sRAMRequested;
+ gctUINT32 sRAMLoopMode;
+
+ gctPHYS_ADDR_T baseAddress;
+ gctSIZE_T physSize;
+ gctSIZE_T bankSize;
+
+ gctUINT recovery;
+ gctINT powerManagement;
+
+ gctINT enableMmu;
+ gctINT fastClear;
+ gceCOMPRESSION_OPTION compression;
+ gctUINT gpu3DMinClock;
+ gctUINT userClusterMask;
+ gctUINT smallBatch;
+
+ /* Debug or other information. */
+ gctUINT stuckDump;
+ gctINT gpuProfiler;
+
+ /* device type, 0 for char device, 1 for misc device. */
+ gctUINT deviceType;
+ gctUINT showArgs;
+
+ /* mmu page table pool, 0 mean auto, 1 means virsual*/
+ gctUINT mmuPageTablePool;
+
+ gctUINT mmuDynamicMap;
+ gctUINT allMapInOne;
+}
+gcsMODULE_PARAMETERS;
+
+typedef struct _gcsPLATFORM gcsPLATFORM;
+
+typedef struct _gcsPLATFORM_OPERATIONS
+{
+
+ /*******************************************************************************
+ **
+ ** adjustParam
+ **
+ ** Override content of arguments, if a argument is not changed here, it will
+ ** keep as default value or value set by insmod command line.
+ */
+ gceSTATUS
+ (*adjustParam)(
+ IN gcsPLATFORM * Platform,
+ OUT gcsMODULE_PARAMETERS *Args
+ );
+
+ /*******************************************************************************
+ **
+ ** getPower
+ **
+ ** Prepare power and clock operation.
+ */
+ gceSTATUS
+ (*getPower)(
+ IN gcsPLATFORM * Platform
+ );
+
+ /*******************************************************************************
+ **
+ ** putPower
+ **
+ ** Finish power and clock operation.
+ */
+ gceSTATUS
+ (*putPower)(
+ IN gcsPLATFORM * Platform
+ );
+
+ /*******************************************************************************
+ **
+ ** setPower
+ **
+ ** Set power state of specified GPU.
+ **
+ ** INPUT:
+ **
+ ** gceCORE GPU
+ ** GPU neeed to config.
+ **
+ ** gceBOOL Enable
+ ** Enable or disable power.
+ */
+ gceSTATUS
+ (*setPower)(
+ IN gcsPLATFORM * Platform,
+ IN gceCORE GPU,
+ IN gctBOOL Enable
+ );
+
+ /*******************************************************************************
+ **
+ ** setClock
+ **
+ ** Set clock state of specified GPU.
+ **
+ ** INPUT:
+ **
+ ** gceCORE GPU
+ ** GPU neeed to config.
+ **
+ ** gceBOOL Enable
+ ** Enable or disable clock.
+ */
+ gceSTATUS
+ (*setClock)(
+ IN gcsPLATFORM * Platform,
+ IN gceCORE GPU,
+ IN gctBOOL Enable
+ );
+
+ /*******************************************************************************
+ **
+ ** reset
+ **
+ ** Reset GPU outside.
+ **
+ ** INPUT:
+ **
+ ** gceCORE GPU
+ ** GPU neeed to reset.
+ */
+ gceSTATUS
+ (*reset)(
+ IN gcsPLATFORM * Platform,
+ IN gceCORE GPU
+ );
+
+ /*******************************************************************************
+ **
+ ** getGPUPhysical
+ **
+ ** Convert CPU physical address to GPU physical address if they are
+ ** different.
+ */
+ gceSTATUS
+ (*getGPUPhysical)(
+ IN gcsPLATFORM * Platform,
+ IN gctPHYS_ADDR_T CPUPhysical,
+ OUT gctPHYS_ADDR_T * GPUPhysical
+ );
+
+ /*******************************************************************************
+ **
+ ** getCPUPhysical
+ **
+ ** Convert GPU physical address to CPU physical address if they are
+ ** different.
+ */
+ gceSTATUS
+ (*getCPUPhysical)(
+ IN gcsPLATFORM * Platform,
+ IN gctPHYS_ADDR_T GPUPhysical,
+ OUT gctPHYS_ADDR_T * CPUPhysical
+ );
+
+ /*******************************************************************************
+ **
+ ** adjustProt
+ **
+ ** Override Prot flag when mapping paged memory to userspace.
+ */
+ gceSTATUS
+ (*adjustProt)(
+ IN struct vm_area_struct * vma
+ );
+
+ /*******************************************************************************
+ **
+ ** shrinkMemory
+ **
+ ** Do something to collect memory, eg, act as oom killer.
+ */
+ gceSTATUS
+ (*shrinkMemory)(
+ IN gcsPLATFORM * Platform
+ );
+
+ /*******************************************************************************
+ **
+ ** getPolicyID
+ **
+ ** Get policyID for a specified surface type.
+ */
+ gceSTATUS
+ (*getPolicyID)(
+ IN gcsPLATFORM *Platform,
+ IN gceVIDMEM_TYPE Type,
+ OUT gctUINT32_PTR PolicyID,
+ OUT gctUINT32_PTR AXIConfig
+ );
+}
+gcsPLATFORM_OPERATIONS;
+
+struct _gcsPLATFORM
+{
+ struct platform_device *device;
+ struct platform_driver *driver;
+
+ const char *name;
+ gcsPLATFORM_OPERATIONS* ops;
+
+ /* TODO: Remove AXI-SRAM size from feature database. */
+ gckDEVICE dev;
+
+ /* PLATFORM specific flags */
+ gctUINT32 flagBits;
+
+ void* priv;
+};
+
+int gckPLATFORM_Init(struct platform_driver *pdrv, gcsPLATFORM **platform);
+int gckPLATFORM_Terminate(gcsPLATFORM *platform);
+
+#endif
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_security_channel.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_security_channel.c
new file mode 100644
index 000000000000..4bacdafb9e60
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_security_channel.c
@@ -0,0 +1,426 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include <linux/slab.h>
+
+#include "tee_client_api.h"
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+#define GPU3D_UUID { 0xcc9f80ea, 0xa836, 0x11e3, { 0x9b, 0x07, 0x78, 0x2b, 0xcb, 0x5c, 0xf3, 0xe3 } }
+
+static const TEEC_UUID gpu3d_uuid = GPU3D_UUID;
+TEEC_Context teecContext;
+
+typedef struct _gcsSecurityChannel
+{
+ gckOS os;
+ TEEC_Session session;
+ int * virtual;
+ TEEC_SharedMemory inputBuffer;
+ gctUINT32 bytes;
+ gctPOINTER mutex;
+}
+gcsSecurityChannel;
+
+TEEC_SharedMemory *
+gpu3d_allocate_secure_mem(
+ gckOS Os,
+ unsigned int size
+ )
+{
+ TEEC_Result result;
+ TEEC_Context *context = &teecContext;
+ TEEC_SharedMemory *shm = NULL;
+ void *handle = NULL;
+ gctPHYS_ADDR_T phyAddr;
+ gceSTATUS status;
+ gctSIZE_T bytes = size;
+
+ shm = kmalloc(sizeof(TEEC_SharedMemory), GFP_KERNEL);
+
+ if (NULL == shm)
+ {
+ return NULL;
+ }
+
+ memset(shm, 0, sizeof(TEEC_SharedMemory));
+
+ status = gckOS_AllocatePagedMemory(
+ Os,
+ gcvALLOC_FLAG_SECURITY,
+ &bytes,
+ gcvNULL,
+ (gctPHYS_ADDR *)&handle);
+
+ if (gcmIS_ERROR(status))
+ {
+ kfree(shm);
+ return NULL;
+ }
+
+ status = gckOS_GetPhysicalFromHandle(
+ Os,
+ handle,
+ 0,
+ &phyAddr);
+
+ if (gcmIS_ERROR(status))
+ {
+ kfree(shm);
+ return NULL;
+ }
+
+ /* record the handle into shm->user_data */
+ shm->userdata = handle;
+
+ /* [b] Bulk input buffer. */
+ shm->size = size;
+ shm->flags = TEEC_MEM_INPUT;
+
+ /* Use TEE Client API to register the underlying memory buffer. */
+ shm->phyAddr = (void *)(gctUINT32)phyAddr;
+
+ result = TEEC_RegisterSharedMemory(
+ context,
+ shm);
+
+ if (result != TEEC_SUCCESS)
+ {
+ gckOS_FreePagedMemory(Os, (gctPHYS_ADDR)handle, shm->size);
+ kfree(shm);
+ return NULL;
+ }
+
+ return shm;
+}
+
+void gpu3d_release_secure_mem(
+ gckOS Os,
+ void *shm_handle
+ )
+{
+ TEEC_SharedMemory *shm = shm_handle;
+ void * handle;
+
+ if (!shm)
+ {
+ return;
+ }
+
+ handle = shm->userdata;
+
+ TEEC_ReleaseSharedMemory(shm);
+ gckOS_FreePagedMemory(Os, (gctPHYS_ADDR)handle, shm->size);
+
+ kfree(shm);
+
+ return;
+}
+
+static TEEC_Result gpu3d_session_callback(
+ TEEC_Session* session,
+ uint32_t commandID,
+ TEEC_Operation* operation,
+ void* userdata
+ )
+{
+ gcsSecurityChannel *channel = userdata;
+
+ if (channel == gcvNULL)
+ {
+ return TEEC_ERROR_BAD_PARAMETERS;
+ }
+
+ switch (commandID)
+ {
+ case gcvTA_CALLBACK_ALLOC_SECURE_MEM:
+ {
+ uint32_t size = operation->params[0].value.a;
+ TEEC_SharedMemory *shm = NULL;
+
+ shm = gpu3d_allocate_secure_mem(channel->os, size);
+ if (shm == NULL)
+ {
+ return TEEC_ERROR_OUT_OF_MEMORY;
+ }
+
+ /* use the value to save the pointer in client side */
+ operation->params[0].value.a = (uint32_t)shm;
+ operation->params[0].value.b = (uint32_t)shm->phyAddr;
+
+ break;
+ }
+ case gcvTA_CALLBACK_FREE_SECURE_MEM:
+ {
+ TEEC_SharedMemory *shm = (TEEC_SharedMemory *)operation->params[0].value.a;
+
+ gpu3d_release_secure_mem(channel->os, shm);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return TEEC_SUCCESS;
+}
+
+gceSTATUS
+gckOS_OpenSecurityChannel(
+ IN gckOS Os,
+ IN gceCORE GPU,
+ OUT gctUINT32 *Channel
+ )
+{
+ gceSTATUS status;
+ TEEC_Result result;
+ static bool initialized = gcvFALSE;
+ gcsSecurityChannel *channel = gcvNULL;
+
+ TEEC_Operation operation = {0};
+
+ /* Connect to TEE. */
+ if (initialized == gcvFALSE)
+ {
+ result = TEEC_InitializeContext(NULL, &teecContext);
+
+ if (result != TEEC_SUCCESS)
+ {
+ gcmkONERROR(gcvSTATUS_CHIP_NOT_READY);
+ }
+
+ initialized = gcvTRUE;
+ }
+
+ /* Construct channel. */
+ gcmkONERROR(
+ gckOS_Allocate(Os, gcmSIZEOF(*channel), (gctPOINTER *)&channel));
+
+ gckOS_ZeroMemory(channel, gcmSIZEOF(gcsSecurityChannel));
+
+ channel->os = Os;
+
+ gcmkONERROR(gckOS_CreateMutex(Os, &channel->mutex));
+
+ /* Allocate shared memory for passing gcTA_INTERFACE. */
+ channel->bytes = gcmSIZEOF(gcsTA_INTERFACE);
+ channel->virtual = kmalloc(channel->bytes, GFP_KERNEL | __GFP_NOWARN);
+
+ if (!channel->virtual)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_MEMORY);
+ }
+
+ channel->inputBuffer.size = channel->bytes;
+ channel->inputBuffer.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT;
+ channel->inputBuffer.phyAddr = (void *)virt_to_phys(channel->virtual);
+
+ result = TEEC_RegisterSharedMemory(&teecContext, &channel->inputBuffer);
+
+ if (result != TEEC_SUCCESS)
+ {
+ gcmkONERROR(gcvSTATUS_OUT_OF_RESOURCES);
+ }
+
+ operation.paramTypes = TEEC_PARAM_TYPES(
+ TEEC_VALUE_INPUT,
+ TEEC_NONE,
+ TEEC_NONE,
+ TEEC_NONE);
+
+ operation.params[0].value.a = GPU;
+
+ /* Open session with TEE application. */
+ result = TEEC_OpenSession(
+ &teecContext,
+ &channel->session,
+ &gpu3d_uuid,
+ TEEC_LOGIN_USER,
+ NULL,
+ &operation,
+ NULL);
+
+ /* Prepare callback. */
+ TEEC_RegisterCallback(&channel->session, gpu3d_session_callback, channel);
+
+ *Channel = (gctUINT32)channel;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (channel)
+ {
+ if (channel->virtual)
+ {
+ }
+
+ if (channel->mutex)
+ {
+ gcmkVERIFY_OK(gckOS_DeleteMutex(Os, channel->mutex));
+ }
+
+ gcmkVERIFY_OK(gckOS_Free(Os, channel));
+ }
+
+ return status;
+}
+
+gceSTATUS
+gckOS_CloseSecurityChannel(
+ IN gctUINT32 Channel
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_CallSecurityService(
+ IN gctUINT32 Channel,
+ IN gcsTA_INTERFACE *Interface
+ )
+{
+ gceSTATUS status;
+ TEEC_Result result;
+ gcsSecurityChannel *channel = (gcsSecurityChannel *)Channel;
+ TEEC_Operation operation = {0};
+
+ gcmkHEADER();
+ gcmkVERIFY_ARGUMENT(Channel != 0);
+
+ gckOS_AcquireMutex(channel->os, channel->mutex, gcvINFINITE);
+
+ gckOS_MemCopy(channel->virtual, Interface, channel->bytes);
+
+ operation.paramTypes = TEEC_PARAM_TYPES(
+ TEEC_MEMREF_PARTIAL_INPUT,
+ TEEC_NONE,
+ TEEC_NONE,
+ TEEC_NONE);
+
+ /* Note: we use the updated size in the MemRef output by the encryption. */
+ operation.params[0].memref.parent = &channel->inputBuffer;
+ operation.params[0].memref.offset = 0;
+ operation.params[0].memref.size = sizeof(gcsTA_INTERFACE);
+ operation.started = true;
+
+ /* Start the commit command within the TEE application. */
+ result = TEEC_InvokeCommand(
+ &channel->session,
+ gcvTA_COMMAND_DISPATCH,
+ &operation,
+ NULL);
+
+ gckOS_MemCopy(Interface, channel->virtual, channel->bytes);
+
+ gckOS_ReleaseMutex(channel->os, channel->mutex);
+
+ if (result != TEEC_SUCCESS)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gckOS_InitSecurityChannel(
+ IN gctUINT32 Channel
+ )
+{
+ gceSTATUS status;
+ TEEC_Result result;
+ gcsSecurityChannel *channel = (gcsSecurityChannel *)Channel;
+ TEEC_Operation operation = {0};
+
+ gcmkHEADER();
+ gcmkVERIFY_ARGUMENT(Channel != 0);
+
+ operation.paramTypes = TEEC_PARAM_TYPES(
+ TEEC_MEMREF_PARTIAL_INPUT,
+ TEEC_NONE,
+ TEEC_NONE,
+ TEEC_NONE);
+
+ /* Note: we use the updated size in the MemRef output by the encryption. */
+ operation.params[0].memref.parent = &channel->inputBuffer;
+ operation.params[0].memref.offset = 0;
+ operation.params[0].memref.size = gcmSIZEOF(gcsTA_INTERFACE);
+ operation.started = true;
+
+ /* Start the commit command within the TEE application. */
+ result = TEEC_InvokeCommand(
+ &channel->session,
+ gcvTA_COMMAND_INIT,
+ &operation,
+ NULL);
+
+ if (result != TEEC_SUCCESS)
+ {
+ gcmkONERROR(gcvSTATUS_GENERIC_IO);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_security_channel_emulator.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_security_channel_emulator.c
new file mode 100644
index 000000000000..135c135082a3
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_security_channel_emulator.c
@@ -0,0 +1,116 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+#if gcdENABLE_TRUST_APPLICATION
+
+gceSTATUS
+gckOS_OpenSecurityChannel(
+ IN gckOS Os,
+ IN gceCORE Core,
+ OUT gctUINT32 *Channel
+ )
+{
+ *Channel = Core + 1;
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_InitSecurityChannel(
+ OUT gctUINT32 Channel
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gckOS_CloseSecurityChannel(
+ IN gctUINT32 Channel
+ )
+{
+ return gcvSTATUS_OK;
+}
+
+extern gceSTATUS
+TAEmulator (
+ gceCORE,
+ void *
+ );
+
+gceSTATUS
+gckOS_CallSecurityService(
+ IN gctUINT32 Channel,
+ IN gcsTA_INTERFACE *Interface
+ )
+{
+ gceCORE core;
+ gceSTATUS status;
+ gcmkHEADER();
+ gcmkVERIFY_ARGUMENT(Channel != 0);
+
+ core = (gceCORE)(Channel - 1);
+
+ TAEmulator(core, Interface);
+
+ status = Interface->result;
+
+ gcmkFOOTER();
+ return status;
+}
+
+#endif
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.c
new file mode 100644
index 000000000000..7cd8a768efb9
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.c
@@ -0,0 +1,378 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include <gc_hal.h>
+#include <gc_hal_base.h>
+
+#if gcdLINUX_SYNC_FILE
+
+#include <linux/kernel.h>
+#include <linux/file.h>
+#include <linux/fs.h>
+#include <linux/miscdevice.h>
+#include <linux/module.h>
+#include <linux/syscalls.h>
+#include <linux/uaccess.h>
+#include <linux/slab.h>
+
+#include "gc_hal_kernel_sync.h"
+#include "gc_hal_kernel_linux.h"
+
+#ifndef CONFIG_SYNC_FILE
+
+static struct sync_pt * viv_sync_pt_dup(struct sync_pt *sync_pt)
+{
+ gceSTATUS status;
+ struct viv_sync_pt *pt;
+ struct viv_sync_pt *src;
+ struct viv_sync_timeline *obj;
+
+ src = (struct viv_sync_pt *)sync_pt;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
+ obj = (struct viv_sync_timeline *)sync_pt_parent(sync_pt);
+#else
+ obj = (struct viv_sync_timeline *)sync_pt->parent;
+#endif
+
+ /* Create the new sync_pt. */
+ pt = (struct viv_sync_pt *)
+ sync_pt_create(&obj->obj, sizeof(struct viv_sync_pt));
+
+ pt->stamp = src->stamp;
+
+ /* Reference signal. */
+ status = gckOS_MapSignal(obj->os,
+ src->signal,
+ gcvNULL /* (gctHANDLE) _GetProcessID() */,
+ &pt->signal);
+
+ if (gcmIS_ERROR(status)) {
+ sync_pt_free((struct sync_pt *)pt);
+ return NULL;
+ }
+
+ return (struct sync_pt *)pt;
+}
+
+static int viv_sync_pt_has_signaled(struct sync_pt *sync_pt)
+{
+ gceSTATUS status;
+ struct viv_sync_pt *pt;
+ struct viv_sync_timeline *obj;
+
+ pt = (struct viv_sync_pt *)sync_pt;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
+ obj = (struct viv_sync_timeline *)sync_pt_parent(sync_pt);
+#else
+ obj = (struct viv_sync_timeline *)sync_pt->parent;
+#endif
+
+ status = _QuerySignal(obj->os, pt->signal);
+
+ if (gcmIS_ERROR(status)) {
+ /* Error. */
+ return -1;
+ }
+
+ return (int) status;
+}
+
+static int viv_sync_pt_compare(struct sync_pt *a, struct sync_pt *b)
+{
+ int ret;
+ struct viv_sync_pt *pt1 = (struct viv_sync_pt *)a;
+ struct viv_sync_pt *pt2 = (struct viv_sync_pt *)b;
+
+ ret = (pt1->stamp < pt2->stamp) ? -1
+ : (pt1->stamp == pt2->stamp) ? 0
+ : 1;
+
+ return ret;
+}
+
+static void viv_sync_pt_free(struct sync_pt *sync_pt)
+{
+ struct viv_sync_pt *pt;
+ struct viv_sync_timeline *obj;
+
+ pt = (struct viv_sync_pt *)sync_pt;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
+ obj = (struct viv_sync_timeline *)sync_pt_parent(sync_pt);
+#else
+ obj = (struct viv_sync_timeline *)sync_pt->parent;
+#endif
+
+ gckOS_DestroySignal(obj->os, pt->signal);
+}
+
+static void viv_timeline_value_str(struct sync_timeline *timeline,
+ char *str, int size)
+{
+ struct viv_sync_timeline *obj;
+
+ obj = (struct viv_sync_timeline *)timeline;
+ snprintf(str, size, "stamp_%llu", obj->stamp);
+}
+
+static void viv_pt_value_str(struct sync_pt *sync_pt, char *str, int size)
+{
+ struct viv_sync_pt *pt;
+
+ pt = (struct viv_sync_pt *)sync_pt;
+ snprintf(str, size, "signal_%lu@stamp_%llu",
+ (unsigned long)pt->signal, pt->stamp);
+}
+
+static struct sync_timeline_ops viv_timeline_ops =
+{
+ .driver_name = "viv_gpu_sync",
+ .dup = viv_sync_pt_dup,
+ .has_signaled = viv_sync_pt_has_signaled,
+ .compare = viv_sync_pt_compare,
+ .free_pt = viv_sync_pt_free,
+ .timeline_value_str = viv_timeline_value_str,
+ .pt_value_str = viv_pt_value_str,
+};
+
+struct viv_sync_timeline * viv_sync_timeline_create(const char *name, gckOS os)
+{
+ struct viv_sync_timeline * obj;
+
+ obj = (struct viv_sync_timeline *)
+ sync_timeline_create(&viv_timeline_ops, sizeof(struct viv_sync_timeline), name);
+
+ obj->os = os;
+ obj->stamp = 0;
+
+ return obj;
+}
+
+struct sync_pt * viv_sync_pt_create(struct viv_sync_timeline *obj,
+ gctSIGNAL Signal)
+{
+ gceSTATUS status;
+ struct viv_sync_pt *pt;
+
+ pt = (struct viv_sync_pt *)
+ sync_pt_create(&obj->obj, sizeof(struct viv_sync_pt));
+
+ pt->stamp = obj->stamp++;
+
+ /* Dup signal. */
+ status = gckOS_MapSignal(obj->os,
+ Signal,
+ gcvNULL /* (gctHANDLE) _GetProcessID() */,
+ &pt->signal);
+
+ if (gcmIS_ERROR(status)) {
+ sync_pt_free((struct sync_pt *)pt);
+ return NULL;
+ }
+
+ return (struct sync_pt *)pt;
+}
+
+#else
+
+struct viv_sync_timeline * viv_sync_timeline_create(const char *name, gckOS Os)
+{
+ struct viv_sync_timeline *timeline;
+
+ timeline = kmalloc(sizeof(struct viv_sync_timeline),
+ gcdNOWARN | GFP_KERNEL);
+
+ if (!timeline)
+ return NULL;
+
+ strncpy(timeline->name, name, sizeof(timeline->name) - 1);
+ timeline->context = dma_fence_context_alloc(1);
+ atomic64_set(&timeline->seqno, 0);
+ timeline->os = Os;
+
+ return timeline;
+}
+
+void viv_sync_timeline_destroy(struct viv_sync_timeline *timeline)
+{
+ kfree(timeline);
+}
+
+static const char * viv_fence_get_driver_name(struct dma_fence *fence)
+{
+ return "viv_gpu_sync";
+}
+
+static const char * viv_fence_get_timeline_name(struct dma_fence *fence)
+{
+ struct viv_fence *f = (struct viv_fence *)fence;
+ return f->parent->name;
+}
+
+/* Same as fence_signaled. */
+static inline bool __viv_fence_signaled(struct dma_fence *fence)
+{
+ struct viv_fence *f = (struct viv_fence *)fence;
+ struct viv_sync_timeline *timeline = f->parent;
+ gceSTATUS status;
+
+ status = _QuerySignal(timeline->os, f->signal);
+
+ return (status == gcvSTATUS_TRUE) ? true : false;
+}
+
+static bool viv_fence_enable_signaling(struct dma_fence *fence)
+{
+ /* fence is locked already. */
+ return !__viv_fence_signaled(fence);
+}
+
+static bool viv_fence_signaled(struct dma_fence *fence)
+{
+ /* fence could be locked, could be not. */
+ return __viv_fence_signaled(fence);
+}
+
+static void viv_fence_release(struct dma_fence *fence)
+{
+ struct viv_fence *f = (struct viv_fence *)fence;
+ struct viv_sync_timeline *timeline = f->parent;
+
+ if (f->signal)
+ gckOS_DestroySignal(timeline->os, f->signal);
+
+ kfree(fence);
+}
+
+static struct dma_fence_ops viv_fence_ops =
+{
+ .get_driver_name = viv_fence_get_driver_name,
+ .get_timeline_name = viv_fence_get_timeline_name,
+ .enable_signaling = viv_fence_enable_signaling,
+ .signaled = viv_fence_signaled,
+ .wait = dma_fence_default_wait,
+ .release = viv_fence_release,
+};
+
+struct dma_fence * viv_fence_create(struct viv_sync_timeline *timeline,
+ gcsSIGNAL *signal)
+{
+ gceSTATUS status;
+ struct viv_fence *fence;
+ struct dma_fence *old_fence = NULL;
+ unsigned seqno;
+
+ fence = kzalloc(sizeof(struct viv_fence), gcdNOWARN | GFP_KERNEL);
+
+ if (!fence)
+ return NULL;
+
+ /* Reference signal in fence. */
+ status = gckOS_MapSignal(timeline->os, (gctSIGNAL)(uintptr_t)signal->id,
+ NULL, &fence->signal);
+
+ if (gcmIS_ERROR(status)) {
+ kfree(fence);
+ return NULL;
+ }
+
+ spin_lock_init(&fence->lock);
+
+ fence->parent = timeline;
+
+ seqno = (unsigned)atomic64_inc_return(&timeline->seqno);
+
+ dma_fence_init((struct dma_fence *)fence, &viv_fence_ops,
+ &fence->lock, timeline->context, seqno);
+
+ /*
+ * Reference fence in signal.
+ * Be aware of recursive reference!!
+ */
+ spin_lock(&signal->lock);
+
+ if (signal->fence) {
+ old_fence = signal->fence;
+ signal->fence = NULL;
+ }
+
+ if (!signal->done) {
+ signal->fence = (struct dma_fence*)fence;
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,9,68)
+ dma_fence_get((struct dma_fence*)fence);
+#endif
+ }
+
+ spin_unlock(&signal->lock);
+
+ if (old_fence)
+ dma_fence_put(old_fence);
+
+ if (!signal->fence) {
+ /* Fence already signaled. */
+ gckOS_DestroySignal(timeline->os, fence->signal);
+ fence->signal = NULL;
+
+ dma_fence_signal_locked((struct dma_fence*)fence);
+ dma_fence_put((struct dma_fence*)fence);
+ fence = NULL;
+ }
+
+ return (struct dma_fence*)fence;
+}
+
+#endif
+
+#endif
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.h b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.h
new file mode 100644
index 000000000000..f83822decd40
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/gc_hal_kernel_sync.h
@@ -0,0 +1,151 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef __gc_hal_kernel_sync_h_
+#define __gc_hal_kernel_sync_h_
+
+#include <linux/types.h>
+
+#ifndef CONFIG_SYNC_FILE
+
+/* sync.h is in drivers/staging/android/ for now. */
+#include <sync.h>
+
+#include <gc_hal.h>
+#include <gc_hal_base.h>
+
+struct viv_sync_timeline
+{
+ /* Parent object. */
+ struct sync_timeline obj;
+
+ /* Timestamp when sync_pt is created. */
+ gctUINT64 stamp;
+
+ /* Pointer to os struct. */
+ gckOS os;
+};
+
+
+struct viv_sync_pt
+{
+ /* Parent object. */
+ struct sync_pt pt;
+
+ /* Reference signal. */
+ gctSIGNAL signal;
+
+ /* Timestamp when sync_pt is created. */
+ gctUINT64 stamp;
+};
+
+/* Create viv_sync_timeline object. */
+struct viv_sync_timeline * viv_sync_timeline_create(const char *name, gckOS Os);
+
+/* Create viv_sync_pt object. */
+struct sync_pt * viv_sync_pt_create(struct viv_sync_timeline *obj,
+ gctSIGNAL signal);
+
+#else
+
+#include <linux/sync_file.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)
+# include <linux/fence.h>
+# include <linux/fence-array.h>
+#else
+# include <linux/dma-fence.h>
+# include <linux/dma-fence-array.h>
+#endif
+
+#include <gc_hal.h>
+#include <gc_hal_base.h>
+#include "gc_hal_kernel_linux.h"
+
+struct viv_sync_timeline
+{
+ char name[64];
+
+ /* Parent object. */
+ u64 context;
+
+ /* Timestamp when sync_pt is created. */
+ atomic64_t seqno;
+
+ /* Pointer to os struct. */
+ gckOS os;
+};
+
+struct viv_fence
+{
+ /* must be the first. */
+ struct dma_fence base;
+ spinlock_t lock;
+
+ struct viv_sync_timeline *parent;
+
+ /* link with signal. */
+ gctSIGNAL signal;
+};
+
+struct viv_sync_timeline * viv_sync_timeline_create(const char *name, gckOS Os);
+
+void viv_sync_timeline_destroy(struct viv_sync_timeline *timeline);
+
+struct dma_fence * viv_fence_create(struct viv_sync_timeline *timeline,
+ gcsSIGNAL *signal);
+
+#endif
+
+#endif /* __gc_hal_kernel_sync_h_ */
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/default/gc_hal_kernel_platform_default.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/default/gc_hal_kernel_platform_default.c
new file mode 100644
index 000000000000..7c915df698e2
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/default/gc_hal_kernel_platform_default.c
@@ -0,0 +1,450 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_platform.h"
+
+/* Disable MSI for internal FPGA build except PPC */
+#if gcdFPGA_BUILD && !defined(CONFIG_PPC)
+#define USE_MSI 0
+#else
+#define USE_MSI 1
+#endif
+
+gceSTATUS
+_AdjustParam(
+ IN gcsPLATFORM *Platform,
+ OUT gcsMODULE_PARAMETERS *Args
+ );
+
+gceSTATUS
+_GetGPUPhysical(
+ IN gcsPLATFORM * Platform,
+ IN gctPHYS_ADDR_T CPUPhysical,
+ OUT gctPHYS_ADDR_T *GPUPhysical
+ );
+
+static struct _gcsPLATFORM_OPERATIONS default_ops =
+{
+ .adjustParam = _AdjustParam,
+ .getGPUPhysical = _GetGPUPhysical,
+};
+
+#if USE_LINUX_PCIE
+
+#define MAX_PCIE_DEVICE 4
+#define MAX_PCIE_BAR 6
+
+typedef struct _gcsBARINFO
+{
+ gctPHYS_ADDR_T base;
+ gctSIZE_T size;
+ gctPOINTER logical;
+}
+gcsBARINFO, *gckBARINFO;
+
+struct _gcsPCIEInfo
+{
+ gcsBARINFO bar[MAX_PCIE_BAR];
+ struct pci_dev *pdev;
+ gctPHYS_ADDR_T sram_bases[gcvSRAM_EXT_COUNT];
+ gctPHYS_ADDR_T sram_gpu_bases[gcvSRAM_EXT_COUNT];
+ uint32_t sram_sizes[gcvSRAM_EXT_COUNT];
+ int sram_bars[gcvSRAM_EXT_COUNT];
+ int sram_offsets[gcvSRAM_EXT_COUNT];
+};
+
+struct _gcsPLATFORM_PCIE
+{
+ struct _gcsPLATFORM base;
+ struct _gcsPCIEInfo pcie_info[MAX_PCIE_DEVICE];
+ unsigned int device_number;
+};
+
+
+struct _gcsPLATFORM_PCIE default_platform =
+{
+ .base =
+ {
+ .name = __FILE__,
+ .ops = &default_ops,
+ },
+};
+
+void
+_QueryBarInfo(
+ struct pci_dev *Pdev,
+ gctPHYS_ADDR_T *BarAddr,
+ gctSIZE_T *BarSize,
+ gctUINT BarNum
+ )
+{
+ gctUINT addr;
+ gctUINT size;
+
+ /* Read the bar address */
+ if (pci_read_config_dword(Pdev, PCI_BASE_ADDRESS_0 + BarNum * 0x4, &addr) < 0)
+ {
+ return;
+ }
+
+ /* Read the bar size */
+ if (pci_write_config_dword(Pdev, PCI_BASE_ADDRESS_0 + BarNum * 0x4, 0xffffffff) < 0)
+ {
+ return;
+ }
+
+ if (pci_read_config_dword(Pdev, PCI_BASE_ADDRESS_0 + BarNum * 0x4, &size) < 0)
+ {
+ return;
+ }
+
+ size &= 0xfffffff0;
+ size = ~size;
+ size += 1;
+
+ /* Write back the bar address */
+ if (pci_write_config_dword(Pdev, PCI_BASE_ADDRESS_0 + BarNum * 0x4, addr) < 0)
+ {
+ return;
+ }
+
+ gcmkPRINT("Bar%d addr=0x%x size=0x%x", BarNum, addr, size);
+
+ *BarAddr = addr;
+ *BarSize = size;
+}
+
+#else
+
+static struct _gcsPLATFORM default_platform =
+{
+ .name = __FILE__,
+ .ops = &default_ops,
+};
+#endif
+
+gceSTATUS
+_AdjustParam(
+ IN gcsPLATFORM *Platform,
+ OUT gcsMODULE_PARAMETERS *Args
+ )
+{
+#if USE_LINUX_PCIE
+ struct _gcsPLATFORM_PCIE *pcie_platform = (struct _gcsPLATFORM_PCIE *)Platform;
+ struct pci_dev *pdev = pcie_platform->pcie_info[0].pdev;
+ unsigned char irqline = pdev->irq;
+ unsigned int i;
+
+ unsigned int dev_index, core_index = 0;
+ int sram_bar, sram_offset;
+
+ if (Args->irqs[gcvCORE_2D] != -1)
+ {
+ Args->irqs[gcvCORE_2D] = irqline;
+ }
+ if (Args->irqs[gcvCORE_MAJOR] != -1)
+ {
+ Args->irqs[gcvCORE_MAJOR] = irqline;
+ }
+
+ for (dev_index = 0; dev_index < pcie_platform->device_number; dev_index++)
+ {
+ struct pci_dev * pcieDev = pcie_platform->pcie_info[dev_index].pdev;
+
+ for (i = 0; i < MAX_PCIE_BAR; i++)
+ {
+ _QueryBarInfo(
+ pcieDev,
+ &pcie_platform->pcie_info[dev_index].bar[i].base,
+ &pcie_platform->pcie_info[dev_index].bar[i].size,
+ i
+ );
+ }
+
+ for (i = 0; i < gcvCORE_COUNT; i++)
+ {
+ if (Args->bars[i] != -1)
+ {
+ Args->irqs[core_index] = pcieDev->irq;
+
+ /* VIV bitfile: Merge last 4 cores to last one bar to support 8 cores. */
+ if (Args->bars[i] == 5)
+ {
+ Args->registerBasesMapped[4] =
+ pcie_platform->pcie_info[dev_index].bar[i].logical =
+ (gctPOINTER)pci_iomap(pcieDev, Args->bars[i], 0x500000);
+ Args->registerBasesMapped[5] = Args->registerBasesMapped[4] + 0x100000;
+ Args->registerBasesMapped[6] = Args->registerBasesMapped[5] + 0x100000;
+ Args->registerBasesMapped[7] = Args->registerBasesMapped[6] + 0x100000;
+
+ Args->irqs[5] =
+ Args->irqs[6] =
+ Args->irqs[7] = Args->irqs[4];
+
+ continue;
+ }
+
+ if (Args->regOffsets[i])
+ {
+ gcmkASSERT(Args->regOffsets[i] + Args->registerSizes[core_index]
+ < pcie_platform->pcie_info[dev_index].bar[Args->bars[i]].size);
+ }
+
+ Args->registerBasesMapped[core_index] =
+ pcie_platform->pcie_info[dev_index].bar[i].logical =
+ (gctPOINTER)pci_iomap(pcieDev, Args->bars[i], Args->registerSizes[core_index] + Args->regOffsets[i]) + Args->regOffsets[i];
+
+ core_index++;
+ }
+ }
+
+ for (i = 0; i < gcvSRAM_EXT_COUNT; i++)
+ {
+ pcie_platform->pcie_info[dev_index].sram_bases[i] =
+ pcie_platform->pcie_info[dev_index].sram_gpu_bases[i] = Args->extSRAMBases[i];
+
+ pcie_platform->pcie_info[dev_index].sram_sizes[i] = Args->extSRAMSizes[i];
+
+ pcie_platform->pcie_info[dev_index].sram_bars[i] = sram_bar = Args->sRAMBars[i];
+ pcie_platform->pcie_info[dev_index].sram_offsets[i] = sram_offset = Args->sRAMOffsets[i];
+
+ /* Get CPU view SRAM base address from bar address and bar inside offset. */
+ if (sram_bar != -1 && sram_offset != -1)
+ {
+ pcie_platform->pcie_info[dev_index].sram_bases[i] = Args->extSRAMBases[i]
+ = pcie_platform->pcie_info[dev_index].bar[sram_bar].base
+ + sram_offset;
+ }
+ }
+ }
+
+ Args->contiguousRequested = gcvTRUE;
+#endif
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+_GetGPUPhysical(
+ IN gcsPLATFORM * Platform,
+ IN gctPHYS_ADDR_T CPUPhysical,
+ OUT gctPHYS_ADDR_T *GPUPhysical
+ )
+{
+#if USE_LINUX_PCIE
+ struct _gcsPLATFORM_PCIE *pcie_platform = (struct _gcsPLATFORM_PCIE *)Platform;
+ /* Only support 1 external shared SRAM currently. */
+ gctPHYS_ADDR_T sram_base = pcie_platform->pcie_info[0].sram_bases[0];
+ gctPHYS_ADDR_T sram_gpu_base = pcie_platform->pcie_info[0].sram_gpu_bases[0];
+ uint32_t sram_size = pcie_platform->pcie_info[0].sram_sizes[0];
+
+ /* TODO: We should always set axi sram size by insmod parameters, never from feature database. */
+ if (!sram_size && Platform->dev && Platform->dev->extSRAMSizes[0])
+ {
+ sram_size = Platform->dev->extSRAMSizes[0];
+ }
+
+ if (sram_base != gcvINVALID_PHYSICAL_ADDRESS && sram_gpu_base != gcvINVALID_PHYSICAL_ADDRESS && sram_size)
+ {
+ if ((CPUPhysical >= sram_base) && (CPUPhysical < (sram_base + sram_size)))
+ {
+ *GPUPhysical = CPUPhysical - sram_base + sram_gpu_base;
+ }
+ else
+ {
+ *GPUPhysical = CPUPhysical;
+ }
+ }
+ else
+#endif
+ {
+ *GPUPhysical = CPUPhysical;
+ }
+
+ return gcvSTATUS_OK;
+}
+
+#if USE_LINUX_PCIE
+static const struct pci_device_id vivpci_ids[] = {
+ {
+ .class = 0x000000,
+ .class_mask = 0x000000,
+ .vendor = 0x10ee,
+ .device = 0x7012,
+ .subvendor = PCI_ANY_ID,
+ .subdevice = PCI_ANY_ID,
+ .driver_data = 0
+ }, { /* End: all zeroes */ }
+};
+
+MODULE_DEVICE_TABLE(pci, vivpci_ids);
+
+
+static int gpu_sub_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
+ static u64 dma_mask = DMA_BIT_MASK(40);
+#else
+ static u64 dma_mask = DMA_40BIT_MASK;
+#endif
+
+ gcmkPRINT("PCIE DRIVER PROBED");
+ if (pci_enable_device(pdev)) {
+ printk(KERN_ERR "galcore: pci_enable_device() failed.\n");
+ }
+
+ if (pci_set_dma_mask(pdev, dma_mask)) {
+ printk(KERN_ERR "galcore: Failed to set DMA mask.\n");
+ }
+
+ pci_set_master(pdev);
+
+ if (pci_request_regions(pdev, "galcore")) {
+ printk(KERN_ERR "galcore: Failed to get ownership of BAR region.\n");
+ }
+
+#if USE_MSI
+ if (pci_enable_msi(pdev)) {
+ printk(KERN_ERR "galcore: Failed to enable MSI.\n");
+ }
+#endif
+ default_platform.pcie_info[default_platform.device_number++].pdev = pdev;
+ return 0;
+}
+
+static void gpu_sub_remove(struct pci_dev *pdev)
+{
+ pci_set_drvdata(pdev, NULL);
+#if USE_MSI
+ pci_disable_msi(pdev);
+#endif
+ pci_clear_master(pdev);
+ pci_release_regions(pdev);
+ pci_disable_device(pdev);
+ return;
+}
+
+static struct pci_driver gpu_pci_subdriver = {
+ .name = DEVICE_NAME,
+ .id_table = vivpci_ids,
+ .probe = gpu_sub_probe,
+ .remove = gpu_sub_remove
+};
+
+#endif
+
+static struct platform_device *default_dev;
+
+int gckPLATFORM_Init(struct platform_driver *pdrv,
+ struct _gcsPLATFORM **platform)
+{
+ int ret;
+ default_dev = platform_device_alloc(pdrv->driver.name, -1);
+
+ if (!default_dev) {
+ printk(KERN_ERR "galcore: platform_device_alloc failed.\n");
+ return -ENOMEM;
+ }
+
+ /* Add device */
+ ret = platform_device_add(default_dev);
+ if (ret) {
+ printk(KERN_ERR "galcore: platform_device_add failed.\n");
+ goto put_dev;
+ }
+
+ *platform = (gcsPLATFORM *)&default_platform;
+
+#if USE_LINUX_PCIE
+ ret = pci_register_driver(&gpu_pci_subdriver);
+#endif
+
+ return 0;
+
+put_dev:
+ platform_device_put(default_dev);
+
+ return ret;
+}
+
+int gckPLATFORM_Terminate(struct _gcsPLATFORM *platform)
+{
+ if (default_dev) {
+ platform_device_unregister(default_dev);
+ default_dev = NULL;
+ }
+
+#if USE_LINUX_PCIE
+ {
+ unsigned int dev_index;
+ struct _gcsPLATFORM_PCIE *pcie_platform = (struct _gcsPLATFORM_PCIE *)platform;
+ for (dev_index = 0; dev_index < pcie_platform->device_number; dev_index++)
+ {
+ unsigned int i;
+ for (i = 0; i < MAX_PCIE_BAR; i++)
+ {
+ if (pcie_platform->pcie_info[dev_index].bar[i].logical != 0)
+ {
+ pci_iounmap(pcie_platform->pcie_info[dev_index].pdev, pcie_platform->pcie_info[dev_index].bar[i].logical);
+ }
+ }
+ }
+
+ pci_unregister_driver(&gpu_pci_subdriver);
+ }
+#endif
+
+ return 0;
+}
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/default/gc_hal_kernel_platform_default.config b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/default/gc_hal_kernel_platform_default.config
new file mode 100644
index 000000000000..cef4f6f40740
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/default/gc_hal_kernel_platform_default.config
@@ -0,0 +1,3 @@
+ifeq ($(USE_LINUX_PCIE), 1)
+EXTRA_CFLAGS +=-DgcdIRQ_SHARED
+endif
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.c b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.c
new file mode 100644
index 000000000000..819bed064094
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.c
@@ -0,0 +1,1838 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_kernel_linux.h"
+#include "gc_hal_kernel_platform.h"
+#include "gc_hal_kernel_device.h"
+#include "gc_hal_driver.h"
+#include <linux/slab.h>
+
+#if defined(CONFIG_PM_OPP)
+#include <linux/pm_opp.h>
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+# include <linux/of_platform.h>
+# include <linux/of_gpio.h>
+# include <linux/of_address.h>
+#endif
+
+#if USE_PLATFORM_DRIVER
+# include <linux/platform_device.h>
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0)
+# define IMX_GPU_SUBSYSTEM 1
+# include <linux/component.h>
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0)
+# include <mach/viv_gpu.h>
+#elif defined (CONFIG_PM)
+# include <linux/pm_runtime.h>
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
+# include <mach/busfreq.h>
+# elif LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 29)
+# include <linux/busfreq-imx6.h>
+# include <linux/reset.h>
+# else
+# include <linux/busfreq-imx.h>
+# include <linux/reset.h>
+# endif
+#endif
+
+#include <linux/clk.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)
+#include <linux/firmware/imx/ipc.h>
+#include <linux/firmware/imx/svc/misc.h>
+#include <dt-bindings/firmware/imx/rsrc.h>
+static struct imx_sc_ipc *gpu_ipcHandle;
+#elif defined(IMX8_SCU_CONTROL)
+#include <soc/imx8/sc/sci.h>
+static sc_ipc_t gpu_ipcHandle;
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
+# include <mach/hardware.h>
+#endif
+
+#include <linux/pm_runtime.h>
+#include <linux/regulator/consumer.h>
+
+#ifdef CONFIG_DEVICE_THERMAL
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+# include <linux/device_cooling.h>
+# define REG_THERMAL_NOTIFIER(a) register_devfreq_cooling_notifier(a);
+# define UNREG_THERMAL_NOTIFIER(a) unregister_devfreq_cooling_notifier(a);
+# else
+extern int register_thermal_notifier(struct notifier_block *nb);
+extern int unregister_thermal_notifier(struct notifier_block *nb);
+# define REG_THERMAL_NOTIFIER(a) register_thermal_notifier(a);
+# define UNREG_THERMAL_NOTIFIER(a) unregister_thermal_notifier(a);
+# endif
+#endif
+
+#ifndef gcdFSL_CONTIGUOUS_SIZE
+# define gcdFSL_CONTIGUOUS_SIZE (4 << 20)
+#endif
+
+static int initgpu3DMinClock = 1;
+module_param(initgpu3DMinClock, int, 0644);
+
+struct platform_device *pdevice;
+
+#ifdef CONFIG_GPU_LOW_MEMORY_KILLER
+# include <linux/kernel.h>
+# include <linux/mm.h>
+# include <linux/oom.h>
+# include <linux/sched.h>
+# include <linux/profile.h>
+
+struct task_struct *lowmem_deathpending;
+
+static int
+task_notify_func(struct notifier_block *self, unsigned long val, void *data);
+
+static struct notifier_block task_nb = {
+ .notifier_call = task_notify_func,
+};
+
+static int
+task_notify_func(struct notifier_block *self, unsigned long val, void *data)
+{
+ struct task_struct *task = data;
+
+ if (task == lowmem_deathpending)
+ lowmem_deathpending = NULL;
+
+ return NOTIFY_DONE;
+}
+
+extern struct task_struct *lowmem_deathpending;
+static unsigned long lowmem_deathpending_timeout;
+
+static int force_contiguous_lowmem_shrink(IN gckKERNEL Kernel)
+{
+ struct task_struct *p;
+ struct task_struct *selected = NULL;
+ int tasksize;
+ int ret = -1;
+ int min_adj = 0;
+ int selected_tasksize = 0;
+ int selected_oom_adj;
+ /*
+ * If we already have a death outstanding, then
+ * bail out right away; indicating to vmscan
+ * that we have nothing further to offer on
+ * this pass.
+ *
+ */
+ if (lowmem_deathpending &&
+ time_before_eq(jiffies, lowmem_deathpending_timeout))
+ return 0;
+ selected_oom_adj = min_adj;
+
+ rcu_read_lock();
+
+ for_each_process(p) {
+ struct mm_struct *mm;
+ struct signal_struct *sig;
+ gcuDATABASE_INFO info;
+ int oom_adj;
+
+ task_lock(p);
+ mm = p->mm;
+ sig = p->signal;
+
+ if (!mm || !sig) {
+ task_unlock(p);
+ continue;
+ }
+
+ oom_adj = sig->oom_score_adj;
+
+ if (oom_adj < min_adj) {
+ task_unlock(p);
+ continue;
+ }
+
+ tasksize = 0;
+ task_unlock(p);
+
+ rcu_read_unlock();
+
+ if (gckKERNEL_QueryProcessDB(Kernel, p->pid, gcvFALSE, gcvDB_VIDEO_MEMORY, &info) == gcvSTATUS_OK) {
+ tasksize += info.counters.bytes / PAGE_SIZE;
+ }
+
+ rcu_read_lock();
+
+ if (tasksize <= 0)
+ continue;
+
+ printk("<gpu> pid %d (%s), adj %d, size %d \n", p->pid, p->comm, oom_adj, tasksize);
+
+ if (selected) {
+ if (oom_adj < selected_oom_adj)
+ continue;
+ if (oom_adj == selected_oom_adj &&
+ tasksize <= selected_tasksize)
+ continue;
+ }
+ selected = p;
+ selected_tasksize = tasksize;
+ selected_oom_adj = oom_adj;
+ }
+
+ if (selected && selected_oom_adj > 0) {
+ printk("<gpu> send sigkill to %d (%s), adj %d, size %d\n",
+ selected->pid, selected->comm,
+ selected_oom_adj, selected_tasksize);
+ lowmem_deathpending = selected;
+ lowmem_deathpending_timeout = jiffies + HZ;
+ force_sig(SIGKILL, selected);
+ ret = 0;
+ }
+
+ rcu_read_unlock();
+ return ret;
+}
+
+extern gckKERNEL
+_GetValidKernel(
+ gckGALDEVICE Device
+ );
+
+static gceSTATUS
+_ShrinkMemory(
+ IN gcsPLATFORM * Platform
+ )
+{
+ struct platform_device *pdev;
+ gckGALDEVICE galDevice;
+ gckKERNEL kernel;
+ gceSTATUS status = gcvSTATUS_OK;
+
+ pdev = Platform->device;
+
+ galDevice = platform_get_drvdata(pdev);
+
+ kernel = _GetValidKernel(galDevice);
+
+ if (kernel != gcvNULL)
+ {
+ if (force_contiguous_lowmem_shrink(kernel) != 0)
+ status = gcvSTATUS_OUT_OF_MEMORY;
+ }
+ else
+ {
+ printk("%s: can't find kernel!\n", __FUNCTION__);
+ }
+
+ return status;
+}
+#endif
+
+#if gcdENABLE_FSCALE_VAL_ADJUST && (defined(CONFIG_DEVICE_THERMAL) || defined(CONFIG_DEVICE_THERMAL_MODULE))
+static int thermal_hot_pm_notify(struct notifier_block *nb, unsigned long event,
+ void *dummy)
+{
+ static gctUINT orgFscale, minFscale, maxFscale;
+ static gctBOOL bAlreadyTooHot = gcvFALSE;
+ gckHARDWARE hardware;
+ gckGALDEVICE galDevice;
+
+ galDevice = platform_get_drvdata(pdevice);
+ if (!galDevice)
+ {
+ /* GPU is not ready, so it is meaningless to change GPU freq. */
+ return NOTIFY_OK;
+ }
+
+ if (!galDevice->kernels[gcvCORE_MAJOR])
+ {
+ return NOTIFY_OK;
+ }
+
+ hardware = galDevice->kernels[gcvCORE_MAJOR]->hardware;
+
+ if (!hardware)
+ {
+ return NOTIFY_OK;
+ }
+
+ if (event && !bAlreadyTooHot) {
+ gckHARDWARE_GetFscaleValue(hardware,&orgFscale,&minFscale, &maxFscale);
+ gckHARDWARE_SetFscaleValue(hardware, minFscale, ~0U);
+ bAlreadyTooHot = gcvTRUE;
+ printk("System is too hot. GPU3D will work at %d/64 clock.\n", minFscale);
+ } else if (!event && bAlreadyTooHot) {
+ gckHARDWARE_SetFscaleValue(hardware, orgFscale, ~0U);
+ printk("Hot alarm is canceled. GPU3D clock will return to %d/64\n", orgFscale);
+ bAlreadyTooHot = gcvFALSE;
+ }
+ return NOTIFY_OK;
+}
+
+static struct notifier_block thermal_hot_pm_notifier =
+{
+ .notifier_call = thermal_hot_pm_notify,
+};
+
+static ssize_t gpu3DMinClock_show(struct device_driver *dev, char *buf)
+{
+ gctUINT currentf = 0, minf = 0, maxf = 0;
+ gckGALDEVICE galDevice;
+
+ galDevice = platform_get_drvdata(pdevice);
+
+ if (galDevice->kernels[gcvCORE_MAJOR])
+ {
+ gckHARDWARE_GetFscaleValue(galDevice->kernels[gcvCORE_MAJOR]->hardware,
+ &currentf, &minf, &maxf);
+ }
+
+ snprintf(buf, PAGE_SIZE, "%d\n", minf);
+ return strlen(buf);
+}
+
+static ssize_t gpu3DMinClock_store(struct device_driver *dev, const char *buf, size_t count)
+{
+
+ gctINT fields;
+ gctUINT MinFscaleValue;
+ gckGALDEVICE galDevice;
+
+ galDevice = platform_get_drvdata(pdevice);
+
+ if (galDevice->kernels[gcvCORE_MAJOR])
+ {
+ fields = sscanf(buf, "%d", &MinFscaleValue);
+
+ if (fields < 1)
+ return -EINVAL;
+
+ gckHARDWARE_SetMinFscaleValue(galDevice->kernels[gcvCORE_MAJOR]->hardware,MinFscaleValue);
+ }
+
+ return count;
+}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+static DRIVER_ATTR_RW(gpu3DMinClock);
+#else
+static DRIVER_ATTR(gpu3DMinClock, S_IRUGO | S_IWUSR, gpu3DMinClock_show, gpu3DMinClock_store);
+#endif
+
+static ssize_t gpu3DClockScale_show(struct device_driver *dev, char *buf)
+{
+ gctUINT currentf = 0, minf = 0, maxf = 0;
+ gckGALDEVICE galDevice;
+
+ galDevice = platform_get_drvdata(pdevice);
+
+ if (galDevice->kernels[gcvCORE_MAJOR])
+ {
+ gckHARDWARE_GetFscaleValue(galDevice->kernels[gcvCORE_MAJOR]->hardware,
+ &currentf, &minf, &maxf);
+ }
+
+ snprintf(buf, PAGE_SIZE, "%d\n", currentf);
+ return strlen(buf);
+}
+
+static ssize_t gpu3DClockScale_store(struct device_driver *dev, const char *buf, size_t count)
+{
+
+ gctINT fields;
+ gctUINT FscaleValue;
+ gckGALDEVICE galDevice;
+ gctUINT core = gcvCORE_MAJOR;
+
+ galDevice = platform_get_drvdata(pdevice);
+ if (!galDevice)
+ return -EINVAL;
+
+ fields = sscanf(buf, "%d", &FscaleValue);
+
+ if (fields < 1)
+ return -EINVAL;
+
+ while (galDevice->kernels[core] && core <= gcvCORE_3D_MAX)
+ {
+ gckHARDWARE_SetFscaleValue(galDevice->kernels[core++]->hardware,FscaleValue,FscaleValue);
+ }
+
+ return count;
+}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+static DRIVER_ATTR_RW(gpu3DClockScale);
+#else
+static DRIVER_ATTR(gpu3DClockScale, S_IRUGO | S_IWUSR, gpu3DClockScale_show, gpu3DClockScale_store);
+#endif
+
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+static const struct of_device_id mxs_gpu_dt_ids[] = {
+#ifdef IMX_GPU_SUBSYSTEM
+ { .compatible = "fsl,imx8-gpu-ss", },
+#endif
+ { .compatible = "fsl,imx6q-gpu", }, /*Backward Compatiblity */
+ {/* sentinel */}
+};
+MODULE_DEVICE_TABLE(of, mxs_gpu_dt_ids);
+#endif
+
+struct gpu_clk
+{
+ struct clk *clk_core;
+ struct clk *clk_shader;
+ struct clk *clk_axi;
+ struct clk *clk_ahb;
+};
+
+#if defined(CONFIG_PM_OPP)
+typedef enum _GOVERN_MODE
+{
+ OVERDRIVE,
+ NOMINAL,
+ UNDERDRIVE,
+ GOVERN_COUNT
+}
+GOVERN_MODE;
+
+static const char *govern_modes[] =
+{
+ "overdrive",
+ "nominal",
+ "underdrive"
+};
+
+struct gpu_govern
+{
+ unsigned long core_clk_freq[GOVERN_COUNT];
+ unsigned long shader_clk_freq[GOVERN_COUNT];
+ struct device* dev;
+ int num_modes;
+ int current_mode;
+};
+#endif
+
+struct imx_priv
+{
+ struct gpu_clk imx_gpu_clks[gcdMAX_GPU_COUNT];
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ /*Power management.*/
+ struct regulator *gpu_regulator;
+# endif
+#endif
+ /*Run time pm*/
+ struct device *pmdev[gcdMAX_GPU_COUNT];
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ struct reset_control *rstc[gcdMAX_GPU_COUNT];
+#endif
+
+ uint32_t sc_gpu_pid[gcdMAX_GPU_COUNT];
+
+ int gpu3dCount;
+
+#if defined(CONFIG_PM_OPP)
+ struct gpu_govern imx_gpu_govern;
+#endif
+};
+
+static struct imx_priv imxPriv;
+
+#if defined(CONFIG_PM_OPP)
+static ssize_t gpu_govern_show(struct device_driver *dev, char *buf)
+{
+ struct imx_priv *priv = &imxPriv;
+ int i;
+ ssize_t len;
+ int max_modes;
+
+ unsigned long core_freq;
+ unsigned long shader_freq;
+
+ if (priv->imx_gpu_govern.num_modes == GOVERN_COUNT)
+ max_modes = priv->imx_gpu_govern.num_modes - 1;
+ else
+ max_modes = priv->imx_gpu_govern.num_modes;
+
+ len = sprintf(buf, "GPU support %d modes\n", priv->imx_gpu_govern.num_modes);
+
+
+ for (i = priv->imx_gpu_govern.current_mode; i <= max_modes; i++)
+ {
+ core_freq = priv->imx_gpu_govern.core_clk_freq[i];
+ shader_freq = priv->imx_gpu_govern.shader_clk_freq[i];
+
+ len += sprintf(buf + len,
+ "%s:\tcore_clk frequency: %lu\tshader_clk frequency: %lu\n",
+ govern_modes[i], core_freq, shader_freq);
+ }
+
+ len += sprintf(buf + len, "Currently GPU runs on mode %s\n",
+ govern_modes[priv->imx_gpu_govern.current_mode]);
+
+ return len;
+}
+
+static ssize_t gpu_govern_store(struct device_driver *dev, const char *buf, size_t count)
+{
+ unsigned long core_freq = 0;
+ unsigned long shader_freq = 0;
+ struct imx_priv *priv = &imxPriv;
+ int core = gcvCORE_MAJOR;
+ int i;
+
+ for (i = 0; i < GOVERN_COUNT; i++)
+ {
+ if (strstr(buf, govern_modes[i]))
+ {
+ break;
+ }
+ }
+
+ if (i == GOVERN_COUNT)
+ {
+ return count;
+ }
+
+ core_freq = priv->imx_gpu_govern.core_clk_freq[i];
+ shader_freq = priv->imx_gpu_govern.shader_clk_freq[i];
+ priv->imx_gpu_govern.current_mode = i;
+
+ for (core = gcvCORE_MAJOR; core <= gcvCORE_3D_MAX; core++)
+ {
+ struct clk* clk_core = priv->imx_gpu_clks[core].clk_core;
+ struct clk* clk_shader = priv->imx_gpu_clks[core].clk_shader;
+
+ if (clk_core != NULL && clk_shader != NULL &&
+ core_freq != 0 && shader_freq != 0)
+ {
+#ifdef CONFIG_PM
+ pm_runtime_get_sync(priv->pmdev[core]);
+#endif
+ clk_set_rate(clk_core, core_freq);
+ clk_set_rate(clk_shader, shader_freq);
+#ifdef CONFIG_PM
+ pm_runtime_put_sync(priv->pmdev[core]);
+#endif
+ }
+ }
+
+ return count;
+}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+static DRIVER_ATTR_RW(gpu_govern);
+#else
+static DRIVER_ATTR(gpu_govern, S_IRUGO | S_IWUSR, gpu_govern_show, gpu_govern_store);
+#endif
+
+int init_gpu_opp_table(struct device *dev)
+{
+ const struct property *prop;
+ const __be32 *val;
+ int nr;
+ int ret = 0;
+ int i, p;
+ int core = gcvCORE_MAJOR;
+ struct imx_priv *priv = &imxPriv;
+
+ struct clk *clk_core;
+ struct clk *clk_shader;
+
+ unsigned long core_freq, shader_freq;
+
+ priv->imx_gpu_govern.num_modes = 0;
+
+ prop = of_find_property(dev->of_node, "operating-points", NULL);
+ if (!prop) {
+ return 0;
+ }
+
+ if (!prop->value) {
+ dev_err(dev, "operating-points invalid. Frequency scaling will not work\n");
+ return -ENODATA;
+ }
+
+ /*
+ * Each OPP is a set of tuples consisting of frequency and
+ * voltage like <freq-kHz vol-uV>.
+ */
+ nr = prop->length / sizeof(u32);
+ if (nr % 2) {
+ dev_err(dev, "%s: Invalid OPP list\n", __func__);
+ return -EINVAL;
+ }
+
+ /*
+ * We handle both cases where UNDERDRIVE is represented by a single tuple
+ * or when it is represented by two. More than 4 tuples means that we have
+ * the current mode defaulting to OVERDRIVE, while less than 3 means only
+ * nominal. Lastly just two tuples means UNDERDRIVE. Note that the tuples
+ * are divisible by 2 (X Y) hence there's no need to test for odd values.
+ */
+ if (nr < 6)
+ priv->imx_gpu_govern.current_mode = UNDERDRIVE;
+ else if (nr == 6 || nr == 8)
+ priv->imx_gpu_govern.current_mode = NOMINAL;
+ else
+ priv->imx_gpu_govern.current_mode = OVERDRIVE;
+
+ val = prop->value;
+
+ for (p = 0, i = priv->imx_gpu_govern.current_mode; nr > 0 && i < GOVERN_COUNT; nr -= 4)
+ {
+ unsigned long core_freq, core_volt, shader_freq, shader_volt;
+
+ core_freq = be32_to_cpup(val++) * 1000;
+ core_volt = be32_to_cpup(val++);
+
+ if (nr == 2)
+ {
+ shader_freq = core_freq;
+ shader_volt = core_volt;
+ }
+ else
+ {
+ shader_freq = be32_to_cpup(val++) * 1000;
+ shader_volt = be32_to_cpup(val++);
+ }
+
+ /* We only register core_clk frequency */
+ if (dev_pm_opp_add(dev, core_freq, core_volt))
+ {
+ dev_warn(dev, "%s: Failed to add OPP %ld\n",
+ __func__, core_freq);
+ continue;
+ }
+
+ priv->imx_gpu_govern.core_clk_freq[i] = core_freq;
+ priv->imx_gpu_govern.shader_clk_freq[i] = shader_freq;
+
+ p++;
+ i++;
+ }
+
+ priv->imx_gpu_govern.num_modes = p;
+ priv->imx_gpu_govern.dev = dev;
+
+ if (priv->imx_gpu_govern.num_modes > 0)
+ {
+ ret = driver_create_file(dev->driver, &driver_attr_gpu_govern);
+ if (ret) {
+ dev_err(dev, "create gpu_govern attr failed (%d)\n", ret);
+ return ret;
+ }
+
+ /*
+ * This could be redundant, but it is useful for testing DTS with
+ * different OPPs that have assigned-clock rates different than the
+ * ones specified in OPP tuple array. Otherwise we will display
+ * different clock values when the driver is loaded. Further
+ * modifications of the governor will display correctly but not when
+ * the driver has been loaded.
+ */
+ core_freq = priv->imx_gpu_govern.core_clk_freq[priv->imx_gpu_govern.current_mode];
+ shader_freq = priv->imx_gpu_govern.shader_clk_freq[priv->imx_gpu_govern.current_mode];
+
+ if (core_freq && shader_freq) {
+ for (; core <= gcvCORE_3D_MAX; core++) {
+ clk_core = priv->imx_gpu_clks[core].clk_core;
+ clk_shader = priv->imx_gpu_clks[core].clk_shader;
+
+ if (clk_core != NULL && clk_shader != NULL) {
+ clk_set_rate(clk_core, core_freq);
+ clk_set_rate(clk_shader, shader_freq);
+ }
+ }
+ }
+
+ }
+
+ return ret;
+}
+
+int remove_gpu_opp_table(void)
+{
+ struct imx_priv *priv = &imxPriv;
+ struct device* dev = priv->imx_gpu_govern.dev;
+ int i = 0;
+ int max_modes;
+
+ if (priv->imx_gpu_govern.num_modes == GOVERN_COUNT)
+ max_modes = priv->imx_gpu_govern.num_modes - 1;
+ else
+ max_modes = priv->imx_gpu_govern.num_modes;
+
+ /* if we don't have any modes available we don't have OPP */
+ if (max_modes == 0)
+ return 0;
+
+ for (i = priv->imx_gpu_govern.current_mode; i <= max_modes; i++)
+ {
+ unsigned long core_freq;
+
+ core_freq = priv->imx_gpu_govern.core_clk_freq[i];
+ dev_pm_opp_remove(dev, core_freq);
+ }
+
+ if (i > 0)
+ {
+ driver_remove_file(dev->driver, &driver_attr_gpu_govern);
+ }
+
+ return 0;
+}
+#endif
+
+#ifdef IMX_GPU_SUBSYSTEM
+
+static int use_imx_gpu_subsystem;
+
+/* sub device component ops. */
+static int mxc_gpu_sub_bind(struct device *dev,
+ struct device *master, void *data)
+{
+ return 0;
+}
+
+static void mxc_gpu_sub_unbind(struct device *dev, struct device *master, void *data)
+{
+}
+
+static const struct component_ops mxc_gpu_sub_ops =
+{
+ .bind = mxc_gpu_sub_bind,
+ .unbind = mxc_gpu_sub_unbind,
+};
+
+/* sub device driver. */
+static const struct of_device_id mxc_gpu_sub_match[] =
+{
+ { .compatible = "fsl,imx8-gpu"},
+ { /* sentinel */ }
+};
+
+static int mxc_gpu_sub_probe(struct platform_device *pdev)
+{
+ return component_add(&pdev->dev, &mxc_gpu_sub_ops);
+}
+
+static int mxc_gpu_sub_remove(struct platform_device *pdev)
+{
+ component_del(&pdev->dev, &mxc_gpu_sub_ops);
+ return 0;
+}
+
+struct platform_driver mxc_gpu_sub_driver =
+{
+ .driver = {
+ .name = "mxc-gpu",
+ .owner = THIS_MODULE,
+ .of_match_table = mxc_gpu_sub_match,
+ },
+
+ .probe = mxc_gpu_sub_probe,
+ .remove = mxc_gpu_sub_remove,
+};
+
+static int register_mxc_gpu_sub_driver(void)
+{
+ return use_imx_gpu_subsystem ? platform_driver_register(&mxc_gpu_sub_driver) : 0;
+}
+
+static void unregister_mxc_gpu_sub_driver(void)
+{
+ if (use_imx_gpu_subsystem) {
+ platform_driver_unregister(&mxc_gpu_sub_driver);
+ }
+}
+
+static int patch_param_imx8_subsystem(struct platform_device *pdev,
+ gcsMODULE_PARAMETERS *args)
+{
+ int i = 0;
+ struct resource* res;
+ struct imx_priv *priv = &imxPriv;
+ struct device_node *node = pdev->dev.of_node;
+ struct device_node *core_node;
+ int core = gcvCORE_MAJOR;
+
+ while ((core_node = of_parse_phandle(node, "cores", i++)) != NULL &&
+ core < gcvCORE_COUNT) {
+ struct platform_device *pdev_gpu;
+ int irqLine = -1;
+
+ if (!of_device_is_available(core_node)) {
+ of_node_put(core_node);
+ continue;
+ }
+
+ pdev_gpu = of_find_device_by_node(core_node);
+
+ if (!pdev_gpu)
+ break;
+
+ irqLine = platform_get_irq(pdev_gpu, 0);
+
+ if (irqLine < 0)
+ break;
+
+ res = platform_get_resource(pdev_gpu, IORESOURCE_MEM, 0);
+
+ if (!res)
+ break;
+
+ while(!priv->pmdev[core] && core < (gcvCORE_COUNT-1))
+ core++;
+
+ args->irqs[core] = irqLine;
+ args->registerBases[core] = res->start;
+ args->registerSizes[core] = res->end - res->start + 1;
+
+ of_node_put(core_node);
+ ++core;
+ }
+
+ if (core_node)
+ of_node_put(core_node);
+
+ return 0;
+}
+
+static inline int get_power_imx8_subsystem(struct device *pdev)
+{
+ struct imx_priv *priv = &imxPriv;
+ struct clk *clk_core = NULL;
+ struct clk *clk_shader = NULL;
+ struct clk *clk_axi = NULL;
+ struct clk *clk_ahb = NULL;
+
+ /* Initialize the clock structure */
+ int i = 0;
+ struct device_node *node = pdev->of_node;
+ struct device_node *core_node;
+ int core = gcvCORE_MAJOR;
+
+ while ((core_node = of_parse_phandle(node, "cores", i++)) != NULL) {
+ struct platform_device *pdev_gpu = NULL;
+ clk_shader = NULL;
+ clk_core = NULL;
+ clk_axi = NULL;
+ clk_ahb = NULL;
+
+ if (!of_device_is_available(core_node)) {
+ of_node_put(core_node);
+ continue;
+ }
+
+ pdev_gpu = of_find_device_by_node(core_node);
+
+ if (!pdev_gpu)
+ break;
+
+ clk_core = clk_get(&pdev_gpu->dev, "core");
+
+ if (IS_ERR(clk_core)) {
+ printk("galcore: clk_get clk_core failed\n");
+ break;
+ }
+
+ clk_axi = clk_get(&pdev_gpu->dev, "axi");
+
+ if (IS_ERR(clk_axi))
+ clk_axi = NULL;
+
+ clk_ahb = clk_get(&pdev_gpu->dev, "ahb");
+
+ if (IS_ERR(clk_ahb))
+ clk_ahb = NULL;
+
+ clk_shader = clk_get(&pdev_gpu->dev, "shader");
+
+ if (IS_ERR(clk_shader)) {
+ priv->gpu3dCount = core;
+ core = gcvCORE_2D;
+ clk_shader = NULL;
+ }
+
+#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;
+ priv->imx_gpu_clks[core].clk_ahb = clk_ahb;
+
+ if (of_property_read_u32(core_node, "fsl,sc_gpu_pid", &priv->sc_gpu_pid[core])) {
+ priv->sc_gpu_pid[core] = 0;
+ }
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)
+ else if (!gpu_ipcHandle) {
+ uint32_t ret = imx_scu_get_handle(&gpu_ipcHandle);
+ if (ret != 0) {
+ printk("galcore: cannot open MU channel to SCU\n");
+ return ret;
+ }
+ }
+#elif defined(IMX8_SCU_CONTROL)
+ else if (!gpu_ipcHandle) {
+ sc_err_t sciErr;
+ uint32_t mu_id;
+ sciErr = sc_ipc_getMuID(&mu_id);
+
+ if (sciErr != SC_ERR_NONE) {
+ printk("galcore; cannot obtain mu id\n");
+ return -EINVAL;
+ }
+
+ sciErr = sc_ipc_open(&gpu_ipcHandle, mu_id);
+
+ if (sciErr != SC_ERR_NONE) {
+ printk("galcore: cannot open MU channel to SCU\n");
+ return -EINVAL;
+ }
+ }
+#endif
+
+#ifdef CONFIG_PM
+ pm_runtime_get_noresume(&pdev_gpu->dev);
+ pm_runtime_set_active(&pdev_gpu->dev);
+ pm_runtime_enable(&pdev_gpu->dev);
+ pm_runtime_put_sync(&pdev_gpu->dev);
+ priv->pmdev[core] = &pdev_gpu->dev;
+#endif
+ of_node_put(core_node);
+ ++core;
+ }
+
+ if (core <= gcvCORE_3D_MAX)
+ priv->gpu3dCount = core;
+
+ if (core_node)
+ of_node_put(core_node);
+
+ return 0;
+}
+
+#endif
+
+static int patch_param_imx6(struct platform_device *pdev,
+ gcsMODULE_PARAMETERS *args)
+{
+ struct resource* res;
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "irq_3d");
+
+ if (res)
+ args->irqs[gcvCORE_MAJOR] = res->start;
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "iobase_3d");
+
+ if (res) {
+ args->registerBases[gcvCORE_MAJOR] = res->start;
+ args->registerSizes[gcvCORE_MAJOR] = res->end - res->start + 1;
+ }
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "irq_2d");
+
+ if (res)
+ args->irqs[gcvCORE_2D] = res->start;
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "iobase_2d");
+
+ if (res) {
+ args->registerBases[gcvCORE_2D] = res->start;
+ args->registerSizes[gcvCORE_2D] = res->end - res->start + 1;
+ }
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "irq_vg");
+
+ if (res)
+ args->irqs[gcvCORE_VG] = res->start;
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "iobase_vg");
+
+ if (res) {
+ args->registerBases[gcvCORE_VG] = res->start;
+ args->registerSizes[gcvCORE_VG] = res->end - res->start + 1;
+ }
+
+ return 0;
+}
+
+static bool is_layerscape;
+
+static int patch_param_ls(struct platform_device *pdev,
+ gcsMODULE_PARAMETERS *args)
+{
+ struct device_node *node = pdev->dev.of_node;
+ struct resource *res;
+ int core = gcvCORE_MAJOR;
+ struct platform_device *pdev_gpu;
+ int irqLine = -1;
+
+ pdev_gpu = of_find_device_by_node(node);
+ if (!pdev_gpu)
+ return gcvSTATUS_DEVICE;
+
+ of_node_put(node);
+
+ irqLine = platform_get_irq(pdev_gpu, 0);
+ if (irqLine < 0)
+ return gcvSTATUS_NOT_FOUND;
+
+ res = platform_get_resource(pdev_gpu, IORESOURCE_MEM, 0);
+ if (!res)
+ return gcvSTATUS_NOT_FOUND;
+
+ args->irqs[core] = irqLine;
+ args->registerBases[core] = res->start;
+ args->registerSizes[core] = res->end - res->start + 1;
+
+ return 0;
+}
+
+static int patch_param(struct platform_device *pdev,
+ gcsMODULE_PARAMETERS *args)
+{
+ struct resource* res;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+ struct device_node *dn =pdev->dev.of_node;
+ const u32 *prop;
+#else
+ struct viv_gpu_platform_data *pdata;
+#endif
+
+ pdevice = pdev;
+
+ if (is_layerscape) {
+ patch_param_ls(pdev, args);
+ } else {
+#ifdef IMX_GPU_SUBSYSTEM
+ if (pdev->dev.of_node && use_imx_gpu_subsystem)
+ patch_param_imx8_subsystem(pdev, args);
+ else
+#endif
+ patch_param_imx6(pdev, args);
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+ if(args->compression == gcvCOMPRESSION_OPTION_DEFAULT)
+ {
+ const u32 *property;
+
+ property = of_get_property(pdev->dev.of_node, "depth-compression", NULL);
+ if (property && *property == 0)
+ {
+ args->compression &= ~gcvCOMPRESSION_OPTION_DEPTH;
+ }
+ }
+#endif
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phys_baseaddr");
+
+ if (res && !args->baseAddress && !args->physSize) {
+ args->baseAddress = res->start;
+ args->physSize = res->end - res->start + 1;
+ }
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "contiguous_mem");
+
+ if (res) {
+ if (args->contiguousBase == 0)
+ args->contiguousBase = res->start;
+
+ if (args->contiguousSize == ~0U)
+ args->contiguousSize = res->end - res->start + 1;
+ }
+
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ args->contiguousBase = 0;
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+ prop = of_get_property(dn, "contiguousbase", NULL);
+
+ if (prop)
+ args->contiguousBase = *prop;
+
+ of_property_read_u32(dn,"contiguoussize", (u32 *)&contiguousSize);
+#else
+
+ pdata = pdev->dev.platform_data;
+
+ if (pdata) {
+ args->contiguousBase = pdata->reserved_mem_base;
+ args->contiguousSize = pdata->reserved_mem_size;
+ }
+
+#endif
+
+ if (args->contiguousSize == ~0U) {
+ printk("Warning: No contiguous memory is reserverd for gpu.!\n");
+ printk("Warning: Will use default value(%d) for the reserved memory!\n", gcdFSL_CONTIGUOUS_SIZE);
+
+ args->contiguousSize = gcdFSL_CONTIGUOUS_SIZE;
+ }
+
+ args->gpu3DMinClock = initgpu3DMinClock;
+
+ if (args->physSize == 0) {
+#if defined(IMX8_PHYS_BASE)
+ args->baseAddress = IMX8_PHYS_BASE;
+#endif
+
+#if defined(IMX8_PHYS_SIZE)
+ args->physSize = IMX8_PHYS_SIZE;
+#else
+ args->physSize = 0x80000000;
+#endif
+ }
+
+ return 0;
+}
+
+int init_priv(void)
+{
+ memset(&imxPriv, 0, sizeof(imxPriv));
+
+#ifdef CONFIG_GPU_LOW_MEMORY_KILLER
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
+ task_free_register(&task_nb);
+# else
+ task_handoff_register(&task_nb);
+# endif
+#endif
+
+ return 0;
+}
+
+void
+free_priv(void)
+{
+#ifdef CONFIG_GPU_LOW_MEMORY_KILLER
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
+ task_free_unregister(&task_nb);
+# else
+ task_handoff_unregister(&task_nb);
+# endif
+#endif
+}
+
+static int set_clock(int gpu, int enable);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+static void imx6sx_optimize_qosc_for_GPU(void)
+{
+ struct device_node *np;
+ void __iomem *src_base;
+
+ np = of_find_compatible_node(NULL, NULL, "fsl,imx6sx-qosc");
+ if (!np)
+ return;
+
+ src_base = of_iomap(np, 0);
+ WARN_ON(!src_base);
+
+ set_clock(gcvCORE_MAJOR, 1);
+
+ writel_relaxed(0, src_base); /* Disable clkgate & soft_rst */
+ writel_relaxed(0, src_base+0x60); /* Enable all masters */
+ writel_relaxed(0, src_base+0x1400); /* Disable clkgate & soft_rst for gpu */
+ writel_relaxed(0x0f000222, src_base+0x1400+0xd0); /* Set Write QoS 2 for gpu */
+ writel_relaxed(0x0f000822, src_base+0x1400+0xe0); /* Set Read QoS 8 for gpu */
+
+ set_clock(gcvCORE_MAJOR, 0);
+ return;
+}
+#endif
+
+static inline int get_power_imx6(struct device *pdev)
+{
+ struct imx_priv *priv = &imxPriv;
+ struct clk *clk_core = NULL;
+ struct clk *clk_shader = NULL;
+ struct clk *clk_axi = NULL;
+ struct clk *clk_ahb = NULL;
+
+#ifdef CONFIG_RESET_CONTROLLER
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ struct reset_control *rstc;
+
+ rstc = devm_reset_control_get(pdev, "gpu3d");
+ priv->rstc[gcvCORE_MAJOR] = IS_ERR(rstc) ? NULL : rstc;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0)
+ rstc = devm_reset_control_get_shared(pdev, "gpu2d");
+ priv->rstc[gcvCORE_2D] = IS_ERR(rstc) ? NULL : rstc;
+ rstc = devm_reset_control_get_shared(pdev, "gpuvg");
+# else
+ rstc = devm_reset_control_get(pdev, "gpu2d");
+ priv->rstc[gcvCORE_2D] = IS_ERR(rstc) ? NULL : rstc;
+ rstc = devm_reset_control_get(pdev, "gpuvg");
+# endif
+ priv->rstc[gcvCORE_VG] = IS_ERR(rstc) ? NULL : rstc;
+# endif
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0)
+ /* Get gpu regulator */
+ priv->gpu_regulator = regulator_get(pdev, "cpu_vddgpu");
+# elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ priv->gpu_regulator = devm_regulator_get(pdev, "pu");
+# endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ if (IS_ERR(priv->gpu_regulator)) {
+ printk("%s: Failed to get gpu regulator\n", __FUNCTION__);
+ return -ENXIO;
+ }
+# endif
+#endif
+
+ clk_core = clk_get(pdev, "gpu3d_clk");
+
+ if (!IS_ERR(clk_core)) {
+ clk_axi = clk_get(pdev, "gpu3d_axi_clk");
+ clk_shader = clk_get(pdev, "gpu3d_shader_clk");
+
+ if (IS_ERR(clk_shader)) {
+ clk_put(clk_core);
+ clk_core = NULL;
+ clk_shader = NULL;
+ printk("galcore: clk_get gpu3d_shader_clk failed, disable 3d!\n");
+ }
+
+ clk_ahb = clk_get(pdev, "gpu3d_ahb_clk");
+ if (IS_ERR(clk_ahb)) {
+ clk_ahb = NULL;
+ }
+ } else {
+ clk_core = NULL;
+ printk("galcore: clk_get gpu3d_clk failed, disable 3d!\n");
+ }
+
+ priv->imx_gpu_clks[gcvCORE_MAJOR].clk_core = clk_core;
+ priv->imx_gpu_clks[gcvCORE_MAJOR].clk_shader = clk_shader;
+ priv->imx_gpu_clks[gcvCORE_MAJOR].clk_axi = clk_axi;
+ priv->imx_gpu_clks[gcvCORE_MAJOR].clk_ahb = clk_ahb;
+
+ clk_core = clk_get(pdev, "gpu2d_clk");
+
+ if (IS_ERR(clk_core)) {
+ clk_core = NULL;
+ printk("galcore: clk_get 2d core clock failed, disable 2d/vg!\n");
+ } else {
+ clk_axi = clk_get(pdev, "gpu2d_axi_clk");
+ if (IS_ERR(clk_axi)) {
+ clk_axi = NULL;
+ printk("galcore: clk_get 2d axi clock failed, disable 2d\n");
+ }
+ clk_ahb = clk_get(pdev, "gpu2d_ahb_clk");
+ if (IS_ERR(clk_ahb)) {
+ clk_ahb = NULL;
+ }
+
+ priv->imx_gpu_clks[gcvCORE_2D].clk_ahb = clk_ahb;
+ priv->imx_gpu_clks[gcvCORE_2D].clk_core = clk_core;
+ priv->imx_gpu_clks[gcvCORE_2D].clk_axi = clk_axi;
+
+ clk_axi = clk_get(pdev, "openvg_axi_clk");
+
+ if (IS_ERR(clk_axi)) {
+ clk_axi = NULL;
+ printk("galcore: clk_get vg clock failed, disable vg!\n");
+ }
+
+ priv->imx_gpu_clks[gcvCORE_VG].clk_core = clk_core;
+ priv->imx_gpu_clks[gcvCORE_VG].clk_axi = clk_axi;
+ }
+
+#ifdef CONFIG_PM
+ pm_runtime_enable(pdev);
+
+ priv->pmdev[gcvCORE_MAJOR] = pdev;
+ priv->pmdev[gcvCORE_2D] = pdev;
+ priv->pmdev[gcvCORE_VG] = pdev;
+#endif
+
+ return 0;
+}
+
+static inline int get_power(struct device *pdev)
+{
+ int ret;
+
+ /*Initialize the clock structure*/
+#ifdef IMX_GPU_SUBSYSTEM
+ if (pdev->of_node && use_imx_gpu_subsystem)
+ ret = get_power_imx8_subsystem(pdev);
+ else
+#endif
+ ret = get_power_imx6(pdev);
+
+ if (ret)
+ return ret;
+
+#if gcdENABLE_FSCALE_VAL_ADJUST && (defined(CONFIG_DEVICE_THERMAL) || defined(CONFIG_DEVICE_THERMAL_MODULE))
+ REG_THERMAL_NOTIFIER(&thermal_hot_pm_notifier);
+
+ ret = driver_create_file(pdev->driver, &driver_attr_gpu3DMinClock);
+
+ if (ret)
+ dev_err(pdev, "create gpu3DMinClock attr failed (%d)\n", ret);
+
+ ret = driver_create_file(pdev->driver, &driver_attr_gpu3DClockScale);
+
+ if (ret)
+ dev_err(pdev, "create gpu3DClockScale attr failed (%d)\n", ret);
+#endif
+
+#if defined(CONFIG_PM_OPP)
+ ret = init_gpu_opp_table(pdev);
+ if (ret)
+ dev_err(pdev, "OPP init failed!\n");
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ imx6sx_optimize_qosc_for_GPU();
+#endif
+
+ return 0;
+}
+
+static inline void put_power(void)
+{
+ int core = 0;
+ struct gpu_clk *imx_clk = NULL;
+ struct imx_priv *priv = &imxPriv;
+ struct device *pmdev_last = NULL;/*legacy gpu device entry for imx6*/
+ struct clk *clk_core_last = NULL;/*vg has same core clk as 2d */
+
+ for (core = 0; core < gcdMAX_GPU_COUNT; core++) {
+ imx_clk = &priv->imx_gpu_clks[core];
+
+ if (imx_clk->clk_core && imx_clk->clk_core != clk_core_last) {
+ clk_put(imx_clk->clk_core);
+ clk_core_last = imx_clk->clk_core;
+ imx_clk->clk_core = NULL;
+ }
+
+ if (imx_clk->clk_shader) {
+ clk_put(imx_clk->clk_shader);
+ imx_clk->clk_shader = NULL;
+ }
+
+ if (imx_clk->clk_axi) {
+ clk_put(imx_clk->clk_axi);
+ imx_clk->clk_axi = NULL;
+ }
+
+ if (imx_clk->clk_ahb) {
+ clk_put(imx_clk->clk_ahb);
+ imx_clk->clk_ahb = NULL;
+ }
+
+#ifdef CONFIG_PM
+ if (priv->pmdev[core] && priv->pmdev[core] != pmdev_last){
+ pm_runtime_disable(priv->pmdev[core]);
+ pmdev_last = priv->pmdev[core];
+ }
+#endif
+ }
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0)
+ if (priv->gpu_regulator) {
+ regulator_put(priv->gpu_regulator);
+ priv->gpu_regulator = NULL;
+ }
+#endif
+
+#if gcdENABLE_FSCALE_VAL_ADJUST && (defined(CONFIG_DEVICE_THERMAL) || defined(CONFIG_DEVICE_THERMAL_MODULE))
+ UNREG_THERMAL_NOTIFIER(&thermal_hot_pm_notifier);
+
+ driver_remove_file(pdevice->dev.driver, &driver_attr_gpu3DMinClock);
+
+ driver_remove_file(pdevice->dev.driver, &driver_attr_gpu3DClockScale);
+#endif
+
+#if defined(CONFIG_PM_OPP)
+ remove_gpu_opp_table();
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0)) && defined(IMX8_SCU_CONTROL)
+ if (gpu_ipcHandle)
+ sc_ipc_close(gpu_ipcHandle);
+#endif
+}
+
+static inline int set_power(int gpu, int enable)
+{
+#ifdef CONFIG_PM
+ struct imx_priv* priv = &imxPriv;
+#endif
+
+ if (enable) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ if (!IS_ERR(priv->gpu_regulator)) {
+ int ret = regulator_enable(priv->gpu_regulator);
+
+ if (ret)
+ printk("%s: fail to enable pu regulator %d!\n", __FUNCTION__, ret);
+ }
+# else
+ imx_gpc_power_up_pu(true);
+# endif
+#endif
+
+#ifdef CONFIG_PM
+ pm_runtime_get_sync(priv->pmdev[gpu]);
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)
+ if (priv->sc_gpu_pid[gpu]) {
+ uint32_t ret = imx_sc_misc_set_control(gpu_ipcHandle, priv->sc_gpu_pid[gpu], IMX_SC_C_ID, gpu);
+ if (ret) {
+ printk("galcore: failed to set gpu id for 3d_%d\n", gpu);
+ return ret;
+ }
+ if (priv->gpu3dCount > 1) {
+ ret = imx_sc_misc_set_control(gpu_ipcHandle, priv->sc_gpu_pid[gpu], IMX_SC_C_SINGLE_MODE, 0);
+ if (ret) {
+ printk("galcore: failed to set gpu dual mode for 3d_%d\n", gpu);
+ return ret;
+ }
+ } else {
+ ret = imx_sc_misc_set_control(gpu_ipcHandle, priv->sc_gpu_pid[gpu], IMX_SC_C_SINGLE_MODE, 1);
+ if (ret) {
+ printk("galcore: failed to set gpu single mode for 3d_%d\n", gpu);
+ return ret;
+ }
+ }
+ }
+#elif defined(IMX8_SCU_CONTROL)
+ if (priv->sc_gpu_pid[gpu]) {
+ sc_err_t sciErr = sc_misc_set_control(gpu_ipcHandle, priv->sc_gpu_pid[gpu], SC_C_ID, gpu);
+ if (sciErr != SC_ERR_NONE)
+ printk("galcore: failed to set gpu id for 3d_%d\n", gpu);
+
+ if (priv->gpu3dCount > 1) {
+ sciErr = sc_misc_set_control(gpu_ipcHandle, priv->sc_gpu_pid[gpu], SC_C_SINGLE_MODE, 0);
+ if (sciErr != SC_ERR_NONE)
+ printk("galcore: failed to set gpu dual mode for 3d_%d\n", gpu);
+ } else {
+ sciErr = sc_misc_set_control(gpu_ipcHandle, priv->sc_gpu_pid[gpu], SC_C_SINGLE_MODE, 1);
+ if (sciErr != SC_ERR_NONE)
+ printk("galcore: failed to set gpu single mode for 3d_%d\n", gpu);
+ }
+ }
+#endif
+ } else {
+#ifdef CONFIG_PM
+ pm_runtime_put_sync(priv->pmdev[gpu]);
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ if (!IS_ERR(priv->gpu_regulator))
+ regulator_disable(priv->gpu_regulator);
+# else
+ imx_gpc_power_up_pu(false);
+# endif
+#endif
+ }
+
+ return 0;
+}
+
+int set_clock(int gpu, int enable)
+{
+ struct imx_priv* priv = &imxPriv;
+ struct clk *clk_core = priv->imx_gpu_clks[gpu].clk_core;
+ struct clk *clk_shader = priv->imx_gpu_clks[gpu].clk_shader;
+ struct clk *clk_axi = priv->imx_gpu_clks[gpu].clk_axi;
+ struct clk *clk_ahb = priv->imx_gpu_clks[gpu].clk_ahb;
+
+ if (enable) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+ if (clk_core)
+ clk_prepare(clk_core);
+
+ if (clk_shader)
+ clk_prepare(clk_shader);
+
+ if (clk_axi)
+ clk_prepare(clk_axi);
+
+ if (clk_ahb)
+ clk_prepare(clk_ahb);
+#endif
+ if (clk_core)
+ clk_enable(clk_core);
+
+ if (clk_shader)
+ clk_enable(clk_shader);
+
+ if (clk_axi)
+ clk_enable(clk_axi);
+
+ if (clk_ahb)
+ clk_enable(clk_ahb);
+ } else {
+ if (clk_core)
+ clk_disable(clk_core);
+
+ if (clk_shader)
+ clk_disable(clk_shader);
+
+ if (clk_axi)
+ clk_disable(clk_axi);
+
+ if (clk_ahb)
+ clk_disable(clk_ahb);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+ if (clk_core)
+ clk_unprepare(clk_core);
+
+ if (clk_shader)
+ clk_unprepare(clk_shader);
+
+ if (clk_axi)
+ clk_unprepare(clk_axi);
+
+ if (clk_ahb)
+ clk_unprepare(clk_ahb);
+#endif
+ }
+
+ return gcvSTATUS_OK;
+}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+#ifdef CONFIG_PM
+#ifdef CONFIG_PM_RUNTIME
+static int gpu_runtime_suspend(struct device *dev)
+{
+ release_bus_freq(BUS_FREQ_HIGH);
+ return 0;
+}
+
+static int gpu_runtime_resume(struct device *dev)
+{
+ request_bus_freq(BUS_FREQ_HIGH);
+ return 0;
+}
+#endif
+
+static struct dev_pm_ops gpu_pm_ops;
+#endif
+#endif
+
+
+static int adjust_platform_driver(struct platform_driver *driver)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+ driver->driver.of_match_table = mxs_gpu_dt_ids;
+#endif
+
+#ifdef CONFIG_PM
+ /* Override PM callbacks to add runtime PM callbacks. */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
+ /* Fill local structure with original value. */
+ memcpy(&gpu_pm_ops, driver->driver.pm, sizeof(struct dev_pm_ops));
+
+ /* Add runtime PM callback. */
+#ifdef CONFIG_PM_RUNTIME
+ gpu_pm_ops.runtime_suspend = gpu_runtime_suspend;
+ gpu_pm_ops.runtime_resume = gpu_runtime_resume;
+ gpu_pm_ops.runtime_idle = NULL;
+#endif
+
+ /* Replace callbacks. */
+ driver->driver.pm = &gpu_pm_ops;
+#endif
+#endif
+
+ return 0;
+}
+
+#define SRC_SCR_OFFSET 0
+#define BP_SRC_SCR_GPU3D_RST 1
+#define BP_SRC_SCR_GPU2D_RST 4
+
+static inline int reset_gpu(int gpu)
+{
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0)
+ void __iomem *src_base = IO_ADDRESS(SRC_BASE_ADDR);
+ uint32_t bit_offset, val;
+
+ if (gpu == gcvCORE_MAJOR)
+ bit_offset = BP_SRC_SCR_GPU3D_RST;
+ else if ((gpu == gcvCORE_VG) ||(gpu == gcvCORE_2D))
+ bit_offset = BP_SRC_SCR_GPU2D_RST;
+ else
+ return -ENXIO;
+
+ val = __raw_readl(src_base + SRC_SCR_OFFSET);
+ val &= ~(1 << (bit_offset));
+ val |= (1 << (bit_offset));
+ __raw_writel(val, src_base + SRC_SCR_OFFSET);
+
+ while ((__raw_readl(src_base + SRC_SCR_OFFSET) & (1 << (bit_offset))) != 0);
+
+ return -ENODEV;
+
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ struct imx_priv* priv = &imxPriv;
+ struct reset_control *rstc = priv->rstc[gpu];
+
+ if (rstc)
+ reset_control_reset(rstc);
+#else
+ imx_src_reset_gpu((int)gpu);
+#endif
+
+ return 0;
+}
+
+static gceSTATUS
+_AdjustParam(
+ gcsPLATFORM * Platform,
+ gcsMODULE_PARAMETERS *Args
+ )
+{
+ patch_param(Platform->device, Args);
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)
+ if (of_find_compatible_node(NULL, NULL, "fsl,imx8mq-gpu") &&
+ ((Args->baseAddress + totalram_pages() * PAGE_SIZE) > 0x100000000))
+#else
+ if (of_find_compatible_node(NULL, NULL, "fsl,imx8mq-gpu") &&
+ ((Args->baseAddress + totalram_pages * PAGE_SIZE) > 0x100000000))
+#endif
+ {
+ Platform->flagBits |= gcvPLATFORM_FLAG_LIMIT_4G_ADDRESS;
+ }
+
+ if (of_find_compatible_node(NULL, NULL, "fsl,imx8mm-gpu"))
+ {
+ Platform->flagBits |= gcvPLATFORM_FLAG_IMX_MM;
+ }
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_GetPower(
+ gcsPLATFORM * Platform
+ )
+{
+ int ret = get_power(&Platform->device->dev);
+
+ if (ret)
+ return gcvSTATUS_GENERIC_IO;
+
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_PutPower(
+ gcsPLATFORM * Platform
+ )
+{
+ put_power();
+ return gcvSTATUS_OK;
+}
+
+
+static gceSTATUS
+_SetPower(
+ gcsPLATFORM * Platform,
+ gceCORE GPU,
+ gctBOOL Enable
+ )
+{
+ return set_power((int)GPU, Enable) ? gcvSTATUS_GENERIC_IO
+ : gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_SetClock(
+ gcsPLATFORM * Platform,
+ gceCORE GPU,
+ gctBOOL Enable
+ )
+{
+ set_clock((int)GPU, Enable);
+ return gcvSTATUS_OK;
+}
+
+static gceSTATUS
+_Reset(
+ gcsPLATFORM * Platform,
+ gceCORE GPU
+ )
+{
+ int ret;
+
+ ret = reset_gpu((int)GPU);
+
+ if (!ret)
+ return gcvSTATUS_OK;
+ else if (ret == -ENODEV)
+ return gcvSTATUS_NOT_SUPPORTED;
+ else
+ return gcvSTATUS_INVALID_CONFIG;
+}
+
+struct _gcsPLATFORM_OPERATIONS imx_platform_ops =
+{
+ .adjustParam = _AdjustParam,
+ .getPower = _GetPower,
+ .putPower = _PutPower,
+ .setPower = _SetPower,
+ .setClock = _SetClock,
+ .reset = _Reset,
+#ifdef CONFIG_GPU_LOW_MEMORY_KILLER
+ .shrinkMemory = _ShrinkMemory,
+#endif
+};
+
+static struct _gcsPLATFORM imx_platform =
+{
+ .name = __FILE__,
+ .ops = &imx_platform_ops,
+};
+
+static const struct of_device_id gpu_match[] = {
+ { .compatible = "fsl,ls1028a-gpu"},
+ { /* sentinel */ }
+};
+
+struct _gcsPLATFORM_OPERATIONS ls_platform_ops = {
+ .adjustParam = _AdjustParam,
+};
+
+static struct _gcsPLATFORM ls_platform = {
+ .name = __FILE__,
+ .ops = &ls_platform_ops,
+};
+
+int gckPLATFORM_Init(struct platform_driver *pdrv,
+ struct _gcsPLATFORM **platform)
+{
+#ifdef IMX_GPU_SUBSYSTEM
+ if (of_find_compatible_node(NULL, NULL, "fsl,imx8-gpu-ss")) {
+ use_imx_gpu_subsystem = 1;
+
+ if (!of_find_compatible_node(NULL, NULL, "fsl,imx8-gpu")) {
+ printk(KERN_ERR "Incorrect device-tree, please update dtb.");
+ return -EINVAL;
+ }
+ }
+#endif
+
+ if (of_find_compatible_node(NULL, NULL, "fsl,ls1028a-gpu")) {
+ is_layerscape = 1;
+ pdrv->driver.of_match_table = gpu_match;
+ *platform = &ls_platform;
+
+ return 0;
+ }
+
+ adjust_platform_driver(pdrv);
+ init_priv();
+
+#ifdef IMX_GPU_SUBSYSTEM
+ register_mxc_gpu_sub_driver();
+#endif
+
+ *platform = &imx_platform;
+ return 0;
+}
+
+int gckPLATFORM_Terminate(struct _gcsPLATFORM *platform)
+{
+ if (is_layerscape)
+ return 0;
+
+#ifdef IMX_GPU_SUBSYSTEM
+ unregister_mxc_gpu_sub_driver();
+#endif
+ free_priv();
+ return 0;
+}
+
diff --git a/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.config b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.config
new file mode 100644
index 000000000000..fa4fb519f5f5
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx.config
@@ -0,0 +1,29 @@
+EXTRA_CFLAGS += -DgcdDEFAULT_CONTIGUOUS_SIZE=~0U
+EXTRA_CFLAGS += -DgcdFSL_CONTIGUOUS_SIZE=134217728
+
+ifneq ($(CONFIG_ANDROID),)
+# build for android
+EXTRA_CFLAGS += -DgcdANDROID
+endif
+
+EXTRA_CFLAGS += -DgcdANDROID_NATIVE_FENCE_SYNC=2
+
+ifeq ($(CONFIG_SYNC)$(CONFIG_SYNC_FILE),)
+$(warn CONFIG_SYNC or CONFIG_SYNC_FILE is not set in kernel config)
+$(warn Android native fence sync requires CONFIG_SYNC or CONFIG_SYNC_FILE)
+endif
+
+ifneq ($(CONFIG_ARCH_FSL_IMX8QM),)
+EXTRA_CFLAGS += -DIMX8_SCU_CONTROL=1 -DIMX8_PHYS_BASE=0x80000000 -DIMX8_PHYS_SIZE=0x80000000
+endif
+
+EXTRA_CFLAGS += -DLINUX_CMA_FSL=1 -DgcdREGISTER_READ_FROM_USER=1 -DgcdREGISTER_WRITE_FROM_USER=1
+ALLOCATOR_ARRAY_H_LOCATION := $(OS_KERNEL_DIR)/allocator/freescale
+CUSTOMER_ALLOCATOR_OBJS := $(ALLOCATOR_ARRAY_H_LOCATION)/gc_hal_kernel_allocator_cma.o
+
+EXTRA_CFLAGS += -DCLASS_NAME=\"gpu_class\"
+
+EXTRA_CFLAGS += -DgcdGPU_2D_TIMEOUT=20000
+EXTRA_CFLAGS += -DNO_DMA_COHERENT=1
+EXTRA_CFLAGS += -DgcdSYS_FREE_MEMORY_LIMIT=51200
+
diff --git a/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta.c b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta.c
new file mode 100644
index 000000000000..c7dd9e7436f1
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta.c
@@ -0,0 +1,348 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_types.h"
+#include "gc_hal_base.h"
+#include "gc_hal_security_interface.h"
+#include "gc_hal_ta.h"
+#include "gc_hal.h"
+
+#define _GC_OBJ_ZONE gcvZONE_KERNEL
+
+/*
+* Responsibility of TA (trust application).
+* 1) Start FE.
+* When non secure driver asks for start FE. TA enable MMU and start FE.
+* TA always execute MMU enable processes because it has no idea whether
+* GPU has been power off.
+*
+* 2) Setup page table
+* When non secure driver asks for set up GPU address to physical address
+* mapping, TA check the attribute of physical address and attribute of
+* GPU address to make sure they are match. Then it change page table.
+*
+*/
+
+gcTA_MMU SharedMmu = gcvNULL;
+
+/*******************************************************************************
+**
+** gcTA_Construct
+**
+** Construct a new gcTA object.
+*/
+int
+gcTA_Construct(
+ IN gctaOS Os,
+ IN gceCORE Core,
+ OUT gcTA *TA
+ )
+{
+ gceSTATUS status;
+ gctPOINTER pointer;
+ gcTA ta = gcvNULL;
+
+ gcmkHEADER();
+ gcmkVERIFY_ARGUMENT(TA != gcvNULL);
+
+ /* Construct a gcTA object. */
+ gcmkONERROR(gctaOS_Allocate(sizeof(struct _gcTA), &pointer));
+
+ gctaOS_ZeroMemory(pointer, sizeof(struct _gcTA));
+
+ ta = (gcTA)pointer;
+
+ ta->os = Os;
+ ta->core = Core;
+
+ gcmkONERROR(gctaHARDWARE_Construct(ta, &ta->hardware));
+
+ if (gctaHARDWARE_IsFeatureAvailable(ta->hardware, gcvFEATURE_SECURITY))
+ {
+ if (SharedMmu == gcvNULL)
+ {
+ gcmkONERROR(gctaMMU_Construct(ta, &ta->mmu));
+
+ /* Record shared MMU. */
+ SharedMmu = ta->mmu;
+ ta->destoryMmu = gcvTRUE;
+ }
+ else
+ {
+ ta->mmu = SharedMmu;
+ ta->destoryMmu = gcvFALSE;
+ }
+
+ gcmkONERROR(gctaHARDWARE_PrepareFunctions(ta->hardware));
+ }
+
+ *TA = ta;
+
+ gcmkFOOTER_NO();
+ return 0;
+
+OnError:
+ if (ta)
+ {
+ if (ta->mmu && ta->destoryMmu)
+ {
+ gcmkVERIFY_OK(gctaMMU_Destory(ta->mmu));
+ }
+
+ if (ta->hardware)
+ {
+ gcmkVERIFY_OK(gctaHARDWARE_Destroy(ta->hardware));
+ }
+
+ gcmkVERIFY_OK(gctaOS_Free(ta));
+ }
+ gcmkFOOTER();
+ return status;
+}
+
+/*******************************************************************************
+**
+** gcTA_Construct
+**
+** Destroy a gcTA object.
+*/
+int
+gcTA_Destroy(
+ IN gcTA TA
+ )
+{
+ if (TA->mmu && TA->destoryMmu)
+ {
+ gcmkVERIFY_OK(gctaMMU_Destory(TA->mmu));
+ }
+
+ if (TA->hardware)
+ {
+ gcmkVERIFY_OK(gctaHARDWARE_Destroy(TA->hardware));
+ }
+
+ gcmkVERIFY_OK(gctaOS_Free(TA));
+
+ /* Destroy. */
+ return 0;
+}
+
+
+/*
+* Map a scatter gather list into gpu address space.
+*
+*/
+gceSTATUS
+gcTA_MapMemory(
+ IN gcTA TA,
+ IN gctUINT32 *PhysicalArray,
+ IN gctPHYS_ADDR_T Physical,
+ IN gctUINT32 PageCount,
+ OUT gctUINT32 *GPUAddress
+ )
+{
+ gceSTATUS status;
+ gcTA_MMU mmu;
+ gctUINT32 pageCount = PageCount;
+ gctUINT32 i;
+ gctUINT32 gpuAddress = *GPUAddress;
+ gctBOOL mtlbSecure = gcvFALSE;
+ gctBOOL physicalSecure = gcvFALSE;
+
+ mmu = TA->mmu;
+
+ /* Fill in page table. */
+ for (i = 0; i < pageCount; i++)
+ {
+ gctUINT32 physical;
+ gctUINT32_PTR entry;
+
+ if (PhysicalArray)
+ {
+ physical = PhysicalArray[i];
+ }
+ else
+ {
+ physical = (gctUINT32)Physical + 4096 * i;
+ }
+
+ gcmkONERROR(gctaMMU_GetPageEntry(mmu, gpuAddress, gcvNULL, &entry, &mtlbSecure));
+
+ status = gctaOS_IsPhysicalSecure(TA->os, physical, &physicalSecure);
+
+ if (gcmIS_SUCCESS(status) && physicalSecure != mtlbSecure)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ gctaMMU_SetPage(mmu, physical, entry);
+
+ gpuAddress += 4096;
+ }
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gcTA_UnmapMemory(
+ IN gcTA TA,
+ IN gctUINT32 GPUAddress,
+ IN gctUINT32 PageCount
+ )
+{
+ gceSTATUS status;
+
+ gcmkONERROR(gctaMMU_FreePages(TA->mmu, GPUAddress, PageCount));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gcTA_StartCommand(
+ IN gcTA TA,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ )
+{
+ gctaHARDWARE_Execute(TA, Address, Bytes);
+ return gcvSTATUS_OK;
+}
+
+int
+gcTA_Dispatch(
+ IN gcTA TA,
+ IN gcsTA_INTERFACE * Interface
+ )
+{
+ int command = Interface->command;
+
+ gceSTATUS status = gcvSTATUS_OK;
+
+ switch (command)
+ {
+ case KERNEL_START_COMMAND:
+ /* Enable MMU every time FE starts.
+ ** Because if normal world stop GPU and power off GPU, MMU states is reset.
+ */
+ gcmkONERROR(gctaHARDWARE_SetMMU(TA->hardware, TA->mmu->mtlbLogical));
+
+ gcmkONERROR(gcTA_StartCommand(
+ TA,
+ Interface->u.StartCommand.address,
+ Interface->u.StartCommand.bytes
+ ));
+ break;
+
+ case KERNEL_MAP_MEMORY:
+ gcmkONERROR(gcTA_MapMemory(
+ TA,
+ Interface->u.MapMemory.physicals,
+ Interface->u.MapMemory.physical,
+ Interface->u.MapMemory.pageCount,
+ &Interface->u.MapMemory.gpuAddress
+ ));
+
+ break;
+
+ case KERNEL_UNMAP_MEMORY:
+ status = gcTA_UnmapMemory(
+ TA,
+ Interface->u.UnmapMemory.gpuAddress,
+ Interface->u.UnmapMemory.pageCount
+ );
+ break;
+
+ case KERNEL_DUMP_MMU_EXCEPTION:
+ status = gctaHARDWARE_DumpMMUException(TA->hardware);
+ break;
+
+ case KERNEL_HANDLE_MMU_EXCEPTION:
+ status = gctaHARDWARE_HandleMMUException(
+ TA->hardware,
+ Interface->u.HandleMMUException.mmuStatus,
+ Interface->u.HandleMMUException.physical,
+ Interface->u.HandleMMUException.gpuAddress
+ );
+ break;
+
+ case KERNEL_READ_MMU_EXCEPTION:
+ status = gctaHARDWARE_ReadMMUException(
+ TA->hardware,
+ &Interface->u.ReadMMUException.mmuStatus,
+ &Interface->u.ReadMMUException.mmuException
+ );
+ break;
+
+ default:
+ gcmkASSERT(0);
+
+ status = gcvSTATUS_INVALID_ARGUMENT;
+ break;
+ }
+
+OnError:
+ Interface->result = status;
+
+ return 0;
+}
+
+
+
diff --git a/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta.h b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta.h
new file mode 100644
index 000000000000..8d004567dd3b
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta.h
@@ -0,0 +1,373 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef _GC_HAL_TA_H_
+#define _GC_HAL_TA_H_
+#include "gc_hal_types.h"
+#include "gc_hal_security_interface.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef struct _gctaOS * gctaOS;
+typedef struct _gcTA * gcTA;
+
+typedef struct _gcTA_HARDWARE * gcTA_HARDWARE;
+typedef struct _gcTA_MMU * gcTA_MMU;
+
+/*
+ Trust Application is a object needed to be created as a context in trust zone.
+ One client for a core.
+*/
+typedef struct _gcTA {
+ /* gctaOS object */
+ gctaOS os;
+
+ gceCORE core;
+
+ gcTA_MMU mmu;
+
+ gcTA_HARDWARE hardware;
+
+ gctBOOL destoryMmu;
+} gcsTA;
+
+typedef struct _gcTA_MMU
+{
+ gctaOS os;
+
+ gctSIZE_T mtlbBytes;
+ gctPOINTER mtlbLogical;
+ gctPHYS_ADDR mtlbPhysical;
+
+ gctPOINTER stlbs;
+
+ gctPOINTER safePageLogical;
+ gctPHYS_ADDR safePagePhysical;
+
+ gctPOINTER nonSecureSafePageLogical;
+ gctPHYS_ADDR nonSecureSafePagePhysical;
+
+ gctPOINTER mutex;
+}
+gcsTA_MMU;
+
+gceSTATUS HALDECL
+TAEmulator(
+ gceCORE Core,
+ void * Interface
+ );
+
+int
+gcTA_Construct(
+ IN gctaOS Os,
+ IN gceCORE Core,
+ OUT gcTA *TA
+);
+
+int
+gcTA_Destroy(
+ IN gcTA TA
+);
+
+int
+gcTA_Dispatch(
+ IN gcTA TA,
+ IN OUT gcsTA_INTERFACE * Interface
+);
+
+/*************************************
+* Porting layer
+*/
+
+gceSTATUS
+gctaOS_ConstructOS(
+ IN gckOS Os,
+ OUT gctaOS *TAos
+ );
+
+gceSTATUS
+gctaOS_DestroyOS(
+ IN gctaOS Os
+ );
+
+gceSTATUS
+gctaOS_Allocate(
+ IN gctUINT32 Bytes,
+ OUT gctPOINTER *Pointer
+ );
+
+gceSTATUS
+gctaOS_Free(
+ IN gctPOINTER Pointer
+ );
+
+gceSTATUS
+gctaOS_AllocateSecurityMemory(
+ IN gctaOS Os,
+ IN gctSIZE_T *Bytes,
+ OUT gctPOINTER *Logical,
+ OUT gctPOINTER *Physical
+ );
+
+gceSTATUS
+gctaOS_FreeSecurityMemory(
+ IN gctaOS Os,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical,
+ OUT gctPOINTER Physical
+ );
+
+gceSTATUS
+gctaOS_AllocateNonSecurityMemory(
+ IN gctaOS Os,
+ IN gctSIZE_T *Bytes,
+ OUT gctPOINTER *Logical,
+ OUT gctPOINTER *Physical
+ );
+
+gceSTATUS
+gctaOS_FreeNonSecurityMemory(
+ IN gctaOS Os,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical,
+ OUT gctPOINTER Physical
+ );
+
+
+
+gceSTATUS
+gctaOS_GetPhysicalAddress(
+ IN gctaOS Os,
+ IN gctPOINTER Logical,
+ OUT gctPHYS_ADDR_T * Physical
+ );
+
+gceSTATUS gctaOS_WriteRegister(
+ IN gctaOS Os, IN gceCORE Core,
+ IN gctUINT32 Address,
+ IN gctUINT32 Data
+ );
+
+gceSTATUS gctaOS_ReadRegister(
+ IN gctaOS Os, IN gceCORE Core,
+ IN gctUINT32 Address,
+ IN gctUINT32 *Data
+ );
+
+gceSTATUS
+gctaOS_MemCopy(
+ IN gctUINT8_PTR Dest,
+ IN gctUINT8_PTR Src,
+ IN gctUINT32 Bytes
+ );
+
+gceSTATUS
+gctaOS_ZeroMemory(
+ IN gctUINT8_PTR Dest,
+ IN gctUINT32 Bytes
+ );
+
+void
+gctaOS_CacheFlush(
+ IN gctUINT8_PTR Dest,
+ IN gctUINT32 Bytes
+ );
+
+void
+gctaOS_CacheClean(
+ IN gctUINT8_PTR Dest,
+ IN gctUINT32 Bytes
+ );
+
+void
+gctaOS_CacheInvalidate(
+ IN gctUINT8_PTR Dest,
+ IN gctUINT32 Bytes
+ );
+
+gceSTATUS
+gctaOS_IsPhysicalSecure(
+ IN gctaOS Os,
+ IN gctUINT32 Physical,
+ OUT gctBOOL *Secure
+ );
+
+gceSTATUS
+gctaOS_Delay(
+ IN gctaOS Os,
+ IN gctUINT32 Delay
+ );
+
+gceSTATUS
+gctaOS_SetGPUPower(
+ IN gctaOS Os,
+ IN gctUINT32 Core,
+ IN gctBOOL Clock,
+ IN gctBOOL Power
+ );
+
+/*
+** gctaHARDWARE
+*/
+gceSTATUS
+gctaHARDWARE_Construct(
+ IN gcTA TA,
+ OUT gcTA_HARDWARE * Hardware
+ );
+
+gceSTATUS
+gctaHARDWARE_Destroy(
+ IN gcTA_HARDWARE Hardware
+ );
+
+gceSTATUS
+gctaHARDWARE_Execute(
+ IN gcTA TA,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ );
+
+gceSTATUS
+gctaHARDWARE_End(
+ IN gcTA_HARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ );
+
+gceSTATUS
+gctaHARDWARE_SetMMU(
+ IN gcTA_HARDWARE Hardware,
+ IN gctPOINTER Logical
+ );
+
+gceSTATUS
+gctaHARDWARE_IsFeatureAvailable(
+ IN gcTA_HARDWARE Hardware,
+ IN gceFEATURE Feature
+ );
+
+gceSTATUS
+gctaHARDWARE_PrepareFunctions(
+ IN gcTA_HARDWARE Hardware
+ );
+
+gceSTATUS
+gctaHARDWARE_DumpMMUException(
+ IN gcTA_HARDWARE Hardware
+ );
+
+gceSTATUS
+gctaHARDWARE_HandleMMUException(
+ IN gcTA_HARDWARE Hardware,
+ IN gctUINT32 MMUStatus,
+ IN gctPHYS_ADDR_T Physical,
+ IN gctUINT32 GPUAddress
+ );
+
+gceSTATUS
+gctaHARDWARE_ReadMMUException(
+ IN gcTA_HARDWARE Hardware,
+ OUT gctUINT32_PTR MMUStatus,
+ OUT gctUINT32_PTR MMUException
+ );
+
+gceSTATUS
+gctaMMU_Construct(
+ IN gcTA TA,
+ OUT gcTA_MMU *Mmu
+ );
+
+gceSTATUS
+gctaMMU_Destory(
+ IN gcTA_MMU Mmu
+ );
+
+gceSTATUS
+gctaMMU_SetPage(
+ IN gcTA_MMU Mmu,
+ IN gctUINT32 PageAddress,
+ IN gctUINT32 *PageEntry
+ );
+
+gceSTATUS
+gctaMMU_GetPageEntry(
+ IN gcTA_MMU Mmu,
+ IN gctUINT32 Address,
+ OUT gctUINT32_PTR MtlbEntry,
+ OUT gctUINT32_PTR *PageTable,
+ OUT gctBOOL * Secure
+ );
+
+void
+gctaMMU_DumpPagetableEntry(
+ IN gcTA_MMU Mmu,
+ IN gctUINT32 Address
+ );
+
+gceSTATUS
+gctaMMU_FreePages(
+ IN gcTA_MMU Mmu,
+ IN gctUINT32 Address,
+ IN gctUINT32 PageCount
+ );
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
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
new file mode 100644
index 000000000000..8fb08a78a40a
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.c
@@ -0,0 +1,1068 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_types.h"
+#include "gc_hal_base.h"
+#include "gc_hal_security_interface.h"
+#include "gc_hal_ta.h"
+#include "gc_hal_ta_hardware.h"
+#include "gc_hal.h"
+#include "gc_feature_database.h"
+
+
+#define _GC_OBJ_ZONE 1
+#define SRC_MAX 8
+#define RECT_ADDR_OFFSET 3
+
+#define INVALID_ADDRESS ~0U
+
+/******************************************************************************\
+********************************* Support Code *********************************
+\******************************************************************************/
+static gceSTATUS
+_IdentifyHardwareByDatabase(
+ IN gcTA_HARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gctUINT32 chipIdentity;
+ gcsFEATURE_DATABASE *database;
+ gctaOS os = Hardware->os;
+
+ gcmkHEADER();
+
+ /***************************************************************************
+ ** Get chip ID and revision.
+ */
+
+ /* Read chip identity register. */
+ gcmkONERROR(gctaOS_ReadRegister(os, Hardware->ta->core, 0x00018, &chipIdentity));
+
+ /* Special case for older graphic cores. */
+ if (((((gctUINT32) (chipIdentity)) >> (0 ?
+ 31:24) & ((gctUINT32) ((((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1)))))) == (0x01 & ((gctUINT32) ((((1 ?
+ 31:24) - (0 ?
+ 31:24) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 31:24) - (0 ? 31:24) + 1))))))))
+ {
+ Hardware->chipModel = gcv500;
+ Hardware->chipRevision = (((((gctUINT32) (chipIdentity)) >> (0 ? 15:12)) & ((gctUINT32) ((((1 ? 15:12) - (0 ? 15:12) + 1) == 32) ? ~0U : (~(~0U << ((1 ? 15:12) - (0 ? 15:12) + 1)))))) );
+ }
+
+ else
+ {
+ /* Read chip identity register. */
+ gcmkONERROR(
+ gctaOS_ReadRegister(os, Hardware->ta->core,
+ 0x00020,
+ (gctUINT32_PTR) &Hardware->chipModel));
+
+ if (((Hardware->chipModel & 0xFF00) == 0x0400)
+ && (Hardware->chipModel != 0x0420)
+ && (Hardware->chipModel != 0x0428))
+ {
+ Hardware->chipModel = (gceCHIPMODEL) (Hardware->chipModel & 0x0400);
+ }
+
+ /* Read CHIP_REV register. */
+ gcmkONERROR(
+ gctaOS_ReadRegister(os, Hardware->ta->core,
+ 0x00024,
+ &Hardware->chipRevision));
+
+ if ((Hardware->chipModel == gcv300)
+ && (Hardware->chipRevision == 0x2201)
+ )
+ {
+ gctUINT32 chipDate;
+ gctUINT32 chipTime;
+
+ /* Read date and time registers. */
+ gcmkONERROR(
+ gctaOS_ReadRegister(os, Hardware->ta->core,
+ 0x00028,
+ &chipDate));
+
+ gcmkONERROR(
+ gctaOS_ReadRegister(os, Hardware->ta->core,
+ 0x0002C,
+ &chipTime));
+
+ if ((chipDate == 0x20080814) && (chipTime == 0x12051100))
+ {
+ /* This IP has an ECO; put the correct revision in it. */
+ Hardware->chipRevision = 0x1051;
+ }
+ }
+
+ gcmkONERROR(
+ gctaOS_ReadRegister(os, Hardware->ta->core,
+ 0x000A8,
+ &Hardware->productID));
+ }
+
+ gcmkVERIFY_OK(gctaOS_ReadRegister(
+ os, Hardware->ta->core,
+ 0x000E8
+,
+ &Hardware->ecoID
+ ));
+
+ gcmkVERIFY_OK(gctaOS_ReadRegister(
+ os, Hardware->ta->core,
+ 0x00030
+,
+ &Hardware->customerID
+ ));
+
+ /***************************************************************************
+ ** Get chip features.
+ */
+
+ database =
+ Hardware->featureDatabase =
+ gcQueryFeatureDB(
+ Hardware->chipModel,
+ Hardware->chipRevision,
+ Hardware->productID,
+ Hardware->ecoID,
+ Hardware->customerID
+ );
+
+ if (database == gcvNULL)
+ {
+ gcmkPRINT("[galcore]: Feature database is not found,"
+ "chipModel=0x%0x, chipRevision=0x%x, productID=0x%x, ecoID=0x%x, customerID=0x%x",
+ Hardware->chipModel,
+ Hardware->chipRevision,
+ Hardware->productID,
+ Hardware->ecoID,
+ Hardware->customerID);
+ gcmkONERROR(gcvSTATUS_NOT_FOUND);
+ }
+ /* Success. */
+ gcmkFOOTER();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+
+gceSTATUS
+gctaHARDWARE_SetMMUStates(
+ IN gcTA_HARDWARE Hardware,
+ IN gctPOINTER MtlbAddress,
+ IN gceMMU_MODE Mode,
+ IN gctPOINTER SafeAddress,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gceSTATUS status;
+ gctUINT32 config;
+ gctUINT32 extMtlb;
+ gctPHYS_ADDR_T physical;
+ gctUINT32_PTR buffer;
+ gctUINT32 reserveBytes = 2 * 4;
+ gcsMMU_TABLE_ARRAY_ENTRY * entry;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ entry = (gcsMMU_TABLE_ARRAY_ENTRY *) Hardware->pagetableArray.logical;
+
+ /* Convert logical address into physical address. */
+ gcmkONERROR(
+ gctaOS_GetPhysicalAddress(Hardware->os, MtlbAddress, &physical));
+
+ config = (gctUINT32)(physical & 0xFFFFFFFF);
+ extMtlb = (gctUINT32)(physical >> 32);
+ /* more than 40bit physical address */
+ if (extMtlb & 0xFFFFFF00)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ switch (Mode)
+ {
+ case gcvMMU_MODE_1K:
+ if (config & 0x3FF)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_ALIGNED);
+ }
+
+ config |= ((((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)));
+
+ break;
+
+ case gcvMMU_MODE_4K:
+ if (config & 0xFFF)
+ {
+ gcmkONERROR(gcvSTATUS_NOT_ALIGNED);
+ }
+
+ config |= ((((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)));
+
+ break;
+
+ default:
+ gcmkONERROR(gcvSTATUS_INVALID_ARGUMENT);
+ }
+
+ if (Logical != gcvNULL)
+ {
+ buffer = Logical;
+
+ /* Setup page table array entry. */
+ entry->low = config;
+ entry->high = extMtlb;
+
+ /* Setup command buffer to load index 0 of page table array. */
+ *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) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0x006B) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 25:16) - (0 ?
+ 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)));
+
+ *buffer++
+ = (((((gctUINT32) (~0U)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) (0) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) &((((gctUINT32) (~0U)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16))));
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ *Bytes = reserveBytes;
+ }
+
+ /* Return the status. */
+ gcmkFOOTER_NO();
+ return status;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gctaHARDWARE_End(
+ IN gcTA_HARDWARE Hardware,
+ IN gctPOINTER Logical,
+ IN OUT gctUINT32 * Bytes
+ )
+{
+ gctUINT32_PTR logical = (gctUINT32_PTR) Logical;
+ gceSTATUS status;
+
+ gcmkHEADER_ARG("Hardware=0x%x Logical=0x%x *Bytes=%lu",
+ Hardware, Logical, gcmOPT_VALUE(Bytes));
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT((Logical == gcvNULL) || (Bytes != gcvNULL));
+
+ if (Logical != gcvNULL)
+ {
+ if (*Bytes < 8)
+ {
+ /* Command queue too small. */
+ gcmkONERROR(gcvSTATUS_BUFFER_TOO_SMALL);
+ }
+
+ /* Append END. */
+ logical[0] =
+ ((((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) (0x02 & ((gctUINT32) ((((1 ?
+ 31:27) - (0 ?
+ 31:27) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:27) - (0 ? 31:27) + 1))))))) << (0 ? 31:27)));
+
+ /* Record the count of execution which is finised by this END. */
+ logical[1] =
+ 0;
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE, "0x%x: END", Logical);
+ }
+
+ if (Bytes != gcvNULL)
+ {
+ /* Return number of bytes required by the END command. */
+ *Bytes = 8;
+ }
+
+ /* Success. */
+ gcmkFOOTER_ARG("*Bytes=%lu", gcmOPT_VALUE(Bytes));
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+
+gceSTATUS
+gctaHARDWARE_Construct(
+ IN gcTA TA,
+ OUT gcTA_HARDWARE * Hardware
+ )
+{
+ gceSTATUS status;
+ gcTA_HARDWARE hardware = gcvNULL;
+
+ gctaOS os = TA->os;
+
+ gcmkONERROR(gctaOS_Allocate(
+ gcmSIZEOF(gcsTA_HARDWARE),
+ (gctPOINTER *)&hardware
+ ));
+
+ gctaOS_ZeroMemory((gctUINT8_PTR)hardware, gcmSIZEOF(gcsTA_HARDWARE));
+
+ hardware->ta = TA;
+ hardware->os = os;
+
+ hardware->pagetableArray.size = 4096;
+
+ hardware->functionBytes = 4096;
+
+ /* Power on GPU. */
+ gctaOS_SetGPUPower(os, TA->core, gcvTRUE, gcvTRUE);
+
+ /*************************************/
+ /******** Get chip information ******/
+ /*************************************/
+ gctaOS_WriteRegister(
+ hardware->ta->os, hardware->ta->core,
+ 0x00000,
+ 0x00000900
+ );
+
+ gcmkONERROR(_IdentifyHardwareByDatabase(hardware));
+
+ *Hardware = hardware;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (hardware)
+ {
+ gctaOS_Free(hardware);
+ }
+
+ return status;
+}
+
+gceSTATUS
+gctaHARDWARE_Destroy(
+ IN gcTA_HARDWARE Hardware
+ )
+{
+ if (Hardware->pagetableArray.logical)
+ {
+ gctaOS_FreeSecurityMemory(
+ Hardware->ta->os,
+ Hardware->pagetableArray.size,
+ Hardware->pagetableArray.logical,
+ (gctUINT32_PTR)Hardware->pagetableArray.physical
+ );
+ }
+
+ if (Hardware->functionLogical)
+ {
+ gctaOS_FreeSecurityMemory(
+ Hardware->ta->os,
+ Hardware->functionBytes,
+ Hardware->functionLogical,
+ (gctUINT32_PTR)Hardware->functionPhysical
+ );
+ }
+
+ gctaOS_Free(Hardware);
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gctaHARDWARE_Execute(
+ IN gcTA TA,
+ IN gctUINT32 Address,
+ IN gctUINT32 Bytes
+ )
+{
+ gceSTATUS status;
+ gctUINT32 address = Address, control;
+
+ gcmkHEADER_ARG("Address=0x%x Bytes=%lu",
+ Address, Bytes);
+
+ /* Enable all events. */
+ gcmkONERROR(
+ gctaOS_WriteRegister(TA->os, TA->core, 0x00014, ~0U));
+
+ /* Write address register. */
+ gcmkONERROR(
+ gctaOS_WriteRegister(TA->os, TA->core, 0x00654, address));
+
+ /* Build control register. */
+ control = ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1))))))) << (0 ?
+ 16:16))) | (((gctUINT32) (0x1 & ((gctUINT32) ((((1 ?
+ 16:16) - (0 ?
+ 16:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 16:16) - (0 ? 16:16) + 1))))))) << (0 ? 16:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1))))))) << (0 ?
+ 15:0))) | (((gctUINT32) ((gctUINT32) ((Bytes + 7) >> 3) & ((gctUINT32) ((((1 ?
+ 15:0) - (0 ?
+ 15:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:0) - (0 ? 15:0) + 1))))))) << (0 ? 15:0)));
+
+ /* Write control register. */
+ gcmkONERROR(
+ gctaOS_WriteRegister(TA->os, TA->core, 0x003A4, control));
+
+ gcmkTRACE_ZONE(gcvLEVEL_INFO, gcvZONE_HARDWARE,
+ "Started command buffer @ 0x%08x",
+ address);
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ /* Return the status. */
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gctaHARDWARE_MmuEnable(
+ IN gcTA_HARDWARE Hardware
+ )
+{
+ gctaOS_WriteRegister(
+ Hardware->ta->os, Hardware->ta->core,
+ 0x0018C,
+ ((((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) ((gctUINT32) (1 ) & ((gctUINT32) ((((1 ?
+ 0:0) - (0 ?
+ 0:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 0:0) - (0 ? 0:0) + 1))))))) << (0 ? 0:0))));
+
+ return gcvSTATUS_OK;
+}
+
+/*
+* In trust zone, we prepare page table array table and configure base address of
+* it to hardware.
+*/
+gceSTATUS
+gctaHARDWARE_SetMMU(
+ IN gcTA_HARDWARE Hardware,
+ IN gctPOINTER Logical
+ )
+{
+ gcsMMU_TABLE_ARRAY_ENTRY *entry;
+ gcsHARDWARE_FUNCTION *function = &Hardware->functions[0];
+ gctUINT32 delay = 1;
+ gctUINT32 timer = 0;
+ gctUINT32 idle;
+ gctPHYS_ADDR_T mtlbPhysical;
+ gctPHYS_ADDR_T secureSafeAddress;
+ gctPHYS_ADDR_T nonSecureSafeAddress;
+
+ gctaOS_GetPhysicalAddress(Hardware->ta->os, Logical, &mtlbPhysical);
+
+ gctaOS_GetPhysicalAddress(Hardware->ta->os, Hardware->ta->mmu->safePageLogical, &secureSafeAddress);
+
+ gctaOS_GetPhysicalAddress(Hardware->ta->os, Hardware->ta->mmu->nonSecureSafePageLogical, &nonSecureSafeAddress);
+
+ /* not support more than 40bit physical address */
+ if ((secureSafeAddress & 0xFFFFFF0000000000ULL) ||
+ (nonSecureSafeAddress & 0xFFFFFF0000000000ULL))
+ {
+ return (gcvSTATUS_NOT_SUPPORTED);
+ }
+
+ /* Fill entry 0 of page table array. */
+ entry = (gcsMMU_TABLE_ARRAY_ENTRY *)Hardware->pagetableArray.logical;
+
+ entry->low = (gctUINT32)(mtlbPhysical & 0xFFFFFFFF);
+
+ entry->high = (gctUINT32)(mtlbPhysical >> 32)
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1))))))) << (0 ?
+ 8:8))) | (((gctUINT32) ((gctUINT32) (1) & ((gctUINT32) ((((1 ?
+ 8:8) - (0 ?
+ 8:8) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 8:8) - (0 ? 8:8) + 1))))))) << (0 ? 8:8)))
+ ;
+
+ /* Set page table base. */
+ gctaOS_WriteRegister(
+ Hardware->ta->os, Hardware->ta->core,
+ 0x0038C,
+ (gctUINT32)(Hardware->pagetableArray.address & 0xFFFFFFFF)
+ );
+
+ gctaOS_WriteRegister(
+ Hardware->ta->os, Hardware->ta->core,
+ 0x00390,
+ (gctUINT32)((Hardware->pagetableArray.address >> 32) & 0xFFFFFFFF)
+ );
+
+ gctaOS_WriteRegister(
+ Hardware->ta->os, Hardware->ta->core,
+ 0x00394
+,
+ 1
+ );
+
+ gctaOS_WriteRegister(
+ Hardware->ta->os, Hardware->ta->core,
+ 0x0039C,
+ (gctUINT32)(secureSafeAddress & 0xFFFFFFFF)
+ );
+
+ gctaOS_WriteRegister(
+ Hardware->ta->os, Hardware->ta->core,
+ 0x00398,
+ (gctUINT32)(nonSecureSafeAddress & 0xFFFFFFFF)
+ );
+
+ gctaOS_WriteRegister(
+ Hardware->ta->os, Hardware->ta->core,
+ 0x003A0,
+ ((((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) ((gctUINT32)((secureSafeAddress >> 32) & 0xFFFFFFFF)) & ((gctUINT32) ((((1 ?
+ 23:16) - (0 ?
+ 23:16) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 23:16) - (0 ? 23:16) + 1))))))) << (0 ? 23:16)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1))))))) << (0 ?
+ 31:31))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 31:31) - (0 ?
+ 31:31) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 31:31) - (0 ? 31:31) + 1))))))) << (0 ? 31:31)))
+ | ((((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) ((gctUINT32)((secureSafeAddress >> 32) & 0xFFFFFFFF)) & ((gctUINT32) ((((1 ?
+ 7:0) - (0 ?
+ 7:0) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 7:0) - (0 ? 7:0) + 1))))))) << (0 ? 7:0)))
+ | ((((gctUINT32) (0)) & ~(((gctUINT32) (((gctUINT32) ((((1 ?
+ 15:15) - (0 ?
+ 15:15) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ?
+ 15:15) - (0 ?
+ 15:15) + 1))))))) << (0 ?
+ 15:15))) | (((gctUINT32) (0x0 & ((gctUINT32) ((((1 ?
+ 15:15) - (0 ?
+ 15:15) + 1) == 32) ?
+ ~0U : (~(~0U << ((1 ? 15:15) - (0 ? 15:15) + 1))))))) << (0 ? 15:15)))
+ );
+
+ /* Execute prepared command sequence. */
+ gctaHARDWARE_Execute(
+ Hardware->ta,
+ function->address,
+ function->bytes
+ );
+
+ /* Wait until MMU configure finishes. */
+ do
+ {
+ gctaOS_Delay(Hardware->os, delay);
+
+ gctaOS_ReadRegister(
+ Hardware->ta->os, Hardware->ta->core,
+ 0x00004,
+ &idle);
+
+ timer += delay;
+ delay *= 2;
+ }
+ 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. */
+ gctaOS_WriteRegister(
+ Hardware->os, Hardware->ta->core,
+ 0x00388,
+ ((((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)))
+ );
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gctaHARDWARE_PrepareFunctions(
+ IN gcTA_HARDWARE Hardware
+ )
+{
+ gceSTATUS status;
+ gcsHARDWARE_FUNCTION * function;
+ gctUINT32 mmuBytes;
+ gctUINT32 endBytes = 8;
+ gctUINT8_PTR logical;
+ gctPHYS_ADDR_T physical;
+
+ gcmkHEADER();
+
+ /* Allocate page table array. */
+ gcmkONERROR(gctaOS_AllocateSecurityMemory(
+ Hardware->ta->os,
+ &Hardware->pagetableArray.size,
+ &Hardware->pagetableArray.logical,
+ &Hardware->pagetableArray.physical
+ ));
+
+ gcmkONERROR(gctaOS_GetPhysicalAddress(
+ Hardware->ta->os,
+ Hardware->pagetableArray.logical,
+ &Hardware->pagetableArray.address
+ ));
+
+ /* Allocate GPU functions. */
+ gcmkONERROR(gctaOS_AllocateSecurityMemory(
+ Hardware->ta->os,
+ &Hardware->functionBytes,
+ &Hardware->functionLogical,
+ &Hardware->functionPhysical
+ ));
+
+ gcmkONERROR(gctaOS_GetPhysicalAddress(
+ Hardware->ta->os,
+ Hardware->functionLogical,
+ &physical
+ ));
+
+ gcmkSAFECASTPHYSADDRT(Hardware->functionAddress, physical);
+
+ function = &Hardware->functions[0];
+
+ function->logical = Hardware->functionLogical;
+
+ function->address = Hardware->functionAddress;
+
+ logical = function->logical;
+
+ gcmkONERROR(gctaHARDWARE_SetMMUStates(
+ Hardware,
+ Hardware->ta->mmu->mtlbLogical,
+ gcvMMU_MODE_4K,
+ Hardware->ta->mmu->safePageLogical,
+ logical,
+ &mmuBytes
+ ));
+
+ logical += 8;
+
+ gcmkONERROR(gctaHARDWARE_End(
+ Hardware,
+ logical,
+ &endBytes
+ ));
+
+ function->bytes = mmuBytes + endBytes;
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gctaHARDWARE_IsFeatureAvailable(
+ IN gcTA_HARDWARE Hardware,
+ IN gceFEATURE Feature
+ )
+{
+ gctBOOL available;
+ gcsFEATURE_DATABASE *database = Hardware->featureDatabase;
+
+ switch (Feature)
+ {
+ case gcvFEATURE_SECURITY:
+ available = database->SECURITY;
+ break;
+ default:
+ gcmkFATAL("Invalid feature has been requested.");
+ available = gcvFALSE;
+ }
+
+ return available;
+}
+
+gceSTATUS
+gctaHARDWARE_DumpMMUException(
+ IN gcTA_HARDWARE Hardware
+ )
+{
+ gctUINT32 mmu = 0;
+ gctUINT32 mmuStatus = 0;
+ gctUINT32 address = 0;
+ gctUINT32 i = 0;
+
+ gctUINT32 mmuStatusRegAddress;
+ gctUINT32 mmuExceptionAddress;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ mmuStatusRegAddress = 0x00384;
+ mmuExceptionAddress = 0x00380;
+
+ /* Verify the arguments. */
+ gcmkVERIFY_OBJECT(Hardware, gcvOBJ_HARDWARE);
+
+ gcmkPRINT("ChipModel=0x%x ChipRevision=0x%x:\n",
+ Hardware->chipModel,
+ Hardware->chipRevision);
+
+ gcmkPRINT("**************************\n");
+ gcmkPRINT("*** MMU ERROR DUMP ***\n");
+ gcmkPRINT("**************************\n");
+
+ gcmkVERIFY_OK(gctaOS_ReadRegister(
+ Hardware->os, Hardware->ta->core,
+ mmuStatusRegAddress
+,
+ &mmuStatus
+ ));
+
+ gcmkPRINT(" MMU status = 0x%08X\n", mmuStatus);
+
+ for (i = 0; i < 4; i += 1)
+ {
+ mmu = mmuStatus & 0xF;
+ mmuStatus >>= 4;
+
+ if (mmu == 0)
+ {
+ continue;
+ }
+
+ switch (mmu)
+ {
+ case 1:
+ gcmkPRINT(" MMU%d: slave not present\n", i);
+ break;
+
+ case 2:
+ gcmkPRINT(" MMU%d: page not present\n", i);
+ break;
+
+ case 3:
+ gcmkPRINT(" MMU%d: write violation\n", i);
+ break;
+
+ case 4:
+ gcmkPRINT(" MMU%d: out of bound", i);
+ break;
+
+ case 5:
+ gcmkPRINT(" MMU%d: read security violation", i);
+ break;
+
+ case 6:
+ gcmkPRINT(" MMU%d: write security violation", i);
+ break;
+
+ default:
+ gcmkPRINT(" MMU%d: unknown state\n", i);
+ }
+
+ gcmkVERIFY_OK(gctaOS_ReadRegister(
+ Hardware->os, Hardware->ta->core,
+ mmuExceptionAddress + i * 4
+,
+ &address
+ ));
+
+ gcmkPRINT(" MMU%d: exception address = 0x%08X\n", i, address);
+
+ gctaMMU_DumpPagetableEntry(Hardware->ta->mmu, address);
+ }
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gctaHARDWARE_ReadMMUException(
+ IN gcTA_HARDWARE Hardware,
+ OUT gctUINT32_PTR MMUStatus,
+ OUT gctUINT32_PTR MMUException
+ )
+{
+ gctUINT32 mmuStatusRegAddress;
+ gctUINT32 mmuExceptionAddress;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ mmuStatusRegAddress = 0x00384;
+ mmuExceptionAddress = 0x00380;
+
+ gcmkVERIFY_OK(gctaOS_ReadRegister(
+ Hardware->os, Hardware->ta->core,
+ mmuStatusRegAddress
+,
+ MMUStatus
+ ));
+
+ gcmkVERIFY_OK(gctaOS_ReadRegister(
+ Hardware->os, Hardware->ta->core,
+ mmuExceptionAddress
+,
+ MMUException
+ ));
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gctaHARDWARE_HandleMMUException(
+ IN gcTA_HARDWARE Hardware,
+ IN gctUINT32 MMUStatus,
+ IN gctPHYS_ADDR_T Physical,
+ IN gctUINT32 GPUAddress
+ )
+{
+ gctUINT32 mmu = 0;
+ gctUINT32 mmuStatus = 0;
+ gctUINT32 mtlbEntry = 0;
+ gctUINT32_PTR stlbEntry;
+ gctBOOL secure;
+
+ gctUINT32 mmuStatusRegAddress;
+ gctUINT32 mmuExceptionAddress;
+
+ gcmkHEADER_ARG("Hardware=0x%x", Hardware);
+
+ mmuStatusRegAddress = 0x00384;
+ mmuExceptionAddress = 0x00380;
+
+ gcmkVERIFY_OK(gctaOS_ReadRegister(
+ Hardware->os, Hardware->ta->core,
+ mmuStatusRegAddress
+,
+ &mmuStatus
+ ));
+
+ mmu = mmuStatus & 0xF;
+
+ /* Setup page table. */
+
+ gctaMMU_GetPageEntry(
+ Hardware->ta->mmu,
+ GPUAddress,
+ &mtlbEntry,
+ &stlbEntry,
+ &secure
+ );
+
+ gctaMMU_SetPage(
+ Hardware->ta->mmu,
+ (gctUINT32)Physical,
+ stlbEntry
+ );
+
+ switch (mmu)
+ {
+ case 1:
+ gcmkASSERT(mtlbEntry != 0);
+ gctaOS_WriteRegister(
+ Hardware->os, Hardware->ta->core,
+ mmuExceptionAddress
+,
+ mtlbEntry
+ );
+
+ break;
+
+ case 2:
+ gctaOS_WriteRegister(
+ Hardware->os, Hardware->ta->core,
+ mmuExceptionAddress
+,
+ *stlbEntry
+ );
+ break;
+
+ default:
+ gcmkASSERT(0);
+ }
+
+
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
diff --git a/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.h b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.h
new file mode 100644
index 000000000000..6e7c8bd76875
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_hardware.h
@@ -0,0 +1,139 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#ifndef _GC_HAL_TA_HARDWARE_H_
+#define _GC_HAL_TA_HARDWARE_H_
+#include "gc_hal_types.h"
+#include "gc_hal_security_interface.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _gcsMMU_TABLE_ARRAY_ENTRY
+{
+ gctUINT32 low;
+ gctUINT32 high;
+}
+gcsMMU_TABLE_ARRAY_ENTRY;
+
+typedef struct _gcsHARDWARE_PAGETABLE_ARRAY
+{
+ /* Number of entries in page table array. */
+ gctUINT num;
+
+ /* Size in bytes of array. */
+ gctSIZE_T size;
+
+ /* Physical address of array. */
+ gctPHYS_ADDR_T address;
+
+ /* Memory descriptor. */
+ gctPOINTER physical;
+
+ /* Logical address of array. */
+ gctPOINTER logical;
+}
+gcsHARDWARE_PAGETABLE_ARRAY;
+
+typedef struct _gcsHARWARE_FUNCTION
+{
+ /* Entry of the function. */
+ gctUINT32 address;
+
+ /* CPU address of the function. */
+ gctUINT8_PTR logical;
+
+ /* Bytes of the function. */
+ gctUINT32 bytes;
+
+ /* Hardware address of END in this function. */
+ gctUINT32 endAddress;
+
+ /* Logical of END in this function. */
+ gctUINT8_PTR endLogical;
+}
+gcsHARDWARE_FUNCTION;
+
+typedef struct _gcTA_HARDWARE
+{
+ gctaOS os;
+ gcTA ta;
+
+ gctUINT32 chipModel;
+ gctUINT32 chipRevision;
+ gctUINT32 productID;
+ gctUINT32 ecoID;
+ gctUINT32 customerID;
+
+ gctPOINTER featureDatabase;
+
+ gcsHARDWARE_PAGETABLE_ARRAY pagetableArray;
+
+ /* Function used by gctaHARDWARE. */
+ gctPHYS_ADDR functionPhysical;
+ gctPOINTER functionLogical;
+ gctUINT32 functionAddress;
+ gctSIZE_T functionBytes;
+
+ gcsHARDWARE_FUNCTION functions[1];
+}
+gcsTA_HARDWARE;
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_mmu.c b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_mmu.c
new file mode 100644
index 000000000000..8cad46c05622
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/security_v1/gc_hal_ta_mmu.c
@@ -0,0 +1,585 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_types.h"
+#include "gc_hal_base.h"
+#include "gc_hal_security_interface.h"
+#include "gc_hal_ta.h"
+#include "gc_hal.h"
+
+#define _GC_OBJ_ZONE 2
+/*******************************************************************************
+************************************ Define ************************************
+********************************************************************************/
+
+#define gcdMMU_MTLB_SHIFT 22
+#define gcdMMU_STLB_4K_SHIFT 12
+#define gcdMMU_STLB_64K_SHIFT 16
+
+#define gcdMMU_MTLB_BITS (32 - gcdMMU_MTLB_SHIFT)
+#define gcdMMU_PAGE_4K_BITS gcdMMU_STLB_4K_SHIFT
+#define gcdMMU_STLB_4K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_PAGE_4K_BITS)
+#define gcdMMU_PAGE_64K_BITS gcdMMU_STLB_64K_SHIFT
+#define gcdMMU_STLB_64K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_PAGE_64K_BITS)
+
+#define gcdMMU_MTLB_ENTRY_NUM (1 << gcdMMU_MTLB_BITS)
+#define gcdMMU_MTLB_SIZE (gcdMMU_MTLB_ENTRY_NUM << 2)
+#define gcdMMU_STLB_4K_ENTRY_NUM (1 << gcdMMU_STLB_4K_BITS)
+#define gcdMMU_STLB_4K_SIZE (gcdMMU_STLB_4K_ENTRY_NUM << 2)
+#define gcdMMU_PAGE_4K_SIZE (1 << gcdMMU_STLB_4K_SHIFT)
+#define gcdMMU_STLB_64K_ENTRY_NUM (1 << gcdMMU_STLB_64K_BITS)
+#define gcdMMU_STLB_64K_SIZE (gcdMMU_STLB_64K_ENTRY_NUM << 2)
+#define gcdMMU_PAGE_64K_SIZE (1 << gcdMMU_STLB_64K_SHIFT)
+
+#define gcdMMU_MTLB_MASK (~((1U << gcdMMU_MTLB_SHIFT)-1))
+#define gcdMMU_STLB_4K_MASK ((~0U << gcdMMU_STLB_4K_SHIFT) ^ gcdMMU_MTLB_MASK)
+#define gcdMMU_PAGE_4K_MASK (gcdMMU_PAGE_4K_SIZE - 1)
+#define gcdMMU_STLB_64K_MASK ((~((1U << gcdMMU_STLB_64K_SHIFT)-1)) ^ gcdMMU_MTLB_MASK)
+#define gcdMMU_PAGE_64K_MASK (gcdMMU_PAGE_64K_SIZE - 1)
+
+/* Page offset definitions. */
+#define gcdMMU_OFFSET_4K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_STLB_4K_BITS)
+#define gcdMMU_OFFSET_4K_MASK ((1U << gcdMMU_OFFSET_4K_BITS) - 1)
+#define gcdMMU_OFFSET_64K_BITS (32 - gcdMMU_MTLB_BITS - gcdMMU_STLB_64K_BITS)
+#define gcdMMU_OFFSET_64K_MASK ((1U << gcdMMU_OFFSET_64K_BITS) - 1)
+
+#define gcdMMU_MTLB_PRESENT 0x00000001
+#define gcdMMU_MTLB_EXCEPTION 0x00000002
+#define gcdMMU_MTLB_4K_PAGE (0 << 2)
+
+#define gcdMMU_STLB_PRESENT 0x00000001
+#define gcdMMU_STLB_EXCEPTION 0x00000002
+#define gcdMMU_STLB_SECURITY (1 << 4)
+
+#define gcdUSE_MMU_EXCEPTION 1
+
+#define gcdMMU_SECURE_AREA_START ((gcdMMU_MTLB_ENTRY_NUM - gcdMMU_SECURE_AREA_SIZE) << gcdMMU_MTLB_SHIFT)
+
+typedef enum _gceMMU_TYPE
+{
+ gcvMMU_USED = (0 << 4),
+ gcvMMU_SINGLE = (1 << 4),
+ gcvMMU_FREE = (2 << 4),
+}
+gceMMU_TYPE;
+
+typedef struct _gcsMMU_STLB *gcsMMU_STLB_PTR;
+typedef struct _gcsMMU_STLB
+{
+ gctPHYS_ADDR physical;
+ gctUINT32_PTR logical;
+ gctSIZE_T size;
+ gctPHYS_ADDR_T physBase;
+ gctSIZE_T pageCount;
+ gctUINT32 mtlbIndex;
+ gctUINT32 mtlbEntryNum;
+ gcsMMU_STLB_PTR next;
+} gcsMMU_STLB;
+
+
+#define gcmENTRY_TYPE(x) (x & 0xF0)
+/*
+* We need flat mapping ta command buffer.
+
+*/
+
+/*
+* Helper
+*/
+gctUINT32
+_MtlbOffset(
+ gctUINT32 Address
+ )
+{
+ return (Address & gcdMMU_MTLB_MASK) >> gcdMMU_MTLB_SHIFT;
+}
+
+gctUINT32
+_StlbOffset(
+ gctUINT32 Address
+ )
+{
+ return (Address & gcdMMU_STLB_4K_MASK) >> gcdMMU_STLB_4K_SHIFT;
+}
+
+static gctUINT32
+_SetPage(gctUINT32 PageAddress)
+{
+ return PageAddress
+ /* writable */
+ | (1 << 2)
+ /* Ignore exception */
+ | (0 << 1)
+ /* Present */
+ | (1 << 0);
+}
+
+static void
+_WritePageEntry(
+ IN gctUINT32_PTR PageEntry,
+ IN gctUINT32 EntryValue
+ )
+{
+ *PageEntry = EntryValue;
+
+ gctaOS_CacheClean((gctUINT8_PTR)PageEntry, gcmSIZEOF(gctUINT32));
+}
+
+static gceSTATUS
+_FillPageTable(
+ IN gctUINT32_PTR PageTable,
+ IN gctUINT32 PageCount,
+ IN gctUINT32 EntryValue
+)
+{
+ gctUINT i;
+
+ for (i = 0; i < PageCount; i++)
+ {
+ _WritePageEntry(PageTable + i, EntryValue);
+ }
+
+ return gcvSTATUS_OK;
+}
+
+
+static gceSTATUS
+_AllocateStlb(
+ IN gctaOS Os,
+ OUT gcsMMU_STLB_PTR *Stlb
+ )
+{
+ gceSTATUS status;
+ gcsMMU_STLB_PTR stlb;
+ gctPOINTER pointer = gcvNULL;
+
+ /* Allocate slave TLB record. */
+ gcmkONERROR(gctaOS_Allocate(gcmSIZEOF(gcsMMU_STLB), &pointer));
+ stlb = pointer;
+
+ stlb->size = gcdMMU_STLB_4K_SIZE;
+
+ /* Allocate slave TLB entries. */
+ gcmkONERROR(gctaOS_AllocateSecurityMemory(
+ Os,
+ &stlb->size,
+ (gctPOINTER *)&stlb->logical,
+ &stlb->physical
+ ));
+
+ gcmkONERROR(gctaOS_GetPhysicalAddress(Os, stlb->logical, &stlb->physBase));
+
+#if gcdUSE_MMU_EXCEPTION
+ _FillPageTable(stlb->logical, (gctUINT32)stlb->size / 4, gcdMMU_STLB_EXCEPTION);
+#else
+ gctaOS_ZeroMemory(stlb->logical, (gctUINT32)stlb->size);
+#endif
+
+ *Stlb = stlb;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if(pointer != gcvNULL)
+ gcmkVERIFY_OK(gctaOS_Free(pointer));
+ return status;
+}
+
+gceSTATUS
+gctaMMU_Construct(
+ IN gcTA TA,
+ OUT gcTA_MMU *Mmu
+ )
+{
+ gceSTATUS status;
+ gctSIZE_T bytes = 4096;
+
+ gcTA_MMU mmu = gcvNULL;
+
+ gcmkONERROR(gctaOS_Allocate(
+ gcmSIZEOF(gcsTA_MMU),
+ (gctPOINTER *)&mmu
+ ));
+
+ mmu->mtlbLogical = gcvNULL;
+ mmu->stlbs = gcvNULL;
+ mmu->safePageLogical = gcvNULL;
+ mmu->nonSecureSafePageLogical = gcvNULL;
+
+ mmu->os = TA->os;
+
+ /* MTLB bytes. */
+ mmu->mtlbBytes = gcdMMU_MTLB_SIZE;
+
+ /* Allocate MTLB. */
+ gcmkONERROR(gctaOS_AllocateSecurityMemory(
+ TA->os,
+ &mmu->mtlbBytes,
+ &mmu->mtlbLogical,
+ &mmu->mtlbPhysical
+ ));
+
+#if gcdUSE_MMU_EXCEPTION
+ _FillPageTable(mmu->mtlbLogical, (gctUINT32)mmu->mtlbBytes / 4, gcdMMU_STLB_EXCEPTION);
+#else
+ gctaOS_ZeroMemory(mmu->mtlbLogical, (gctUINT32)mmu->mtlbBytes);
+#endif
+
+ /* Allocate a array to store stlbs. */
+ gcmkONERROR(gctaOS_Allocate((gctUINT32)mmu->mtlbBytes, &mmu->stlbs));
+
+ gctaOS_ZeroMemory((gctUINT8_PTR)mmu->stlbs, (gctUINT32)mmu->mtlbBytes);
+
+ /* Allocate security safe page. */
+ gcmkONERROR(gctaOS_AllocateSecurityMemory(
+ TA->os,
+ &bytes,
+ &mmu->safePageLogical,
+ &mmu->safePagePhysical
+ ));
+
+ gctaOS_ZeroMemory((gctUINT8_PTR)mmu->safePageLogical, (gctUINT32)bytes);
+
+ /* Allocate non security safe page. */
+ gcmkONERROR(gctaOS_AllocateSecurityMemory(
+ TA->os,
+ &bytes,
+ &mmu->nonSecureSafePageLogical,
+ &mmu->nonSecureSafePagePhysical
+ ));
+
+ gctaOS_ZeroMemory((gctUINT8_PTR)mmu->nonSecureSafePageLogical, (gctUINT32)bytes);
+
+ /* gcmkONERROR(gctaOS_CreateMutex(TA->os, &mmu->mutex)); */
+
+ *Mmu = mmu;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (mmu)
+ {
+ if (mmu->safePageLogical)
+ {
+ gcmkVERIFY_OK(gctaOS_FreeSecurityMemory(
+ TA->os,
+ 4096,
+ mmu->safePageLogical,
+ mmu->safePagePhysical
+ ));
+ }
+
+ if (mmu->nonSecureSafePageLogical)
+ {
+ gcmkVERIFY_OK(gctaOS_FreeSecurityMemory(
+ TA->os,
+ 4096,
+ mmu->nonSecureSafePageLogical,
+ mmu->nonSecureSafePagePhysical
+ ));
+ }
+
+ if (mmu->mtlbLogical)
+ {
+ gcmkVERIFY_OK(gctaOS_FreeSecurityMemory(
+ TA->os,
+ 4096,
+ mmu->mtlbLogical,
+ mmu->mtlbPhysical
+ ));
+ }
+
+ if (mmu->stlbs)
+ {
+ gcmkVERIFY_OK(gctaOS_Free((gctPOINTER)mmu->stlbs));
+ }
+
+ gcmkVERIFY_OK(gctaOS_Free((gctPOINTER)mmu));
+ }
+ return status;
+}
+
+gceSTATUS
+gctaMMU_Destory(
+ IN gcTA_MMU Mmu
+ )
+{
+ gctaOS os = Mmu->os;
+
+ if (Mmu->safePageLogical)
+ {
+ gcmkVERIFY_OK(gctaOS_FreeSecurityMemory(
+ os,
+ 4096,
+ Mmu->safePageLogical,
+ Mmu->safePagePhysical
+ ));
+ }
+
+ if (Mmu->nonSecureSafePageLogical)
+ {
+ gcmkVERIFY_OK(gctaOS_FreeSecurityMemory(
+ os,
+ 4096,
+ Mmu->nonSecureSafePageLogical,
+ Mmu->nonSecureSafePagePhysical
+ ));
+ }
+
+ if (Mmu->mtlbLogical)
+ {
+ gcmkVERIFY_OK(gctaOS_FreeSecurityMemory(
+ os,
+ 4096,
+ Mmu->mtlbLogical,
+ Mmu->mtlbPhysical
+ ));
+ }
+
+ if (Mmu->stlbs)
+ {
+ gcmkVERIFY_OK(gctaOS_Free((gctPOINTER)Mmu->stlbs));
+ }
+
+ gcmkVERIFY_OK(gctaOS_Free(Mmu));
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gctaMMU_GetPageEntry(
+ IN gcTA_MMU Mmu,
+ IN gctUINT32 Address,
+ OUT gctUINT32_PTR MtlbEntry,
+ OUT gctUINT32_PTR *PageTable,
+ OUT gctBOOL * Secure
+ )
+{
+ gceSTATUS status;
+ struct _gcsMMU_STLB *stlb;
+ struct _gcsMMU_STLB **stlbs = (struct _gcsMMU_STLB **)Mmu->stlbs;
+ gctUINT32 offset = _MtlbOffset(Address);
+ gctUINT32 mtlbEntry;
+ gctBOOL secure = Address > gcdMMU_SECURE_AREA_START;
+
+ gcmkHEADER_ARG("Mmu=0x%x", Mmu);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT((Address & 0xFFF) == 0);
+
+ stlb = stlbs[offset];
+
+ if (stlb == gcvNULL)
+ {
+ gcmkONERROR(_AllocateStlb(Mmu->os, &stlb));
+
+ mtlbEntry = (gctUINT32)(stlb->physBase & 0xFFFFFFFF)
+ | gcdMMU_MTLB_4K_PAGE
+ | gcdMMU_MTLB_PRESENT
+ ;
+
+ if (secure)
+ {
+ /* Secure MTLB. */
+ mtlbEntry |= (1 << 4);
+ }
+
+ /* Insert Slave TLB address to Master TLB entry.*/
+ _WritePageEntry((gctUINT32_PTR)Mmu->mtlbLogical + offset, mtlbEntry);
+
+ /* Record stlb. */
+ stlbs[offset] = stlb;
+
+ if (MtlbEntry)
+ {
+ /* Return entry value of new mtlb entry. */
+ *MtlbEntry = mtlbEntry;
+ }
+ }
+
+ *PageTable = &stlb->logical[_StlbOffset(Address)];
+
+ if (Secure)
+ {
+ *Secure = secure;
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gctaMMU_SetPage(
+ IN gcTA_MMU Mmu,
+ IN gctUINT32 PageAddress,
+ IN gctUINT32 *PageEntry
+ )
+{
+ /* gctBOOL secure; */
+
+ gcmkHEADER_ARG("Mmu=0x%x", Mmu);
+
+ /* Verify the arguments. */
+ gcmkVERIFY_ARGUMENT(PageEntry != gcvNULL);
+ gcmkVERIFY_ARGUMENT(!(PageAddress & 0xFFF));
+
+ _WritePageEntry(PageEntry, _SetPage(PageAddress));
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gctaMMU_FreePages(
+ IN gcTA_MMU Mmu,
+ IN gctUINT32 Address,
+ IN gctUINT32 PageCount
+ )
+{
+ gceSTATUS status;
+ gctUINT32 i;
+ gctUINT32_PTR entry;
+ gcmkHEADER_ARG("Mmu=0x%x", Mmu);
+
+ /* Fill in page table. */
+ for (i = 0; i < PageCount; i++)
+ {
+ gcmkONERROR(gctaMMU_GetPageEntry(Mmu, Address, gcvNULL, &entry, gcvNULL));
+
+#if gcdUSE_MMU_EXCEPTION
+ *entry = gcdMMU_STLB_EXCEPTION;
+#else
+ *entry = 0;
+#endif
+
+ Address += 4096;
+ }
+
+ /* Success. */
+ gcmkFOOTER_NO();
+ return gcvSTATUS_OK;
+
+OnError:
+ gcmkFOOTER();
+ return status;
+}
+
+gceSTATUS
+gctaMMU_Enable(
+ IN gcTA_MMU Mmu,
+ IN gcTA TA
+ )
+{
+ gceSTATUS status;
+ gctPHYS_ADDR_T address;
+ gctPHYS_ADDR_T safeAddress;
+
+ gcmkONERROR(gctaOS_GetPhysicalAddress(Mmu->os, Mmu->mtlbLogical, &address));
+
+ gctaOS_GetPhysicalAddress(Mmu->os, Mmu->safePageLogical, &safeAddress);
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+void
+gctaMMU_DumpPagetableEntry(
+ IN gcTA_MMU Mmu,
+ IN gctUINT32 Address
+ )
+{
+ gctUINT32 entry;
+ gctUINT32 mtlb = _MtlbOffset(Address);
+ gctUINT32_PTR mtlbLogical = Mmu->mtlbLogical;
+ gctUINT32_PTR stlbLogical;
+ gcsMMU_STLB_PTR stlb;
+ struct _gcsMMU_STLB **stlbs = (struct _gcsMMU_STLB **)Mmu->stlbs;
+
+ gctUINT32 stlbOffset = (Address & gcdMMU_STLB_4K_MASK) >> gcdMMU_STLB_4K_SHIFT;
+ gctUINT32 offsetInPage = Address & gcdMMU_OFFSET_4K_MASK;
+
+ stlb = stlbs[mtlb];
+
+ gcmkPRINT(" MTLB entry = %d\n", mtlb);
+
+ gcmkPRINT(" STLB entry = %d\n", stlbOffset);
+
+ gcmkPRINT(" Offset = 0x%08X (%d)\n", offsetInPage, offsetInPage);
+
+
+ if (stlb == gcvNULL)
+ {
+ /* Dmp mtlb entry. */
+ entry = mtlbLogical[mtlb];
+
+ gcmkPRINT(" mtlb entry [%d] = %x", mtlb, entry);
+ }
+ else
+ {
+ stlbLogical = stlb->logical;
+
+ gcmkPRINT(" stlb entry = 0x%08X", stlbLogical[stlbOffset]);
+ }
+}
+
+
diff --git a/drivers/mxc/gpu-viv/hal/security_v1/os/emulator/gc_hal_ta_emulator.c b/drivers/mxc/gpu-viv/hal/security_v1/os/emulator/gc_hal_ta_emulator.c
new file mode 100644
index 000000000000..c3339475df02
--- /dev/null
+++ b/drivers/mxc/gpu-viv/hal/security_v1/os/emulator/gc_hal_ta_emulator.c
@@ -0,0 +1,324 @@
+/****************************************************************************
+*
+* The MIT License (MIT)
+*
+* Copyright (c) 2014 - 2019 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 - 2019 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.
+*
+*****************************************************************************/
+
+
+#include "gc_hal_base.h"
+#include "gc_hal.h"
+#include "gc_hal_ta.h"
+#include "gc_hal_kernel_mutex.h"
+
+#define _GC_OBJ_ZONE gcvZONE_OS
+
+gcTA globalTA[16] = { gcvNULL, gcvNULL, gcvNULL, gcvNULL,gcvNULL, gcvNULL, gcvNULL, gcvNULL };
+gctaOS globalTAos;
+
+struct _gctaOS {
+ void *os;
+
+ gctPOINTER dispatchMutex;
+};
+
+gceSTATUS HALDECL
+TAEmulator(
+ gceCORE Core,
+ void * Interface
+ )
+{
+ gckOS_AcquireMutex(globalTAos->os, globalTAos->dispatchMutex, gcvINFINITE);
+
+ gcTA_Dispatch(globalTA[Core], Interface);
+
+ gckOS_ReleaseMutex(globalTAos->os, globalTAos->dispatchMutex);
+ return gcvSTATUS_OK;
+}
+
+
+gceSTATUS
+gctaOS_ConstructOS(
+ IN gckOS Os,
+ OUT gctaOS *TAos
+ )
+{
+ gctaOS os;
+ gctPOINTER pointer = gcvNULL;
+ gceSTATUS status;
+
+ gcmkONERROR(gckOS_AllocateMemory(Os, gcmSIZEOF(struct _gctaOS), &pointer));
+
+ os = (gctaOS)pointer;
+ os->os = Os;
+
+ gcmkONERROR(gckOS_CreateMutex(Os, &os->dispatchMutex));
+
+ *TAos = globalTAos = os;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ if (pointer != gcvNULL)
+ {
+ gcmkVERIFY_OK(gckOS_FreeMemory(Os, pointer));
+ }
+ return status;
+}
+
+gceSTATUS
+gctaOS_DestroyOS(
+ IN gctaOS Os
+ )
+{
+ gckOS os = Os->os;
+
+ gcmkVERIFY_OK(gckOS_DeleteMutex(os, Os->dispatchMutex));
+ gcmkVERIFY_OK(gckOS_FreeMemory(os, Os));
+
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gctaOS_AllocateSecurityMemory(
+ IN gctaOS Os,
+ IN gctSIZE_T *Bytes,
+ OUT gctPOINTER *Logical,
+ OUT gctPOINTER *Physical
+ )
+{
+ gceSTATUS status;
+
+ gcmkONERROR(gckOS_AllocateNonPagedMemory(Os->os, gcvFALSE, gcvALLOC_FLAG_CONTIGUOUS, Bytes, (gctPHYS_ADDR *)Physical, Logical));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gctaOS_FreeSecurityMemory(
+ IN gctaOS Os,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical,
+ OUT gctPOINTER Physical
+ )
+{
+ gckOS_FreeNonPagedMemory(Os->os, (gctPHYS_ADDR)Physical, Logical, Bytes);
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gctaOS_AllocateNonSecurityMemory(
+ IN gctaOS Os,
+ IN gctSIZE_T *Bytes,
+ OUT gctPOINTER *Logical,
+ OUT gctPOINTER *Physical
+ )
+{
+ gceSTATUS status;
+
+ gcmkONERROR(gckOS_AllocateNonPagedMemory(Os->os, gcvFALSE, gcvALLOC_FLAG_CONTIGUOUS, Bytes, (gctPHYS_ADDR *)Physical, Logical));
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS
+gctaOS_FreeNonSecurityMemory(
+ IN gctaOS Os,
+ IN gctSIZE_T Bytes,
+ IN gctPOINTER Logical,
+ OUT gctPOINTER Physical
+ )
+{
+ gckOS_FreeNonPagedMemory(Os->os, (gctPHYS_ADDR)Physical, Logical, Bytes);
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gctaOS_Allocate(
+ IN gctUINT32 Bytes,
+ OUT gctPOINTER *Pointer
+ )
+{
+ return gckOS_AllocateMemory(globalTAos->os, Bytes, Pointer);
+}
+
+gceSTATUS
+gctaOS_Free(
+ IN gctPOINTER Pointer
+ )
+{
+ return gckOS_FreeMemory(globalTAos->os, Pointer);
+}
+
+gceSTATUS
+gctaOS_GetPhysicalAddress(
+ IN gctaOS Os,
+ IN gctPOINTER Logical,
+ OUT gctPHYS_ADDR_T * Physical
+ )
+{
+ gctPHYS_ADDR_T physical;
+ gceSTATUS status;
+
+ gcmkONERROR(gckOS_GetPhysicalAddress(Os->os, Logical, &physical));
+
+ gcmkVERIFY_OK(gckOS_CPUPhysicalToGPUPhysical(Os->os, physical, &physical));
+
+ *Physical = physical;
+
+ return gcvSTATUS_OK;
+
+OnError:
+ return status;
+}
+
+gceSTATUS gctaOS_WriteRegister(
+ IN gctaOS Os, IN gceCORE Core,
+ IN gctUINT32 Address,
+ IN gctUINT32 Data
+ )
+{
+ return gckOS_WriteRegisterEx(Os->os, Core, Address, Data);
+}
+
+gceSTATUS gctaOS_ReadRegister(
+ IN gctaOS Os, IN gceCORE Core,
+ IN gctUINT32 Address,
+ IN gctUINT32 *Data
+ )
+{
+ return gckOS_ReadRegisterEx(Os->os, Core, Address, Data);
+}
+
+gceSTATUS
+gctaOS_MemCopy(
+ IN gctUINT8_PTR Dest,
+ IN gctUINT8_PTR Src,
+ IN gctUINT32 Bytes
+ )
+{
+ gckOS_MemCopy(Dest, Src, Bytes);
+ return gcvSTATUS_OK;
+}
+
+gceSTATUS
+gctaOS_ZeroMemory(
+ IN gctUINT8_PTR Dest,
+ IN gctUINT32 Bytes
+ )
+{
+ gckOS_ZeroMemory(Dest, Bytes);
+ return gcvSTATUS_OK;
+}
+
+void
+gctaOS_CacheFlush(
+ IN gctUINT8_PTR Dest,
+ IN gctUINT32 Bytes
+ )
+{
+
+}
+
+void
+gctaOS_CacheClean(
+ IN gctUINT8_PTR Dest,
+ IN gctUINT32 Bytes
+ )
+{
+
+}
+
+void
+gctaOS_CacheInvalidate(
+ IN gctUINT8_PTR Dest,
+ IN gctUINT32 Bytes
+ )
+{
+
+}
+
+gceSTATUS
+gctaOS_IsPhysicalSecure(
+ IN gctaOS Os,
+ IN gctUINT32 Physical,
+ OUT gctBOOL *Secure
+ )
+{
+ return gcvSTATUS_NOT_SUPPORTED;
+}
+
+gceSTATUS
+gctaOS_Delay(
+ IN gctaOS Os,
+ IN gctUINT32 Delay
+ )
+{
+ return gckOS_Delay(Os->os, Delay);
+}
+
+gceSTATUS
+gctaOS_SetGPUPower(
+ IN gctaOS Os,
+ IN gctUINT32 Core,
+ IN gctBOOL Clock,
+ IN gctBOOL Power
+ )
+{
+ return gckOS_SetGPUPower(Os->os, Core, Power, Clock);
+}
+
+
diff --git a/drivers/mxc/hantro/Kconfig b/drivers/mxc/hantro/Kconfig
new file mode 100644
index 000000000000..5fae512712a1
--- /dev/null
+++ b/drivers/mxc/hantro/Kconfig
@@ -0,0 +1,14 @@
+#
+# Codec configuration
+#
+
+menu "MXC HANTRO(Video Processing Unit) support"
+ depends on ARCH_MXC
+
+config MXC_HANTRO
+ tristate "Support for MXC HANTRO(Video Processing Unit)"
+ default y
+ ---help---
+ VPU codec device.
+
+endmenu
diff --git a/drivers/mxc/hantro/Makefile b/drivers/mxc/hantro/Makefile
new file mode 100644
index 000000000000..3673ac214fa3
--- /dev/null
+++ b/drivers/mxc/hantro/Makefile
@@ -0,0 +1,8 @@
+#
+# Makefile for the VPU drivers.
+#
+
+ccflags-y += -I$(PWD)/./dwl
+
+obj-$(CONFIG_MXC_HANTRO) += hantrodec.o
+
diff --git a/drivers/mxc/hantro/dwl_defs.h b/drivers/mxc/hantro/dwl_defs.h
new file mode 100644
index 000000000000..8976dcf156b6
--- /dev/null
+++ b/drivers/mxc/hantro/dwl_defs.h
@@ -0,0 +1,94 @@
+/*****************************************************************************
+ * The GPL License (GPL)
+ *
+ * Copyright (c) 2015-2017, VeriSilicon Inc.
+ * Copyright (c) 2011-2014, Google Inc.
+ *
+ * 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 may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ *****************************************************************************/
+
+#ifndef SOFTWARE_LINUX_DWL_DWL_DEFS_H_
+#define SOFTWARE_LINUX_DWL_DWL_DEFS_H_
+
+#define DWL_MPEG2_E 31 /* 1 bit */
+#define DWL_VC1_E 29 /* 2 bits */
+#define DWL_JPEG_E 28 /* 1 bit */
+#define DWL_MPEG4_E 26 /* 2 bits */
+#define DWL_H264_E 24 /* 2 bits */
+#define DWL_VP6_E 23 /* 1 bit */
+#define DWL_RV_E 26 /* 2 bits */
+#define DWL_VP8_E 23 /* 1 bit */
+#define DWL_VP7_E 24 /* 1 bit */
+#define DWL_WEBP_E 19 /* 1 bit */
+#define DWL_AVS_E 22 /* 1 bit */
+#if 0
+#define DWL_PP_E 16 /* 1 bit */
+#endif
+#define DWL_PP_E 31 /* 1 bit */
+#define DWL_HEVC_E 5 /* 2 bits */
+#define DWL_VP9_E 3 /* 2 bits */
+
+#define DWL_HEVC_ENA 0 /* 1 bits */
+#define DWL_VP9_ENA 1 /* 1 bits */
+#define DWL_RFC_E 2 /* 1 bits */
+#define DWL_DS_E 3 /* 1 bits */
+#define DWL_HEVC_VER 8 /* 4 bits */
+#define DWL_VP9_PROFILE 12 /* 3 bits */
+#define DWL_RING_E 16 /* 1 bits */
+
+#define HANTRODEC_IRQ_STAT_DEC 1
+#define HANTRODEC_IRQ_STAT_DEC_OFF (HANTRODEC_IRQ_STAT_DEC * 4)
+
+#define HANTRODECPP_SYNTH_CFG 60
+#define HANTRODECPP_SYNTH_CFG_OFF (HANTRODECPP_SYNTH_CFG * 4)
+#define HANTRODEC_SYNTH_CFG 50
+#define HANTRODEC_SYNTH_CFG_OFF (HANTRODEC_SYNTH_CFG * 4)
+#define HANTRODEC_SYNTH_CFG_2 54
+#define HANTRODEC_SYNTH_CFG_2_OFF (HANTRODEC_SYNTH_CFG_2 * 4)
+#define HANTRODEC_SYNTH_CFG_3 56
+#define HANTRODEC_SYNTH_CFG_3_OFF (HANTRODEC_SYNTH_CFG_3 * 4)
+#define HANTRODEC_CFG_STAT 23
+#define HANTRODEC_CFG_STAT_OFF (HANTRODEC_CFG_STAT * 4)
+
+
+#define HANTRODEC_DEC_E 0x01
+#define HANTRODEC_PP_E 0x01
+#define HANTRODEC_DEC_ABORT 0x20
+#define HANTRODEC_DEC_IRQ_DISABLE 0x10
+#define HANTRODEC_DEC_IRQ 0x100
+
+/* Legacy from G1 */
+#define HANTRO_IRQ_STAT_DEC 1
+#define HANTRO_IRQ_STAT_DEC_OFF (HANTRO_IRQ_STAT_DEC * 4)
+#define HANTRO_IRQ_STAT_PP 60
+#define HANTRO_IRQ_STAT_PP_OFF (HANTRO_IRQ_STAT_PP * 4)
+
+#define HANTROPP_SYNTH_CFG 100
+#define HANTROPP_SYNTH_CFG_OFF (HANTROPP_SYNTH_CFG * 4)
+#define HANTRODEC_SYNTH_CFG 50
+#define HANTRODEC_SYNTH_CFG_OFF (HANTRODEC_SYNTH_CFG * 4)
+#define HANTRODEC_SYNTH_CFG_2 54
+#define HANTRODEC_SYNTH_CFG_2_OFF (HANTRODEC_SYNTH_CFG_2 * 4)
+
+#define HANTRO_DEC_E 0x01
+#define HANTRO_PP_E 0x01
+#define HANTRO_DEC_ABORT 0x20
+#define HANTRO_DEC_IRQ_DISABLE 0x10
+#define HANTRO_PP_IRQ_DISABLE 0x10
+#define HANTRO_DEC_IRQ 0x100
+#define HANTRO_PP_IRQ 0x100
+
+#endif /* SOFTWARE_LINUX_DWL_DWL_DEFS_H_ */
diff --git a/drivers/mxc/hantro/hantrodec.c b/drivers/mxc/hantro/hantrodec.c
new file mode 100755
index 000000000000..f39a7802ce62
--- /dev/null
+++ b/drivers/mxc/hantro/hantrodec.c
@@ -0,0 +1,1946 @@
+/*****************************************************************************
+ * The GPL License (GPL)
+ *
+ * Copyright (c) 2015-2018, VeriSilicon Inc.
+ * Copyright (c) 2011-2014, Google Inc.
+ *
+ * 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 may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ *****************************************************************************/
+
+#include <linux/hantrodec.h>
+#include "dwl_defs.h"
+#include <linux/io.h>
+#include <linux/uaccess.h>
+#include <linux/errno.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/pci.h>
+#include <linux/sched.h>
+#include <linux/semaphore.h>
+#include <linux/spinlock.h>
+#include <linux/slab.h>
+#include <linux/version.h>
+#include <linux/wait.h>
+#include <linux/timer.h>
+#include <linux/clk.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/clk.h>
+//#include <linux/busfreq-imx.h>
+
+#ifdef CONFIG_DEVICE_THERMAL
+#include <linux/device_cooling.h>
+#define HANTRO_REG_THERMAL_NOTIFIER(a) register_devfreq_cooling_notifier(a)
+#define HANTRO_UNREG_THERMAL_NOTIFIER(a) unregister_devfreq_cooling_notifier(a)
+DEFINE_SPINLOCK(thermal_lock);
+/*1:hot, 0: not hot*/
+static int thermal_event;
+static int thermal_cur;
+static int hantro_clock_ratio = 2;
+static int hantro_dynamic_clock;
+module_param(hantro_clock_ratio, int, 0644);
+module_param(hantro_dynamic_clock, int, 0644);
+MODULE_PARM_DESC(hantro_clock_ratio, "clock ratio 1/N");
+MODULE_PARM_DESC(hantro_dynamic_clock, "enable or disable dynamic clock rate");
+#endif
+
+/*hantro G1 regs config including dec and pp*/
+#define HANTRO_DEC_ORG_REGS 60
+#define HANTRO_PP_ORG_REGS 41
+
+#define HANTRO_DEC_EXT_REGS 27
+#define HANTRO_PP_EXT_REGS 9
+
+#define HANTRO_G1_DEC_TOTAL_REGS (HANTRO_DEC_ORG_REGS + HANTRO_DEC_EXT_REGS)
+#define HANTRO_PP_TOTAL_REGS (HANTRO_PP_ORG_REGS + HANTRO_PP_EXT_REGS)
+#define HANTRO_G1_TOTAL_REGS 155 /*G1 total regs*/
+
+#define HANTRO_DEC_ORG_FIRST_REG 0
+#define HANTRO_DEC_ORG_LAST_REG 59
+#define HANTRO_DEC_EXT_FIRST_REG 119
+#define HANTRO_DEC_EXT_LAST_REG 145
+
+#define HANTRO_PP_ORG_FIRST_REG 60
+#define HANTRO_PP_ORG_LAST_REG 100
+#define HANTRO_PP_EXT_FIRST_REG 146
+#define HANTRO_PP_EXT_LAST_REG 154
+
+/*hantro G2 reg config*/
+#define HANTRO_G2_DEC_REGS 265 /*G2 total regs*/
+
+#define HANTRO_G2_DEC_FIRST_REG 0
+#define HANTRO_G2_DEC_LAST_REG (HANTRO_G2_DEC_REGS - 1)
+
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
+#define DEC_IO_SIZE_MAX (MAX(HANTRO_G2_DEC_REGS, HANTRO_G1_TOTAL_REGS) * 4)
+
+/********************************************************************
+ * PORTING SEGMENT
+ * NOTES: customer should modify these configuration if do porting to own platform.
+ * Please guarantee the base_addr, io_size,dec_irq belong to same core.
+ ********************************************************************/
+
+#define HXDEC_MAX_CORES 2
+
+/* Logic module base address */
+#define SOCLE_LOGIC_0_BASE 0x38300000
+#define SOCLE_LOGIC_1_BASE 0x38310000
+#define BLK_CTL_BASE 0x38320000
+
+#define VEXPRESS_LOGIC_0_BASE 0xFC010000
+#define VEXPRESS_LOGIC_1_BASE 0xFC020000
+
+#define DEC_IO_SIZE_0 ((HANTRO_G2_DEC_REGS) * 4) /* bytes */
+#define DEC_IO_SIZE_1 ((HANTRO_G2_DEC_REGS) * 4) /* bytes */
+
+#define HANTRO_G1_DEF_CLK (600000000)
+#define HANTRO_G2_DEF_CLK (600000000)
+#define HANTRO_BUS_DEF_CLK (800000000)
+#define HANTRO_CLK_VOL_THR (600000000)
+/***********************************************************************/
+
+#define IS_G1(hw_id) ((hw_id == 0x6731) ? 1:0)
+
+static const int DecHwId[] = {
+ 0x8190, /* Legacy HW */
+ 0x8170,
+ 0x9170,
+ 0x9190,
+ 0x6731, /* G1 */
+ 0x6732 /* G2 */
+};
+
+ulong multicorebase[HXDEC_MAX_CORES] = {
+ SOCLE_LOGIC_0_BASE,
+ SOCLE_LOGIC_1_BASE
+};
+
+
+static struct class *hantro_class;
+#define DEVICE_NAME "mxc_hantro"
+
+static struct device *hantro_dev;
+static struct clk *hantro_clk_g1;
+static struct clk *hantro_clk_g2;
+static struct clk *hantro_clk_bus;
+//static struct regulator *hantro_regulator;
+
+static int hantro_dbg = -1;
+module_param(hantro_dbg, int, 0644);
+MODULE_PARM_DESC(hantro_dbg, "Debug level (0-1)");
+#undef PDEBUG
+#define PDEBUG(fmt, arg...) \
+ do { \
+ if (hantro_dbg > 0) { \
+ dev_info(hantro_dev, fmt, ## arg); \
+ } \
+ } while (0)
+
+
+static int hantrodec_major; /* dynamic allocation */
+
+/* here's all the must remember stuff */
+typedef struct {
+ char *buffer;
+ unsigned int iosize[HXDEC_MAX_CORES];
+ volatile u8 *hwregs[HXDEC_MAX_CORES];
+ int irq[HXDEC_MAX_CORES];
+ int hw_id[HXDEC_MAX_CORES];
+ int cores;
+ struct fasync_struct *async_queue_dec;
+ struct fasync_struct *async_queue_pp;
+} hantrodec_t;
+
+static hantrodec_t hantrodec_data; /* dynamic allocation? */
+
+static int ReserveIO(void);
+static void ReleaseIO(void);
+
+static void ResetAsic(hantrodec_t *dev);
+
+#ifdef HANTRODEC_DEBUG
+static void dump_regs(hantrodec_t *dev);
+#endif
+
+/* IRQ handler */
+static irqreturn_t hantrodec_isr(int irq, void *dev_id);
+
+static u32 dec_regs[HXDEC_MAX_CORES][DEC_IO_SIZE_MAX/4];
+struct semaphore dec_core_sem;
+struct semaphore pp_core_sem;
+
+static int dec_irq;
+static int pp_irq;
+
+atomic_t irq_rx = ATOMIC_INIT(0);
+atomic_t irq_tx = ATOMIC_INIT(0);
+
+static struct file *dec_owner[HXDEC_MAX_CORES];
+static struct file *pp_owner[HXDEC_MAX_CORES];
+
+/* spinlock_t owner_lock = SPIN_LOCK_UNLOCKED; */
+DEFINE_SPINLOCK(owner_lock);
+
+DECLARE_WAIT_QUEUE_HEAD(dec_wait_queue);
+DECLARE_WAIT_QUEUE_HEAD(pp_wait_queue);
+
+DECLARE_WAIT_QUEUE_HEAD(hw_queue);
+
+#define DWL_CLIENT_TYPE_H264_DEC 1U
+#define DWL_CLIENT_TYPE_MPEG4_DEC 2U
+#define DWL_CLIENT_TYPE_JPEG_DEC 3U
+#define DWL_CLIENT_TYPE_PP 4U
+#define DWL_CLIENT_TYPE_VC1_DEC 5U
+#define DWL_CLIENT_TYPE_MPEG2_DEC 6U
+#define DWL_CLIENT_TYPE_VP6_DEC 7U
+#define DWL_CLIENT_TYPE_AVS_DEC 8U
+#define DWL_CLIENT_TYPE_RV_DEC 9U
+#define DWL_CLIENT_TYPE_VP8_DEC 10U
+#define DWL_CLIENT_TYPE_VP9_DEC 11U
+#define DWL_CLIENT_TYPE_HEVC_DEC 12U
+
+static u32 cfg[HXDEC_MAX_CORES];
+static u32 timeout;
+
+#if 0
+static int hantro_update_voltage(struct device *dev)
+{
+ unsigned long new_vol, old_vol;
+ int ret;
+ unsigned long clk1, clk2;
+
+ clk1 = clk_get_rate(hantro_clk_g1);
+ clk2 = clk_get_rate(hantro_clk_g2);
+
+ if (!clk1 || !clk2)
+ return -1;
+
+ old_vol = regulator_get_voltage(hantro_regulator);
+ if ((clk1 >= HANTRO_CLK_VOL_THR) || (clk2 >= HANTRO_CLK_VOL_THR))
+ new_vol = 1000000; // 1.0v
+ else
+ new_vol = 900000; // 0.9v
+
+ if (old_vol != new_vol) {
+ ret = regulator_set_voltage_tol(hantro_regulator, new_vol, 0);
+ if (ret)
+ pr_err("failed to set hantro voltage: %ld mV\n", new_vol/1000);
+ else
+ pr_info("update hantro voltage from %ld mV to %ld mV\n", old_vol/1000, new_vol/1000);
+ }
+ return 0;
+}
+#endif
+
+static int hantro_clk_enable(struct device *dev)
+{
+ clk_prepare(hantro_clk_g1);
+ clk_enable(hantro_clk_g1);
+ clk_prepare(hantro_clk_g2);
+ clk_enable(hantro_clk_g2);
+ clk_prepare(hantro_clk_bus);
+ clk_enable(hantro_clk_bus);
+ return 0;
+}
+
+static int hantro_clk_disable(struct device *dev)
+{
+ if (hantro_clk_g1) {
+ clk_disable(hantro_clk_g1);
+ clk_unprepare(hantro_clk_g1);
+ }
+ if (hantro_clk_g2) {
+ clk_disable(hantro_clk_g2);
+ clk_unprepare(hantro_clk_g2);
+ }
+ if (hantro_clk_bus) {
+ clk_disable(hantro_clk_bus);
+ clk_unprepare(hantro_clk_bus);
+ }
+ return 0;
+}
+
+static int hantro_ctrlblk_reset(struct device *dev)
+{
+ volatile u8 *iobase;
+
+ //config G1/G2
+ hantro_clk_enable(dev);
+ iobase = (volatile u8 *)ioremap_nocache(BLK_CTL_BASE, 0x10000);
+ iowrite32(0x3, iobase); //VPUMIX G1/G2 block soft reset control
+ iowrite32(0x3, iobase+4); //VPUMIX G1/G2 block clock enable control
+ iowrite32(0xFFFFFFFF, iobase + 0x8); // all G1 fuse dec enable
+ iowrite32(0xFFFFFFFF, iobase + 0xC); // all G1 fuse pp enable
+ iowrite32(0xFFFFFFFF, iobase + 0x10); // all G2 fuse dec enable
+ iounmap(iobase);
+ hantro_clk_disable(dev);
+ return 0;
+}
+
+#ifdef CONFIG_DEVICE_THERMAL
+static int hantro_thermal_check(struct device *dev)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&thermal_lock, flags);
+ if (thermal_event == thermal_cur) {
+ /*nothing to do and return directly*/
+ spin_unlock_irqrestore(&thermal_lock, flags);
+ return 0;
+ }
+ thermal_cur = thermal_event;
+ spin_unlock_irqrestore(&thermal_lock, flags);
+
+ if (thermal_cur) {
+ int ratio = hantro_clock_ratio;
+
+ pr_debug("hantro: too hot, need to decrease clock, ratio: 1/%d\n", ratio);
+ /*clock disable/enable are not required for vpu clock rate operation*/
+ clk_set_rate(hantro_clk_g1, HANTRO_G1_DEF_CLK/ratio);
+ clk_set_rate(hantro_clk_g2, HANTRO_G2_DEF_CLK/ratio);
+ clk_set_rate(hantro_clk_bus, HANTRO_BUS_DEF_CLK/ratio);
+ } else {
+ pr_debug("hantro: not hot again, will restore default clock\n");
+ clk_set_rate(hantro_clk_g1, HANTRO_G1_DEF_CLK);
+ clk_set_rate(hantro_clk_g2, HANTRO_G2_DEF_CLK);
+ clk_set_rate(hantro_clk_bus, HANTRO_BUS_DEF_CLK);
+ }
+ pr_info("hantro: event(%d), g1, g2, bus clock: %ld, %ld, %ld\n", thermal_cur,
+ clk_get_rate(hantro_clk_g1), clk_get_rate(hantro_clk_g2), clk_get_rate(hantro_clk_bus));
+ //hantro_update_voltage(dev);
+ return 0;
+}
+
+static int hantro_thermal_hot_notify(struct notifier_block *nb, unsigned long event, void *dummy)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&thermal_lock, flags);
+ thermal_event = event; /*event: 1: hot, 0: cool*/
+ spin_unlock_irqrestore(&thermal_lock, flags);
+ pr_info("hantro receive hot notification event: %ld\n", event);
+
+ return NOTIFY_OK;
+}
+
+static struct notifier_block hantro_thermal_hot_notifier = {
+ .notifier_call = hantro_thermal_hot_notify,
+};
+#endif //CONFIG_DEVICE_THERMAL
+
+static void ReadCoreConfig(hantrodec_t *dev)
+{
+ int c;
+ u32 reg, tmp, mask;
+
+ memset(cfg, 0, sizeof(cfg));
+
+ for (c = 0; c < dev->cores; c++) {
+ /* Decoder configuration */
+ if (IS_G1(dev->hw_id[c])) {
+ reg = ioread32(dev->hwregs[c] + HANTRODEC_SYNTH_CFG * 4);
+
+ tmp = (reg >> DWL_H264_E) & 0x3U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has H264\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_H264_DEC : 0;
+
+ tmp = (reg >> DWL_JPEG_E) & 0x01U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has JPEG\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_JPEG_DEC : 0;
+
+ tmp = (reg >> DWL_MPEG4_E) & 0x3U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has MPEG4\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_MPEG4_DEC : 0;
+
+ tmp = (reg >> DWL_VC1_E) & 0x3U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has VC1\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_VC1_DEC : 0;
+
+ tmp = (reg >> DWL_MPEG2_E) & 0x01U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has MPEG2\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_MPEG2_DEC : 0;
+
+ tmp = (reg >> DWL_VP6_E) & 0x01U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has VP6\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_VP6_DEC : 0;
+
+ reg = ioread32(dev->hwregs[c] + HANTRODEC_SYNTH_CFG_2 * 4);
+
+ /* VP7 and WEBP is part of VP8 */
+ mask = (1 << DWL_VP8_E) | (1 << DWL_VP7_E) | (1 << DWL_WEBP_E);
+ tmp = (reg & mask);
+ if (tmp & (1 << DWL_VP8_E))
+ pr_debug("hantrodec: Core[%d] has VP8\n", c);
+ if (tmp & (1 << DWL_VP7_E))
+ pr_debug("hantrodec: Core[%d] has VP7\n", c);
+ if (tmp & (1 << DWL_WEBP_E))
+ pr_debug("hantrodec: Core[%d] has WebP\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_VP8_DEC : 0;
+
+ tmp = (reg >> DWL_AVS_E) & 0x01U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has AVS\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_AVS_DEC : 0;
+
+ tmp = (reg >> DWL_RV_E) & 0x03U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has RV\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_RV_DEC : 0;
+
+ /* Post-processor configuration */
+ //reg = ioread32(dev->hwregs[c] + HANTROPP_SYNTH_CFG * 4);
+ } else {
+ reg = ioread32(dev->hwregs[c] + HANTRODEC_SYNTH_CFG_2 * 4);
+
+ tmp = (reg >> DWL_HEVC_E) & 0x3U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has HEVC\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_HEVC_DEC : 0;
+
+ tmp = (reg >> DWL_VP9_E) & 0x03U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has VP9\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_VP9_DEC : 0;
+ }
+
+ /* Post-processor configuration */
+ reg = ioread32(dev->hwregs[c] + HANTRODECPP_SYNTH_CFG * 4);
+
+ tmp = (reg >> DWL_PP_E) & 0x01U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has PP\n", c);
+ cfg[c] |= tmp ? 1 << DWL_CLIENT_TYPE_PP : 0;
+ }
+}
+
+static int CoreHasFormat(const u32 *cfg, int Core, u32 format)
+{
+ return (cfg[Core] & (1 << format)) ? 1 : 0;
+}
+
+int GetDecCore(long Core, hantrodec_t *dev, struct file *filp)
+{
+ int success = 0;
+ unsigned long flags;
+
+ spin_lock_irqsave(&owner_lock, flags);
+ if (dec_owner[Core] == NULL) {
+ dec_owner[Core] = filp;
+ success = 1;
+ }
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return success;
+}
+
+int GetDecCoreAny(long *Core, hantrodec_t *dev, struct file *filp,
+ unsigned long format)
+{
+ int success = 0;
+ long c;
+
+ *Core = -1;
+
+ for (c = 0; c < dev->cores; c++) {
+ /* a free Core that has format */
+ if (CoreHasFormat(cfg, c, format) && GetDecCore(c, dev, filp)) {
+ success = 1;
+ *Core = c;
+ break;
+ }
+ }
+
+ return success;
+}
+int GetDecCoreID(hantrodec_t *dev, struct file *filp,
+ unsigned long format)
+{
+ long c;
+
+ int core_id = -1;
+
+ for (c = 0; c < dev->cores; c++) {
+ /* a Core that has format */
+ if (CoreHasFormat(cfg, c, format)) {
+ core_id = c;
+ break;
+ }
+ }
+ PDEBUG("GetDecCoreID=%d\n", core_id);
+ return core_id;
+}
+
+static int hantrodec_choose_core(int is_g1)
+{
+ volatile unsigned char *reg = NULL;
+ unsigned int blk_base = BLK_CTL_BASE;
+
+ PDEBUG("hantrodec_choose_core\n");
+ if (!request_mem_region(blk_base, 0x1000, "blk_ctl")) {
+ pr_err("blk_ctl: failed to reserve HW regs\n");
+ return -EBUSY;
+ }
+
+ reg = (volatile u8 *) ioremap_nocache(blk_base, 0x1000);
+
+ if (reg == NULL) {
+ pr_err("blk_ctl: failed to ioremap HW regs\n");
+ release_mem_region(blk_base, 0x1000);
+ return -EBUSY;
+ }
+
+ // G1 use, set to 1; G2 use, set to 0, choose the one you are using
+ if (is_g1)
+ iowrite32(0x1, reg + 0x14); // VPUMIX only use G1
+ else
+ iowrite32(0x0, reg + 0x14); // VPUMIX only use G2
+
+ if (reg)
+ iounmap((void *)reg);
+ release_mem_region(blk_base, 0x1000);
+ PDEBUG("hantrodec_choose_core OK!\n");
+ return 0;
+}
+
+
+long ReserveDecoder(hantrodec_t *dev, struct file *filp, unsigned long format)
+{
+ long Core = -1;
+
+ /* reserve a Core */
+ if (down_interruptible(&dec_core_sem))
+ return -ERESTARTSYS;
+
+ /* lock a Core that has specific format*/
+ if (wait_event_interruptible(hw_queue, GetDecCoreAny(&Core, dev, filp, format) != 0))
+ return -ERESTARTSYS;
+
+ if (IS_G1(dev->hw_id[Core])) {
+ if (0 == hantrodec_choose_core(1))
+ PDEBUG("G1 is reserved\n");
+ else
+ return -1;
+ } else {
+ if (0 == hantrodec_choose_core(0))
+ PDEBUG("G2 is reserved\n");
+ else
+ return -1;
+ }
+
+#ifdef CONFIG_DEVICE_THERMAL
+ if (hantro_dynamic_clock)
+ hantro_thermal_check(hantro_dev);
+#endif
+
+ return Core;
+}
+
+void ReleaseDecoder(hantrodec_t *dev, long Core)
+{
+ u32 status;
+ unsigned long flags;
+
+ status = ioread32(dev->hwregs[Core] + HANTRODEC_IRQ_STAT_DEC_OFF);
+
+ /* make sure HW is disabled */
+ if (status & HANTRODEC_DEC_E) {
+ pr_info("hantrodec: DEC[%li] still enabled -> reset\n", Core);
+
+ /* abort decoder */
+ status |= HANTRODEC_DEC_ABORT | HANTRODEC_DEC_IRQ_DISABLE;
+ iowrite32(status, dev->hwregs[Core] + HANTRODEC_IRQ_STAT_DEC_OFF);
+ }
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ dec_owner[Core] = NULL;
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ up(&dec_core_sem);
+
+ wake_up_interruptible_all(&hw_queue);
+
+}
+
+long ReservePostProcessor(hantrodec_t *dev, struct file *filp)
+{
+ unsigned long flags;
+
+ long Core = 0;
+
+ /* single Core PP only */
+ if (down_interruptible(&pp_core_sem))
+ return -ERESTARTSYS;
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ pp_owner[Core] = filp;
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return Core;
+}
+
+void ReleasePostProcessor(hantrodec_t *dev, long Core)
+{
+ unsigned long flags;
+
+ u32 status = ioread32(dev->hwregs[Core] + HANTRO_IRQ_STAT_PP_OFF);
+
+ /* make sure HW is disabled */
+ if (status & HANTRO_PP_E) {
+ pr_info("hantrodec: PP[%li] still enabled -> reset\n", Core);
+
+ /* disable IRQ */
+ status |= HANTRO_PP_IRQ_DISABLE;
+
+ /* disable postprocessor */
+ status &= (~HANTRO_PP_E);
+ iowrite32(0x10, dev->hwregs[Core] + HANTRO_IRQ_STAT_PP_OFF);
+ }
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ pp_owner[Core] = NULL;
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ up(&pp_core_sem);
+}
+
+long ReserveDecPp(hantrodec_t *dev, struct file *filp, unsigned long format)
+{
+ /* reserve Core 0, DEC+PP for pipeline */
+ unsigned long flags;
+
+ long Core = 0;
+
+ /* check that Core has the requested dec format */
+ if (!CoreHasFormat(cfg, Core, format))
+ return -EFAULT;
+
+ /* check that Core has PP */
+ if (!CoreHasFormat(cfg, Core, DWL_CLIENT_TYPE_PP))
+ return -EFAULT;
+
+ /* reserve a Core */
+ if (down_interruptible(&dec_core_sem))
+ return -ERESTARTSYS;
+
+ /* wait until the Core is available */
+ if (wait_event_interruptible(hw_queue, GetDecCore(Core, dev, filp) != 0)) {
+ up(&dec_core_sem);
+ return -ERESTARTSYS;
+ }
+
+ if (down_interruptible(&pp_core_sem)) {
+ ReleaseDecoder(dev, Core);
+ return -ERESTARTSYS;
+ }
+
+ spin_lock_irqsave(&owner_lock, flags);
+ pp_owner[Core] = filp;
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return Core;
+}
+
+long DecFlushRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ long ret = 0, i;
+
+ u32 id = Core->id;
+
+ if (IS_G1(dev->hw_id[id])) {
+ /* copy original dec regs to kernal space*/
+ ret = copy_from_user(dec_regs[id], Core->regs, HANTRO_DEC_ORG_REGS*4);
+ if (ret) {
+ pr_err("copy_from_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+#ifdef USE_64BIT_ENV
+ /* copy extended dec regs to kernal space*/
+ ret = copy_from_user(dec_regs[id] + HANTRO_DEC_EXT_FIRST_REG,
+ Core->regs + HANTRO_DEC_EXT_FIRST_REG, HANTRO_DEC_EXT_REGS * 4);
+#endif
+ if (ret) {
+ pr_err("copy_from_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+
+ /* write dec regs but the status reg[1] to hardware */
+ /* both original and extended regs need to be written */
+ for (i = 2; i <= HANTRO_DEC_ORG_LAST_REG; i++)
+ iowrite32(dec_regs[id][i], dev->hwregs[id] + i*4);
+#ifdef USE_64BIT_ENV
+ for (i = HANTRO_DEC_EXT_FIRST_REG; i <= HANTRO_DEC_EXT_LAST_REG; i++)
+ iowrite32(dec_regs[id][i], dev->hwregs[id] + i*4);
+#endif
+ } else {
+ ret = copy_from_user(dec_regs[id], Core->regs, HANTRO_G2_DEC_REGS*4);
+ if (ret) {
+ pr_err("copy_from_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+
+ /* write all regs but the status reg[1] to hardware */
+ for (i = 2; i <= HANTRO_G2_DEC_LAST_REG; i++)
+ iowrite32(dec_regs[id][i], dev->hwregs[id] + i*4);
+ }
+
+ /* write the status register, which may start the decoder */
+ iowrite32(dec_regs[id][1], dev->hwregs[id] + 4);
+
+ PDEBUG("flushed registers on Core %d\n", id);
+
+ return 0;
+}
+
+long DecRefreshRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ long ret, i;
+ u32 id = Core->id;
+
+ if (IS_G1(dev->hw_id[id])) {
+ /* user has to know exactly what they are asking for */
+ //if(Core->size != (HANTRO_DEC_ORG_REGS * 4))
+ // return -EFAULT;
+
+ /* read all registers from hardware */
+ /* both original and extended regs need to be read */
+ for (i = 0; i <= HANTRO_DEC_ORG_LAST_REG; i++)
+ dec_regs[id][i] = ioread32(dev->hwregs[id] + i*4);
+#ifdef USE_64BIT_ENV
+ for (i = HANTRO_DEC_EXT_FIRST_REG; i <= HANTRO_DEC_EXT_LAST_REG; i++)
+ dec_regs[id][i] = ioread32(dev->hwregs[id] + i*4);
+#endif
+
+ if (timeout) {
+ /* Enable TIMEOUT bits in Reg[1] */
+ dec_regs[id][1] = 0x40100;
+ /* Reset HW */
+ ResetAsic(dev);
+ timeout = 0;
+ }
+
+ /* put registers to user space*/
+ /* put original registers to user space*/
+ ret = copy_to_user(Core->regs, dec_regs[id], HANTRO_DEC_ORG_REGS*4);
+#ifdef USE_64BIT_ENV
+ /*put extended registers to user space*/
+ ret = copy_to_user(Core->regs + HANTRO_DEC_EXT_FIRST_REG,
+ dec_regs[id] + HANTRO_DEC_EXT_FIRST_REG, HANTRO_DEC_EXT_REGS * 4);
+#endif
+ if (ret) {
+ pr_err("copy_to_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+ } else {
+ /* user has to know exactly what they are asking for */
+ if (Core->size != (HANTRO_G2_DEC_REGS * 4))
+ return -EFAULT;
+
+ /* read all registers from hardware */
+ for (i = 0; i <= HANTRO_G2_DEC_LAST_REG; i++)
+ dec_regs[id][i] = ioread32(dev->hwregs[id] + i*4);
+
+ if (timeout) {
+ /* Enable TIMEOUT bits in Reg[1] */
+ dec_regs[id][1] = 0x40100;
+ /* Reset HW */
+ ResetAsic(dev);
+ timeout = 0;
+ }
+
+ /* put registers to user space*/
+ ret = copy_to_user(Core->regs, dec_regs[id], HANTRO_G2_DEC_REGS*4);
+ if (ret) {
+ pr_err("copy_to_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+ }
+ return 0;
+}
+
+static int CheckDecIrq(hantrodec_t *dev, int id)
+{
+ unsigned long flags;
+ int rdy = 0;
+
+ const u32 irq_mask = (1 << id);
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ if (dec_irq & irq_mask) {
+ /* reset the wait condition(s) */
+ dec_irq &= ~irq_mask;
+ rdy = 1;
+ }
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return rdy;
+}
+
+long WaitDecReadyAndRefreshRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ u32 id = Core->id;
+ long ret;
+
+ PDEBUG("wait_event_interruptible DEC[%d]\n", id);
+
+ //ret = wait_event_interruptible_timeout(dec_wait_queue, CheckDecIrq(dev, id), msecs_to_jiffies(200));
+ ret = wait_event_timeout(dec_wait_queue, CheckDecIrq(dev, id), msecs_to_jiffies(200));
+ if (ret == -ERESTARTSYS) {
+ pr_err("DEC[%d] failed to wait_event interrupted\n", id);
+ return -ERESTARTSYS;
+ } else if (ret == 0) {
+ pr_err("DEC[%d] wait_event timeout\n", id);
+ timeout = 1;
+ }
+
+ atomic_inc(&irq_tx);
+
+ /* refresh registers */
+ return DecRefreshRegs(dev, Core);
+}
+
+long PPFlushRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ long ret = 0;
+ u32 id = Core->id;
+ u32 i;
+
+ /* copy original dec regs to kernal space*/
+ ret = copy_from_user(dec_regs[id] + HANTRO_PP_ORG_FIRST_REG,
+ Core->regs + HANTRO_PP_ORG_FIRST_REG, HANTRO_PP_ORG_REGS*4);
+#ifdef USE_64BIT_ENV
+ /* copy extended dec regs to kernal space*/
+ ret = copy_from_user(dec_regs[id] + HANTRO_PP_EXT_FIRST_REG,
+ Core->regs + HANTRO_PP_EXT_FIRST_REG, HANTRO_PP_EXT_REGS*4);
+#endif
+ if (ret) {
+ pr_err("copy_from_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+
+ /* write all regs but the status reg[1] to hardware */
+ /* both original and extended regs need to be written */
+ for (i = HANTRO_PP_ORG_FIRST_REG + 1; i <= HANTRO_PP_ORG_LAST_REG; i++)
+ iowrite32(dec_regs[id][i], dev->hwregs[id] + i*4);
+#ifdef USE_64BIT_ENV
+ for (i = HANTRO_PP_EXT_FIRST_REG; i <= HANTRO_PP_EXT_LAST_REG; i++)
+ iowrite32(dec_regs[id][i], dev->hwregs[id] + i*4);
+#endif
+ /* write the stat reg, which may start the PP */
+ iowrite32(dec_regs[id][HANTRO_PP_ORG_FIRST_REG],
+ dev->hwregs[id] + HANTRO_PP_ORG_FIRST_REG * 4);
+
+ return 0;
+}
+
+long PPRefreshRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ long i, ret;
+ u32 id = Core->id;
+#ifdef USE_64BIT_ENV
+ /* user has to know exactly what they are asking for */
+ if (Core->size != (HANTRO_PP_TOTAL_REGS * 4))
+ return -EFAULT;
+#else
+ /* user has to know exactly what they are asking for */
+ if (Core->size != (HANTRO_PP_ORG_REGS * 4))
+ return -EFAULT;
+#endif
+
+ /* read all registers from hardware */
+ /* both original and extended regs need to be read */
+ for (i = HANTRO_PP_ORG_FIRST_REG; i <= HANTRO_PP_ORG_LAST_REG; i++)
+ dec_regs[id][i] = ioread32(dev->hwregs[id] + i*4);
+#ifdef USE_64BIT_ENV
+ for (i = HANTRO_PP_EXT_FIRST_REG; i <= HANTRO_PP_EXT_LAST_REG; i++)
+ dec_regs[id][i] = ioread32(dev->hwregs[id] + i*4);
+#endif
+ /* put registers to user space*/
+ /* put original registers to user space*/
+ ret = copy_to_user(Core->regs + HANTRO_PP_ORG_FIRST_REG,
+ dec_regs[id] + HANTRO_PP_ORG_FIRST_REG, HANTRO_PP_ORG_REGS*4);
+#ifdef USE_64BIT_ENV
+ /* put extended registers to user space*/
+ ret = copy_to_user(Core->regs + HANTRO_PP_EXT_FIRST_REG,
+ dec_regs[id] + HANTRO_PP_EXT_FIRST_REG, HANTRO_PP_EXT_REGS * 4);
+#endif
+ if (ret) {
+ pr_err("copy_to_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+
+ return 0;
+}
+
+static int CheckPPIrq(hantrodec_t *dev, int id)
+{
+ unsigned long flags;
+ int rdy = 0;
+
+ const u32 irq_mask = (1 << id);
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ if (pp_irq & irq_mask) {
+ /* reset the wait condition(s) */
+ pp_irq &= ~irq_mask;
+ rdy = 1;
+ }
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return rdy;
+}
+
+long WaitPPReadyAndRefreshRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ u32 id = Core->id;
+
+ PDEBUG("wait_event_interruptible PP[%d]\n", id);
+
+ if (wait_event_interruptible(pp_wait_queue, CheckPPIrq(dev, id))) {
+ pr_err("PP[%d] failed to wait_event_interruptible interrupted\n", id);
+ return -ERESTARTSYS;
+ }
+
+ atomic_inc(&irq_tx);
+
+ /* refresh registers */
+ return PPRefreshRegs(dev, Core);
+}
+
+static int CheckCoreIrq(hantrodec_t *dev, const struct file *filp, int *id)
+{
+ unsigned long flags;
+ int rdy = 0, n = 0;
+
+ do {
+ u32 irq_mask = (1 << n);
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ if (dec_irq & irq_mask) {
+ if (dec_owner[n] == filp) {
+ /* we have an IRQ for our client */
+
+ /* reset the wait condition(s) */
+ dec_irq &= ~irq_mask;
+
+ /* signal ready Core no. for our client */
+ *id = n;
+
+ rdy = 1;
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+ break;
+ } else if (dec_owner[n] == NULL) {
+ /* zombie IRQ */
+ pr_info("IRQ on Core[%d], but no owner!!!\n", n);
+
+ /* reset the wait condition(s) */
+ dec_irq &= ~irq_mask;
+ }
+ }
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ n++; /* next Core */
+ } while (n < dev->cores);
+
+ return rdy;
+}
+
+long WaitCoreReady(hantrodec_t *dev, const struct file *filp, int *id)
+{
+ PDEBUG("wait_event_interruptible CORE\n");
+
+ if (wait_event_interruptible(dec_wait_queue, CheckCoreIrq(dev, filp, id))) {
+ pr_err("CORE failed to wait_event_interruptible interrupted\n");
+ return -ERESTARTSYS;
+ }
+
+ atomic_inc(&irq_tx);
+
+ return 0;
+}
+
+/*-------------------------------------------------------------------------
+ *Function name : hantrodec_ioctl
+ *Description : communication method to/from the user space
+ *
+ *Return type : long
+ *-------------------------------------------------------------------------
+ */
+
+static long hantrodec_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+ int err = 0;
+ long tmp;
+
+ PDEBUG("ioctl cmd 0x%08x\n", cmd);
+ /*
+ * extract the type and number bitfields, and don't decode
+ * wrong cmds: return ENOTTY (inappropriate ioctl) before access_ok()
+ */
+ if (_IOC_TYPE(cmd) != HANTRODEC_IOC_MAGIC)
+ return -ENOTTY;
+ if (_IOC_NR(cmd) > HANTRODEC_IOC_MAXNR)
+ return -ENOTTY;
+
+ /*
+ * the direction is a bitmask, and VERIFY_WRITE catches R/W
+ * transfers. `Type' is user-oriented, while
+ * access_ok is kernel-oriented, so the concept of "read" and
+ * "write" is reversed
+ */
+ if (_IOC_DIR(cmd) & _IOC_READ)
+ err = !access_ok((void *) arg, _IOC_SIZE(cmd));
+ else if (_IOC_DIR(cmd) & _IOC_WRITE)
+ err = !access_ok((void *) arg, _IOC_SIZE(cmd));
+
+ if (err)
+ return -EFAULT;
+
+ switch (_IOC_NR(cmd)) {
+ case _IOC_NR(HANTRODEC_IOC_CLI): {
+ __u32 id;
+
+ __get_user(id, (__u32 *)arg);
+ if (id >= hantrodec_data.cores)
+ return -EFAULT;
+ disable_irq(hantrodec_data.irq[id]);
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOC_STI): {
+ __u32 id;
+
+ __get_user(id, (__u32 *)arg);
+ if (id >= hantrodec_data.cores)
+ return -EFAULT;
+ enable_irq(hantrodec_data.irq[id]);
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCGHWOFFSET): {
+ __u32 id;
+
+ __get_user(id, (__u32 *)arg);
+ if (id >= hantrodec_data.cores)
+ return -EFAULT;
+
+ __put_user(multicorebase[id], (unsigned long *) arg);
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCGHWIOSIZE): {
+ __u32 id;
+ __u32 io_size;
+
+ __get_user(id, (__u32 *)arg);
+ if (id >= hantrodec_data.cores)
+ return -EFAULT;
+ io_size = hantrodec_data.iosize[id];
+ __put_user(io_size, (u32 *) arg);
+
+ return 0;
+ }
+ case _IOC_NR(HANTRODEC_IOC_MC_OFFSETS): {
+ tmp = copy_to_user((u64 *) arg, multicorebase, sizeof(multicorebase));
+ if (err) {
+ pr_err("copy_to_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOC_MC_CORES):
+ __put_user(hantrodec_data.cores, (unsigned int *) arg);
+ PDEBUG("hantrodec_data.cores=%d\n", hantrodec_data.cores);
+ break;
+ case _IOC_NR(HANTRODEC_IOCS_DEC_PUSH_REG): {
+ struct core_desc Core;
+
+ /* get registers from user space*/
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= hantrodec_data.cores)
+ return -EFAULT;
+
+ DecFlushRegs(&hantrodec_data, &Core);
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCS_PP_PUSH_REG): {
+ struct core_desc Core;
+
+ /* get registers from user space*/
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= hantrodec_data.cores)
+ return -EFAULT;
+
+ PPFlushRegs(&hantrodec_data, &Core);
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCS_DEC_PULL_REG): {
+ struct core_desc Core;
+
+ /* get registers from user space*/
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= hantrodec_data.cores)
+ return -EFAULT;
+
+ return DecRefreshRegs(&hantrodec_data, &Core);
+ }
+ case _IOC_NR(HANTRODEC_IOCS_PP_PULL_REG): {
+ struct core_desc Core;
+
+ /* get registers from user space*/
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= hantrodec_data.cores)
+ return -EFAULT;
+
+ return PPRefreshRegs(&hantrodec_data, &Core);
+ }
+ case _IOC_NR(HANTRODEC_IOCH_DEC_RESERVE): {
+ PDEBUG("Reserve DEC Core, format = %li\n", arg);
+ return ReserveDecoder(&hantrodec_data, filp, arg);
+ }
+ case _IOC_NR(HANTRODEC_IOCT_DEC_RELEASE): {
+ if (arg >= hantrodec_data.cores || dec_owner[arg] != filp) {
+ pr_err("bogus DEC release, Core = %li\n", arg);
+ return -EFAULT;
+ }
+
+ PDEBUG("Release DEC, Core = %li\n", arg);
+
+ ReleaseDecoder(&hantrodec_data, arg);
+
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCQ_PP_RESERVE):
+ return ReservePostProcessor(&hantrodec_data, filp);
+ case _IOC_NR(HANTRODEC_IOCT_PP_RELEASE): {
+ if (arg != 0 || pp_owner[arg] != filp) {
+ pr_err("bogus PP release %li\n", arg);
+ return -EFAULT;
+ }
+
+ ReleasePostProcessor(&hantrodec_data, arg);
+
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCX_DEC_WAIT): {
+ struct core_desc Core;
+
+ /* get registers from user space */
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= hantrodec_data.cores)
+ return -EFAULT;
+
+ return WaitDecReadyAndRefreshRegs(&hantrodec_data, &Core);
+ }
+ case _IOC_NR(HANTRODEC_IOCX_PP_WAIT): {
+ struct core_desc Core;
+
+ /* get registers from user space */
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= hantrodec_data.cores)
+ return -EFAULT;
+
+ return WaitPPReadyAndRefreshRegs(&hantrodec_data, &Core);
+ }
+ case _IOC_NR(HANTRODEC_IOCG_CORE_WAIT): {
+ int id;
+
+ tmp = WaitCoreReady(&hantrodec_data, filp, &id);
+ __put_user(id, (int *) arg);
+ return tmp;
+ }
+ case _IOC_NR(HANTRODEC_IOX_ASIC_ID): {
+ u32 id;
+
+ __get_user(id, (u32 *)arg);
+ if (id >= hantrodec_data.cores)
+ return -EFAULT;
+ id = ioread32(hantrodec_data.hwregs[id]);
+ __put_user(id, (u32 *) arg);
+ return 0;
+ }
+ case _IOC_NR(HANTRODEC_IOCG_CORE_ID): {
+ PDEBUG("Get DEC Core_id, format = %li\n", arg);
+ return GetDecCoreID(&hantrodec_data, filp, arg);
+ }
+ case _IOC_NR(HANTRODEC_DEBUG_STATUS): {
+ PDEBUG("hantrodec: dec_irq = 0x%08x\n", dec_irq);
+ PDEBUG("hantrodec: pp_irq = 0x%08x\n", pp_irq);
+
+ PDEBUG("hantrodec: IRQs received/sent2user = %d / %d\n",
+ atomic_read(&irq_rx), atomic_read(&irq_tx));
+
+ for (tmp = 0; tmp < hantrodec_data.cores; tmp++) {
+ PDEBUG("hantrodec: dec_core[%li] %s\n",
+ tmp, dec_owner[tmp] == NULL ? "FREE" : "RESERVED");
+ PDEBUG("hantrodec: pp_core[%li] %s\n",
+ tmp, pp_owner[tmp] == NULL ? "FREE" : "RESERVED");
+ }
+ }
+ default:
+ return -ENOTTY;
+ }
+
+ return 0;
+}
+
+#ifdef CONFIG_COMPAT
+struct core_desc_32 {
+ __u32 id; /* id of the Core */
+ compat_caddr_t regs; /* pointer to user registers */
+ __u32 size; /* size of register space */
+};
+
+static int get_hantro_core_desc32(struct core_desc *kp, struct core_desc_32 __user *up)
+{
+ u32 tmp;
+
+ if (!access_ok(up, sizeof(struct core_desc_32)) ||
+ get_user(kp->id, &up->id) ||
+ get_user(kp->size, &up->size) ||
+ get_user(tmp, &up->regs)) {
+ return -EFAULT;
+ }
+ kp->regs = (__force u32 *)compat_ptr(tmp);
+ return 0;
+}
+
+static int put_hantro_core_desc32(struct core_desc *kp, struct core_desc_32 __user *up)
+{
+ u32 tmp = (u32)((unsigned long)kp->regs);
+
+ if (!access_ok(up, sizeof(struct core_desc_32)) ||
+ put_user(kp->id, &up->id) ||
+ put_user(kp->size, &up->size) ||
+ put_user(tmp, &up->regs)) {
+ return -EFAULT;
+ }
+ return 0;
+}
+static long hantrodec_ioctl32(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+#define HANTRO_IOCTL32(err, filp, cmd, arg) { \
+ mm_segment_t old_fs = get_fs(); \
+ set_fs(KERNEL_DS); \
+ err = hantrodec_ioctl(filp, cmd, arg); \
+ if (err) \
+ return err; \
+ set_fs(old_fs); \
+ }
+
+ union {
+ struct core_desc kcore;
+ unsigned long kux;
+ unsigned int kui;
+ } karg;
+ void __user *up = compat_ptr(arg);
+ long err = 0;
+
+ switch (_IOC_NR(cmd)) {
+ case _IOC_NR(HANTRODEC_IOCGHWOFFSET):
+ case _IOC_NR(HANTRODEC_IOC_MC_OFFSETS):
+ err = get_user(karg.kux, (s32 __user *)up);
+ if (err)
+ return err;
+ HANTRO_IOCTL32(err, filp, cmd, (unsigned long)&karg);
+ err = put_user(((s32)karg.kux), (s32 __user *)up);
+ break;
+ case _IOC_NR(HANTRODEC_IOCGHWIOSIZE):
+ case _IOC_NR(HANTRODEC_IOC_MC_CORES):
+ case _IOC_NR(HANTRODEC_IOCG_CORE_WAIT):
+ case _IOC_NR(HANTRODEC_IOX_ASIC_ID):
+ err = get_user(karg.kui, (s32 __user *)up);
+ if (err)
+ return err;
+ HANTRO_IOCTL32(err, filp, cmd, (unsigned long)&karg);
+ err = put_user(((s32)karg.kui), (s32 __user *)up);
+ break;
+ case _IOC_NR(HANTRODEC_IOCS_DEC_PUSH_REG):
+ case _IOC_NR(HANTRODEC_IOCS_PP_PUSH_REG):
+ case _IOC_NR(HANTRODEC_IOCX_DEC_WAIT):
+ case _IOC_NR(HANTRODEC_IOCX_PP_WAIT):
+ case _IOC_NR(HANTRODEC_IOCS_DEC_PULL_REG):
+ case _IOC_NR(HANTRODEC_IOCS_PP_PULL_REG):
+ err = get_hantro_core_desc32(&karg.kcore, up);
+ if (err)
+ return err;
+ HANTRO_IOCTL32(err, filp, cmd, (unsigned long)&karg);
+ err = put_hantro_core_desc32(&karg.kcore, up);
+ break;
+ default:
+ err = hantrodec_ioctl(filp, cmd, (unsigned long)up);
+ break;
+ }
+
+ return err;
+}
+
+#endif //ifdef CONFIG_COMPAT
+
+/*--------------------------------------------------------------------------
+ *Function name : hantrodec_open
+ *Description : open method
+ *
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+static int hantrodec_open(struct inode *inode, struct file *filp)
+{
+ PDEBUG("dev opened\n");
+ hantro_clk_enable(hantro_dev);
+ pm_runtime_get_sync(hantro_dev);
+ return 0;
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : hantrodec_release
+ *Description : Release driver
+ *
+ *Return type : int
+ *----------------------------------------------------------------------------
+ */
+static int hantrodec_release(struct inode *inode, struct file *filp)
+{
+ int n;
+ hantrodec_t *dev = &hantrodec_data;
+
+ PDEBUG("closing ...\n");
+
+ for (n = 0; n < dev->cores; n++) {
+ if (dec_owner[n] == filp) {
+ PDEBUG("releasing dec Core %i lock\n", n);
+ ReleaseDecoder(dev, n);
+ }
+ }
+
+ for (n = 0; n < 1; n++) {
+ if (pp_owner[n] == filp) {
+ PDEBUG("releasing pp Core %i lock\n", n);
+ ReleasePostProcessor(dev, n);
+ }
+ }
+
+ pm_runtime_put_sync(hantro_dev);
+ hantro_clk_disable(hantro_dev);
+ PDEBUG("closed\n");
+ return 0;
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : hantro_mmap
+ *Description : memory map interface for hantro file operation
+ *
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+static int hantro_mmap(struct file *fp, struct vm_area_struct *vm)
+{
+ if (vm->vm_pgoff == (multicorebase[0] >> PAGE_SHIFT) || vm->vm_pgoff == (multicorebase[1] >> PAGE_SHIFT)) {
+ vm->vm_flags |= VM_IO;
+ vm->vm_page_prot = pgprot_noncached(vm->vm_page_prot);
+ PDEBUG("hantro mmap: size=0x%lX, page off=0x%lX\n", (vm->vm_end - vm->vm_start), vm->vm_pgoff);
+ return remap_pfn_range(vm, vm->vm_start, vm->vm_pgoff, vm->vm_end - vm->vm_start,
+ vm->vm_page_prot) ? -EAGAIN : 0;
+ } else {
+ pr_err("invalid map offset :0x%lX\n", vm->vm_pgoff);
+ return -EINVAL;
+ }
+}
+
+/* VFS methods */
+static const struct file_operations hantrodec_fops = {
+ .owner = THIS_MODULE,
+ .open = hantrodec_open,
+ .release = hantrodec_release,
+ .unlocked_ioctl = hantrodec_ioctl,
+ .fasync = NULL,
+ .mmap = hantro_mmap,
+#ifdef CONFIG_COMPAT
+ .compat_ioctl = hantrodec_ioctl32,
+#endif
+};
+
+/*---------------------------------------------------------------------------
+ *Function name : hantrodec_init
+ *Description : Initialize the driver
+ *
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+int hantrodec_init(struct platform_device *pdev)
+{
+ int result;
+ int irq_0, irq_1;
+
+ dec_irq = 0;
+ pp_irq = 0;
+ pr_debug("hantrodec: Init multi Core[0] at 0x%16lx\n"
+ " Core[1] at 0x%16lx\n", multicorebase[0], multicorebase[1]);
+
+ hantrodec_data.cores = 0;
+ hantrodec_data.iosize[0] = DEC_IO_SIZE_0;
+ hantrodec_data.iosize[1] = DEC_IO_SIZE_1;
+
+ hantrodec_data.async_queue_dec = NULL;
+ hantrodec_data.async_queue_pp = NULL;
+
+ result = register_chrdev(hantrodec_major, "hantrodec", &hantrodec_fops);
+ if (result < 0) {
+ pr_err("hantrodec: unable to get major %d\n", hantrodec_major);
+ goto err;
+ } else if (result != 0) { /* this is for dynamic major */
+ hantrodec_major = result;
+ }
+
+ result = ReserveIO();
+ if (result < 0)
+ goto err;
+
+ memset(dec_owner, 0, sizeof(dec_owner));
+ memset(pp_owner, 0, sizeof(pp_owner));
+
+ sema_init(&dec_core_sem, hantrodec_data.cores-1);
+ sema_init(&pp_core_sem, 1);
+
+ /* read configuration fo all cores */
+ ReadCoreConfig(&hantrodec_data);
+
+ /* reset hardware */
+ ResetAsic(&hantrodec_data);
+
+ /* register irq for each core*/
+ irq_0 = platform_get_irq_byname(pdev, "irq_hantro_g1");
+ if (irq_0 > 0) {
+ hantrodec_data.irq[0] = irq_0;
+ result = request_irq(irq_0, hantrodec_isr, IRQF_SHARED,
+ "hantrodec", (void *) &hantrodec_data);
+
+ if (result != 0) {
+ if (result == -EINVAL)
+ pr_err("hantrodec: Bad irq number or handler\n");
+ else if (result == -EBUSY) {
+ pr_err("hantrodec: IRQ <%d> busy, change your config\n",
+ hantrodec_data.irq[0]);
+ }
+ ReleaseIO();
+ goto err;
+ }
+ } else {
+ pr_err("hantrodec: IRQ0 not in use!\n");
+ goto err;
+ }
+
+ irq_1 = platform_get_irq_byname(pdev, "irq_hantro_g2");
+ if (irq_1 > 0) {
+ hantrodec_data.irq[1] = irq_1;
+ result = request_irq(irq_1, hantrodec_isr, IRQF_SHARED,
+ "hantrodec", (void *) &hantrodec_data);
+
+ if (result != 0) {
+ if (result == -EINVAL)
+ pr_err("hantrodec: Bad irq number or handler\n");
+ else if (result == -EBUSY) {
+ pr_err("hantrodec: IRQ <%d> busy, change your config\n",
+ hantrodec_data.irq[1]);
+ }
+
+ ReleaseIO();
+ goto err;
+ }
+ } else {
+ pr_err("hantrodec: IRQ1 not in use!\n");
+ goto err;
+ }
+ pr_info("hantrodec: module inserted. Major = %d\n", hantrodec_major);
+
+ return 0;
+
+err:
+ pr_err("hantrodec: module not inserted\n");
+ unregister_chrdev(hantrodec_major, "hantrodec");
+ return result;
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : hantrodec_cleanup
+ *Description : clean up
+ *
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+void hantrodec_cleanup(void)
+{
+ hantrodec_t *dev = &hantrodec_data;
+ int n = 0;
+ /* reset hardware */
+ ResetAsic(dev);
+
+ /* free the IRQ */
+ for (n = 0; n < dev->cores; n++) {
+ if (dev->irq[n] != -1)
+ free_irq(dev->irq[n], (void *) dev);
+ }
+
+ ReleaseIO();
+
+ unregister_chrdev(hantrodec_major, "hantrodec");
+
+ PDEBUG("hantrodec: module removed\n");
+
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : CheckHwId
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+static int CheckHwId(hantrodec_t *dev)
+{
+ long int hwid;
+ int i;
+ size_t num_hw = sizeof(DecHwId) / sizeof(*DecHwId);
+
+ int found = 0;
+
+ for (i = 0; i < dev->cores; i++) {
+ if (dev->hwregs[i] != NULL) {
+ hwid = readl(dev->hwregs[i]);
+ pr_debug("hantrodec: Core %d HW ID=0x%16lx\n", i, hwid);
+ hwid = (hwid >> 16) & 0xFFFF; /* product version only */
+
+ while (num_hw--) {
+ if (hwid == DecHwId[num_hw]) {
+ pr_debug("hantrodec: Supported HW found at 0x%16lx\n",
+ multicorebase[i]);
+ found++;
+ dev->hw_id[i] = hwid;
+ break;
+ }
+ }
+ if (!found) {
+ pr_err("hantrodec: Unknown HW found at 0x%16lx\n", multicorebase[i]);
+ return 0;
+ }
+ found = 0;
+ num_hw = sizeof(DecHwId) / sizeof(*DecHwId);
+ }
+ }
+
+ return 1;
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : ReserveIO
+ *Description : IO reserve
+ *
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+static int ReserveIO(void)
+{
+ int i;
+
+ for (i = 0; i < HXDEC_MAX_CORES; i++) {
+ if (multicorebase[i] != -1) {
+ if (!request_mem_region(multicorebase[i], hantrodec_data.iosize[i], "hantrodec0")) {
+ pr_err("hantrodec: failed to reserve HW regs\n");
+ return -EBUSY;
+ }
+
+ hantrodec_data.hwregs[i] = (volatile u8 *) ioremap_nocache(multicorebase[i],
+ hantrodec_data.iosize[i]);
+
+ if (hantrodec_data.hwregs[i] == NULL) {
+ pr_err("hantrodec: failed to ioremap HW regs\n");
+ ReleaseIO();
+ return -EBUSY;
+ }
+ hantrodec_data.cores++;
+ }
+ }
+
+ /* check for correct HW */
+ if (!CheckHwId(&hantrodec_data)) {
+ ReleaseIO();
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : releaseIO
+ *Description : release
+ *
+ *Return type : void
+ *---------------------------------------------------------------------------
+ */
+static void ReleaseIO(void)
+{
+ int i;
+
+ for (i = 0; i < hantrodec_data.cores; i++) {
+ if (hantrodec_data.hwregs[i])
+ iounmap((void *) hantrodec_data.hwregs[i]);
+ release_mem_region(multicorebase[i], hantrodec_data.iosize[i]);
+ }
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : hantrodec_isr
+ *Description : interrupt handler
+ *
+ *Return type : irqreturn_t
+ *---------------------------------------------------------------------------
+ */
+irqreturn_t hantrodec_isr(int irq, void *dev_id)
+{
+ unsigned long flags;
+ unsigned int handled = 0;
+ int i;
+ volatile u8 *hwregs;
+
+ hantrodec_t *dev = (hantrodec_t *) dev_id;
+ u32 irq_status_dec;
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ for (i = 0; i < dev->cores; i++) {
+ volatile u8 *hwregs = dev->hwregs[i];
+
+ /* interrupt status register read */
+ irq_status_dec = ioread32(hwregs + HANTRODEC_IRQ_STAT_DEC_OFF);
+
+ if (irq_status_dec & HANTRODEC_DEC_IRQ) {
+ /* clear dec IRQ */
+ irq_status_dec &= (~HANTRODEC_DEC_IRQ);
+ iowrite32(irq_status_dec, hwregs + HANTRODEC_IRQ_STAT_DEC_OFF);
+
+ PDEBUG("decoder IRQ received! Core %d\n", i);
+
+ atomic_inc(&irq_rx);
+
+ dec_irq |= (1 << i);
+
+ //wake_up_interruptible_all(&dec_wait_queue);
+ wake_up_all(&dec_wait_queue);
+ handled++;
+ }
+ }
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ if (!handled)
+ pr_info("IRQ received, but not hantrodec's!\n");
+
+ (void)hwregs;
+ return IRQ_RETVAL(handled);
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : ResetAsic
+ *Description : reset asic
+ *
+ *Return type :
+ *---------------------------------------------------------------------------
+ */
+void ResetAsic(hantrodec_t *dev)
+{
+ int i, j;
+ u32 status;
+
+ for (j = 0; j < dev->cores; j++) {
+ status = ioread32(dev->hwregs[j] + HANTRODEC_IRQ_STAT_DEC_OFF);
+
+ if (status & HANTRODEC_DEC_E) {
+ /* abort with IRQ disabled */
+ status = HANTRODEC_DEC_ABORT | HANTRODEC_DEC_IRQ_DISABLE;
+ iowrite32(status, dev->hwregs[j] + HANTRODEC_IRQ_STAT_DEC_OFF);
+ }
+
+ if (IS_G1(dev->hw_id[j]))
+ /* reset PP */
+ iowrite32(0, dev->hwregs[j] + HANTRO_IRQ_STAT_PP_OFF);
+
+ for (i = 4; i < dev->iosize[j]; i += 4)
+ iowrite32(0, dev->hwregs[j] + i);
+ }
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : dump_regs
+ *Description : Dump registers
+ *
+ *Return type :
+ *---------------------------------------------------------------------------
+ */
+#ifdef HANTRODEC_DEBUG
+void dump_regs(hantrodec_t *dev)
+{
+ int i, c;
+
+ PDEBUG("Reg Dump Start\n");
+ for (c = 0; c < dev->cores; c++) {
+ for (i = 0; i < dev->iosize[c]; i += 4*4) {
+ PDEBUG("\toffset %04X: %08X %08X %08X %08X\n", i,
+ ioread32(dev->hwregs[c] + i),
+ ioread32(dev->hwregs[c] + i + 4),
+ ioread32(dev->hwregs[c] + i + 8),
+ ioread32(dev->hwregs[c] + i + 12));
+ }
+ }
+ PDEBUG("Reg Dump End\n");
+}
+#endif
+
+static int hantro_dev_probe(struct platform_device *pdev)
+{
+ int err = 0;
+ struct device *temp_class;
+ struct resource *res;
+ unsigned long reg_base;
+
+ hantro_dev = &pdev->dev;
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs_hantro");
+ if (!res) {
+ pr_err("hantro: unable to get vpu base addr\n");
+ return -ENODEV;
+ }
+ reg_base = res->start;
+ if ((ulong)reg_base != multicorebase[0]) {
+ pr_err("hantrodec: regbase(0x%lX) not equal to expected value(0x%lX)\n", reg_base, multicorebase[0]);
+ return -ENODEV;
+ }
+
+ hantro_clk_g1 = clk_get(&pdev->dev, "clk_hantro_g1");
+ hantro_clk_g2 = clk_get(&pdev->dev, "clk_hantro_g2");
+ hantro_clk_bus = clk_get(&pdev->dev, "clk_hantro_bus");
+ if (IS_ERR(hantro_clk_g1) || IS_ERR(hantro_clk_g2) || IS_ERR(hantro_clk_bus)) {
+ pr_err("hantro: get clock failed\n");
+ return -ENODEV;
+ }
+ pr_debug("hantro: g1, g2, bus clock: 0x%lX, 0x%lX, 0x%lX\n", clk_get_rate(hantro_clk_g1),
+ clk_get_rate(hantro_clk_g2), clk_get_rate(hantro_clk_bus));
+
+#if 0
+ hantro_regulator = regulator_get(&pdev->dev, "regulator");
+ if (IS_ERR(hantro_regulator)) {
+ pr_err("hantro: get regulator failed\n");
+ return -ENODEV;
+ }
+ hantro_update_voltage(&pdev->dev);
+#endif
+ hantro_clk_enable(&pdev->dev);
+ pm_runtime_enable(&pdev->dev);
+
+ pm_runtime_get_sync(&pdev->dev);
+
+ hantro_ctrlblk_reset(&pdev->dev);
+
+ err = hantrodec_init(pdev);
+ if (0 != err) {
+ pr_err("hantro: hantrodec_init failed\n");
+ goto error;
+ }
+
+ hantro_class = class_create(THIS_MODULE, "mxc_hantro");
+ if (IS_ERR(hantro_class)) {
+ err = PTR_ERR(hantro_class);
+ goto error;
+ }
+ temp_class = device_create(hantro_class, NULL, MKDEV(hantrodec_major, 0), NULL, DEVICE_NAME);
+ if (IS_ERR(temp_class)) {
+ err = PTR_ERR(temp_class);
+ goto err_out_class;
+ }
+
+#ifdef CONFIG_DEVICE_THERMAL
+ HANTRO_REG_THERMAL_NOTIFIER(&hantro_thermal_hot_notifier);
+ thermal_event = 0;
+ thermal_cur = 0;
+ hantro_dynamic_clock = 0;
+#endif
+ timeout = 0;
+ goto out;
+
+err_out_class:
+ device_destroy(hantro_class, MKDEV(hantrodec_major, 0));
+ class_destroy(hantro_class);
+error:
+ pr_err("hantro probe failed\n");
+out:
+ pm_runtime_put_sync(&pdev->dev);
+ hantro_clk_disable(&pdev->dev);
+ return err;
+}
+
+static int hantro_dev_remove(struct platform_device *pdev)
+{
+ hantro_clk_enable(&pdev->dev);
+ pm_runtime_get_sync(&pdev->dev);
+ if (hantrodec_major > 0) {
+ device_destroy(hantro_class, MKDEV(hantrodec_major, 0));
+ class_destroy(hantro_class);
+ hantrodec_cleanup();
+ hantrodec_major = 0;
+ }
+ pm_runtime_put_sync(&pdev->dev);
+ pm_runtime_disable(&pdev->dev);
+ hantro_clk_disable(&pdev->dev);
+
+#ifdef CONFIG_DEVICE_THERMAL
+ HANTRO_UNREG_THERMAL_NOTIFIER(&hantro_thermal_hot_notifier);
+#endif
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int hantro_suspend(struct device *dev)
+{
+ pm_runtime_put_sync_suspend(dev); //power off
+ return 0;
+}
+static int hantro_resume(struct device *dev)
+{
+ pm_runtime_get_sync(dev); //power on
+ hantro_ctrlblk_reset(dev);
+ return 0;
+}
+static int hantro_runtime_suspend(struct device *dev)
+{
+// release_bus_freq(BUS_FREQ_HIGH);
+ return 0;
+}
+
+static int hantro_runtime_resume(struct device *dev)
+{
+// request_bus_freq(BUS_FREQ_HIGH);
+ hantro_ctrlblk_reset(dev);
+ return 0;
+}
+
+static const struct dev_pm_ops hantro_pm_ops = {
+ SET_RUNTIME_PM_OPS(hantro_runtime_suspend, hantro_runtime_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(hantro_suspend, hantro_resume)
+};
+#endif //CONFIG_PM
+
+static const struct of_device_id hantro_of_match[] = {
+ { .compatible = "nxp,imx8mq-hantro", },
+ {/* sentinel */}
+};
+MODULE_DEVICE_TABLE(of, hantro_of_match);
+
+
+static struct platform_driver mxchantro_driver = {
+ .driver = {
+ .name = "mxc_hantro",
+ .of_match_table = hantro_of_match,
+#ifdef CONFIG_PM
+ .pm = &hantro_pm_ops,
+#endif
+ },
+ .probe = hantro_dev_probe,
+ .remove = hantro_dev_remove,
+};
+
+static int __init hantro_init(void)
+{
+ int ret = platform_driver_register(&mxchantro_driver);
+
+ return ret;
+}
+
+static void __exit hantro_exit(void)
+{
+ if (!IS_ERR(hantro_clk_g1))
+ clk_put(hantro_clk_g1);
+ if (!IS_ERR(hantro_clk_g2))
+ clk_put(hantro_clk_g2);
+ if (!IS_ERR(hantro_clk_bus))
+ clk_put(hantro_clk_bus);
+#if 0
+ if (!IS_ERR(hantro_regulator))
+ regulator_put(hantro_regulator);
+#endif
+ platform_driver_unregister(&mxchantro_driver);
+}
+
+module_init(hantro_init);
+module_exit(hantro_exit);
+
+/* module description */
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Google Finland Oy");
+MODULE_DESCRIPTION("Driver module for Hantro Decoder/Post-Processor");
+
diff --git a/drivers/mxc/hantro_845/Kconfig b/drivers/mxc/hantro_845/Kconfig
new file mode 100755
index 000000000000..75e1a0c4dd8e
--- /dev/null
+++ b/drivers/mxc/hantro_845/Kconfig
@@ -0,0 +1,14 @@
+#
+# Codec configuration
+#
+
+menu "MXC HANTRO(Video Processing Unit) 845 support"
+ depends on ARCH_MXC
+
+config MXC_HANTRO_845
+ tristate "Support for MXC HANTRO(Video Processing Unit) 845"
+ default y
+ ---help---
+ VPU codec device.
+
+endmenu
diff --git a/drivers/mxc/hantro_845/Makefile b/drivers/mxc/hantro_845/Makefile
new file mode 100755
index 000000000000..575756282a8b
--- /dev/null
+++ b/drivers/mxc/hantro_845/Makefile
@@ -0,0 +1,8 @@
+#
+# Makefile for the VPU drivers.
+#
+
+#ccflags-y += -I$(PWD)
+
+obj-$(CONFIG_MXC_HANTRO_845) += hantrodec_845s.o
+
diff --git a/drivers/mxc/hantro_845/dwl_defs.h b/drivers/mxc/hantro_845/dwl_defs.h
new file mode 100644
index 000000000000..8976dcf156b6
--- /dev/null
+++ b/drivers/mxc/hantro_845/dwl_defs.h
@@ -0,0 +1,94 @@
+/*****************************************************************************
+ * The GPL License (GPL)
+ *
+ * Copyright (c) 2015-2017, VeriSilicon Inc.
+ * Copyright (c) 2011-2014, Google Inc.
+ *
+ * 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 may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ *****************************************************************************/
+
+#ifndef SOFTWARE_LINUX_DWL_DWL_DEFS_H_
+#define SOFTWARE_LINUX_DWL_DWL_DEFS_H_
+
+#define DWL_MPEG2_E 31 /* 1 bit */
+#define DWL_VC1_E 29 /* 2 bits */
+#define DWL_JPEG_E 28 /* 1 bit */
+#define DWL_MPEG4_E 26 /* 2 bits */
+#define DWL_H264_E 24 /* 2 bits */
+#define DWL_VP6_E 23 /* 1 bit */
+#define DWL_RV_E 26 /* 2 bits */
+#define DWL_VP8_E 23 /* 1 bit */
+#define DWL_VP7_E 24 /* 1 bit */
+#define DWL_WEBP_E 19 /* 1 bit */
+#define DWL_AVS_E 22 /* 1 bit */
+#if 0
+#define DWL_PP_E 16 /* 1 bit */
+#endif
+#define DWL_PP_E 31 /* 1 bit */
+#define DWL_HEVC_E 5 /* 2 bits */
+#define DWL_VP9_E 3 /* 2 bits */
+
+#define DWL_HEVC_ENA 0 /* 1 bits */
+#define DWL_VP9_ENA 1 /* 1 bits */
+#define DWL_RFC_E 2 /* 1 bits */
+#define DWL_DS_E 3 /* 1 bits */
+#define DWL_HEVC_VER 8 /* 4 bits */
+#define DWL_VP9_PROFILE 12 /* 3 bits */
+#define DWL_RING_E 16 /* 1 bits */
+
+#define HANTRODEC_IRQ_STAT_DEC 1
+#define HANTRODEC_IRQ_STAT_DEC_OFF (HANTRODEC_IRQ_STAT_DEC * 4)
+
+#define HANTRODECPP_SYNTH_CFG 60
+#define HANTRODECPP_SYNTH_CFG_OFF (HANTRODECPP_SYNTH_CFG * 4)
+#define HANTRODEC_SYNTH_CFG 50
+#define HANTRODEC_SYNTH_CFG_OFF (HANTRODEC_SYNTH_CFG * 4)
+#define HANTRODEC_SYNTH_CFG_2 54
+#define HANTRODEC_SYNTH_CFG_2_OFF (HANTRODEC_SYNTH_CFG_2 * 4)
+#define HANTRODEC_SYNTH_CFG_3 56
+#define HANTRODEC_SYNTH_CFG_3_OFF (HANTRODEC_SYNTH_CFG_3 * 4)
+#define HANTRODEC_CFG_STAT 23
+#define HANTRODEC_CFG_STAT_OFF (HANTRODEC_CFG_STAT * 4)
+
+
+#define HANTRODEC_DEC_E 0x01
+#define HANTRODEC_PP_E 0x01
+#define HANTRODEC_DEC_ABORT 0x20
+#define HANTRODEC_DEC_IRQ_DISABLE 0x10
+#define HANTRODEC_DEC_IRQ 0x100
+
+/* Legacy from G1 */
+#define HANTRO_IRQ_STAT_DEC 1
+#define HANTRO_IRQ_STAT_DEC_OFF (HANTRO_IRQ_STAT_DEC * 4)
+#define HANTRO_IRQ_STAT_PP 60
+#define HANTRO_IRQ_STAT_PP_OFF (HANTRO_IRQ_STAT_PP * 4)
+
+#define HANTROPP_SYNTH_CFG 100
+#define HANTROPP_SYNTH_CFG_OFF (HANTROPP_SYNTH_CFG * 4)
+#define HANTRODEC_SYNTH_CFG 50
+#define HANTRODEC_SYNTH_CFG_OFF (HANTRODEC_SYNTH_CFG * 4)
+#define HANTRODEC_SYNTH_CFG_2 54
+#define HANTRODEC_SYNTH_CFG_2_OFF (HANTRODEC_SYNTH_CFG_2 * 4)
+
+#define HANTRO_DEC_E 0x01
+#define HANTRO_PP_E 0x01
+#define HANTRO_DEC_ABORT 0x20
+#define HANTRO_DEC_IRQ_DISABLE 0x10
+#define HANTRO_PP_IRQ_DISABLE 0x10
+#define HANTRO_DEC_IRQ 0x100
+#define HANTRO_PP_IRQ 0x100
+
+#endif /* SOFTWARE_LINUX_DWL_DWL_DEFS_H_ */
diff --git a/drivers/mxc/hantro_845/hantrodec_845s.c b/drivers/mxc/hantro_845/hantrodec_845s.c
new file mode 100755
index 000000000000..e6c447f1c8a9
--- /dev/null
+++ b/drivers/mxc/hantro_845/hantrodec_845s.c
@@ -0,0 +1,2040 @@
+/*****************************************************************************
+ * The GPL License (GPL)
+ *
+ * Copyright (c) 2015-2019, VeriSilicon Inc.
+ * Copyright (c) 2011-2014, Google Inc.
+ *
+ * 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 may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ *****************************************************************************/
+#include <linux/hantrodec.h>
+#include "dwl_defs.h"
+#include <linux/io.h>
+#include <linux/uaccess.h>
+#include <linux/errno.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/pci.h>
+#include <linux/sched.h>
+#include <linux/semaphore.h>
+#include <linux/spinlock.h>
+#include <linux/slab.h>
+#include <linux/version.h>
+#include <linux/wait.h>
+#include <linux/timer.h>
+#include <linux/clk.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/clk.h>
+#include <linux/busfreq-imx.h>
+
+#include <linux/delay.h>
+
+//#define CONFIG_DEVICE_THERMAL_HANTRO
+#ifdef CONFIG_DEVICE_THERMAL_HANTRO
+#include <linux/device_cooling.h>
+#define HANTRO_REG_THERMAL_NOTIFIER(a) register_devfreq_cooling_notifier(a)
+#define HANTRO_UNREG_THERMAL_NOTIFIER(a) unregister_devfreq_cooling_notifier(a)
+static DEFINE_SPINLOCK(thermal_lock);
+/*1:hot, 0: not hot*/
+static int thermal_event;
+static int hantro_clock_ratio = 2;
+static int hantro_dynamic_clock;
+module_param(hantro_clock_ratio, int, 0644);
+module_param(hantro_dynamic_clock, int, 0644);
+MODULE_PARM_DESC(hantro_clock_ratio, "clock ratio 1/N");
+MODULE_PARM_DESC(hantro_dynamic_clock, "enable or disable dynamic clock rate");
+#endif
+
+/*hantro G1 regs config including dec and pp*/
+#define HANTRO_DEC_ORG_REGS 60
+#define HANTRO_PP_ORG_REGS 41
+
+#define HANTRO_DEC_EXT_REGS 27
+#define HANTRO_PP_EXT_REGS 9
+
+#define HANTRO_G1_DEC_TOTAL_REGS (HANTRO_DEC_ORG_REGS + HANTRO_DEC_EXT_REGS)
+#define HANTRO_PP_TOTAL_REGS (HANTRO_PP_ORG_REGS + HANTRO_PP_EXT_REGS)
+#define HANTRO_G1_TOTAL_REGS 155 /*G1 total regs*/
+
+#define HANTRO_DEC_ORG_FIRST_REG 0
+#define HANTRO_DEC_ORG_LAST_REG 59
+#define HANTRO_DEC_EXT_FIRST_REG 119
+#define HANTRO_DEC_EXT_LAST_REG 145
+
+#define HANTRO_PP_ORG_FIRST_REG 60
+#define HANTRO_PP_ORG_LAST_REG 100
+#define HANTRO_PP_EXT_FIRST_REG 146
+#define HANTRO_PP_EXT_LAST_REG 154
+
+/*hantro G2 reg config*/
+#define HANTRO_G2_DEC_REGS 265 /*G2 total regs*/
+
+#define HANTRO_G2_DEC_FIRST_REG 0
+#define HANTRO_G2_DEC_LAST_REG (HANTRO_G2_DEC_REGS - 1)
+
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
+#define DEC_IO_SIZE_MAX (MAX(HANTRO_G2_DEC_REGS, HANTRO_G1_TOTAL_REGS) * 4)
+
+/********************************************************************
+ * PORTING SEGMENT
+ * NOTES: customer should modify these configuration if do porting to own platform.
+ * Please guarantee the base_addr, io_size,dec_irq belong to same core.
+ ********************************************************************/
+
+#define HXDEC_MAX_CORES 2
+
+/* Logic module base address */
+#define SOCLE_LOGIC_0_BASE 0x38300000
+#define SOCLE_LOGIC_1_BASE 0x38310000
+#define BLK_CTL_BASE 0x38330000 //0x38320000
+
+#define VEXPRESS_LOGIC_0_BASE 0xFC010000
+#define VEXPRESS_LOGIC_1_BASE 0xFC020000
+
+#define DEC_IO_SIZE_0 ((HANTRO_G2_DEC_REGS) * 4) /* bytes */
+#define DEC_IO_SIZE_1 ((HANTRO_G2_DEC_REGS) * 4) /* bytes */
+
+#define HANTRO_DEC_DEF_CLK (600000000)
+#define HANTRO_BUS_DEF_CLK (800000000)
+/***********************************************************************/
+
+#define IS_G1(hw_id) ((hw_id == 0x6731) ? 1:0)
+
+static const int DecHwId[] = {
+ 0x8190, /* Legacy HW */
+ 0x8170,
+ 0x9170,
+ 0x9190,
+ 0x6731, /* G1 */
+ 0x6732 /* G2 */
+};
+
+static ulong multicorebase[HXDEC_MAX_CORES] = {
+ SOCLE_LOGIC_0_BASE,
+ SOCLE_LOGIC_1_BASE
+};
+
+
+static struct class *hantro_class;
+#define DEVICE_NAME "mxc_hantro"
+
+//static struct device *hantro_dev[HXDEC_MAX_CORES];
+
+typedef struct {
+ struct clk *dec;
+ struct clk *bus;
+} hantrodec_clk;
+
+static int hantro_dbg = -1;
+module_param(hantro_dbg, int, 0644);
+MODULE_PARM_DESC(hantro_dbg, "Debug level (0-1)");
+#undef PDEBUG
+#define PDEBUG(fmt, arg...) \
+ do { \
+ if (hantro_dbg > 0) { \
+ dev_info(hantrodec_data[0].dev, fmt, ## arg); \
+ } \
+ } while (0)
+
+
+static int hantrodec_major;
+static int cores = 2;
+/* here's all the must remember stuff */
+typedef struct {
+ //char *buffer;
+ unsigned int iosize;
+ volatile u8 *hwregs;
+ int irq;
+ int hw_id;
+ int core_id;
+ //int cores;
+ //struct fasync_struct *async_queue_dec;
+ //struct fasync_struct *async_queue_pp;
+ hantrodec_clk clk;
+ u32 dec_regs[DEC_IO_SIZE_MAX/4];
+ struct semaphore dec_core_sem;
+ struct semaphore pp_core_sem;
+ struct file *dec_owner;
+ struct file *pp_owner;
+ u32 cfg;
+ u32 timeout;
+ atomic_t irq_rx;
+ atomic_t irq_tx;
+ struct device *dev;
+ struct mutex dev_mutex;
+ int thermal_cur;
+} hantrodec_t;
+
+static hantrodec_t hantrodec_data[HXDEC_MAX_CORES]; /* dynamic allocation? */
+
+typedef struct {
+ char inst_id;
+ char core_id; //1:g1; 2:g2; 3:unknow
+} hantrodec_instance;
+static unsigned long instance_mask;
+#define MAX_HANTRODEC_INSTANCE 32
+static hantrodec_instance hantrodec_ctx[MAX_HANTRODEC_INSTANCE];
+
+static int ReserveIO(int);
+static void ReleaseIO(int);
+
+static void ResetAsic(hantrodec_t *dev);
+
+#ifdef HANTRODEC_DEBUG
+static void dump_regs(hantrodec_t *dev);
+#endif
+
+/* IRQ handler */
+static irqreturn_t hantrodec_isr(int irq, void *dev_id);
+
+static int dec_irq;
+static int pp_irq;
+
+
+/* spinlock_t owner_lock = SPIN_LOCK_UNLOCKED; */
+static DEFINE_SPINLOCK(owner_lock);
+
+static DECLARE_WAIT_QUEUE_HEAD(dec_wait_queue);
+static DECLARE_WAIT_QUEUE_HEAD(pp_wait_queue);
+
+static DECLARE_WAIT_QUEUE_HEAD(hw_queue);
+
+#define DWL_CLIENT_TYPE_H264_DEC 1U
+#define DWL_CLIENT_TYPE_MPEG4_DEC 2U
+#define DWL_CLIENT_TYPE_JPEG_DEC 3U
+#define DWL_CLIENT_TYPE_PP 4U
+#define DWL_CLIENT_TYPE_VC1_DEC 5U
+#define DWL_CLIENT_TYPE_MPEG2_DEC 6U
+#define DWL_CLIENT_TYPE_VP6_DEC 7U
+#define DWL_CLIENT_TYPE_AVS_DEC 8U
+#define DWL_CLIENT_TYPE_RV_DEC 9U
+#define DWL_CLIENT_TYPE_VP8_DEC 10U
+#define DWL_CLIENT_TYPE_VP9_DEC 11U
+#define DWL_CLIENT_TYPE_HEVC_DEC 12U
+
+static int hantro_device_id(struct device *dev)
+{
+ int id;
+
+ if (strcmp("vpu_g1", dev->of_node->name) == 0) {
+ id = 0;
+ } else if (strcmp("vpu_g2", dev->of_node->name) == 0) {
+ id = 1;
+ } else {
+ return id = -1;
+ }
+ return id;
+}
+static int hantro_clk_enable(hantrodec_clk *clk)
+{
+ clk_prepare(clk->dec);
+ clk_enable(clk->dec);
+ clk_prepare(clk->bus);
+ clk_enable(clk->bus);
+ return 0;
+}
+
+static int hantro_clk_disable(hantrodec_clk *clk)
+{
+ clk_disable(clk->dec);
+ clk_unprepare(clk->dec);
+ clk_disable(clk->bus);
+ clk_unprepare(clk->bus);
+ return 0;
+}
+
+static int hantro_ctrlblk_reset(hantrodec_t *dev)
+{
+ volatile u8 *iobase;
+ u32 val;
+
+ //config G1/G2
+ hantro_clk_enable(&dev->clk);
+ iobase = (volatile u8 *)ioremap_nocache(BLK_CTL_BASE, 0x10000);
+ if (dev->core_id == 0) {
+ val = ioread32(iobase);
+ val &= (~0x2);
+ iowrite32(val, iobase); //assert G1 block soft reset control
+ udelay(2);
+ val = ioread32(iobase);
+ val |= 0x2;
+ iowrite32(val, iobase); //desert G1 block soft reset control
+
+ val = ioread32(iobase+4);
+ val |= 0x2;
+ iowrite32(val, iobase+4); //VPUMIX G1 block clock enable control
+ iowrite32(0xFFFFFFFF, iobase + 0x8); // all G1 fuse dec enable
+ iowrite32(0xFFFFFFFF, iobase + 0xC); // all G1 fuse pp enable
+ } else {
+ val = ioread32(iobase);
+ val &= (~0x1);
+ iowrite32(val, iobase); //assert G2 block soft reset control
+ udelay(2);
+ val = ioread32(iobase);
+ val |= 0x1;
+ iowrite32(val, iobase); //desert G2 block soft reset control
+
+ val = ioread32(iobase+4);
+ val |= 0x1;
+ iowrite32(val, iobase+4); //VPUMIX G2 block clock enable control
+ iowrite32(0xFFFFFFFF, iobase + 0x10); // all G2 fuse dec enable
+ }
+ iounmap(iobase);
+ hantro_clk_disable(&dev->clk);
+ return 0;
+}
+
+static int hantro_power_on_disirq(hantrodec_t *hantrodev)
+{
+ //spin_lock_irq(&owner_lock);
+ mutex_lock(&hantrodev->dev_mutex);
+ disable_irq(hantrodev->irq);
+ pm_runtime_get_sync(hantrodev->dev);
+ enable_irq(hantrodev->irq);
+ mutex_unlock(&hantrodev->dev_mutex);
+ //spin_unlock_irq(&owner_lock);
+ return 0;
+}
+
+static int hantro_new_instance(void)
+{
+ int idx;
+
+ spin_lock(&owner_lock);
+ if (instance_mask == ((1UL << MAX_HANTRODEC_INSTANCE) - 1)) {
+ spin_unlock(&owner_lock);
+ return -1;
+ }
+ idx = ffz(instance_mask);
+ set_bit(idx, &instance_mask);
+ spin_unlock(&owner_lock);
+ return idx;
+}
+
+static int hantro_free_instance(int idx)
+{
+ spin_lock(&owner_lock);
+ clear_bit(idx, &instance_mask);
+ spin_unlock(&owner_lock);
+
+ return 0;
+}
+
+#ifdef CONFIG_DEVICE_THERMAL_HANTRO
+static int hantro_thermal_check(struct device *dev)
+{
+ hantrodec_t *hantrodev = dev_get_drvdata(dev);
+ unsigned long flags;
+
+ spin_lock_irqsave(&thermal_lock, flags);
+ if (thermal_event == hantrodev->thermal_cur) {
+ /*nothing to do and return directly*/
+ spin_unlock_irqrestore(&thermal_lock, flags);
+ return 0;
+ }
+ hantrodev->thermal_cur = thermal_event;
+ spin_unlock_irqrestore(&thermal_lock, flags);
+
+ if (hantrodev->thermal_cur) {
+ int ratio = hantro_clock_ratio;
+
+ pr_debug("hantro[%d]: too hot, need to decrease clock, ratio: 1/%d\n", hantrodev->core_id, ratio);
+ /*clock disable/enable are not required for vpu clock rate operation*/
+ clk_set_rate(hantrodev->clk.dec, HANTRO_DEC_DEF_CLK/ratio);
+ clk_set_rate(hantrodev->clk.bus, HANTRO_BUS_DEF_CLK/ratio);
+ } else {
+ pr_debug("hantro[%d]: not hot again, will restore default clock\n", hantrodev->core_id);
+ clk_set_rate(hantrodev->clk.dec, HANTRO_DEC_DEF_CLK);
+ clk_set_rate(hantrodev->clk.bus, HANTRO_BUS_DEF_CLK);
+ }
+ pr_info("hantro[%d]: event(%d), dec, bus clock: %ld, %ld\n", hantrodev->core_id, hantrodev->thermal_cur,
+ clk_get_rate(hantrodev->clk.dec), clk_get_rate(hantrodev->clk.bus));
+ return 0;
+}
+
+static int hantro_thermal_hot_notify(struct notifier_block *nb, unsigned long event, void *dummy)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&thermal_lock, flags);
+ thermal_event = event; /*event: 1: hot, 0: cool*/
+ spin_unlock_irqrestore(&thermal_lock, flags);
+ pr_info("hantro receive hot notification event: %ld\n", event);
+
+ return NOTIFY_OK;
+}
+
+static struct notifier_block hantro_thermal_hot_notifier = {
+ .notifier_call = hantro_thermal_hot_notify,
+};
+#endif //CONFIG_DEVICE_THERMAL_HANTRO
+
+static void ReadCoreConfig(hantrodec_t *dev)
+{
+ int c = dev->core_id;
+ u32 reg, tmp, mask;
+
+ memset(&dev->cfg, 0, sizeof(dev->cfg));
+
+ //for (c = 0; c < dev->cores; c++) {
+ /* Decoder configuration */
+ if (IS_G1(dev->hw_id)) {
+ reg = ioread32(dev->hwregs + HANTRODEC_SYNTH_CFG * 4);
+
+ tmp = (reg >> DWL_H264_E) & 0x3U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has H264\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_H264_DEC : 0;
+
+ tmp = (reg >> DWL_JPEG_E) & 0x01U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has JPEG\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_JPEG_DEC : 0;
+
+ tmp = (reg >> DWL_MPEG4_E) & 0x3U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has MPEG4\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_MPEG4_DEC : 0;
+
+ tmp = (reg >> DWL_VC1_E) & 0x3U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has VC1\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_VC1_DEC : 0;
+
+ tmp = (reg >> DWL_MPEG2_E) & 0x01U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has MPEG2\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_MPEG2_DEC : 0;
+
+ tmp = (reg >> DWL_VP6_E) & 0x01U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has VP6\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_VP6_DEC : 0;
+
+ reg = ioread32(dev->hwregs + HANTRODEC_SYNTH_CFG_2 * 4);
+
+ /* VP7 and WEBP is part of VP8 */
+ mask = (1 << DWL_VP8_E) | (1 << DWL_VP7_E) | (1 << DWL_WEBP_E);
+ tmp = (reg & mask);
+ if (tmp & (1 << DWL_VP8_E))
+ pr_debug("hantrodec: Core[%d] has VP8\n", c);
+ if (tmp & (1 << DWL_VP7_E))
+ pr_debug("hantrodec: Core[%d] has VP7\n", c);
+ if (tmp & (1 << DWL_WEBP_E))
+ pr_debug("hantrodec: Core[%d] has WebP\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_VP8_DEC : 0;
+
+ tmp = (reg >> DWL_AVS_E) & 0x01U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has AVS\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_AVS_DEC : 0;
+
+ tmp = (reg >> DWL_RV_E) & 0x03U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has RV\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_RV_DEC : 0;
+
+ /* Post-processor configuration */
+ //reg = ioread32(dev->hwregs + HANTROPP_SYNTH_CFG * 4);
+ } else {
+ reg = ioread32(dev->hwregs + HANTRODEC_SYNTH_CFG_2 * 4);
+
+ tmp = (reg >> DWL_HEVC_E) & 0x3U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has HEVC\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_HEVC_DEC : 0;
+
+ tmp = (reg >> DWL_VP9_E) & 0x03U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has VP9\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_VP9_DEC : 0;
+ }
+
+ /* Post-processor configuration */
+ reg = ioread32(dev->hwregs + HANTRODECPP_SYNTH_CFG * 4);
+
+ tmp = (reg >> DWL_PP_E) & 0x01U;
+ if (tmp)
+ pr_debug("hantrodec: Core[%d] has PP\n", c);
+ dev->cfg |= tmp ? 1 << DWL_CLIENT_TYPE_PP : 0;
+ //}
+}
+
+static int CoreHasFormat(const u32 cfg, u32 format)
+{
+ return (cfg & (1 << format)) ? 1 : 0;
+}
+
+static int GetDecCore(hantrodec_t *dev, struct file *filp)
+{
+ int success = 0;
+ unsigned long flags;
+
+ spin_lock_irqsave(&owner_lock, flags);
+ if (dev->dec_owner == NULL) {
+ dev->dec_owner = filp;
+ success = 1;
+ }
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return success;
+}
+
+static int GetDecCoreAny(long *Core, hantrodec_t *dev, struct file *filp,
+ unsigned long format)
+{
+ int success = 0;
+ //long c;
+
+ *Core = -1;
+
+ //for (c = 0; c < dev->cores; c++) {
+ /* a free Core that has format */
+ if (CoreHasFormat(dev->cfg, format) && GetDecCore(dev, filp)) {
+ success = 1;
+ *Core = dev->core_id;
+ //break;
+ }
+ //}
+
+ return success;
+}
+
+static int GetDecCoreID(unsigned long format)
+{
+ long c;
+
+ int core_id = -1;
+
+ for (c = 0; c < cores; c++) {
+ /* a Core that has format */
+ if (CoreHasFormat(hantrodec_data[c].cfg, format)) {
+ core_id = c;
+ break;
+ }
+ }
+ PDEBUG("GetDecCoreID=%d\n", core_id);
+ return core_id;
+}
+#if 0
+static int hantrodec_choose_core(int is_g1)
+{
+ volatile unsigned char *reg = NULL;
+ unsigned int blk_base = BLK_CTL_BASE;
+
+ PDEBUG("hantrodec_choose_core\n");
+ if (!request_mem_region(blk_base, 0x1000, "blk_ctl")) {
+ pr_err("blk_ctl: failed to reserve HW regs\n");
+ return -EBUSY;
+ }
+
+ reg = (volatile u8 *) ioremap_nocache(blk_base, 0x1000);
+
+ if (reg == NULL) {
+ pr_err("blk_ctl: failed to ioremap HW regs\n");
+ if (reg)
+ iounmap((void *)reg);
+ release_mem_region(blk_base, 0x1000);
+ return -EBUSY;
+ }
+
+ // G1 use, set to 1; G2 use, set to 0, choose the one you are using
+ if (is_g1)
+ iowrite32(0x1, reg + 0x14); // VPUMIX only use G1
+ else
+ iowrite32(0x0, reg + 0x14); // VPUMIX only use G2
+
+ if (reg)
+ iounmap((void *)reg);
+ release_mem_region(blk_base, 0x1000);
+ PDEBUG("hantrodec_choose_core OK!\n");
+ return 0;
+}
+#endif
+
+static long ReserveDecoder(hantrodec_t *dev, struct file *filp, unsigned long format)
+{
+ long Core = -1;
+
+ /* reserve a Core */
+ if (down_interruptible(&dev->dec_core_sem))
+ return -ERESTARTSYS;
+
+#if 1
+ if (GetDecCoreAny(&Core, dev, filp, format) == 0) {
+ pr_err("Core %d is already been reserved !\n", dev->core_id);
+ return -1;
+ }
+#else
+ /* lock a Core that has specific format*/
+ if (wait_event_interruptible(hw_queue, GetDecCoreAny(&Core, dev, filp, format) != 0))
+ return -ERESTARTSYS;
+#endif
+#if 0
+ if (IS_G1(dev->hw_id)) {
+ if (0 == hantrodec_choose_core(1))
+ PDEBUG("G1 is reserved\n");
+ else
+ return -1;
+ } else {
+ if (0 == hantrodec_choose_core(0))
+ PDEBUG("G2 is reserved\n");
+ else
+ return -1;
+ }
+#endif
+#ifdef CONFIG_DEVICE_THERMAL_HANTRO
+ if (hantro_dynamic_clock)
+ hantro_thermal_check(dev->dev);
+#endif
+
+ return Core;
+}
+
+static void ReleaseDecoder(hantrodec_t *dev)
+{
+ u32 status;
+ unsigned long flags;
+
+ status = ioread32(dev->hwregs + HANTRODEC_IRQ_STAT_DEC_OFF);
+
+ /* make sure HW is disabled */
+ if (status & HANTRODEC_DEC_E) {
+ pr_info("hantrodec: DEC[%d] still enabled -> reset\n", dev->core_id);
+
+ /* abort decoder */
+ status |= HANTRODEC_DEC_ABORT | HANTRODEC_DEC_IRQ_DISABLE;
+ iowrite32(status, dev->hwregs + HANTRODEC_IRQ_STAT_DEC_OFF);
+ }
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ dev->dec_owner = NULL;
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ up(&dev->dec_core_sem);
+
+ //wake_up_interruptible_all(&hw_queue);
+
+}
+
+static long ReservePostProcessor(hantrodec_t *dev, struct file *filp)
+{
+ unsigned long flags;
+
+ long Core = 0;
+
+ /* single Core PP only */
+ if (down_interruptible(&dev->pp_core_sem))
+ return -ERESTARTSYS;
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ dev->pp_owner = filp;
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return Core;
+}
+
+static void ReleasePostProcessor(hantrodec_t *dev)
+{
+ unsigned long flags;
+
+ u32 status = ioread32(dev->hwregs + HANTRO_IRQ_STAT_PP_OFF);
+
+ /* make sure HW is disabled */
+ if (status & HANTRO_PP_E) {
+ pr_info("hantrodec: PP[%d] still enabled -> reset\n", dev->core_id);
+
+ /* disable IRQ */
+ status |= HANTRO_PP_IRQ_DISABLE;
+
+ /* disable postprocessor */
+ status &= (~HANTRO_PP_E);
+ iowrite32(0x10, dev->hwregs + HANTRO_IRQ_STAT_PP_OFF);
+ }
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ dev->pp_owner = NULL;
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ up(&dev->pp_core_sem);
+}
+
+#if 0
+static long ReserveDecPp(hantrodec_t *dev, struct file *filp, unsigned long format)
+{
+ /* reserve Core 0, DEC+PP for pipeline */
+ unsigned long flags;
+
+ long Core = 0;
+
+ /* check that Core has the requested dec format */
+ if (!CoreHasFormat(dev->cfg, format))
+ return -EFAULT;
+
+ /* check that Core has PP */
+ if (!CoreHasFormat(dev->cfg, DWL_CLIENT_TYPE_PP))
+ return -EFAULT;
+
+ /* reserve a Core */
+ if (down_interruptible(&dev->dec_core_sem))
+ return -ERESTARTSYS;
+
+ /* wait until the Core is available */
+ if (wait_event_interruptible(hw_queue, GetDecCore(dev, filp) != 0)) {
+ up(&dev->dec_core_sem);
+ return -ERESTARTSYS;
+ }
+
+ if (down_interruptible(&dev->pp_core_sem)) {
+ ReleaseDecoder(dev);
+ return -ERESTARTSYS;
+ }
+
+ spin_lock_irqsave(&owner_lock, flags);
+ dev->pp_owner = filp;
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return Core;
+}
+#endif
+static long DecFlushRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ long ret = 0, i;
+
+ //u32 id = Core->id;
+
+ if (IS_G1(dev->hw_id)) {
+ /* copy original dec regs to kernal space*/
+ ret = copy_from_user(dev->dec_regs, Core->regs, HANTRO_DEC_ORG_REGS*4);
+ if (ret) {
+ pr_err("copy_from_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+#ifdef USE_64BIT_ENV
+ /* copy extended dec regs to kernal space*/
+ ret = copy_from_user(dev->dec_regs + HANTRO_DEC_EXT_FIRST_REG,
+ Core->regs + HANTRO_DEC_EXT_FIRST_REG, HANTRO_DEC_EXT_REGS * 4);
+#endif
+ if (ret) {
+ pr_err("copy_from_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+
+ /* write dec regs but the status reg[1] to hardware */
+ /* both original and extended regs need to be written */
+ for (i = 2; i <= HANTRO_DEC_ORG_LAST_REG; i++)
+ iowrite32(dev->dec_regs[i], dev->hwregs + i*4);
+#ifdef USE_64BIT_ENV
+ for (i = HANTRO_DEC_EXT_FIRST_REG; i <= HANTRO_DEC_EXT_LAST_REG; i++)
+ iowrite32(dev->dec_regs[i], dev->hwregs + i*4);
+#endif
+ } else {
+ ret = copy_from_user(dev->dec_regs, Core->regs, HANTRO_G2_DEC_REGS*4);
+ if (ret) {
+ pr_err("copy_from_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+
+ /* write all regs but the status reg[1] to hardware */
+ for (i = 2; i <= HANTRO_G2_DEC_LAST_REG; i++)
+ iowrite32(dev->dec_regs[i], dev->hwregs + i*4);
+ }
+
+ /* write the status register, which may start the decoder */
+ iowrite32(dev->dec_regs[1], dev->hwregs + 4);
+
+ PDEBUG("flushed registers on Core %d\n", dev->core_id);
+
+ return 0;
+}
+
+static long DecRefreshRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ long ret, i;
+ //u32 id = Core->id;
+
+ if (IS_G1(dev->hw_id)) {
+ /* user has to know exactly what they are asking for */
+ //if(Core->size != (HANTRO_DEC_ORG_REGS * 4))
+ // return -EFAULT;
+
+ /* read all registers from hardware */
+ /* both original and extended regs need to be read */
+ for (i = 0; i <= HANTRO_DEC_ORG_LAST_REG; i++)
+ dev->dec_regs[i] = ioread32(dev->hwregs + i*4);
+#ifdef USE_64BIT_ENV
+ for (i = HANTRO_DEC_EXT_FIRST_REG; i <= HANTRO_DEC_EXT_LAST_REG; i++)
+ dev->dec_regs[i] = ioread32(dev->hwregs + i*4);
+#endif
+
+ if (dev->timeout) {
+ /* Enable TIMEOUT bits in Reg[1] */
+ dev->dec_regs[1] = 0x40100;
+ /* Reset HW */
+ ResetAsic(dev);
+ dev->timeout = 0;
+ }
+
+ /* put registers to user space*/
+ /* put original registers to user space*/
+ ret = copy_to_user(Core->regs, dev->dec_regs, HANTRO_DEC_ORG_REGS*4);
+#ifdef USE_64BIT_ENV
+ /*put extended registers to user space*/
+ ret = copy_to_user(Core->regs + HANTRO_DEC_EXT_FIRST_REG,
+ dev->dec_regs + HANTRO_DEC_EXT_FIRST_REG, HANTRO_DEC_EXT_REGS * 4);
+#endif
+ if (ret) {
+ pr_err("copy_to_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+ } else {
+ /* user has to know exactly what they are asking for */
+ if (Core->size != (HANTRO_G2_DEC_REGS * 4))
+ return -EFAULT;
+
+ /* read all registers from hardware */
+ for (i = 0; i <= HANTRO_G2_DEC_LAST_REG; i++)
+ dev->dec_regs[i] = ioread32(dev->hwregs + i*4);
+
+ if (dev->timeout) {
+ /* Enable TIMEOUT bits in Reg[1] */
+ dev->dec_regs[1] = 0x40100;
+ /* Reset HW */
+ ResetAsic(dev);
+ dev->timeout = 0;
+ }
+
+ /* put registers to user space*/
+ ret = copy_to_user(Core->regs, dev->dec_regs, HANTRO_G2_DEC_REGS*4);
+ if (ret) {
+ pr_err("copy_to_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+ }
+ return 0;
+}
+
+static int CheckDecIrq(hantrodec_t *dev)
+{
+ unsigned long flags;
+ int rdy = 0;
+
+ const u32 irq_mask = (1 << dev->core_id);
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ if (dec_irq & irq_mask) {
+ /* reset the wait condition(s) */
+ dec_irq &= ~irq_mask;
+ rdy = 1;
+ }
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return rdy;
+}
+
+static long WaitDecReadyAndRefreshRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ //u32 id = Core->id;
+ long ret;
+
+ PDEBUG("wait_event_interruptible DEC[%d]\n", dev->core_id);
+
+ //ret = wait_event_interruptible_timeout(dec_wait_queue, CheckDecIrq(dev), msecs_to_jiffies(200));
+ ret = wait_event_timeout(dec_wait_queue, CheckDecIrq(dev), msecs_to_jiffies(200));
+ if (ret == -ERESTARTSYS) {
+ pr_err("DEC[%d] failed to wait_event_interruptible interrupted\n", dev->core_id);
+ return -ERESTARTSYS;
+ } else if (ret == 0) {
+ pr_err("DEC[%d] wait_event_interruptible timeout\n", dev->core_id);
+ dev->timeout = 1;
+ }
+
+ atomic_inc(&dev->irq_tx);
+
+ /* refresh registers */
+ return DecRefreshRegs(dev, Core);
+}
+
+static long PPFlushRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ long ret = 0;
+ //u32 id = Core->id;
+ u32 i;
+
+ /* copy original dec regs to kernal space*/
+ ret = copy_from_user(dev->dec_regs + HANTRO_PP_ORG_FIRST_REG,
+ Core->regs + HANTRO_PP_ORG_FIRST_REG, HANTRO_PP_ORG_REGS*4);
+#ifdef USE_64BIT_ENV
+ /* copy extended dec regs to kernal space*/
+ ret = copy_from_user(dev->dec_regs + HANTRO_PP_EXT_FIRST_REG,
+ Core->regs + HANTRO_PP_EXT_FIRST_REG, HANTRO_PP_EXT_REGS*4);
+#endif
+ if (ret) {
+ pr_err("copy_from_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+
+ /* write all regs but the status reg[1] to hardware */
+ /* both original and extended regs need to be written */
+ for (i = HANTRO_PP_ORG_FIRST_REG + 1; i <= HANTRO_PP_ORG_LAST_REG; i++)
+ iowrite32(dev->dec_regs[i], dev->hwregs + i*4);
+#ifdef USE_64BIT_ENV
+ for (i = HANTRO_PP_EXT_FIRST_REG; i <= HANTRO_PP_EXT_LAST_REG; i++)
+ iowrite32(dev->dec_regs[i], dev->hwregs + i*4);
+#endif
+ /* write the stat reg, which may start the PP */
+ iowrite32(dev->dec_regs[HANTRO_PP_ORG_FIRST_REG],
+ dev->hwregs + HANTRO_PP_ORG_FIRST_REG * 4);
+
+ return 0;
+}
+
+static long PPRefreshRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ long i, ret;
+ //u32 id = Core->id;
+#ifdef USE_64BIT_ENV
+ /* user has to know exactly what they are asking for */
+ if (Core->size != (HANTRO_PP_TOTAL_REGS * 4))
+ return -EFAULT;
+#else
+ /* user has to know exactly what they are asking for */
+ if (Core->size != (HANTRO_PP_ORG_REGS * 4))
+ return -EFAULT;
+#endif
+
+ /* read all registers from hardware */
+ /* both original and extended regs need to be read */
+ for (i = HANTRO_PP_ORG_FIRST_REG; i <= HANTRO_PP_ORG_LAST_REG; i++)
+ dev->dec_regs[i] = ioread32(dev->hwregs + i*4);
+#ifdef USE_64BIT_ENV
+ for (i = HANTRO_PP_EXT_FIRST_REG; i <= HANTRO_PP_EXT_LAST_REG; i++)
+ dev->dec_regs[i] = ioread32(dev->hwregs + i*4);
+#endif
+ /* put registers to user space*/
+ /* put original registers to user space*/
+ ret = copy_to_user(Core->regs + HANTRO_PP_ORG_FIRST_REG,
+ dev->dec_regs + HANTRO_PP_ORG_FIRST_REG, HANTRO_PP_ORG_REGS*4);
+#ifdef USE_64BIT_ENV
+ /* put extended registers to user space*/
+ ret = copy_to_user(Core->regs + HANTRO_PP_EXT_FIRST_REG,
+ dev->dec_regs + HANTRO_PP_EXT_FIRST_REG, HANTRO_PP_EXT_REGS * 4);
+#endif
+ if (ret) {
+ pr_err("copy_to_user failed, returned %li\n", ret);
+ return -EFAULT;
+ }
+
+ return 0;
+}
+
+static int CheckPPIrq(hantrodec_t *dev)
+{
+ unsigned long flags;
+ int rdy = 0;
+
+ const u32 irq_mask = (1 << dev->core_id);
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ if (pp_irq & irq_mask) {
+ /* reset the wait condition(s) */
+ pp_irq &= ~irq_mask;
+ rdy = 1;
+ }
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return rdy;
+}
+
+static long WaitPPReadyAndRefreshRegs(hantrodec_t *dev, struct core_desc *Core)
+{
+ //u32 id = Core->id;
+
+ PDEBUG("wait_event_interruptible PP[%d]\n", dev->core_id);
+
+ if (wait_event_interruptible(pp_wait_queue, CheckPPIrq(dev))) {
+ pr_err("PP[%d] failed to wait_event_interruptible interrupted\n", dev->core_id);
+ return -ERESTARTSYS;
+ }
+
+ atomic_inc(&dev->irq_tx);
+
+ /* refresh registers */
+ return PPRefreshRegs(dev, Core);
+}
+
+static int CheckCoreIrq(const struct file *filp, int *id)
+{
+ unsigned long flags;
+ int rdy = 0, n = 0;
+ hantrodec_t *dev;
+
+ do {
+ u32 irq_mask;
+
+ dev = &hantrodec_data[n];
+ irq_mask = (1 << dev->core_id);
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ if (dec_irq & irq_mask) {
+ if (dev->dec_owner == filp) {
+ /* we have an IRQ for our client */
+
+ /* reset the wait condition(s) */
+ dec_irq &= ~irq_mask;
+
+ /* signal ready Core no. for our client */
+ *id = dev->core_id;
+
+ rdy = 1;
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+ break;
+ } else if (dev->dec_owner == NULL) {
+ /* zombie IRQ */
+ pr_info("IRQ on Core[%d], but no owner!!!\n", n);
+
+ /* reset the wait condition(s) */
+ dec_irq &= ~irq_mask;
+ }
+ }
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ n++; /* next Core */
+ } while (n < cores);
+
+ return rdy;
+}
+
+static long WaitCoreReady(const struct file *filp, int *id)
+{
+ PDEBUG("wait_event_interruptible CORE\n");
+
+ if (wait_event_interruptible(dec_wait_queue, CheckCoreIrq(filp, id))) {
+ pr_err("CORE failed to wait_event_interruptible interrupted\n");
+ return -ERESTARTSYS;
+ }
+
+ atomic_inc(&hantrodec_data[*id].irq_tx);
+
+ return 0;
+}
+
+/*-------------------------------------------------------------------------
+ *Function name : hantrodec_ioctl
+ *Description : communication method to/from the user space
+ *
+ *Return type : long
+ *-------------------------------------------------------------------------
+ */
+
+static long hantrodec_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+ int err = 0;
+ long tmp;
+
+ PDEBUG("ioctl cmd 0x%08x\n", cmd);
+ /*
+ * extract the type and number bitfields, and don't decode
+ * wrong cmds: return ENOTTY (inappropriate ioctl) before access_ok()
+ */
+ if (_IOC_TYPE(cmd) != HANTRODEC_IOC_MAGIC)
+ return -ENOTTY;
+ if (_IOC_NR(cmd) > HANTRODEC_IOC_MAXNR)
+ return -ENOTTY;
+
+ /*
+ * the direction is a bitmask, and VERIFY_WRITE catches R/W
+ * transfers. `Type' is user-oriented, while
+ * access_ok is kernel-oriented, so the concept of "read" and
+ * "write" is reversed
+ */
+ if (_IOC_DIR(cmd) & _IOC_READ)
+ err = !access_ok((void *) arg, _IOC_SIZE(cmd));
+ else if (_IOC_DIR(cmd) & _IOC_WRITE)
+ err = !access_ok((void *) arg, _IOC_SIZE(cmd));
+
+ if (err)
+ return -EFAULT;
+
+ switch (_IOC_NR(cmd)) {
+ case _IOC_NR(HANTRODEC_IOC_CLI): {
+ __u32 id;
+
+ __get_user(id, (__u32 *)arg);
+ if (id >= cores)
+ return -EFAULT;
+ disable_irq(hantrodec_data[id].irq);
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOC_STI): {
+ __u32 id;
+
+ __get_user(id, (__u32 *)arg);
+ if (id >= cores)
+ return -EFAULT;
+ enable_irq(hantrodec_data[id].irq);
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCGHWOFFSET): {
+ __u32 id;
+
+ __get_user(id, (__u32 *)arg);
+ if (id >= cores)
+ return -EFAULT;
+
+ __put_user(multicorebase[id], (unsigned long *) arg);
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCGHWIOSIZE): {
+ __u32 id;
+ __u32 io_size;
+
+ __get_user(id, (__u32 *)arg);
+ if (id >= cores)
+ return -EFAULT;
+ io_size = hantrodec_data[id].iosize;
+ __put_user(io_size, (u32 *) arg);
+
+ return 0;
+ }
+ case _IOC_NR(HANTRODEC_IOC_MC_OFFSETS): {
+ tmp = copy_to_user((u64 *) arg, multicorebase, sizeof(multicorebase));
+ if (err) {
+ pr_err("copy_to_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOC_MC_CORES):
+ __put_user(cores, (unsigned int *) arg);
+ PDEBUG("hantrodec_data.cores=%d\n", cores);
+ break;
+ case _IOC_NR(HANTRODEC_IOCS_DEC_PUSH_REG): {
+ struct core_desc Core;
+
+ /* get registers from user space*/
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= cores)
+ return -EFAULT;
+
+ DecFlushRegs(&hantrodec_data[Core.id], &Core);
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCS_PP_PUSH_REG): {
+ struct core_desc Core;
+
+ /* get registers from user space*/
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= cores)
+ return -EFAULT;
+
+ PPFlushRegs(&hantrodec_data[Core.id], &Core);
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCS_DEC_PULL_REG): {
+ struct core_desc Core;
+
+ /* get registers from user space*/
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= cores)
+ return -EFAULT;
+
+ return DecRefreshRegs(&hantrodec_data[Core.id], &Core);
+ }
+ case _IOC_NR(HANTRODEC_IOCS_PP_PULL_REG): {
+ struct core_desc Core;
+
+ /* get registers from user space*/
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= cores)
+ return -EFAULT;
+
+ return PPRefreshRegs(&hantrodec_data[Core.id], &Core);
+ }
+ case _IOC_NR(HANTRODEC_IOCH_DEC_RESERVE): {
+ int id;
+
+ PDEBUG("Reserve DEC Core, format = %li\n", arg);
+ id = GetDecCoreID(arg);
+ if (id < 0) {
+ pr_err("invalid format: %ld\n", arg);
+ return -EFAULT;
+ }
+ return ReserveDecoder(&hantrodec_data[id], filp, arg);
+ }
+ case _IOC_NR(HANTRODEC_IOCT_DEC_RELEASE): {
+ if (arg >= cores || hantrodec_data[arg].dec_owner != filp) {
+ pr_err("bogus DEC release, Core = %li\n", arg);
+ return -EFAULT;
+ }
+
+ PDEBUG("Release DEC, Core = %li\n", arg);
+
+ ReleaseDecoder(&hantrodec_data[arg]);
+
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCQ_PP_RESERVE):
+ return ReservePostProcessor(&hantrodec_data[0], filp);
+ case _IOC_NR(HANTRODEC_IOCT_PP_RELEASE): {
+ if (arg != 0 || hantrodec_data[arg].pp_owner != filp) {
+ pr_err("bogus PP release %li\n", arg);
+ return -EFAULT;
+ }
+
+ ReleasePostProcessor(&hantrodec_data[arg]);
+
+ break;
+ }
+ case _IOC_NR(HANTRODEC_IOCX_DEC_WAIT): {
+ struct core_desc Core;
+
+ /* get registers from user space */
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= cores)
+ return -EFAULT;
+
+ return WaitDecReadyAndRefreshRegs(&hantrodec_data[Core.id], &Core);
+ }
+ case _IOC_NR(HANTRODEC_IOCX_PP_WAIT): {
+ struct core_desc Core;
+
+ /* get registers from user space */
+ tmp = copy_from_user(&Core, (void *)arg, sizeof(struct core_desc));
+ if (tmp) {
+ pr_err("copy_from_user failed, returned %li\n", tmp);
+ return -EFAULT;
+ }
+
+ if (Core.id >= cores)
+ return -EFAULT;
+
+ return WaitPPReadyAndRefreshRegs(&hantrodec_data[Core.id], &Core);
+ }
+ case _IOC_NR(HANTRODEC_IOCG_CORE_WAIT): {
+ int id;
+
+ tmp = WaitCoreReady(filp, &id);
+ __put_user(id, (int *) arg);
+ return tmp;
+ }
+ case _IOC_NR(HANTRODEC_IOX_ASIC_ID): {
+ u32 id;
+
+ __get_user(id, (u32 *)arg);
+ if (id >= cores)
+ return -EFAULT;
+ id = ioread32(hantrodec_data[id].hwregs);
+ __put_user(id, (u32 *) arg);
+ return 0;
+ }
+ case _IOC_NR(HANTRODEC_IOCG_CORE_ID): {
+ int id;
+ hantrodec_instance *ctx = (hantrodec_instance *)filp->private_data;
+
+ PDEBUG("Get DEC Core_id, format = %li\n", arg);
+ id = GetDecCoreID(arg);
+ if ((ctx->core_id == 3) && (id >= 0)) {
+ if (id == 0) {
+ ctx->core_id = 1; //g1
+ /*power off g2*/
+ pm_runtime_put_sync(hantrodec_data[1].dev);
+ hantro_clk_disable(&hantrodec_data[1].clk);
+ } else if (id == 1) {
+ ctx->core_id = 2; //g2
+ /*power off g1*/
+ pm_runtime_put_sync(hantrodec_data[0].dev);
+ hantro_clk_disable(&hantrodec_data[0].clk);
+ }
+ }
+ return id;
+ }
+ case _IOC_NR(HANTRODEC_DEBUG_STATUS): {
+ PDEBUG("hantrodec: dec_irq = 0x%08x\n", dec_irq);
+ PDEBUG("hantrodec: pp_irq = 0x%08x\n", pp_irq);
+
+ //PDEBUG("hantrodec: IRQs received/sent2user = %d / %d\n",
+ //atomic_read(&irq_rx), atomic_read(&irq_tx));
+
+ for (tmp = 0; tmp < cores; tmp++) {
+ PDEBUG("hantrodec: Core %ld IRQs received/sent2user = %d / %d\n", tmp,
+ atomic_read(&hantrodec_data[tmp].irq_rx), atomic_read(&hantrodec_data[tmp].irq_tx));
+
+ PDEBUG("hantrodec: dec_core[%li] %s\n",
+ tmp, hantrodec_data[tmp].dec_owner == NULL ? "FREE" : "RESERVED");
+ PDEBUG("hantrodec: pp_core[%li] %s\n",
+ tmp, hantrodec_data[tmp].pp_owner == NULL ? "FREE" : "RESERVED");
+ }
+ break;
+ }
+ default:
+ return -ENOTTY;
+ }
+
+ return 0;
+}
+
+#ifdef CONFIG_COMPAT
+struct core_desc_32 {
+ __u32 id; /* id of the Core */
+ compat_caddr_t regs; /* pointer to user registers */
+ __u32 size; /* size of register space */
+};
+
+static int get_hantro_core_desc32(struct core_desc *kp, struct core_desc_32 __user *up)
+{
+ u32 tmp;
+
+ if (!access_ok(up, sizeof(struct core_desc_32)) ||
+ get_user(kp->id, &up->id) ||
+ get_user(kp->size, &up->size) ||
+ get_user(tmp, &up->regs)) {
+ return -EFAULT;
+ }
+ kp->regs = (__force u32 *)compat_ptr(tmp);
+ return 0;
+}
+
+static int put_hantro_core_desc32(struct core_desc *kp, struct core_desc_32 __user *up)
+{
+ u32 tmp = (u32)((unsigned long)kp->regs);
+
+ if (!access_ok(up, sizeof(struct core_desc_32)) ||
+ put_user(kp->id, &up->id) ||
+ put_user(kp->size, &up->size) ||
+ put_user(tmp, &up->regs)) {
+ return -EFAULT;
+ }
+ return 0;
+}
+static long hantrodec_ioctl32(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+#define HANTRO_IOCTL32(err, filp, cmd, arg) { \
+ mm_segment_t old_fs = get_fs(); \
+ set_fs(KERNEL_DS); \
+ err = hantrodec_ioctl(filp, cmd, arg); \
+ if (err) \
+ return err; \
+ set_fs(old_fs); \
+ }
+
+ union {
+ struct core_desc kcore;
+ unsigned long kux;
+ unsigned int kui;
+ } karg;
+ void __user *up = compat_ptr(arg);
+ long err = 0;
+
+ switch (_IOC_NR(cmd)) {
+ case _IOC_NR(HANTRODEC_IOCGHWOFFSET):
+ case _IOC_NR(HANTRODEC_IOC_MC_OFFSETS):
+ err = get_user(karg.kux, (s32 __user *)up);
+ if (err)
+ return err;
+ HANTRO_IOCTL32(err, filp, cmd, (unsigned long)&karg);
+ err = put_user(((s32)karg.kux), (s32 __user *)up);
+ break;
+ case _IOC_NR(HANTRODEC_IOCGHWIOSIZE):
+ case _IOC_NR(HANTRODEC_IOC_MC_CORES):
+ case _IOC_NR(HANTRODEC_IOCG_CORE_WAIT):
+ case _IOC_NR(HANTRODEC_IOX_ASIC_ID):
+ err = get_user(karg.kui, (s32 __user *)up);
+ if (err)
+ return err;
+ HANTRO_IOCTL32(err, filp, cmd, (unsigned long)&karg);
+ err = put_user(((s32)karg.kui), (s32 __user *)up);
+ break;
+ case _IOC_NR(HANTRODEC_IOCS_DEC_PUSH_REG):
+ case _IOC_NR(HANTRODEC_IOCS_PP_PUSH_REG):
+ case _IOC_NR(HANTRODEC_IOCX_DEC_WAIT):
+ case _IOC_NR(HANTRODEC_IOCX_PP_WAIT):
+ case _IOC_NR(HANTRODEC_IOCS_DEC_PULL_REG):
+ case _IOC_NR(HANTRODEC_IOCS_PP_PULL_REG):
+ err = get_hantro_core_desc32(&karg.kcore, up);
+ if (err)
+ return err;
+ HANTRO_IOCTL32(err, filp, cmd, (unsigned long)&karg);
+ err = put_hantro_core_desc32(&karg.kcore, up);
+ break;
+ default:
+ err = hantrodec_ioctl(filp, cmd, (unsigned long)up);
+ break;
+ }
+
+ return err;
+}
+
+#endif //ifdef CONFIG_COMPAT
+
+/*--------------------------------------------------------------------------
+ *Function name : hantrodec_open
+ *Description : open method
+ *
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+static int hantrodec_open(struct inode *inode, struct file *filp)
+{
+ int i;
+ int idx;
+
+ idx = hantro_new_instance();
+ if (idx < 0)
+ return -ENOMEM;
+
+ PDEBUG("dev opened: id: %d\n", idx);
+ hantrodec_ctx[idx].core_id = 3; //unknow
+ hantrodec_ctx[idx].inst_id = idx;
+ filp->private_data = (void *)(&hantrodec_ctx[idx]);
+
+ /*not yet know which core id, so power on both g1 and g2 firstly*/
+ for (i = 0; i < 2; i++) {
+ hantro_clk_enable(&hantrodec_data[i].clk);
+ hantro_power_on_disirq(&hantrodec_data[i]);
+ }
+ return 0;
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : hantrodec_release
+ *Description : Release driver
+ *
+ *Return type : int
+ *----------------------------------------------------------------------------
+ */
+static int hantrodec_release(struct inode *inode, struct file *filp)
+{
+ int n;
+ //hantrodec_t *dev = &hantrodec_data;
+ hantrodec_instance *ctx = (hantrodec_instance *)filp->private_data;
+
+ PDEBUG("closing ...\n");
+ for (n = 0; n < cores; n++) {
+ if (hantrodec_data[n].dec_owner == filp) {
+ PDEBUG("releasing dec Core %i lock\n", n);
+ ReleaseDecoder(&hantrodec_data[n]);
+ }
+ }
+
+ for (n = 0; n < 1; n++) {
+ if (hantrodec_data[n].pp_owner == filp) {
+ PDEBUG("releasing pp Core %i lock\n", n);
+ ReleasePostProcessor(&hantrodec_data[n]);
+ }
+ }
+
+ if (ctx->core_id & 0x1) {
+ pm_runtime_put_sync(hantrodec_data[0].dev);
+ hantro_clk_disable(&hantrodec_data[0].clk);
+ }
+ if (ctx->core_id & 0x2) {
+ pm_runtime_put_sync(hantrodec_data[1].dev);
+ hantro_clk_disable(&hantrodec_data[1].clk);
+ }
+ hantro_free_instance(ctx->inst_id);
+
+ PDEBUG("closed: id: %d\n", n);
+ return 0;
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : hantro_mmap
+ *Description : memory map interface for hantro file operation
+ *
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+static int hantro_mmap(struct file *fp, struct vm_area_struct *vm)
+{
+ if (vm->vm_pgoff == (multicorebase[0] >> PAGE_SHIFT) || vm->vm_pgoff == (multicorebase[1] >> PAGE_SHIFT)) {
+ vm->vm_flags |= VM_IO;
+ vm->vm_page_prot = pgprot_noncached(vm->vm_page_prot);
+ PDEBUG("hantro mmap: size=0x%lX, page off=0x%lX\n", (vm->vm_end - vm->vm_start), vm->vm_pgoff);
+ return remap_pfn_range(vm, vm->vm_start, vm->vm_pgoff, vm->vm_end - vm->vm_start,
+ vm->vm_page_prot) ? -EAGAIN : 0;
+ } else {
+ pr_err("invalid map offset :0x%lX\n", vm->vm_pgoff);
+ return -EINVAL;
+ }
+}
+
+/* VFS methods */
+static const struct file_operations hantrodec_fops = {
+ .owner = THIS_MODULE,
+ .open = hantrodec_open,
+ .release = hantrodec_release,
+ .unlocked_ioctl = hantrodec_ioctl,
+ .fasync = NULL,
+ .mmap = hantro_mmap,
+#ifdef CONFIG_COMPAT
+ .compat_ioctl = hantrodec_ioctl32,
+#endif
+};
+
+/*---------------------------------------------------------------------------
+ *Function name : hantrodec_init
+ *Description : Initialize the driver
+ *
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+static int hantrodec_init(struct platform_device *pdev, int id)
+{
+ int result;
+ int irq;
+ struct device *temp_class;
+
+ //dec_irq = 0;
+ //pp_irq = 0;
+ pr_debug("hantrodec: Init multi Core[0] at 0x%16lx\n"
+ " Core[1] at 0x%16lx\n", multicorebase[0], multicorebase[1]);
+
+ //hantrodec_data.cores = 0;
+ //hantrodec_data.iosize[0] = DEC_IO_SIZE_0;
+ //hantrodec_data.iosize[1] = DEC_IO_SIZE_1;
+
+ //hantrodec_data.async_queue_dec = NULL;
+ //hantrodec_data.async_queue_pp = NULL;
+
+ hantrodec_data[id].iosize = (id == 0) ? DEC_IO_SIZE_0 : DEC_IO_SIZE_1;
+
+ if (!hantrodec_major) {
+ dec_irq = 0;
+ pp_irq = 0;
+
+ result = register_chrdev(hantrodec_major, "hantrodec", &hantrodec_fops);
+ if (result < 0) {
+ pr_err("hantrodec: unable to get major %d\n", hantrodec_major);
+ goto err;
+ } else if (result != 0) { /* this is for dynamic major */
+ hantrodec_major = result;
+ }
+
+ hantro_class = class_create(THIS_MODULE, "mxc_hantro_845");
+ if (IS_ERR(hantro_class)) {
+ result = -1;
+ goto err;
+ }
+ temp_class = device_create(hantro_class, NULL, MKDEV(hantrodec_major, 0), NULL, DEVICE_NAME);
+ if (IS_ERR(temp_class)) {
+ result = -1;
+ goto err_out_class;
+ }
+ }
+
+ result = ReserveIO(id);
+ if (result < 0)
+ goto err;
+
+ hantrodec_data[id].dec_owner = 0;
+ hantrodec_data[id].pp_owner = 0;
+
+ sema_init(&hantrodec_data[id].dec_core_sem, 1);
+ sema_init(&hantrodec_data[id].pp_core_sem, 1);
+
+ /* read configuration fo all cores */
+ ReadCoreConfig(&hantrodec_data[id]);
+
+ /* reset hardware */
+ ResetAsic(&hantrodec_data[id]);
+
+ /* register irq for each core*/
+ irq = platform_get_irq_byname(pdev, "irq_hantro");
+ if (irq > 0) {
+ hantrodec_data[id].irq = irq;
+ result = request_irq(irq, hantrodec_isr, IRQF_SHARED,
+ "hantrodec", (void *) &hantrodec_data[id]);
+
+ if (result != 0) {
+ if (result == -EINVAL)
+ pr_err("hantrodec: Bad irq number or handler\n");
+ else if (result == -EBUSY) {
+ pr_err("hantrodec: IRQ <%d> busy, change your config\n",
+ hantrodec_data[id].irq);
+ }
+ ReleaseIO(id);
+ goto err;
+ }
+ } else {
+ pr_err("hantrodec: IRQ0 not in use!\n");
+ goto err;
+ }
+
+ hantrodec_data[id].irq_rx.counter = 0;
+ hantrodec_data[id].irq_tx.counter = 0;
+ irq_set_status_flags(irq, IRQ_DISABLE_UNLAZY);
+ pr_info("hantrodec %d : module inserted. Major = %d\n", id, hantrodec_major);
+
+ return 0;
+
+err_out_class:
+ device_destroy(hantro_class, MKDEV(hantrodec_major, 0));
+ class_destroy(hantro_class);
+err:
+ pr_err("hantrodec: module not inserted\n");
+ unregister_chrdev(hantrodec_major, "hantrodec");
+ return result;
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : hantrodec_cleanup
+ *Description : clean up
+ *
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+static void hantrodec_cleanup(int id)
+{
+ hantrodec_t *dev = &hantrodec_data[id];
+ //int n = 0;
+ /* reset hardware */
+ ResetAsic(dev);
+
+ /* free the IRQ */
+ //for (n = 0; n < dev->cores; n++) {
+ if (dev->irq != -1)
+ free_irq(dev->irq, (void *) dev);
+ //}
+
+ ReleaseIO(id);
+
+ //unregister_chrdev(hantrodec_major, "hantrodec");
+
+ PDEBUG("hantrodec: module removed\n");
+
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : CheckHwId
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+static int CheckHwId(hantrodec_t *dev)
+{
+ long int hwid;
+ //int i;
+ size_t num_hw = sizeof(DecHwId) / sizeof(*DecHwId);
+
+ int found = 0;
+
+ //for (i = 0; i < cores; i++) {
+ if (dev->hwregs != NULL) {
+ hwid = readl(dev->hwregs);
+ pr_debug("hantrodec: Core %d HW ID=0x%16lx\n", dev->core_id, hwid);
+ hwid = (hwid >> 16) & 0xFFFF; /* product version only */
+
+ while (num_hw--) {
+ if (hwid == DecHwId[num_hw]) {
+ pr_debug("hantrodec: Supported HW found at 0x%16lx\n",
+ multicorebase[dev->core_id]);
+ found++;
+ dev->hw_id = hwid;
+ break;
+ }
+ }
+ if (!found) {
+ pr_err("hantrodec: Unknown HW found at 0x%16lx\n", multicorebase[dev->core_id]);
+ return 0;
+ }
+ found = 0;
+ num_hw = sizeof(DecHwId) / sizeof(*DecHwId);
+ }
+ //}
+
+ return 1;
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : ReserveIO
+ *Description : IO reserve
+ *
+ *Return type : int
+ *---------------------------------------------------------------------------
+ */
+static int ReserveIO(int i)
+{
+ //int i;
+
+ //for (i = 0; i < HXDEC_MAX_CORES; i++) {
+ if (multicorebase[i] != -1) {
+ if (!request_mem_region(multicorebase[i], hantrodec_data[i].iosize, "hantrodec0")) {
+ pr_err("hantrodec: failed to reserve HW regs, %d, base: 0x%lX, %d\n", i, multicorebase[i], hantrodec_data[i].iosize);
+ return -EBUSY;
+ }
+
+ hantrodec_data[i].hwregs = (volatile u8 *) ioremap_nocache(multicorebase[i],
+ hantrodec_data[i].iosize);
+
+ if (hantrodec_data[i].hwregs == NULL) {
+ pr_err("hantrodec: failed to ioremap HW regs\n");
+ ReleaseIO(i);
+ return -EBUSY;
+ }
+ //hantrodec_data.cores++;
+ }
+ //}
+
+ /* check for correct HW */
+ if (!CheckHwId(&hantrodec_data[i])) {
+ ReleaseIO(i);
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : releaseIO
+ *Description : release
+ *
+ *Return type : void
+ *---------------------------------------------------------------------------
+ */
+static void ReleaseIO(int i)
+{
+ //int i;
+
+ //for (i = 0; i < hantrodec_data.cores; i++) {
+ if (hantrodec_data[i].hwregs)
+ iounmap((void *) hantrodec_data[i].hwregs);
+ release_mem_region(multicorebase[i], hantrodec_data[i].iosize);
+ //}
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : hantrodec_isr
+ *Description : interrupt handler
+ *
+ *Return type : irqreturn_t
+ *---------------------------------------------------------------------------
+ */
+static irqreturn_t hantrodec_isr(int irq, void *dev_id)
+{
+ unsigned long flags;
+ unsigned int handled = 0;
+ //int i;
+ volatile u8 *hwregs;
+
+ hantrodec_t *dev = (hantrodec_t *) dev_id;
+ u32 irq_status_dec;
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ //for (i = 0; i < cores; i++) {
+ hwregs = dev->hwregs;
+
+ /* interrupt status register read */
+ irq_status_dec = ioread32(hwregs + HANTRODEC_IRQ_STAT_DEC_OFF);
+
+ if (irq_status_dec & HANTRODEC_DEC_IRQ) {
+ /* clear dec IRQ */
+ irq_status_dec &= (~HANTRODEC_DEC_IRQ);
+ iowrite32(irq_status_dec, hwregs + HANTRODEC_IRQ_STAT_DEC_OFF);
+
+ PDEBUG("decoder IRQ received! Core %d\n", dev->core_id);
+
+ atomic_inc(&hantrodec_data[dev->core_id].irq_rx);
+
+ dec_irq |= (1 << dev->core_id);
+
+ //wake_up_interruptible_all(&dec_wait_queue);
+ wake_up_all(&dec_wait_queue);
+ handled++;
+ }
+ //}
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ if (!handled)
+ pr_info("IRQ received, but not hantrodec's!\n");
+
+ (void)hwregs;
+ return IRQ_RETVAL(handled);
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : ResetAsic
+ *Description : reset asic
+ *
+ *Return type :
+ *---------------------------------------------------------------------------
+ */
+static void ResetAsic(hantrodec_t *dev)
+{
+ int i;
+ u32 status;
+
+ //for (j = 0; j < dev->cores; j++) {
+ status = ioread32(dev->hwregs + HANTRODEC_IRQ_STAT_DEC_OFF);
+
+ if (status & HANTRODEC_DEC_E) {
+ /* abort with IRQ disabled */
+ status = HANTRODEC_DEC_ABORT | HANTRODEC_DEC_IRQ_DISABLE;
+ iowrite32(status, dev->hwregs + HANTRODEC_IRQ_STAT_DEC_OFF);
+ }
+
+ if (IS_G1(dev->hw_id))
+ /* reset PP */
+ iowrite32(0, dev->hwregs + HANTRO_IRQ_STAT_PP_OFF);
+
+ for (i = 4; i < dev->iosize; i += 4)
+ iowrite32(0, dev->hwregs + i);
+ //}
+}
+
+/*---------------------------------------------------------------------------
+ *Function name : dump_regs
+ *Description : Dump registers
+ *
+ *Return type :
+ *---------------------------------------------------------------------------
+ */
+#ifdef HANTRODEC_DEBUG
+static void dump_regs(hantrodec_t *dev)
+{
+ int i, c;
+
+ PDEBUG("Reg Dump Start\n");
+ for (c = 0; c < dev->cores; c++) {
+ for (i = 0; i < dev->iosize[c]; i += 4*4) {
+ PDEBUG("\toffset %04X: %08X %08X %08X %08X\n", i,
+ ioread32(dev->hwregs[c] + i),
+ ioread32(dev->hwregs[c] + i + 4),
+ ioread32(dev->hwregs[c] + i + 8),
+ ioread32(dev->hwregs[c] + i + 12));
+ }
+ }
+ PDEBUG("Reg Dump End\n");
+}
+#endif
+
+static int hantro_dev_probe(struct platform_device *pdev)
+{
+ int err = 0;
+ struct resource *res;
+ unsigned long reg_base;
+ int id;
+
+ id = hantro_device_id(&pdev->dev);
+ if (id < 0)
+ return -ENODEV;
+
+ hantrodec_data[id].dev = &pdev->dev;
+ hantrodec_data[id].core_id = id;
+ platform_set_drvdata(pdev, &hantrodec_data[id]);
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs_hantro");
+ if (!res) {
+ pr_err("hantro: unable to get vpu base addr\n");
+ return -ENODEV;
+ }
+ reg_base = res->start;
+ if ((ulong)reg_base != multicorebase[id]) {
+ pr_err("hantrodec %d: regbase(0x%lX) not equal to expected value(0x%lX)\n", id, reg_base, multicorebase[id]);
+ return -ENODEV;
+ }
+
+ hantrodec_data[id].clk.dec = clk_get(&pdev->dev, "clk_hantro");
+ hantrodec_data[id].clk.bus = clk_get(&pdev->dev, "clk_hantro_bus");
+ if (IS_ERR(hantrodec_data[id].clk.dec) || IS_ERR(hantrodec_data[id].clk.bus)) {
+ pr_err("hantro: get clock failed\n");
+ return -ENODEV;
+ }
+ pr_debug("hantro: dec, bus clock: 0x%lX, 0x%lX\n", clk_get_rate(hantrodec_data[id].clk.dec),
+ clk_get_rate(hantrodec_data[id].clk.bus));
+
+ hantro_clk_enable(&hantrodec_data[id].clk);
+ pm_runtime_enable(&pdev->dev);
+ pm_runtime_get_sync(&pdev->dev);
+ hantro_ctrlblk_reset(&hantrodec_data[id]);
+
+ err = hantrodec_init(pdev, id);
+ if (err != 0) {
+ pr_err("hantro: hantrodec_init failed\n");
+ goto error;
+ }
+
+#ifdef CONFIG_DEVICE_THERMAL_HANTRO
+ HANTRO_REG_THERMAL_NOTIFIER(&hantro_thermal_hot_notifier);
+ thermal_event = 0;
+ hantro_dynamic_clock = 0;
+ hantrodec_data[id].thermal_cur = 0;
+#endif
+ hantrodec_data[id].timeout = 0;
+ mutex_init(&hantrodec_data[id].dev_mutex);
+ instance_mask = 0;
+
+ goto out;
+
+error:
+ pr_err("hantro probe failed\n");
+out:
+ pm_runtime_put_sync(&pdev->dev);
+ hantro_clk_disable(&hantrodec_data[id].clk);
+ return err;
+}
+
+static int hantro_dev_remove(struct platform_device *pdev)
+{
+ hantrodec_t *dev = platform_get_drvdata(pdev);
+
+ hantro_clk_enable(&dev->clk);
+ pm_runtime_get_sync(&pdev->dev);
+
+ hantrodec_cleanup(dev->core_id);
+#if 1 // FIXME: need to identify core id
+ if (hantrodec_major > 0) {
+ device_destroy(hantro_class, MKDEV(hantrodec_major, 0));
+ class_destroy(hantro_class);
+ unregister_chrdev(hantrodec_major, "hantrodec");
+ hantrodec_major = 0;
+ }
+#endif
+ pm_runtime_put_sync(&pdev->dev);
+ pm_runtime_disable(&pdev->dev);
+ hantro_clk_disable(&dev->clk);
+
+#ifdef CONFIG_DEVICE_THERMAL_HANTRO
+ HANTRO_UNREG_THERMAL_NOTIFIER(&hantro_thermal_hot_notifier);
+#endif
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int __maybe_unused hantro_suspend(struct device *dev)
+{
+ pm_runtime_put_sync_suspend(dev); //power off
+ return 0;
+}
+static int __maybe_unused hantro_resume(struct device *dev)
+{
+ hantrodec_t *hantrodev = dev_get_drvdata(dev);
+
+ hantro_power_on_disirq(hantrodev);
+ hantro_ctrlblk_reset(hantrodev);
+ return 0;
+}
+static int hantro_runtime_suspend(struct device *dev)
+{
+ release_bus_freq(BUS_FREQ_HIGH);
+ return 0;
+}
+
+static int hantro_runtime_resume(struct device *dev)
+{
+ hantrodec_t *hantrodev = dev_get_drvdata(dev);
+
+ request_bus_freq(BUS_FREQ_HIGH);
+ hantro_ctrlblk_reset(hantrodev);
+ return 0;
+}
+
+static const struct dev_pm_ops hantro_pm_ops = {
+ SET_RUNTIME_PM_OPS(hantro_runtime_suspend, hantro_runtime_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(hantro_suspend, hantro_resume)
+};
+#endif //CONFIG_PM
+
+static const struct of_device_id hantro_of_match[] = {
+ { .compatible = "nxp,imx8mm-hantro", },
+ {/* sentinel */}
+};
+MODULE_DEVICE_TABLE(of, hantro_of_match);
+
+
+static struct platform_driver mxchantro_driver = {
+ .driver = {
+ .name = "mxc_hantro_845",
+ .of_match_table = hantro_of_match,
+#ifdef CONFIG_PM
+ .pm = &hantro_pm_ops,
+#endif
+ },
+ .probe = hantro_dev_probe,
+ .remove = hantro_dev_remove,
+};
+
+static int __init hantro_init(void)
+{
+ int ret = platform_driver_register(&mxchantro_driver);
+
+ return ret;
+}
+
+static void __exit hantro_exit(void)
+{
+ //clk_put(hantro_clk);
+ platform_driver_unregister(&mxchantro_driver);
+}
+
+module_init(hantro_init);
+module_exit(hantro_exit);
+
+/* module description */
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Google Finland Oy");
+MODULE_DESCRIPTION("Driver module for Hantro Decoder/Post-Processor");
+
diff --git a/drivers/mxc/hantro_845_h1/Kconfig b/drivers/mxc/hantro_845_h1/Kconfig
new file mode 100755
index 000000000000..72936da4ef4a
--- /dev/null
+++ b/drivers/mxc/hantro_845_h1/Kconfig
@@ -0,0 +1,14 @@
+#
+# Codec configuration
+#
+
+menu "MXC HANTRO(Video Processing Unit) encoder support"
+ depends on ARCH_MXC
+
+config MXC_HANTRO_845_H1
+ tristate "Support for MXC HANTRO(Video Processing Unit) encoder"
+ default y
+ ---help---
+ VPU codec device.
+
+endmenu
diff --git a/drivers/mxc/hantro_845_h1/Makefile b/drivers/mxc/hantro_845_h1/Makefile
new file mode 100755
index 000000000000..acb87202c5b0
--- /dev/null
+++ b/drivers/mxc/hantro_845_h1/Makefile
@@ -0,0 +1,8 @@
+#
+# Makefile for the VPU drivers.
+#
+
+#ccflags-y += -I$(PWD)
+
+obj-$(CONFIG_MXC_HANTRO_845_H1) += hx280enc.o
+
diff --git a/drivers/mxc/hantro_845_h1/hx280enc.c b/drivers/mxc/hantro_845_h1/hx280enc.c
new file mode 100755
index 000000000000..3859e8233a6d
--- /dev/null
+++ b/drivers/mxc/hantro_845_h1/hx280enc.c
@@ -0,0 +1,920 @@
+/*
+ * Encoder device driver (kernel module)
+ *
+ * Copyright (c) 2013-2019, VeriSilicon Inc.
+ * Copyright (C) 2012 Google Finland Oy.
+ *
+ * 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.
+ *
+--------------------------------------------------------------------------------
+--
+-- Abstract : 6280/7280/8270/8290/H1 Encoder device driver (kernel module)
+--
+------------------------------------------------------------------------------*/
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+/* needed for __init,__exit directives */
+#include <linux/init.h>
+/* needed for remap_page_range
+ SetPageReserved
+ ClearPageReserved
+*/
+#include <linux/mm.h>
+/* obviously, for kmalloc */
+#include <linux/slab.h>
+/* for struct file_operations, register_chrdev() */
+#include <linux/fs.h>
+/* standard error codes */
+#include <linux/errno.h>
+
+#include <linux/moduleparam.h>
+/* request_irq(), free_irq() */
+#include <linux/interrupt.h>
+#include <linux/sched.h>
+
+/* needed for virt_to_phys() */
+#include <linux/io.h>
+#include <linux/pci.h>
+#include <linux/uaccess.h>
+#include <linux/ioport.h>
+
+#include <asm/irq.h>
+#include <linux/of_irq.h>
+#include <linux/version.h>
+
+/* our own stuff */
+#include <linux/hx280enc.h>
+
+#ifndef VSI
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/clk.h>
+//static int hantro_h1_major = -1; /* dynamic allocation */
+static struct class *hantro_h1_class;
+#define DEVICE_NAME "mxc_hantro_h1"
+static struct device *hantro_h1_dev;
+static struct clk *hantro_clk_h1;
+static struct clk *hantro_clk_h1_bus;
+#define IRQF_DISABLED 0x0
+#endif
+
+#include <linux/delay.h>
+
+/* module description */
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Google Finland Oy");
+MODULE_DESCRIPTION("Hantro 6280/7280/8270/8290/H1 Encoder driver");
+
+/* this is ARM Integrator specific stuff */
+#ifndef VSI
+#define INTEGRATOR_LOGIC_MODULE0_BASE 0x38320000
+#else
+#define INTEGRATOR_LOGIC_MODULE0_BASE 0xC0000000
+#endif
+#define BLK_CTL_BASE 0x38330000 //0x38320000
+/*
+#define INTEGRATOR_LOGIC_MODULE1_BASE 0xD0000000
+#define INTEGRATOR_LOGIC_MODULE2_BASE 0xE0000000
+#define INTEGRATOR_LOGIC_MODULE3_BASE 0xF0000000
+*/
+
+#define VP_PB_INT_LT 30
+/*
+#define INT_EXPINT1 10
+#define INT_EXPINT2 11
+#define INT_EXPINT3 12
+*/
+/* these could be module params in the future */
+
+#define ENC_IO_BASE INTEGRATOR_LOGIC_MODULE0_BASE
+#define ENC_IO_SIZE (500 * 4) /* bytes */
+
+#define ENC_HW_ID1 0x62800000
+#define ENC_HW_ID2 0x72800000
+#define ENC_HW_ID3 0x82700000
+#define ENC_HW_ID4 0x82900000
+#define ENC_HW_ID5 0x48310000
+
+#define HX280ENC_BUF_SIZE 0
+
+static unsigned long base_port = INTEGRATOR_LOGIC_MODULE0_BASE;
+static int irq = VP_PB_INT_LT;
+
+/* for critical data access */
+static DEFINE_SPINLOCK(owner_lock);
+/* for irq wait */
+static DECLARE_WAIT_QUEUE_HEAD(enc_wait_queue);
+/* for reserve hw */
+static DECLARE_WAIT_QUEUE_HEAD(enc_hw_queue);
+
+/* module_param(name, type, perm) */
+module_param(base_port, ulong, 0644);
+module_param(irq, int, 0644);
+
+/* and this is our MAJOR; use 0 for dynamic allocation (recommended)*/
+static int hx280enc_major;
+
+/* here's all the must remember stuff */
+typedef struct {
+ u32 hw_id; //hw id to indicate project
+ u32 is_valid; //indicate this core is hantro's core or not
+ u32 is_reserved; //indicate this core is occupied by user or not
+ int pid; //indicate which process is occupying the core
+ u32 irq_received; //indicate this core receives irq
+ u32 irq_status;
+ int irq;
+ unsigned long iobaseaddr;
+ unsigned int iosize;
+
+ volatile u8 *hwregs;
+ struct fasync_struct *async_queue;
+ unsigned int mirror_regs[512];
+ struct device *dev;
+ struct mutex dev_mutex;
+} hx280enc_t;
+
+/* dynamic allocation? */
+static hx280enc_t hx280enc_data;
+
+static int ReserveIO(void);
+static void ReleaseIO(void);
+static void ResetAsic(hx280enc_t *dev);
+
+#ifdef HX280ENC_DEBUG
+static void dump_regs(unsigned long data);
+#endif
+
+/* IRQ handler */
+static irqreturn_t hx280enc_isr(int irq, void *dev_id);
+
+#ifndef VSI
+static int hantro_h1_clk_enable(struct device *dev)
+{
+ clk_prepare(hantro_clk_h1);
+ clk_enable(hantro_clk_h1);
+ clk_prepare(hantro_clk_h1_bus);
+ clk_enable(hantro_clk_h1_bus);
+ return 0;
+}
+
+static int hantro_h1_clk_disable(struct device *dev)
+{
+ if (hantro_clk_h1) {
+ clk_disable(hantro_clk_h1);
+ clk_unprepare(hantro_clk_h1);
+ }
+ if (hantro_clk_h1_bus) {
+ clk_disable(hantro_clk_h1_bus);
+ clk_unprepare(hantro_clk_h1_bus);
+ }
+ return 0;
+}
+
+static int hantro_h1_ctrlblk_reset(struct device *dev)
+{
+ volatile u8 *iobase;
+ u32 val;
+
+ //config H1
+ hantro_h1_clk_enable(dev);
+ iobase = (volatile u8 *)ioremap_nocache(BLK_CTL_BASE, 0x10000);
+
+ val = ioread32(iobase);
+ val &= (~0x4);
+ iowrite32(val, iobase); // assert soft reset
+ udelay(2);
+
+ val = ioread32(iobase);
+ val |= 0x4;
+ iowrite32(val, iobase); // release soft reset
+
+ val = ioread32(iobase+0x4);
+ val |= 0x4;
+ iowrite32(val, iobase + 0x4); // enable clock
+
+ iowrite32(0xFFFFFFFF, iobase + 0x14); // H1 fuse encoder enable
+ iounmap(iobase);
+ hantro_h1_clk_disable(dev);
+ return 0;
+}
+
+static int hantro_h1_power_on_disirq(hx280enc_t *hx280enc)
+{
+ //spin_lock_irq(&owner_lock);
+ mutex_lock(&hx280enc->dev_mutex);
+ disable_irq(hx280enc->irq);
+ pm_runtime_get_sync(hx280enc->dev);
+ enable_irq(hx280enc->irq);
+ mutex_unlock(&hx280enc->dev_mutex);
+ //spin_unlock_irq(&owner_lock);
+ return 0;
+}
+
+#endif
+
+/* the device's mmap method. The VFS has kindly prepared the process's
+ * vm_area_struct for us, so we examine this to see what was requested.
+ */
+
+static int hx280enc_mmap(struct file *filp, struct vm_area_struct *vm)
+{
+#ifdef VSI
+ int result = -EINVAL;
+
+ result = -EINVAL;
+ vma->vm_ops = &hx280enc_vm_ops;
+ return result;
+#else
+ if (vm->vm_pgoff == (hx280enc_data.iobaseaddr >> PAGE_SHIFT)) {
+ vm->vm_flags |= VM_IO;
+ vm->vm_page_prot = pgprot_noncached(vm->vm_page_prot);
+ PDEBUG("hx280enc mmap: size=0x%lX, page off=0x%lX\n", (vm->vm_end - vm->vm_start), vm->vm_pgoff);
+ return remap_pfn_range(vm, vm->vm_start, vm->vm_pgoff, vm->vm_end - vm->vm_start,
+ vm->vm_page_prot) ? -EAGAIN : 0;
+ } else {
+ pr_err("invalid map offset :0x%lX\n", vm->vm_pgoff);
+ return -EINVAL;
+ }
+#endif
+}
+
+static int CheckEncIrq(hx280enc_t *dev)
+{
+ unsigned long flags;
+ int rdy = 0;
+
+ spin_lock_irqsave(&owner_lock, flags);
+
+ if (dev->irq_received) {
+ /* reset the wait condition(s) */
+ PDEBUG("check irq ready\n");
+ dev->irq_received = 0;
+ rdy = 1;
+ }
+
+ spin_unlock_irqrestore(&owner_lock, flags);
+ //printk("rdy=%d\n",rdy);
+
+ return rdy;
+}
+
+unsigned int WaitEncReady(hx280enc_t *dev)
+{
+ u32 irq_status, is_write1_clr;
+ int i;
+ long ret;
+
+ PDEBUG("%s\n", __func__);
+ ret = wait_event_timeout(enc_wait_queue, CheckEncIrq(dev), msecs_to_jiffies(200));
+ if (ret == 0) {
+ u32 reg14 = readl(dev->hwregs + 14*4);
+
+ pr_err("%s: wait_event_timeout() timeout !\n", __func__);
+ writel(reg14 & (~1), dev->hwregs + 14*4);
+ }
+
+ /* read register to mirror */
+ for (i = 0; i < dev->iosize; i += 4)
+ dev->mirror_regs[i/4] = readl(dev->hwregs + i);
+
+ /* clear the status bits */
+ is_write1_clr = (dev->mirror_regs[0x4a0/4] & 0x00800000);
+ irq_status = dev->mirror_regs[1];
+ if (is_write1_clr)
+ writel(irq_status, dev->hwregs + 0x04);
+ else
+ writel(irq_status & (~0xf7d), dev->hwregs + 0x04);
+
+ return 0;
+}
+
+int CheckCoreOccupation(hx280enc_t *dev)
+{
+ int ret = 0;
+ unsigned long flags;
+
+ spin_lock_irqsave(&owner_lock, flags);
+ if (!dev->is_reserved) {
+ dev->is_reserved = 1;
+ dev->pid = current->pid;
+ ret = 1;
+ PDEBUG("CheckCoreOccupation pid=%d\n", dev->pid);
+ }
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ return ret;
+}
+
+int GetWorkableCore(hx280enc_t *dev)
+{
+ int ret = 0;
+
+ PDEBUG("GetWorkableCore\n");
+
+ if (dev->is_valid && CheckCoreOccupation(dev))
+ ret = 1;
+
+ return ret;
+}
+
+long ReserveEncoder(hx280enc_t *dev)
+{
+ /* lock a core that has specified core id*/
+ if (wait_event_interruptible(enc_hw_queue, GetWorkableCore(dev) != 0))
+ return -ERESTARTSYS;
+
+ return 0;
+}
+
+void ReleaseEncoder(hx280enc_t *dev)
+{
+ unsigned long flags;
+
+ PDEBUG("ReleaseEncoder\n");
+
+ spin_lock_irqsave(&owner_lock, flags);
+ PDEBUG("relase reseve by pid=%d with current->pid=%d\n", dev->pid, current->pid);
+ if (dev->is_reserved && dev->pid == current->pid) {
+ dev->pid = -1;
+ dev->is_reserved = 0;
+ }
+
+ dev->irq_received = 0;
+ dev->irq_status = 0;
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ wake_up_interruptible_all(&enc_hw_queue);
+}
+
+static long EncRefreshRegs(hx280enc_t *dev, unsigned int *regs)
+{
+ long ret;
+
+ ret = copy_to_user(regs, dev->mirror_regs, dev->iosize);
+ if (ret) {
+ PDEBUG("%s: copy_to_user failed, returned %li\n", __func__, ret);
+ return -EFAULT;
+ }
+ return 0;
+}
+
+
+static long hx280enc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+ int err = 0;
+
+ PDEBUG("ioctl cmd 0x%X\n", cmd);
+ /*
+ * extract the type and number bitfields, and don't encode
+ * wrong cmds: return ENOTTY (inappropriate ioctl) before access_ok()
+ */
+ if (_IOC_TYPE(cmd) != HX280ENC_IOC_MAGIC)
+ return -ENOTTY;
+ if (_IOC_NR(cmd) > HX280ENC_IOC_MAXNR)
+ return -ENOTTY;
+
+ /*
+ * the direction is a bitmask, and VERIFY_WRITE catches R/W
+ * transfers. `Type' is user-oriented, while
+ * access_ok is kernel-oriented, so the concept of "read" and
+ * "write" is reversed
+ */
+ if (_IOC_DIR(cmd) & _IOC_READ)
+ err = !access_ok((void *) arg, _IOC_SIZE(cmd));
+ else if (_IOC_DIR(cmd) & _IOC_WRITE)
+ err = !access_ok((void *) arg, _IOC_SIZE(cmd));
+ if (err)
+ return -EFAULT;
+
+ switch (_IOC_NR(cmd)) {
+ case _IOC_NR(HX280ENC_IOCGHWOFFSET):
+ __put_user(hx280enc_data.iobaseaddr, (unsigned long *) arg);
+ break;
+ case _IOC_NR(HX280ENC_IOCGHWIOSIZE):
+ __put_user(hx280enc_data.iosize, (unsigned int *) arg);
+ break;
+ case _IOC_NR(HX280ENC_IOCH_ENC_RESERVE): {
+ int ret;
+
+ PDEBUG("Reserve ENC Cores\n");
+ ret = ReserveEncoder(&hx280enc_data);
+ return ret;
+ }
+ case _IOC_NR(HX280ENC_IOCH_ENC_RELEASE):
+ PDEBUG("Release ENC Core\n");
+ ReleaseEncoder(&hx280enc_data);
+ break;
+ case _IOC_NR(HX280ENC_IOCG_CORE_WAIT): {
+ unsigned int *regs = (unsigned int *)arg;
+ unsigned int ret1, ret2;
+
+ ret1 = WaitEncReady(&hx280enc_data);
+ ret2 = EncRefreshRegs(&hx280enc_data, regs);
+ if (ret2)
+ return ret2;
+ if (ret1)
+ return ret1;
+ break;
+ }
+ }
+ return 0;
+}
+
+static int hx280enc_open(struct inode *inode, struct file *filp)
+{
+ int result = 0;
+ hx280enc_t *dev = &hx280enc_data;
+
+ filp->private_data = (void *) dev;
+
+#ifndef VSI
+ hantro_h1_clk_enable(dev->dev);
+ hantro_h1_power_on_disirq(dev);
+#endif
+
+ PDEBUG("dev opened\n");
+ return result;
+}
+
+static int hx280enc_release(struct inode *inode, struct file *filp)
+{
+ hx280enc_t *dev = (hx280enc_t *) filp->private_data;
+ unsigned long flags;
+#ifdef HX280ENC_DEBUG
+ dump_regs((unsigned long) dev); /* dump the regs */
+#endif
+
+ PDEBUG("dev closed\n");
+ spin_lock_irqsave(&owner_lock, flags);
+ if (dev->is_reserved == 1 && dev->pid == current->pid) {
+ dev->pid = -1;
+ dev->is_reserved = 0;
+ dev->irq_received = 0;
+ dev->irq_status = 0;
+ PDEBUG("release reserved core\n");
+ }
+ spin_unlock_irqrestore(&owner_lock, flags);
+ wake_up_interruptible_all(&enc_hw_queue);
+
+#ifndef VSI
+ pm_runtime_put_sync(hantro_h1_dev);
+ hantro_h1_clk_disable(hantro_h1_dev);
+#endif
+
+ return 0;
+}
+
+#ifdef CONFIG_COMPAT
+static long hx280enc_ioctl32(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+ long err = 0;
+#define HX280ENC_IOCTL32(err, filp, cmd, arg) { \
+ mm_segment_t old_fs = get_fs(); \
+ set_fs(KERNEL_DS); \
+ err = hx280enc_ioctl(filp, cmd, arg); \
+ if (err) \
+ return err; \
+ set_fs(old_fs); \
+}
+
+union {
+ unsigned long kux;
+ unsigned int kui;
+} karg;
+ void __user *up = compat_ptr(arg);
+
+ switch (_IOC_NR(cmd)) {
+ case _IOC_NR(HX280ENC_IOCGHWOFFSET):
+ err = get_user(karg.kux, (s32 __user *)up);
+ if (err)
+ return err;
+ HX280ENC_IOCTL32(err, filp, cmd, (unsigned long)&karg);
+ err = put_user(((s32)karg.kux), (s32 __user *)up);
+ break;
+ case _IOC_NR(HX280ENC_IOCGHWIOSIZE):
+ err = get_user(karg.kui, (s32 __user *)up);
+ if (err)
+ return err;
+ HX280ENC_IOCTL32(err, filp, cmd, (unsigned long)&karg);
+ err = put_user(((s32)karg.kui), (s32 __user *)up);
+ break;
+ case _IOC_NR(HX280ENC_IOCH_ENC_RESERVE): {
+ int ret;
+ PDEBUG("Reserve ENC Cores\n");
+ ret = ReserveEncoder(&hx280enc_data);
+ return ret;
+ }
+ case _IOC_NR(HX280ENC_IOCH_ENC_RELEASE): {
+ PDEBUG("Release ENC Core\n");
+ ReleaseEncoder(&hx280enc_data);
+ break;
+ }
+ case _IOC_NR(HX280ENC_IOCG_CORE_WAIT): {
+ HX280ENC_IOCTL32(err, filp, cmd, (unsigned long)up);
+ break;
+ }
+ }
+ return 0;
+}
+#endif
+
+/* VFS methods */
+static struct file_operations hx280enc_fops = {
+ .owner = THIS_MODULE,
+ .open = hx280enc_open,
+ .release = hx280enc_release,
+ .unlocked_ioctl = hx280enc_ioctl,
+ .fasync = NULL,
+ .mmap = hx280enc_mmap,
+#ifdef CONFIG_COMPAT
+ .compat_ioctl = hx280enc_ioctl32,
+#endif
+};
+
+#ifndef VSI
+static int hx280enc_init(void)
+#else
+static int __init hx280enc_init(void)
+#endif
+{
+ int result;
+
+ PDEBUG(KERN_INFO "hx280enc: module init - base_port=0x%08lx irq=%i\n",
+ base_port, irq);
+
+ hx280enc_data.iobaseaddr = base_port;
+ hx280enc_data.iosize = ENC_IO_SIZE;
+ hx280enc_data.irq = irq;
+ hx280enc_data.async_queue = NULL;
+ hx280enc_data.hwregs = NULL;
+
+ result = register_chrdev(hx280enc_major, "hx280enc", &hx280enc_fops);
+ if (result < 0) {
+ PDEBUG(KERN_INFO "hx280enc: unable to get major <%d>\n", hx280enc_major);
+ return result;
+ } else if (result != 0) /* this is for dynamic major */
+ hx280enc_major = result;
+
+ result = ReserveIO();
+ if (result < 0)
+ goto err;
+
+ ResetAsic(&hx280enc_data); /* reset hardware */
+
+ /* get the IRQ line */
+ if (irq != -1) {
+ result = request_irq(irq, hx280enc_isr,
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
+ SA_INTERRUPT | SA_SHIRQ,
+#else
+ //IRQF_DISABLED | IRQF_SHARED,
+ IRQF_SHARED,
+#endif
+ "hx280enc", (void *) &hx280enc_data);
+ if (result == -EINVAL) {
+ PDEBUG(KERN_ERR "hx280enc: Bad irq number or handler\n");
+ ReleaseIO();
+ goto err;
+ } else if (result == -EBUSY) {
+ PDEBUG(KERN_ERR "hx280enc: IRQ <%d> busy, change your config\n",
+ hx280enc_data.irq);
+ ReleaseIO();
+ goto err;
+ }
+ } else
+ PDEBUG(KERN_INFO "hx280enc: IRQ not in use!\n");
+ irq_set_status_flags(irq, IRQ_DISABLE_UNLAZY);
+
+ pr_info("hx280enc: module inserted. Major <%d>\n", hx280enc_major);
+ return 0;
+
+err:
+ unregister_chrdev(hx280enc_major, "hx280enc");
+ PDEBUG(KERN_ERR "hx280enc: module not inserted\n");
+ return result;
+}
+
+#ifndef VSI
+static void hx280enc_cleanup(void)
+#else
+static void __exit hx280enc_cleanup(void)
+#endif
+{
+ writel(0, hx280enc_data.hwregs + 0x38); /* disable HW */
+ writel(0, hx280enc_data.hwregs + 0x04); /* clear enc IRQ */
+
+ /* free the encoder IRQ */
+ if (hx280enc_data.irq != -1)
+ free_irq(hx280enc_data.irq, (void *) &hx280enc_data);
+
+ ReleaseIO();
+ unregister_chrdev(hx280enc_major, "hx280enc");
+
+ PDEBUG(KERN_INFO "hx280enc: module removed\n");
+}
+
+#ifdef VSI
+module_init(hx280enc_init);
+module_exit(hx280enc_cleanup);
+#endif
+static int ReserveIO(void)
+{
+ long int hwid;
+
+ if (!request_mem_region(hx280enc_data.iobaseaddr, hx280enc_data.iosize, "hx280enc")) {
+ PDEBUG(KERN_INFO "hx280enc: failed to reserve HW regs\n");
+ return -EBUSY;
+ }
+ hx280enc_data.hwregs = (volatile u8 *) ioremap_nocache(hx280enc_data.iobaseaddr, hx280enc_data.iosize);
+ if (hx280enc_data.hwregs == NULL) {
+ PDEBUG(KERN_INFO "hx280enc: failed to ioremap HW regs\n");
+ ReleaseIO();
+ return -EBUSY;
+ }
+
+ hwid = readl(hx280enc_data.hwregs);
+
+ /* check for encoder HW ID */
+ if ((((hwid >> 16) & 0xFFFF) != ((ENC_HW_ID1 >> 16) & 0xFFFF)) &&
+ (((hwid >> 16) & 0xFFFF) != ((ENC_HW_ID2 >> 16) & 0xFFFF)) &&
+ (((hwid >> 16) & 0xFFFF) != ((ENC_HW_ID3 >> 16) & 0xFFFF)) &&
+ (((hwid >> 16) & 0xFFFF) != ((ENC_HW_ID4 >> 16) & 0xFFFF)) &&
+ (((hwid >> 16) & 0xFFFF) != ((ENC_HW_ID5 >> 16) & 0xFFFF))) {
+ PDEBUG(KERN_ERR "hx280enc: HW not found at 0x%08lx\n", hx280enc_data.iobaseaddr);
+#ifdef HX280ENC_DEBUG
+ dump_regs((unsigned long) &hx280enc_data);
+#endif
+ ReleaseIO();
+ return -EBUSY;
+ }
+
+ hx280enc_data.hw_id = hwid;
+ hx280enc_data.is_valid = 1;
+
+ PDEBUG(KERN_INFO "hx280enc: HW at base <0x%08lx> with ID <0x%08lx>\n", hx280enc_data.iobaseaddr, hwid);
+ return 0;
+}
+
+static void ReleaseIO(void)
+{
+ if (hx280enc_data.is_valid == 0)
+ return;
+ if (hx280enc_data.hwregs)
+ iounmap((void *) hx280enc_data.hwregs);
+ release_mem_region(hx280enc_data.iobaseaddr, hx280enc_data.iosize);
+}
+
+irqreturn_t hx280enc_isr(int irq, void *dev_id)
+{
+ hx280enc_t *dev = (hx280enc_t *) dev_id;
+ u32 irq_status;
+ unsigned long flags;
+ u32 is_write1_clr;
+
+ spin_lock_irqsave(&owner_lock, flags);
+ if (!dev->is_reserved) {
+ spin_unlock_irqrestore(&owner_lock, flags);
+ return IRQ_HANDLED;
+ }
+ spin_unlock_irqrestore(&owner_lock, flags);
+ irq_status = readl(dev->hwregs + 0x04);
+
+ /* BASE_HWFuse2 = 0x4a0; HWCFGIrqClearSupport = 0x00800000 */
+ is_write1_clr = (readl(dev->hwregs + 0x4a0) & 0x00800000);
+ if (irq_status & 0x01) {
+ /* clear enc IRQ and slice ready interrupt bit */
+ if (is_write1_clr)
+ writel(irq_status & (0x101), dev->hwregs + 0x04);
+ else
+ writel(irq_status & (~0x101), dev->hwregs + 0x04);
+
+ /* Handle slice ready interrupts. The reference implementation
+ * doesn't signal slice ready interrupts to EWL.
+ * The EWL will poll the slices ready register value. */
+ if ((irq_status & 0x1FE) == 0x100) {
+ PDEBUG("Slice ready IRQ handled!\n");
+ return IRQ_HANDLED;
+ }
+
+ spin_lock_irqsave(&owner_lock, flags);
+ dev->irq_received = 1;
+ dev->irq_status = irq_status & (~0x01);
+ spin_unlock_irqrestore(&owner_lock, flags);
+
+ wake_up_all(&enc_wait_queue);
+
+ PDEBUG("IRQ handled!\n");
+ return IRQ_HANDLED;
+ } else {
+ PDEBUG("IRQ received, but NOT handled!\n");
+ return IRQ_NONE;
+ }
+}
+
+static void ResetAsic(hx280enc_t *dev)
+{
+ int i;
+
+ if (dev->is_valid == 0)
+ return;
+
+ writel(0, dev->hwregs + 0x38);
+
+ for (i = 4; i < dev->iosize; i += 4)
+ writel(0, dev->hwregs + i);
+}
+
+#ifdef HX280ENC_DEBUG
+static void dump_regs(unsigned long data)
+{
+ hx280enc_t *dev = (hx280enc_t *) data;
+ int i;
+
+ PDEBUG("Reg Dump Start\n");
+ for (i = 0; i < dev->iosize; i += 4)
+ PDEBUG("\toffset %02X = %08X\n", i, readl(dev->hwregs + i));
+ PDEBUG("Reg Dump End\n");
+}
+#endif
+
+
+
+#ifndef VSI
+static int hantro_h1_probe(struct platform_device *pdev)
+{
+ int err = 0;
+ struct device *temp_class;
+ struct resource *res;
+ unsigned long reg_base;
+
+ hantro_h1_dev = &pdev->dev;
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs_hantro_h1");
+ if (!res) {
+ pr_err("hantro h1: unable to get vpu base addr\n");
+ return -ENODEV;
+ }
+ reg_base = res->start;
+ if ((ulong)reg_base != base_port) {
+ pr_err("hantro h1: regbase(0x%lX) not equal to expected value(0x%lX)\n", reg_base, base_port);
+ return -ENODEV;
+ }
+
+ irq = platform_get_irq_byname(pdev, "irq_hantro_h1");
+ if (irq < 0) {
+ pr_err("hantro h1: not find valid irq\n");
+ return -ENODEV;
+ }
+
+ hantro_clk_h1 = clk_get(&pdev->dev, "clk_hantro_h1");
+ if (IS_ERR(hantro_clk_h1)) {
+ pr_err("hantro h1: get clock failed, %p\n", hantro_clk_h1);
+ err = -ENXIO;
+ goto error;
+ }
+ hantro_clk_h1_bus = clk_get(&pdev->dev, "clk_hantro_h1_bus");
+ if (IS_ERR(hantro_clk_h1_bus)) {
+ pr_err("hantro h1: get bus clock failed, %p\n", hantro_clk_h1_bus);
+ err = -ENXIO;
+ goto error;
+ }
+
+ PDEBUG("hantro: h1 clock: 0x%lX, 0x%lX\n", clk_get_rate(hantro_clk_h1), clk_get_rate(hantro_clk_h1_bus));
+
+ hantro_h1_clk_enable(&pdev->dev);
+ pm_runtime_enable(&pdev->dev);
+ pm_runtime_get_sync(&pdev->dev);
+ hantro_h1_ctrlblk_reset(&pdev->dev);
+
+ err = hx280enc_init();
+ if (0 != err) {
+ pr_err("hantro h1: init failed\n");
+ goto error;
+ }
+
+ hantro_h1_class = class_create(THIS_MODULE, "mxc_hantro_h1");
+ if (IS_ERR(hantro_h1_class)) {
+ err = PTR_ERR(hantro_h1_class);
+ goto error;
+ }
+ temp_class = device_create(hantro_h1_class, NULL, MKDEV(hx280enc_major, 0), NULL, DEVICE_NAME);
+ if (IS_ERR(temp_class)) {
+ err = PTR_ERR(temp_class);
+ goto err_out_class;
+ }
+ hx280enc_data.dev = &pdev->dev;
+ platform_set_drvdata(pdev, &hx280enc_data);
+ mutex_init(&hx280enc_data.dev_mutex);
+
+ goto out;
+
+err_out_class:
+ device_destroy(hantro_h1_class, MKDEV(hx280enc_major, 0));
+ class_destroy(hantro_h1_class);
+error:
+ pr_err("hantro probe failed\n");
+out:
+ pm_runtime_put_sync(&pdev->dev);
+ hantro_h1_clk_disable(&pdev->dev);
+ return err;
+}
+
+static int hantro_h1_dev_remove(struct platform_device *pdev)
+{
+ hantro_h1_clk_enable(&pdev->dev);
+ pm_runtime_get_sync(&pdev->dev);
+ if (hx280enc_major > 0) {
+ device_destroy(hantro_h1_class, MKDEV(hx280enc_major, 0));
+ class_destroy(hantro_h1_class);
+ hx280enc_cleanup();
+ hx280enc_major = 0;
+ }
+ pm_runtime_put_sync(&pdev->dev);
+ pm_runtime_disable(&pdev->dev);
+ hantro_h1_clk_disable(&pdev->dev);
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int __maybe_unused hantro_h1_suspend(struct device *dev)
+{
+ pm_runtime_put_sync_suspend(dev); //power off
+ return 0;
+}
+static int __maybe_unused hantro_h1_resume(struct device *dev)
+{
+ hx280enc_t *hx280enc = dev_get_drvdata(dev);
+
+ hantro_h1_power_on_disirq(hx280enc);
+ hantro_h1_ctrlblk_reset(dev);
+ return 0;
+}
+static int hantro_h1_runtime_suspend(struct device *dev)
+{
+ //release_bus_freq(BUS_FREQ_HIGH);
+ return 0;
+}
+
+static int hantro_h1_runtime_resume(struct device *dev)
+{
+ //request_bus_freq(BUS_FREQ_HIGH);
+ hantro_h1_ctrlblk_reset(dev);
+ return 0;
+}
+
+static const struct dev_pm_ops hantro_h1_pm_ops = {
+ SET_RUNTIME_PM_OPS(hantro_h1_runtime_suspend, hantro_h1_runtime_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(hantro_h1_suspend, hantro_h1_resume)
+};
+#endif //CONFIG_PM
+
+static const struct of_device_id hantro_h1_of_match[] = {
+ { .compatible = "nxp,imx8mm-hantro-h1", },
+ {/* sentinel */}
+};
+MODULE_DEVICE_TABLE(of, hantro_h1_of_match);
+
+
+static struct platform_driver mxchantro_h1_driver = {
+ .driver = {
+ .name = "mxc_hantro_h1",
+ .of_match_table = hantro_h1_of_match,
+#ifdef CONFIG_PM
+ .pm = &hantro_h1_pm_ops,
+#endif
+ },
+ .probe = hantro_h1_probe,
+ .remove = hantro_h1_dev_remove,
+};
+
+static int __init hantro_h1_init(void)
+{
+ int ret = platform_driver_register(&mxchantro_h1_driver);
+
+ return ret;
+}
+
+static void __exit hantro_h1_exit(void)
+{
+ //clk_put(hantro_clk);
+ platform_driver_unregister(&mxchantro_h1_driver);
+}
+
+module_init(hantro_h1_init);
+module_exit(hantro_h1_exit);
+
+#endif
+
diff --git a/drivers/mxc/hantro_845_h1/hx280enc.h b/drivers/mxc/hantro_845_h1/hx280enc.h
new file mode 100755
index 000000000000..d5b05607b1d4
--- /dev/null
+++ b/drivers/mxc/hantro_845_h1/hx280enc.h
@@ -0,0 +1,82 @@
+ /*****************************************************************************
+ * Encoder device driver (kernel module header)
+ *
+ * Copyright (C) 2012 Google Finland Oy.
+ *
+ * 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.
+ *
+--------------------------------------------------------------------------------
+--
+-- Abstract : 6280/7280/8270/8290/H1 Encoder device driver (kernel module)
+--
+*****************************************************************************/
+#ifndef _UAPI_HX280ENC_H_
+#define _UAPI_HX280ENC_H_
+#include <linux/ioctl.h> /* needed for the _IOW etc stuff used later */
+
+/*
+ * Macros to help debugging
+ */
+
+#undef PDEBUG /* undef it, just in case */
+#ifdef HX280ENC_DEBUG
+# ifdef __KERNEL__
+ /* This one if debugging is on, and kernel space */
+# define PDEBUG(fmt, args...) printk(KERN_INFO "hmp4e: " fmt, ## args)
+# else
+ /* This one for user space */
+# define PDEBUG(fmt, args...) printf(__FILE__ ":%d: " fmt, __LINE__, ## args)
+# endif
+#else
+# define PDEBUG(fmt, args...) /* not debugging: nothing */
+#endif
+
+/*
+ * Ioctl definitions
+ */
+struct mirror_regs {
+ unsigned int regs[512]; /* pointer to user registers */
+};
+
+/* Use 'k' as magic number */
+#define HX280ENC_IOC_MAGIC 'k'
+/*
+ * S means "Set" through a ptr,
+ * T means "Tell" directly with the argument value
+ * G means "Get": reply by setting through a pointer
+ * Q means "Query": response is on the return value
+ * X means "eXchange": G and S atomically
+ * H means "sHift": T and Q atomically
+ */
+ /*
+ * #define HX280ENC_IOCGBUFBUSADDRESS _IOR(HX280ENC_IOC_MAGIC, 1, unsigned long *)
+ * #define HX280ENC_IOCGBUFSIZE _IOR(HX280ENC_IOC_MAGIC, 2, unsigned int *)
+ */
+#define HX280ENC_IOCGHWOFFSET _IOR(HX280ENC_IOC_MAGIC, 3, unsigned long *)
+#define HX280ENC_IOCGHWIOSIZE _IOR(HX280ENC_IOC_MAGIC, 4, unsigned int *)
+#define HX280ENC_IOC_CLI _IO(HX280ENC_IOC_MAGIC, 5)
+#define HX280ENC_IOC_STI _IO(HX280ENC_IOC_MAGIC, 6)
+#define HX280ENC_IOCXVIRT2BUS _IOWR(HX280ENC_IOC_MAGIC, 7, unsigned long *)
+
+#define HX280ENC_IOCHARDRESET _IO(HX280ENC_IOC_MAGIC, 8) /* debugging tool */
+#define HX280ENC_IOCGSRAMOFFSET _IOR(HX280ENC_IOC_MAGIC, 9, unsigned long *)
+#define HX280ENC_IOCGSRAMEIOSIZE _IOR(HX280ENC_IOC_MAGIC, 10, unsigned int *)
+
+#define HX280ENC_IOCH_ENC_RESERVE _IOR(HX280ENC_IOC_MAGIC, 11, unsigned int *)
+#define HX280ENC_IOCH_ENC_RELEASE _IOR(HX280ENC_IOC_MAGIC, 12, unsigned int *)
+#define HX280ENC_IOCG_CORE_WAIT _IOR(HX280ENC_IOC_MAGIC, 13, unsigned int *)
+#define HX280ENC_IOC_MAXNR 30
+
+#endif /* !_UAPI_HX280ENC_H_ */
diff --git a/drivers/mxc/hdmi-cec/Kconfig b/drivers/mxc/hdmi-cec/Kconfig
new file mode 100644
index 000000000000..c0be06854e27
--- /dev/null
+++ b/drivers/mxc/hdmi-cec/Kconfig
@@ -0,0 +1,11 @@
+
+menu "MXC HDMI CEC (Consumer Electronics Control) support"
+
+config MXC_HDMI_CEC
+ tristate "Support for MXC HDMI CEC (Consumer Electronics Control)"
+ depends on MFD_MXC_HDMI
+ depends on FB_MXC_HDMI
+ help
+ The HDMI CEC device implement low level protocol on i.MX6x platforms.
+
+endmenu
diff --git a/drivers/mxc/hdmi-cec/Makefile b/drivers/mxc/hdmi-cec/Makefile
new file mode 100644
index 000000000000..07248b25b033
--- /dev/null
+++ b/drivers/mxc/hdmi-cec/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_MXC_HDMI_CEC) += mxc_hdmi-cec.o
diff --git a/drivers/mxc/hdmi-cec/mxc_hdmi-cec.c b/drivers/mxc/hdmi-cec/mxc_hdmi-cec.c
new file mode 100644
index 000000000000..75c01972e584
--- /dev/null
+++ b/drivers/mxc/hdmi-cec/mxc_hdmi-cec.c
@@ -0,0 +1,665 @@
+/*
+ * Copyright (C) 2012-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file mxc_hdmi-cec.c
+ *
+ * @brief HDMI CEC system initialization and file operation implementation
+ *
+ * @ingroup HDMI
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/fs.h>
+#include <linux/stat.h>
+#include <linux/platform_device.h>
+#include <linux/poll.h>
+#include <linux/wait.h>
+#include <linux/list.h>
+#include <linux/delay.h>
+#include <linux/fsl_devices.h>
+#include <linux/uaccess.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/workqueue.h>
+#include <linux/sizes.h>
+
+#include <linux/console.h>
+#include <linux/types.h>
+#include <linux/mfd/mxc-hdmi-core.h>
+#include <linux/pinctrl/consumer.h>
+
+#include <video/mxc_hdmi.h>
+
+#include "mxc_hdmi-cec.h"
+
+
+#define MAX_MESSAGE_LEN 17
+
+#define MESSAGE_TYPE_RECEIVE_SUCCESS 1
+#define MESSAGE_TYPE_NOACK 2
+#define MESSAGE_TYPE_DISCONNECTED 3
+#define MESSAGE_TYPE_CONNECTED 4
+#define MESSAGE_TYPE_SEND_SUCCESS 5
+
+
+struct hdmi_cec_priv {
+ int receive_error;
+ int send_error;
+ u8 Logical_address;
+ bool cec_state;
+ u8 last_msg[MAX_MESSAGE_LEN];
+ u8 msg_len;
+ u8 latest_cec_stat;
+ spinlock_t irq_lock;
+ struct delayed_work hdmi_cec_work;
+ struct mutex lock;
+};
+
+struct hdmi_cec_event {
+ int event_type;
+ int msg_len;
+ u8 msg[MAX_MESSAGE_LEN];
+ struct list_head list;
+};
+
+static LIST_HEAD(head);
+
+static int hdmi_cec_major;
+static struct class *hdmi_cec_class;
+static struct hdmi_cec_priv hdmi_cec_data;
+static u8 open_count;
+
+static wait_queue_head_t hdmi_cec_queue;
+static irqreturn_t mxc_hdmi_cec_isr(int irq, void *data)
+{
+ struct hdmi_cec_priv *hdmi_cec = data;
+ u8 cec_stat = 0;
+ unsigned long flags;
+
+ spin_lock_irqsave(&hdmi_cec->irq_lock, flags);
+
+ hdmi_writeb(0x7f, HDMI_IH_MUTE_CEC_STAT0);
+
+ cec_stat = hdmi_readb(HDMI_IH_CEC_STAT0);
+ hdmi_writeb(cec_stat, HDMI_IH_CEC_STAT0);
+
+ if ((cec_stat & (HDMI_IH_CEC_STAT0_ERROR_INIT | \
+ HDMI_IH_CEC_STAT0_NACK | HDMI_IH_CEC_STAT0_EOM | \
+ HDMI_IH_CEC_STAT0_DONE)) == 0) {
+ spin_unlock_irqrestore(&hdmi_cec->irq_lock, flags);
+ return IRQ_HANDLED;
+ }
+
+ pr_debug("HDMI CEC interrupt received\n");
+ hdmi_cec->latest_cec_stat = cec_stat;
+
+ schedule_delayed_work(&(hdmi_cec->hdmi_cec_work), msecs_to_jiffies(20));
+
+ spin_unlock_irqrestore(&hdmi_cec->irq_lock, flags);
+
+ return IRQ_HANDLED;
+}
+
+void mxc_hdmi_cec_handle(u16 cec_stat)
+{
+ u8 val = 0, i = 0;
+ struct hdmi_cec_event *event = NULL;
+
+ /* The current transmission is successful (for initiator only). */
+ if (!open_count)
+ return;
+
+ if (cec_stat & HDMI_IH_CEC_STAT0_DONE) {
+
+ event = vmalloc(sizeof(struct hdmi_cec_event));
+ if (NULL == event) {
+ pr_err("%s: Not enough memory!\n", __func__);
+ return;
+ }
+
+ memset(event, 0, sizeof(struct hdmi_cec_event));
+ event->event_type = MESSAGE_TYPE_SEND_SUCCESS;
+
+ mutex_lock(&hdmi_cec_data.lock);
+ list_add_tail(&event->list, &head);
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ wake_up(&hdmi_cec_queue);
+ }
+
+ /* EOM is detected so that the received data is ready
+ * in the receiver data buffer
+ */
+ if (cec_stat & HDMI_IH_CEC_STAT0_EOM) {
+
+ hdmi_writeb(0x02, HDMI_IH_CEC_STAT0);
+
+ event = vmalloc(sizeof(struct hdmi_cec_event));
+ if (NULL == event) {
+ pr_err("%s: Not enough memory!\n", __func__);
+ return;
+ }
+ memset(event, 0, sizeof(struct hdmi_cec_event));
+
+ event->msg_len = hdmi_readb(HDMI_CEC_RX_CNT);
+ if (!event->msg_len) {
+ pr_err("%s: Invalid CEC message length!\n", __func__);
+ vfree(event);
+ return;
+ }
+ event->event_type = MESSAGE_TYPE_RECEIVE_SUCCESS;
+
+ for (i = 0; i < event->msg_len; i++)
+ event->msg[i] = hdmi_readb(HDMI_CEC_RX_DATA0+i);
+ hdmi_writeb(0x0, HDMI_CEC_LOCK);
+
+ mutex_lock(&hdmi_cec_data.lock);
+ list_add_tail(&event->list, &head);
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ wake_up(&hdmi_cec_queue);
+ }
+
+ /* An error is detected on cec line (for initiator only). */
+ if (cec_stat & HDMI_IH_CEC_STAT0_ERROR_INIT) {
+
+ mutex_lock(&hdmi_cec_data.lock);
+ hdmi_cec_data.send_error++;
+ if (hdmi_cec_data.send_error > 5) {
+ pr_err("%s:Re-transmission is attempted more than 5 times!\n",
+ __func__);
+ hdmi_cec_data.send_error = 0;
+ mutex_unlock(&hdmi_cec_data.lock);
+ return;
+ }
+
+ for (i = 0; i < hdmi_cec_data.msg_len; i++) {
+ hdmi_writeb(hdmi_cec_data.last_msg[i],
+ HDMI_CEC_TX_DATA0 + i);
+ }
+ hdmi_writeb(hdmi_cec_data.msg_len, HDMI_CEC_TX_CNT);
+
+ val = hdmi_readb(HDMI_CEC_CTRL);
+ val |= 0x01;
+ hdmi_writeb(val, HDMI_CEC_CTRL);
+ mutex_unlock(&hdmi_cec_data.lock);
+ }
+
+ /* A frame is not acknowledged in a directly addressed message.
+ * Or a frame is negatively acknowledged in
+ * a broadcast message (for initiator only).
+ */
+ if (cec_stat & HDMI_IH_CEC_STAT0_NACK) {
+ event = vmalloc(sizeof(struct hdmi_cec_event));
+ if (NULL == event) {
+ pr_err("%s: Not enough memory\n", __func__);
+ return;
+ }
+ memset(event, 0, sizeof(struct hdmi_cec_event));
+ event->event_type = MESSAGE_TYPE_NOACK;
+
+ mutex_lock(&hdmi_cec_data.lock);
+ list_add_tail(&event->list, &head);
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ wake_up(&hdmi_cec_queue);
+ }
+
+ /* An error is notified by a follower.
+ * Abnormal logic data bit error (for follower).
+ */
+ if (cec_stat & HDMI_IH_CEC_STAT0_ERROR_FOLL) {
+ hdmi_cec_data.receive_error++;
+ }
+
+ /* HDMI cable connected */
+ if (cec_stat & 0x80) {
+ event = vmalloc(sizeof(struct hdmi_cec_event));
+ if (NULL == event) {
+ pr_err("%s: Not enough memory\n", __func__);
+ return;
+ }
+ memset(event, 0, sizeof(struct hdmi_cec_event));
+ event->event_type = MESSAGE_TYPE_CONNECTED;
+
+ mutex_lock(&hdmi_cec_data.lock);
+ list_add_tail(&event->list, &head);
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ wake_up(&hdmi_cec_queue);
+ }
+
+ /* HDMI cable disconnected */
+ if (cec_stat & 0x100) {
+ event = vmalloc(sizeof(struct hdmi_cec_event));
+ if (NULL == event) {
+ pr_err("%s: Not enough memory!\n", __func__);
+ return;
+ }
+ memset(event, 0, sizeof(struct hdmi_cec_event));
+ event->event_type = MESSAGE_TYPE_DISCONNECTED;
+
+ mutex_lock(&hdmi_cec_data.lock);
+ list_add_tail(&event->list, &head);
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ wake_up(&hdmi_cec_queue);
+ }
+
+ return;
+}
+EXPORT_SYMBOL(mxc_hdmi_cec_handle);
+
+static void mxc_hdmi_cec_worker(struct work_struct *work)
+{
+ u8 val;
+
+ mxc_hdmi_cec_handle(hdmi_cec_data.latest_cec_stat);
+ val = HDMI_IH_CEC_STAT0_WAKEUP | HDMI_IH_CEC_STAT0_ERROR_FOLL |
+ HDMI_IH_CEC_STAT0_ARB_LOST;
+ hdmi_writeb(val, HDMI_IH_MUTE_CEC_STAT0);
+}
+
+/*!
+ * @brief open function for vpu file operation
+ *
+ * @return 0 on success or negative error code on error
+ */
+static int hdmi_cec_open(struct inode *inode, struct file *filp)
+{
+ mutex_lock(&hdmi_cec_data.lock);
+ if (open_count) {
+ mutex_unlock(&hdmi_cec_data.lock);
+ return -EBUSY;
+ }
+
+ open_count = 1;
+ filp->private_data = (void *)(&hdmi_cec_data);
+ hdmi_cec_data.Logical_address = 15;
+ hdmi_cec_data.cec_state = false;
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ return 0;
+}
+
+static ssize_t hdmi_cec_read(struct file *file, char __user *buf, size_t count,
+ loff_t *ppos)
+{
+ struct hdmi_cec_event *event = NULL;
+
+ pr_debug("function : %s\n", __func__);
+ if (!open_count)
+ return -ENODEV;
+
+ mutex_lock(&hdmi_cec_data.lock);
+ if (false == hdmi_cec_data.cec_state) {
+ mutex_unlock(&hdmi_cec_data.lock);
+ return -EACCES;
+ }
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ /* delete from list */
+ mutex_lock(&hdmi_cec_data.lock);
+ if (list_empty(&head)) {
+ mutex_unlock(&hdmi_cec_data.lock);
+ return -EACCES;
+ }
+ event = list_first_entry(&head, struct hdmi_cec_event, list);
+ list_del(&event->list);
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ if (copy_to_user(buf, event,
+ sizeof(struct hdmi_cec_event) - sizeof(struct list_head))) {
+ vfree(event);
+ return -EFAULT;
+ }
+ vfree(event);
+
+ return sizeof(struct hdmi_cec_event);
+}
+
+static ssize_t hdmi_cec_write(struct file *file, const char __user *buf,
+ size_t count, loff_t *ppos)
+{
+ int ret = 0 , i = 0;
+ u8 msg[MAX_MESSAGE_LEN];
+ u8 msg_len = 0, val = 0;
+
+ pr_debug("function : %s\n", __func__);
+ if (!open_count)
+ return -ENODEV;
+
+ mutex_lock(&hdmi_cec_data.lock);
+ if (false == hdmi_cec_data.cec_state) {
+ mutex_unlock(&hdmi_cec_data.lock);
+ return -EACCES;
+ }
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ if (count > MAX_MESSAGE_LEN)
+ return -EINVAL;
+
+ mutex_lock(&hdmi_cec_data.lock);
+ hdmi_cec_data.send_error = 0;
+ memset(&msg, 0, MAX_MESSAGE_LEN);
+ ret = copy_from_user(&msg, buf, count);
+ if (ret) {
+ ret = -EACCES;
+ goto end;
+ }
+
+ msg_len = count;
+ hdmi_writeb(msg_len, HDMI_CEC_TX_CNT);
+ for (i = 0; i < msg_len; i++) {
+ hdmi_writeb(msg[i], HDMI_CEC_TX_DATA0+i);
+ }
+
+ val = hdmi_readb(HDMI_CEC_CTRL);
+ val |= 0x01;
+ hdmi_writeb(val, HDMI_CEC_CTRL);
+ memcpy(hdmi_cec_data.last_msg, msg, msg_len);
+ hdmi_cec_data.msg_len = msg_len;
+
+ i = 0;
+ val = hdmi_readb(HDMI_CEC_CTRL);
+ while ((val & 0x01) == 0x1) {
+ msleep(50);
+ i++;
+ if (i > 3) {
+ ret = -EIO;
+ goto end;
+ }
+ val = hdmi_readb(HDMI_CEC_CTRL);
+ }
+
+end:
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ return ret;
+}
+
+/*!
+ * @brief IO ctrl function for vpu file operation
+ * @param cmd IO ctrl command
+ * @return 0 on success or negative error code on error
+ */
+static long hdmi_cec_ioctl(struct file *filp, u_int cmd,
+ u_long arg)
+{
+ int ret = 0, status = 0;
+ u8 val = 0, msg = 0;
+ struct mxc_edid_cfg hdmi_edid_cfg;
+
+ pr_debug("function : %s\n", __func__);
+ if (!open_count)
+ return -ENODEV;
+
+ switch (cmd) {
+ case HDMICEC_IOC_SETLOGICALADDRESS:
+ mutex_lock(&hdmi_cec_data.lock);
+ if (false == hdmi_cec_data.cec_state) {
+ mutex_unlock(&hdmi_cec_data.lock);
+ return -EACCES;
+ }
+
+ hdmi_cec_data.Logical_address = (u8)arg;
+
+ if (hdmi_cec_data.Logical_address <= 7) {
+ val = 1 << hdmi_cec_data.Logical_address;
+ hdmi_writeb(val, HDMI_CEC_ADDR_L);
+ hdmi_writeb(0, HDMI_CEC_ADDR_H);
+ } else if (hdmi_cec_data.Logical_address > 7 &&
+ hdmi_cec_data.Logical_address <= 15) {
+ val = 1 << (hdmi_cec_data.Logical_address - 8);
+ hdmi_writeb(val, HDMI_CEC_ADDR_H);
+ hdmi_writeb(0, HDMI_CEC_ADDR_L);
+ } else {
+ ret = -EINVAL;
+ }
+
+ /* Send Polling message with same source
+ * and destination address
+ */
+ if (0 == ret && 15 != hdmi_cec_data.Logical_address) {
+ msg = (hdmi_cec_data.Logical_address << 4) |
+ hdmi_cec_data.Logical_address;
+ hdmi_writeb(1, HDMI_CEC_TX_CNT);
+ hdmi_writeb(msg, HDMI_CEC_TX_DATA0);
+
+ val = hdmi_readb(HDMI_CEC_CTRL);
+ val |= 0x01;
+ hdmi_writeb(val, HDMI_CEC_CTRL);
+ }
+
+ mutex_unlock(&hdmi_cec_data.lock);
+ break;
+
+ case HDMICEC_IOC_STARTDEVICE:
+ val = hdmi_readb(HDMI_MC_CLKDIS);
+ val &= ~HDMI_MC_CLKDIS_CECCLK_DISABLE;
+ hdmi_writeb(val, HDMI_MC_CLKDIS);
+
+ hdmi_writeb(0x02, HDMI_CEC_CTRL);
+
+ val = HDMI_IH_CEC_STAT0_ERROR_INIT | HDMI_IH_CEC_STAT0_NACK |
+ HDMI_IH_CEC_STAT0_EOM | HDMI_IH_CEC_STAT0_DONE;
+ hdmi_writeb(val, HDMI_CEC_POLARITY);
+
+ val = HDMI_IH_CEC_STAT0_WAKEUP | HDMI_IH_CEC_STAT0_ERROR_FOLL |
+ HDMI_IH_CEC_STAT0_ARB_LOST;
+ hdmi_writeb(val, HDMI_CEC_MASK);
+ hdmi_writeb(val, HDMI_IH_MUTE_CEC_STAT0);
+
+ mutex_lock(&hdmi_cec_data.lock);
+ hdmi_cec_data.cec_state = true;
+ mutex_unlock(&hdmi_cec_data.lock);
+ break;
+
+ case HDMICEC_IOC_STOPDEVICE:
+ hdmi_writeb(0x10, HDMI_CEC_CTRL);
+
+ val = HDMI_IH_CEC_STAT0_WAKEUP | HDMI_IH_CEC_STAT0_ERROR_FOLL |
+ HDMI_IH_CEC_STAT0_ERROR_INIT | HDMI_IH_CEC_STAT0_ARB_LOST |
+ HDMI_IH_CEC_STAT0_NACK | HDMI_IH_CEC_STAT0_EOM |
+ HDMI_IH_CEC_STAT0_DONE;
+ hdmi_writeb(val, HDMI_CEC_MASK);
+ hdmi_writeb(val, HDMI_IH_MUTE_CEC_STAT0);
+
+ hdmi_writeb(0x0, HDMI_CEC_POLARITY);
+
+ val = hdmi_readb(HDMI_MC_CLKDIS);
+ val |= HDMI_MC_CLKDIS_CECCLK_DISABLE;
+ hdmi_writeb(val, HDMI_MC_CLKDIS);
+
+ mutex_lock(&hdmi_cec_data.lock);
+ hdmi_cec_data.cec_state = false;
+ mutex_unlock(&hdmi_cec_data.lock);
+ break;
+
+ case HDMICEC_IOC_GETPHYADDRESS:
+ hdmi_get_edid_cfg(&hdmi_edid_cfg);
+ status = copy_to_user((void __user *)arg,
+ &hdmi_edid_cfg.physical_address,
+ 4*sizeof(u8));
+ if (status)
+ ret = -EFAULT;
+ break;
+
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+ return ret;
+}
+
+/*!
+* @brief Release function for vpu file operation
+* @return 0 on success or negative error code on error
+*/
+static int hdmi_cec_release(struct inode *inode, struct file *filp)
+{
+ mutex_lock(&hdmi_cec_data.lock);
+
+ if (open_count) {
+ open_count = 0;
+ hdmi_cec_data.cec_state = false;
+ hdmi_cec_data.Logical_address = 15;
+ }
+
+ mutex_unlock(&hdmi_cec_data.lock);
+
+ return 0;
+}
+
+static unsigned int hdmi_cec_poll(struct file *file, poll_table *wait)
+{
+ unsigned int mask = 0;
+
+ pr_debug("function : %s\n", __func__);
+
+ if (!open_count)
+ return -ENODEV;
+
+ if (false == hdmi_cec_data.cec_state)
+ return -EACCES;
+
+ poll_wait(file, &hdmi_cec_queue, wait);
+
+ if (!list_empty(&head))
+ mask |= (POLLIN | POLLRDNORM);
+
+ return mask;
+}
+
+const struct file_operations hdmi_cec_fops = {
+ .owner = THIS_MODULE,
+ .read = hdmi_cec_read,
+ .write = hdmi_cec_write,
+ .open = hdmi_cec_open,
+ .unlocked_ioctl = hdmi_cec_ioctl,
+ .release = hdmi_cec_release,
+ .poll = hdmi_cec_poll,
+};
+
+static int hdmi_cec_dev_probe(struct platform_device *pdev)
+{
+ int err = 0;
+ struct device *temp_class;
+ struct resource *res;
+ struct pinctrl *pinctrl;
+ int irq = platform_get_irq(pdev, 0);
+
+ hdmi_cec_major = register_chrdev(hdmi_cec_major,
+ "mxc_hdmi_cec", &hdmi_cec_fops);
+ if (hdmi_cec_major < 0) {
+ dev_err(&pdev->dev, "hdmi_cec: unable to get a major for HDMI CEC\n");
+ err = -EBUSY;
+ goto out;
+ }
+
+ res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+ if (unlikely(res == NULL)) {
+ dev_err(&pdev->dev, "hdmi_cec:No HDMI irq line provided\n");
+ goto err_out_chrdev;
+ }
+
+ spin_lock_init(&hdmi_cec_data.irq_lock);
+
+ err = devm_request_irq(&pdev->dev, irq, mxc_hdmi_cec_isr, IRQF_SHARED,
+ dev_name(&pdev->dev), &hdmi_cec_data);
+ if (err < 0) {
+ dev_err(&pdev->dev, "hdmi_cec:Unable to request irq: %d\n", err);
+ goto err_out_chrdev;
+ }
+
+ hdmi_cec_class = class_create(THIS_MODULE, "mxc_hdmi_cec");
+ if (IS_ERR(hdmi_cec_class)) {
+ err = PTR_ERR(hdmi_cec_class);
+ goto err_out_chrdev;
+ }
+
+ temp_class = device_create(hdmi_cec_class, NULL,
+ MKDEV(hdmi_cec_major, 0), NULL, "mxc_hdmi_cec");
+ if (IS_ERR(temp_class)) {
+ err = PTR_ERR(temp_class);
+ goto err_out_class;
+ }
+
+ pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
+ if (IS_ERR(pinctrl)) {
+ dev_err(&pdev->dev, "can't get/select CEC pinctrl\n");
+ goto err_out_class;
+ }
+
+ init_waitqueue_head(&hdmi_cec_queue);
+
+ INIT_LIST_HEAD(&head);
+
+ mutex_init(&hdmi_cec_data.lock);
+
+ hdmi_cec_data.Logical_address = 15;
+
+ platform_set_drvdata(pdev, &hdmi_cec_data);
+
+ INIT_DELAYED_WORK(&hdmi_cec_data.hdmi_cec_work, mxc_hdmi_cec_worker);
+
+ dev_info(&pdev->dev, "HDMI CEC initialized\n");
+ goto out;
+
+err_out_class:
+ device_destroy(hdmi_cec_class, MKDEV(hdmi_cec_major, 0));
+ class_destroy(hdmi_cec_class);
+err_out_chrdev:
+ unregister_chrdev(hdmi_cec_major, "mxc_hdmi_cec");
+out:
+ return err;
+}
+
+static int hdmi_cec_dev_remove(struct platform_device *pdev)
+{
+ if (hdmi_cec_major > 0) {
+ device_destroy(hdmi_cec_class, MKDEV(hdmi_cec_major, 0));
+ class_destroy(hdmi_cec_class);
+ unregister_chrdev(hdmi_cec_major, "mxc_hdmi_cec");
+ hdmi_cec_major = 0;
+ }
+ return 0;
+}
+
+static const struct of_device_id imx_hdmi_cec_match[] = {
+ { .compatible = "fsl,imx6q-hdmi-cec", },
+ { .compatible = "fsl,imx6dl-hdmi-cec", },
+ { /* sentinel */ }
+};
+
+static struct platform_driver mxc_hdmi_cec_driver = {
+ .probe = hdmi_cec_dev_probe,
+ .remove = hdmi_cec_dev_remove,
+ .driver = {
+ .name = "mxc_hdmi_cec",
+ .of_match_table = imx_hdmi_cec_match,
+ },
+};
+
+module_platform_driver(mxc_hdmi_cec_driver);
+
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_DESCRIPTION("Linux HDMI CEC driver for Freescale i.MX/MXC");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:mxc_hdmi_cec");
+
diff --git a/drivers/mxc/hdmi-cec/mxc_hdmi-cec.h b/drivers/mxc/hdmi-cec/mxc_hdmi-cec.h
new file mode 100644
index 000000000000..5c402af4d0c3
--- /dev/null
+++ b/drivers/mxc/hdmi-cec/mxc_hdmi-cec.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2005-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#ifndef _HDMICEC_H_
+#define _HDMICEC_H_
+#include <linux/ioctl.h>
+
+/*
+ * Ioctl definitions
+ */
+
+/* Use 'k' as magic number */
+#define HDMICEC_IOC_MAGIC 'H'
+/*
+ * S means "Set" through a ptr,
+ * T means "Tell" directly with the argument value
+ * G means "Get": reply by setting through a pointer
+ * Q means "Query": response is on the return value
+ * X means "eXchange": G and S atomically
+ * H means "sHift": T and Q atomically
+ */
+#define HDMICEC_IOC_SETLOGICALADDRESS \
+ _IOW(HDMICEC_IOC_MAGIC, 1, unsigned char)
+#define HDMICEC_IOC_STARTDEVICE _IO(HDMICEC_IOC_MAGIC, 2)
+#define HDMICEC_IOC_STOPDEVICE _IO(HDMICEC_IOC_MAGIC, 3)
+#define HDMICEC_IOC_GETPHYADDRESS \
+ _IOR(HDMICEC_IOC_MAGIC, 4, unsigned char[4])
+
+#endif /* !_HDMICEC_H_ */
diff --git a/drivers/mxc/ipu3/Kconfig b/drivers/mxc/ipu3/Kconfig
new file mode 100644
index 000000000000..c702efed2b55
--- /dev/null
+++ b/drivers/mxc/ipu3/Kconfig
@@ -0,0 +1,21 @@
+config MXC_IPU_V3
+ bool
+
+config MXC_IPU_V3_PRG
+ tristate "i.MX IPUv3 prefetch gasket engine"
+ depends on MXC_IPU_V3 && MXC_IPU_V3_PRE
+ help
+ This enables support for the IPUv3 prefetch gasket engine to
+ support double buffer handshake control bewteen IPUv3 and
+ prefetch engine(PRE), snoop the AXI interface for display
+ refresh requests to memory and modify the request address to
+ fetch the double buffered row of blocks in OCRAM.
+
+config MXC_IPU_V3_PRE
+ tristate "i.MX IPUv3 prefetch engine"
+ depends on MXC_IPU_V3
+ select MXC_IPU_V3_PRG
+ help
+ This enables support for the IPUv3 prefetch engine to improve
+ the system memory performance. The engine has the capability
+ to resolve framebuffers in tile pixel format to linear.
diff --git a/drivers/mxc/ipu3/Makefile b/drivers/mxc/ipu3/Makefile
new file mode 100644
index 000000000000..d48f11244073
--- /dev/null
+++ b/drivers/mxc/ipu3/Makefile
@@ -0,0 +1,7 @@
+obj-$(CONFIG_MXC_IPU_V3) = mxc_ipu.o
+
+obj-$(CONFIG_MXC_IPU_V3_PRG) += prg.o
+obj-$(CONFIG_MXC_IPU_V3_PRE) += pre.o
+
+mxc_ipu-objs := ipu_common.o ipu_ic.o ipu_disp.o ipu_capture.o ipu_device.o \
+ ipu_calc_stripes_sizes.o vdoa.o ipu_pixel_clk.o
diff --git a/drivers/mxc/ipu3/ipu_calc_stripes_sizes.c b/drivers/mxc/ipu3/ipu_calc_stripes_sizes.c
new file mode 100644
index 000000000000..512404d4101c
--- /dev/null
+++ b/drivers/mxc/ipu3/ipu_calc_stripes_sizes.c
@@ -0,0 +1,495 @@
+/*
+ * Copyright 2009-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ * @file ipu_calc_stripes_sizes.c
+ *
+ * @brief IPU IC functions
+ *
+ * @ingroup IPU
+ */
+
+#include <linux/ipu-v3.h>
+#include <linux/module.h>
+#include <linux/math64.h>
+
+#define BPP_32 0
+#define BPP_16 3
+#define BPP_8 5
+#define BPP_24 1
+#define BPP_12 4
+#define BPP_18 2
+
+static u32 truncate(u32 up, /* 0: down; else: up */
+ u64 a, /* must be non-negative */
+ u32 b)
+{
+ u32 d;
+ u64 div;
+ div = div_u64(a, b);
+ d = b * (div >> 32);
+ if (up && (a > (((u64)d) << 32)))
+ return d+b;
+ else
+ return d;
+}
+
+static unsigned int f_calc(unsigned int pfs, unsigned int bpp, unsigned int *write)
+{/* return input_f */
+ unsigned int f_calculated = 0;
+ switch (pfs) {
+ case IPU_PIX_FMT_YVU422P:
+ case IPU_PIX_FMT_YUV422P:
+ case IPU_PIX_FMT_YUV420P2:
+ case IPU_PIX_FMT_YUV420P:
+ case IPU_PIX_FMT_YVU420P:
+ case IPU_PIX_FMT_YUV444P:
+ f_calculated = 16;
+ break;
+
+ case IPU_PIX_FMT_RGB565:
+ case IPU_PIX_FMT_YUYV:
+ case IPU_PIX_FMT_UYVY:
+ f_calculated = 8;
+ break;
+
+ case IPU_PIX_FMT_NV12:
+ f_calculated = 8;
+ break;
+
+ default:
+ f_calculated = 0;
+ break;
+
+ }
+ if (!f_calculated) {
+ switch (bpp) {
+ case BPP_32:
+ f_calculated = 2;
+ break;
+
+ case BPP_16:
+ f_calculated = 4;
+ break;
+
+ case BPP_8:
+ case BPP_24:
+ f_calculated = 8;
+ break;
+
+ case BPP_12:
+ f_calculated = 16;
+ break;
+
+ case BPP_18:
+ f_calculated = 32;
+ break;
+
+ default:
+ f_calculated = 0;
+ break;
+ }
+ }
+ return f_calculated;
+}
+
+
+static unsigned int m_calc(unsigned int pfs)
+{
+ unsigned int m_calculated = 0;
+ switch (pfs) {
+ case IPU_PIX_FMT_YUV420P2:
+ case IPU_PIX_FMT_YUV420P:
+ case IPU_PIX_FMT_YVU422P:
+ case IPU_PIX_FMT_YUV422P:
+ case IPU_PIX_FMT_YVU420P:
+ case IPU_PIX_FMT_YUV444P:
+ m_calculated = 16;
+ break;
+
+ case IPU_PIX_FMT_NV12:
+ case IPU_PIX_FMT_YUYV:
+ case IPU_PIX_FMT_UYVY:
+ m_calculated = 8;
+ break;
+
+ default:
+ m_calculated = 8;
+ break;
+
+ }
+ return m_calculated;
+}
+
+static int calc_split_resize_coeffs(unsigned int inSize, unsigned int outSize,
+ unsigned int *resizeCoeff,
+ unsigned int *downsizeCoeff)
+{
+ uint32_t tempSize;
+ uint32_t tempDownsize;
+
+ if (inSize > 4096) {
+ pr_debug("IC input size(%d) cannot exceed 4096\n",
+ inSize);
+ return -EINVAL;
+ }
+
+ if (outSize > 1024) {
+ pr_debug("IC output size(%d) cannot exceed 1024\n",
+ outSize);
+ return -EINVAL;
+ }
+
+ if ((outSize << 3) < inSize) {
+ pr_debug("IC cannot downsize more than 8:1\n");
+ return -EINVAL;
+ }
+
+ /* Compute downsizing coefficient */
+ /* Output of downsizing unit cannot be more than 1024 */
+ tempDownsize = 0;
+ tempSize = inSize;
+ while (((tempSize > 1024) || (tempSize >= outSize * 2)) &&
+ (tempDownsize < 2)) {
+ tempSize >>= 1;
+ tempDownsize++;
+ }
+ *downsizeCoeff = tempDownsize;
+
+ /* compute resizing coefficient using the following equation:
+ resizeCoeff = M*(SI -1)/(SO - 1)
+ where M = 2^13, SI - input size, SO - output size */
+ *resizeCoeff = (8192L * (tempSize - 1)) / (outSize - 1);
+ if (*resizeCoeff >= 16384L) {
+ pr_debug("Overflow on IC resize coefficient.\n");
+ return -EINVAL;
+ }
+
+ pr_debug("resizing from %u -> %u pixels, "
+ "downsize=%u, resize=%u.%lu (reg=%u)\n", inSize, outSize,
+ *downsizeCoeff, (*resizeCoeff >= 8192L) ? 1 : 0,
+ ((*resizeCoeff & 0x1FFF) * 10000L) / 8192L, *resizeCoeff);
+
+ return 0;
+}
+
+/* Stripe parameters calculator */
+/**************************************************************************
+Notes:
+MSW = the maximal width allowed for a stripe
+ i.MX31: 720, i.MX35: 800, i.MX37/51/53: 1024
+cirr = the maximal inverse resizing ratio for which overlap in the input
+ is requested; typically cirr~2
+flags
+ bit 0 - equal_stripes
+ 0 each stripe is allowed to have independent parameters
+ for maximal image quality
+ 1 the stripes are requested to have identical parameters
+ (except the base address), for maximal performance
+ bit 1 - vertical/horizontal
+ 0 horizontal
+ 1 vertical
+
+If performance is the top priority (above image quality)
+ Avoid overlap, by setting CIRR = 0
+ This will also force effectively identical_stripes = 1
+ Choose IF & OF that corresponds to the same IOX/SX for both stripes
+ Choose IFW & OFW such that
+ IFW/IM, IFW/IF, OFW/OM, OFW/OF are even integers
+ The function returns an error status:
+ 0: no error
+ 1: invalid input parameters -> aborted without result
+ Valid parameters should satisfy the following conditions
+ IFW <= OFW, otherwise downsizing is required
+ - which is not supported yet
+ 4 <= IFW,OFW, so some interpolation may be needed even without overlap
+ IM, OM, IF, OF should not vanish
+ 2*IF <= IFW
+ so the frame can be split to two equal stripes, even without overlap
+ 2*(OF+IF/irr_opt) <= OFW
+ so a valid positive INW exists even for equal stripes
+ OF <= MSW, otherwise, the left stripe cannot be sufficiently large
+ MSW < OFW, so splitting to stripes is required
+ OFW <= 2*MSW, so two stripes are sufficient
+ (this also implies that 2<=MSW)
+ 2: OF is not a multiple of OM - not fully-supported yet
+ Output is produced but OW is not guaranited to be a multiple of OM
+ 4: OFW reduced to be a multiple of OM
+ 8: CIRR > 1: truncated to 1
+ Overlap is not supported (and not needed) y for upsizing)
+**************************************************************************/
+int ipu_calc_stripes_sizes(const unsigned int input_frame_width,
+ /* input frame width;>1 */
+ unsigned int output_frame_width, /* output frame width; >1 */
+ const unsigned int maximal_stripe_width,
+ /* the maximal width allowed for a stripe */
+ const unsigned long long cirr, /* see above */
+ const unsigned int flags, /* see above */
+ u32 input_pixelformat,/* pixel format after of read channel*/
+ u32 output_pixelformat,/* pixel format after of write channel*/
+ struct stripe_param *left,
+ struct stripe_param *right)
+{
+ const unsigned int irr_frac_bits = 13;
+ const unsigned long irr_steps = 1 << irr_frac_bits;
+ const u64 dirr = ((u64)1) << (32 - 2);
+ /* The maximum relative difference allowed between the irrs */
+ const u64 cr = ((u64)4) << 32;
+ /* The importance ratio between the two terms in the cost function below */
+
+ unsigned int status;
+ unsigned int temp;
+ unsigned int onw_min;
+ unsigned int inw = 0, onw = 0, inw_best = 0;
+ /* number of pixels in the left stripe NOT hidden by the right stripe */
+ u64 irr_opt; /* the optimal inverse resizing ratio */
+ u64 rr_opt; /* the optimal resizing ratio = 1/irr_opt*/
+ u64 dinw; /* the misalignment between the stripes */
+ /* (measured in units of input columns) */
+ u64 difwl, difwr = 0;
+ /* The number of input columns not reflected in the output */
+ /* the resizing ratio used for the right stripe is */
+ /* left->irr and right->irr respectively */
+ u64 cost, cost_min;
+ u64 div; /* result of division */
+ bool equal_stripes = (flags & 0x1) != 0;
+ bool vertical = (flags & 0x2) != 0;
+
+ unsigned int input_m, input_f, output_m, output_f; /* parameters for upsizing by stripes */
+ unsigned int resize_coeff;
+ unsigned int downsize_coeff;
+
+ status = 0;
+
+ if (vertical) {
+ input_f = 2;
+ input_m = 8;
+ output_f = 8;
+ output_m = 2;
+ } else {
+ input_f = f_calc(input_pixelformat, 0, NULL);
+ input_m = m_calc(input_pixelformat);
+ output_f = input_m;
+ output_m = m_calc(output_pixelformat);
+ }
+ if ((input_frame_width < 4) || (output_frame_width < 4))
+ return 1;
+
+ irr_opt = div_u64((((u64)(input_frame_width - 1)) << 32),
+ (output_frame_width - 1));
+ rr_opt = div_u64((((u64)(output_frame_width - 1)) << 32),
+ (input_frame_width - 1));
+
+ if ((input_m == 0) || (output_m == 0) || (input_f == 0) || (output_f == 0)
+ || (input_frame_width < (2 * input_f))
+ || ((((u64)output_frame_width) << 32) <
+ (2 * ((((u64)output_f) << 32) + (input_f * rr_opt))))
+ || (maximal_stripe_width < output_f)
+ || ((output_frame_width <= maximal_stripe_width)
+ && (equal_stripes == 0))
+ || ((2 * maximal_stripe_width) < output_frame_width))
+ return 1;
+
+ if (output_f % output_m)
+ status += 2;
+
+ temp = truncate(0, (((u64)output_frame_width) << 32), output_m);
+ if (temp < output_frame_width) {
+ output_frame_width = temp;
+ status += 4;
+ }
+
+ pr_debug("---------------->\n"
+ "if = %d\n"
+ "im = %d\n"
+ "of = %d\n"
+ "om = %d\n"
+ "irr_opt = %llu\n"
+ "rr_opt = %llu\n"
+ "cirr = %llu\n"
+ "pixel in = %08x\n"
+ "pixel out = %08x\n"
+ "ifw = %d\n"
+ "ofwidth = %d\n",
+ input_f,
+ input_m,
+ output_f,
+ output_m,
+ irr_opt,
+ rr_opt,
+ cirr,
+ input_pixelformat,
+ output_pixelformat,
+ input_frame_width,
+ output_frame_width
+ );
+
+ if (equal_stripes) {
+ if ((irr_opt > cirr) /* overlap in the input is not requested */
+ && ((input_frame_width % (input_m << 1)) == 0)
+ && ((input_frame_width % (input_f << 1)) == 0)
+ && ((output_frame_width % (output_m << 1)) == 0)
+ && ((output_frame_width % (output_f << 1)) == 0)) {
+ /* without overlap */
+ left->input_width = right->input_width = right->input_column =
+ input_frame_width >> 1;
+ left->output_width = right->output_width = right->output_column =
+ output_frame_width >> 1;
+ left->input_column = 0;
+ left->output_column = 0;
+ div = div_u64(((((u64)irr_steps) << 32) *
+ (right->input_width - 1)), (right->output_width - 1));
+ left->irr = right->irr = truncate(0, div, 1);
+ } else { /* with overlap */
+ onw = truncate(0, (((u64)output_frame_width - 1) << 32) >> 1,
+ output_f);
+ inw = truncate(0, onw * irr_opt, input_f);
+ /* this is the maximal inw which allows the same resizing ratio */
+ /* in both stripes */
+ onw = truncate(1, (inw * rr_opt), output_f);
+ div = div_u64((((u64)(irr_steps * inw)) <<
+ 32), onw);
+ left->irr = right->irr = truncate(0, div, 1);
+ left->output_width = right->output_width =
+ output_frame_width - onw;
+ /* These are valid assignments for output_width, */
+ /* assuming output_f is a multiple of output_m */
+ div = (((u64)(left->output_width-1) * (left->irr)) << 32);
+ div = (((u64)1) << 32) + div_u64(div, irr_steps);
+
+ left->input_width = right->input_width = truncate(1, div, input_m);
+
+ div = div_u64((((u64)((right->output_width - 1) * right->irr)) <<
+ 32), irr_steps);
+ difwr = (((u64)(input_frame_width - 1 - inw)) << 32) - div;
+ div = div_u64((difwr + (((u64)input_f) << 32)), 2);
+ left->input_column = truncate(0, div, input_f);
+
+
+ /* This splits the truncated input columns evenly */
+ /* between the left and right margins */
+ right->input_column = left->input_column + inw;
+ left->output_column = 0;
+ right->output_column = onw;
+ }
+ if (left->input_width > left->output_width) {
+ if (calc_split_resize_coeffs(left->input_width,
+ left->output_width,
+ &resize_coeff,
+ &downsize_coeff) < 0)
+ return -EINVAL;
+
+ if (downsize_coeff > 0) {
+ left->irr = right->irr =
+ (downsize_coeff << 14) | resize_coeff;
+ }
+ }
+ pr_debug("inw %d, onw %d, ilw %d, ilc %d, olw %d,"
+ " irw %d, irc %d, orw %d, orc %d, "
+ "difwr %llu, lirr %u\n",
+ inw, onw, left->input_width,
+ left->input_column, left->output_width,
+ right->input_width, right->input_column,
+ right->output_width,
+ right->output_column, difwr, left->irr);
+ } else { /* independent stripes */
+ onw_min = output_frame_width - maximal_stripe_width;
+ /* onw is a multiple of output_f, in the range */
+ /* [max(output_f,output_frame_width-maximal_stripe_width),*/
+ /*min(output_frame_width-2,maximal_stripe_width)] */
+ /* definitely beyond the cost of any valid setting */
+ cost_min = (((u64)input_frame_width) << 32) + cr;
+ onw = truncate(0, ((u64)maximal_stripe_width), output_f);
+ if (output_frame_width - onw == 1)
+ onw -= output_f; /* => onw and output_frame_width-1-onw are positive */
+ inw = truncate(0, onw * irr_opt, input_f);
+ /* this is the maximal inw which allows the same resizing ratio */
+ /* in both stripes */
+ onw = truncate(1, inw * rr_opt, output_f);
+ do {
+ div = div_u64((((u64)(irr_steps * inw)) << 32), onw);
+ left->irr = truncate(0, div, 1);
+ div = div_u64((((u64)(onw * left->irr)) << 32),
+ irr_steps);
+ dinw = (((u64)inw) << 32) - div;
+
+ div = div_u64((((u64)((output_frame_width - 1 - onw) * left->irr)) <<
+ 32), irr_steps);
+
+ difwl = (((u64)(input_frame_width - 1 - inw)) << 32) - div;
+
+ cost = difwl + (((u64)(cr * dinw)) >> 32);
+
+ if (cost < cost_min) {
+ inw_best = inw;
+ cost_min = cost;
+ }
+
+ inw -= input_f;
+ onw = truncate(1, inw * rr_opt, output_f);
+ /* This is the minimal onw which allows the same resizing ratio */
+ /* in both stripes */
+ } while (onw >= onw_min);
+
+ inw = inw_best;
+ onw = truncate(1, inw * rr_opt, output_f);
+ div = div_u64((((u64)(irr_steps * inw)) << 32), onw);
+ left->irr = truncate(0, div, 1);
+
+ left->output_width = onw;
+ right->output_width = output_frame_width - onw;
+ /* These are valid assignments for output_width, */
+ /* assuming output_f is a multiple of output_m */
+ left->input_width = truncate(1, ((u64)(inw + 1)) << 32, input_m);
+ right->input_width = truncate(1, ((u64)(input_frame_width - inw)) <<
+ 32, input_m);
+
+ div = div_u64((((u64)(irr_steps * (input_frame_width - 1 - inw))) <<
+ 32), (right->output_width - 1));
+ right->irr = truncate(0, div, 1);
+ temp = truncate(0, ((u64)left->irr) * ((((u64)1) << 32) + dirr), 1);
+ if (temp < right->irr)
+ right->irr = temp;
+ div = div_u64(((u64)((right->output_width - 1) * right->irr) <<
+ 32), irr_steps);
+ difwr = (u64)(input_frame_width - 1 - inw) - div;
+
+
+ div = div_u64((difwr + (((u64)input_f) << 32)), 2);
+ left->input_column = truncate(0, div, input_f);
+
+ /* This splits the truncated input columns evenly */
+ /* between the left and right margins */
+ right->input_column = left->input_column + inw;
+ left->output_column = 0;
+ right->output_column = onw;
+ if (left->input_width > left->output_width) {
+ if (calc_split_resize_coeffs(left->input_width,
+ left->output_width,
+ &resize_coeff,
+ &downsize_coeff) < 0)
+ return -EINVAL;
+ left->irr = (downsize_coeff << 14) | resize_coeff;
+ }
+ if (right->input_width > right->output_width) {
+ if (calc_split_resize_coeffs(right->input_width,
+ right->output_width,
+ &resize_coeff,
+ &downsize_coeff) < 0)
+ return -EINVAL;
+ right->irr = (downsize_coeff << 14) | resize_coeff;
+ }
+ }
+ return status;
+}
+EXPORT_SYMBOL(ipu_calc_stripes_sizes);
diff --git a/drivers/mxc/ipu3/ipu_capture.c b/drivers/mxc/ipu3/ipu_capture.c
new file mode 100644
index 000000000000..f304c8140be4
--- /dev/null
+++ b/drivers/mxc/ipu3/ipu_capture.c
@@ -0,0 +1,816 @@
+/*
+ * Copyright 2008-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file ipu_capture.c
+ *
+ * @brief IPU capture dase functions
+ *
+ * @ingroup IPU
+ */
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/ipu-v3.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <linux/types.h>
+
+#include "ipu_prv.h"
+#include "ipu_regs.h"
+
+/*!
+ * _ipu_csi_mclk_set
+ *
+ * @param ipu ipu handler
+ * @param pixel_clk desired pixel clock frequency in Hz
+ * @param csi csi 0 or csi 1
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int _ipu_csi_mclk_set(struct ipu_soc *ipu, uint32_t pixel_clk, uint32_t csi)
+{
+ uint32_t temp;
+ int32_t div_ratio;
+
+ div_ratio = (clk_get_rate(ipu->ipu_clk) / pixel_clk) - 1;
+
+ if (div_ratio > 0xFF || div_ratio < 0) {
+ dev_dbg(ipu->dev, "value of pixel_clk extends normal range\n");
+ return -EINVAL;
+ }
+
+ temp = ipu_csi_read(ipu, csi, CSI_SENS_CONF);
+ temp &= ~CSI_SENS_CONF_DIVRATIO_MASK;
+ ipu_csi_write(ipu, csi, temp |
+ (div_ratio << CSI_SENS_CONF_DIVRATIO_SHIFT),
+ CSI_SENS_CONF);
+
+ return 0;
+}
+
+/*!
+ * ipu_csi_init_interface
+ * Sets initial values for the CSI registers.
+ * The width and height of the sensor and the actual frame size will be
+ * set to the same values.
+ * @param ipu ipu handler
+ * @param width Sensor width
+ * @param height Sensor height
+ * @param pixel_fmt pixel format
+ * @param cfg_param ipu_csi_signal_cfg_t structure
+ * @param csi csi 0 or csi 1
+ *
+ * @return 0 for success, -EINVAL for error
+ */
+int32_t
+ipu_csi_init_interface(struct ipu_soc *ipu, uint16_t width, uint16_t height,
+ uint32_t pixel_fmt, ipu_csi_signal_cfg_t cfg_param)
+{
+ uint32_t data = 0;
+ uint32_t csi = cfg_param.csi;
+
+ /* Set SENS_DATA_FORMAT bits (8, 9 and 10)
+ RGB or YUV444 is 0 which is current value in data so not set
+ explicitly
+ This is also the default value if attempts are made to set it to
+ something invalid. */
+ switch (pixel_fmt) {
+ case IPU_PIX_FMT_YUYV:
+ cfg_param.data_fmt = CSI_SENS_CONF_DATA_FMT_YUV422_YUYV;
+ break;
+ case IPU_PIX_FMT_UYVY:
+ cfg_param.data_fmt = CSI_SENS_CONF_DATA_FMT_YUV422_UYVY;
+ break;
+ case IPU_PIX_FMT_RGB24:
+ case IPU_PIX_FMT_BGR24:
+ cfg_param.data_fmt = CSI_SENS_CONF_DATA_FMT_RGB_YUV444;
+ break;
+ case IPU_PIX_FMT_GENERIC:
+ case IPU_PIX_FMT_GENERIC_16:
+ cfg_param.data_fmt = CSI_SENS_CONF_DATA_FMT_BAYER;
+ break;
+ case IPU_PIX_FMT_RGB565:
+ cfg_param.data_fmt = CSI_SENS_CONF_DATA_FMT_RGB565;
+ break;
+ case IPU_PIX_FMT_RGB555:
+ cfg_param.data_fmt = CSI_SENS_CONF_DATA_FMT_RGB555;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ /* Set the CSI_SENS_CONF register remaining fields */
+ data |= cfg_param.data_width << CSI_SENS_CONF_DATA_WIDTH_SHIFT |
+ cfg_param.data_fmt << CSI_SENS_CONF_DATA_FMT_SHIFT |
+ cfg_param.data_pol << CSI_SENS_CONF_DATA_POL_SHIFT |
+ cfg_param.Vsync_pol << CSI_SENS_CONF_VSYNC_POL_SHIFT |
+ cfg_param.Hsync_pol << CSI_SENS_CONF_HSYNC_POL_SHIFT |
+ cfg_param.pixclk_pol << CSI_SENS_CONF_PIX_CLK_POL_SHIFT |
+ cfg_param.ext_vsync << CSI_SENS_CONF_EXT_VSYNC_SHIFT |
+ cfg_param.clk_mode << CSI_SENS_CONF_SENS_PRTCL_SHIFT |
+ cfg_param.pack_tight << CSI_SENS_CONF_PACK_TIGHT_SHIFT |
+ cfg_param.force_eof << CSI_SENS_CONF_FORCE_EOF_SHIFT |
+ cfg_param.data_en_pol << CSI_SENS_CONF_DATA_EN_POL_SHIFT;
+
+ _ipu_get(ipu);
+
+ mutex_lock(&ipu->mutex_lock);
+
+ ipu_csi_write(ipu, csi, data, CSI_SENS_CONF);
+
+ /* Setup sensor frame size */
+ ipu_csi_write(ipu, csi, (width - 1) | (height - 1) << 16, CSI_SENS_FRM_SIZE);
+
+ /* Set CCIR registers */
+ if (cfg_param.clk_mode == IPU_CSI_CLK_MODE_CCIR656_PROGRESSIVE) {
+ ipu_csi_write(ipu, csi, 0x40030, CSI_CCIR_CODE_1);
+ ipu_csi_write(ipu, csi, 0xFF0000, CSI_CCIR_CODE_3);
+ } else if (cfg_param.clk_mode == IPU_CSI_CLK_MODE_CCIR656_INTERLACED) {
+ if (width == 720 && height == 625) {
+ /* PAL case */
+ /*
+ * Field0BlankEnd = 0x6, Field0BlankStart = 0x2,
+ * Field0ActiveEnd = 0x4, Field0ActiveStart = 0
+ */
+ ipu_csi_write(ipu, csi, 0x40596, CSI_CCIR_CODE_1);
+ /*
+ * Field1BlankEnd = 0x7, Field1BlankStart = 0x3,
+ * Field1ActiveEnd = 0x5, Field1ActiveStart = 0x1
+ */
+ ipu_csi_write(ipu, csi, 0xD07DF, CSI_CCIR_CODE_2);
+
+ ipu_csi_write(ipu, csi, 0xFF0000, CSI_CCIR_CODE_3);
+
+ } else if (width == 720 && height == 525) {
+ /* NTSC case */
+ /*
+ * Field0BlankEnd = 0x7, Field0BlankStart = 0x3,
+ * Field0ActiveEnd = 0x5, Field0ActiveStart = 0x1
+ */
+ ipu_csi_write(ipu, csi, 0xD07DF, CSI_CCIR_CODE_1);
+ /*
+ * Field1BlankEnd = 0x6, Field1BlankStart = 0x2,
+ * Field1ActiveEnd = 0x4, Field1ActiveStart = 0
+ */
+ ipu_csi_write(ipu, csi, 0x40596, CSI_CCIR_CODE_2);
+ ipu_csi_write(ipu, csi, 0xFF0000, CSI_CCIR_CODE_3);
+ } else {
+ dev_err(ipu->dev, "Unsupported CCIR656 interlaced "
+ "video mode\n");
+ mutex_unlock(&ipu->mutex_lock);
+ _ipu_put(ipu);
+ return -EINVAL;
+ }
+ _ipu_csi_ccir_err_detection_enable(ipu, csi);
+ } else if ((cfg_param.clk_mode ==
+ IPU_CSI_CLK_MODE_CCIR1120_PROGRESSIVE_DDR) ||
+ (cfg_param.clk_mode ==
+ IPU_CSI_CLK_MODE_CCIR1120_PROGRESSIVE_SDR) ||
+ (cfg_param.clk_mode ==
+ IPU_CSI_CLK_MODE_CCIR1120_INTERLACED_DDR) ||
+ (cfg_param.clk_mode ==
+ IPU_CSI_CLK_MODE_CCIR1120_INTERLACED_SDR)) {
+ ipu_csi_write(ipu, csi, 0x40030, CSI_CCIR_CODE_1);
+ ipu_csi_write(ipu, csi, 0xFF0000, CSI_CCIR_CODE_3);
+ _ipu_csi_ccir_err_detection_enable(ipu, csi);
+ } else if ((cfg_param.clk_mode == IPU_CSI_CLK_MODE_GATED_CLK) ||
+ (cfg_param.clk_mode == IPU_CSI_CLK_MODE_NONGATED_CLK)) {
+ _ipu_csi_ccir_err_detection_disable(ipu, csi);
+ }
+
+ dev_dbg(ipu->dev, "CSI_SENS_CONF = 0x%08X\n",
+ ipu_csi_read(ipu, csi, CSI_SENS_CONF));
+ dev_dbg(ipu->dev, "CSI_ACT_FRM_SIZE = 0x%08X\n",
+ ipu_csi_read(ipu, csi, CSI_ACT_FRM_SIZE));
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ _ipu_put(ipu);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_csi_init_interface);
+
+/*!
+ * ipu_csi_get_sensor_protocol
+ *
+ * @param ipu ipu handler
+ * @param csi csi 0 or csi 1
+ *
+ * @return Returns sensor protocol
+ */
+int32_t ipu_csi_get_sensor_protocol(struct ipu_soc *ipu, uint32_t csi)
+{
+ int ret;
+ _ipu_get(ipu);
+ ret = (ipu_csi_read(ipu, csi, CSI_SENS_CONF) &
+ CSI_SENS_CONF_SENS_PRTCL_MASK) >>
+ CSI_SENS_CONF_SENS_PRTCL_SHIFT;
+ _ipu_put(ipu);
+ return ret;
+}
+EXPORT_SYMBOL(ipu_csi_get_sensor_protocol);
+
+/*!
+ * ipu_csi_enable_mclk
+ *
+ * @param ipu ipu handler
+ * @param csi csi 0 or csi 1
+ * @param flag true to enable mclk, false to disable mclk
+ * @param wait true to wait 100ms make clock stable, false not wait
+ *
+ * @return Returns 0 on success
+ */
+int ipu_csi_enable_mclk(struct ipu_soc *ipu, int csi, bool flag, bool wait)
+{
+ /* Return immediately if there is no csi_clk to manage */
+ if (ipu->csi_clk[csi] == NULL)
+ return 0;
+
+ if (flag) {
+ clk_enable(ipu->csi_clk[csi]);
+ if (wait == true)
+ msleep(10);
+ } else {
+ clk_disable(ipu->csi_clk[csi]);
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_csi_enable_mclk);
+
+/*!
+ * ipu_csi_get_window_size
+ *
+ * @param ipu ipu handler
+ * @param width pointer to window width
+ * @param height pointer to window height
+ * @param csi csi 0 or csi 1
+ */
+void ipu_csi_get_window_size(struct ipu_soc *ipu, uint32_t *width, uint32_t *height, uint32_t csi)
+{
+ uint32_t reg;
+
+ _ipu_get(ipu);
+
+ mutex_lock(&ipu->mutex_lock);
+
+ reg = ipu_csi_read(ipu, csi, CSI_ACT_FRM_SIZE);
+ *width = (reg & 0xFFFF) + 1;
+ *height = (reg >> 16 & 0xFFFF) + 1;
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ _ipu_put(ipu);
+}
+EXPORT_SYMBOL(ipu_csi_get_window_size);
+
+/*!
+ * ipu_csi_set_window_size
+ *
+ * @param ipu ipu handler
+ * @param width window width
+ * @param height window height
+ * @param csi csi 0 or csi 1
+ */
+void ipu_csi_set_window_size(struct ipu_soc *ipu, uint32_t width, uint32_t height, uint32_t csi)
+{
+ _ipu_get(ipu);
+
+ mutex_lock(&ipu->mutex_lock);
+
+ ipu_csi_write(ipu, csi, (width - 1) | (height - 1) << 16, CSI_ACT_FRM_SIZE);
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ _ipu_put(ipu);
+}
+EXPORT_SYMBOL(ipu_csi_set_window_size);
+
+/*!
+ * ipu_csi_set_window_pos
+ *
+ * @param ipu ipu handler
+ * @param left uint32 window x start
+ * @param top uint32 window y start
+ * @param csi csi 0 or csi 1
+ */
+void ipu_csi_set_window_pos(struct ipu_soc *ipu, uint32_t left, uint32_t top, uint32_t csi)
+{
+ uint32_t temp;
+
+ _ipu_get(ipu);
+
+ mutex_lock(&ipu->mutex_lock);
+
+ temp = ipu_csi_read(ipu, csi, CSI_OUT_FRM_CTRL);
+ temp &= ~(CSI_HSC_MASK | CSI_VSC_MASK);
+ temp |= ((top << CSI_VSC_SHIFT) | (left << CSI_HSC_SHIFT));
+ ipu_csi_write(ipu, csi, temp, CSI_OUT_FRM_CTRL);
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ _ipu_put(ipu);
+}
+EXPORT_SYMBOL(ipu_csi_set_window_pos);
+
+/*!
+ * _ipu_csi_horizontal_downsize_enable
+ * Enable horizontal downsizing(decimation) by 2.
+ *
+ * @param ipu ipu handler
+ * @param csi csi 0 or csi 1
+ */
+void _ipu_csi_horizontal_downsize_enable(struct ipu_soc *ipu, uint32_t csi)
+{
+ uint32_t temp;
+
+ temp = ipu_csi_read(ipu, csi, CSI_OUT_FRM_CTRL);
+ temp |= CSI_HORI_DOWNSIZE_EN;
+ ipu_csi_write(ipu, csi, temp, CSI_OUT_FRM_CTRL);
+}
+
+/*!
+ * _ipu_csi_horizontal_downsize_disable
+ * Disable horizontal downsizing(decimation) by 2.
+ *
+ * @param ipu ipu handler
+ * @param csi csi 0 or csi 1
+ */
+void _ipu_csi_horizontal_downsize_disable(struct ipu_soc *ipu, uint32_t csi)
+{
+ uint32_t temp;
+
+ temp = ipu_csi_read(ipu, csi, CSI_OUT_FRM_CTRL);
+ temp &= ~CSI_HORI_DOWNSIZE_EN;
+ ipu_csi_write(ipu, csi, temp, CSI_OUT_FRM_CTRL);
+}
+
+/*!
+ * _ipu_csi_vertical_downsize_enable
+ * Enable vertical downsizing(decimation) by 2.
+ *
+ * @param ipu ipu handler
+ * @param csi csi 0 or csi 1
+ */
+void _ipu_csi_vertical_downsize_enable(struct ipu_soc *ipu, uint32_t csi)
+{
+ uint32_t temp;
+
+ temp = ipu_csi_read(ipu, csi, CSI_OUT_FRM_CTRL);
+ temp |= CSI_VERT_DOWNSIZE_EN;
+ ipu_csi_write(ipu, csi, temp, CSI_OUT_FRM_CTRL);
+}
+
+/*!
+ * _ipu_csi_vertical_downsize_disable
+ * Disable vertical downsizing(decimation) by 2.
+ *
+ * @param ipu ipu handler
+ * @param csi csi 0 or csi 1
+ */
+void _ipu_csi_vertical_downsize_disable(struct ipu_soc *ipu, uint32_t csi)
+{
+ uint32_t temp;
+
+ temp = ipu_csi_read(ipu, csi, CSI_OUT_FRM_CTRL);
+ temp &= ~CSI_VERT_DOWNSIZE_EN;
+ ipu_csi_write(ipu, csi, temp, CSI_OUT_FRM_CTRL);
+}
+
+/*!
+ * _ipu_csi_set_test_generator
+ *
+ * @param ipu ipu handler
+ * @param active 1 for active and 0 for inactive
+ * @param r_value red value for the generated pattern of even pixel
+ * @param g_value green value for the generated pattern of even
+ * pixel
+ * @param b_value blue value for the generated pattern of even pixel
+ * @param pixel_clk desired pixel clock frequency in Hz
+ * @param csi csi 0 or csi 1
+ */
+void _ipu_csi_set_test_generator(struct ipu_soc *ipu, bool active, uint32_t r_value,
+ uint32_t g_value, uint32_t b_value, uint32_t pix_clk, uint32_t csi)
+{
+ uint32_t temp;
+
+ temp = ipu_csi_read(ipu, csi, CSI_TST_CTRL);
+
+ if (active == false) {
+ temp &= ~CSI_TEST_GEN_MODE_EN;
+ ipu_csi_write(ipu, csi, temp, CSI_TST_CTRL);
+ } else {
+ /* Set sensb_mclk div_ratio*/
+ _ipu_csi_mclk_set(ipu, pix_clk, csi);
+
+ temp &= ~(CSI_TEST_GEN_R_MASK | CSI_TEST_GEN_G_MASK |
+ CSI_TEST_GEN_B_MASK);
+ temp |= CSI_TEST_GEN_MODE_EN;
+ temp |= (r_value << CSI_TEST_GEN_R_SHIFT) |
+ (g_value << CSI_TEST_GEN_G_SHIFT) |
+ (b_value << CSI_TEST_GEN_B_SHIFT);
+ ipu_csi_write(ipu, csi, temp, CSI_TST_CTRL);
+ }
+}
+
+/*!
+ * _ipu_csi_ccir_err_detection_en
+ * Enable error detection and correction for
+ * CCIR interlaced mode with protection bit.
+ *
+ * @param ipu ipu handler
+ * @param csi csi 0 or csi 1
+ */
+void _ipu_csi_ccir_err_detection_enable(struct ipu_soc *ipu, uint32_t csi)
+{
+ uint32_t temp;
+
+ temp = ipu_csi_read(ipu, csi, CSI_CCIR_CODE_1);
+ temp |= CSI_CCIR_ERR_DET_EN;
+ ipu_csi_write(ipu, csi, temp, CSI_CCIR_CODE_1);
+
+}
+
+/*!
+ * _ipu_csi_ccir_err_detection_disable
+ * Disable error detection and correction for
+ * CCIR interlaced mode with protection bit.
+ *
+ * @param ipu ipu handler
+ * @param csi csi 0 or csi 1
+ */
+void _ipu_csi_ccir_err_detection_disable(struct ipu_soc *ipu, uint32_t csi)
+{
+ uint32_t temp;
+
+ temp = ipu_csi_read(ipu, csi, CSI_CCIR_CODE_1);
+ temp &= ~CSI_CCIR_ERR_DET_EN;
+ ipu_csi_write(ipu, csi, temp, CSI_CCIR_CODE_1);
+
+}
+
+/*!
+ * _ipu_csi_set_mipi_di
+ *
+ * @param ipu ipu handler
+ * @param num MIPI data identifier 0-3 handled by CSI
+ * @param di_val data identifier value
+ * @param csi csi 0 or csi 1
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int _ipu_csi_set_mipi_di(struct ipu_soc *ipu, uint32_t num, uint32_t di_val, uint32_t csi)
+{
+ uint32_t temp;
+ int retval = 0;
+
+ if (di_val > 0xFFL) {
+ retval = -EINVAL;
+ goto err;
+ }
+
+ temp = ipu_csi_read(ipu, csi, CSI_MIPI_DI);
+
+ switch (num) {
+ case IPU_CSI_MIPI_DI0:
+ temp &= ~CSI_MIPI_DI0_MASK;
+ temp |= (di_val << CSI_MIPI_DI0_SHIFT);
+ ipu_csi_write(ipu, csi, temp, CSI_MIPI_DI);
+ break;
+ case IPU_CSI_MIPI_DI1:
+ temp &= ~CSI_MIPI_DI1_MASK;
+ temp |= (di_val << CSI_MIPI_DI1_SHIFT);
+ ipu_csi_write(ipu, csi, temp, CSI_MIPI_DI);
+ break;
+ case IPU_CSI_MIPI_DI2:
+ temp &= ~CSI_MIPI_DI2_MASK;
+ temp |= (di_val << CSI_MIPI_DI2_SHIFT);
+ ipu_csi_write(ipu, csi, temp, CSI_MIPI_DI);
+ break;
+ case IPU_CSI_MIPI_DI3:
+ temp &= ~CSI_MIPI_DI3_MASK;
+ temp |= (di_val << CSI_MIPI_DI3_SHIFT);
+ ipu_csi_write(ipu, csi, temp, CSI_MIPI_DI);
+ break;
+ default:
+ retval = -EINVAL;
+ }
+
+err:
+ return retval;
+}
+
+/*!
+ * _ipu_csi_set_skip_isp
+ *
+ * @param ipu ipu handler
+ * @param skip select frames to be skipped and set the
+ * correspond bits to 1
+ * @param max_ratio number of frames in a skipping set and the
+ * maximum value of max_ratio is 5
+ * @param csi csi 0 or csi 1
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int _ipu_csi_set_skip_isp(struct ipu_soc *ipu, uint32_t skip, uint32_t max_ratio, uint32_t csi)
+{
+ uint32_t temp;
+ int retval = 0;
+
+ if (max_ratio > 5) {
+ retval = -EINVAL;
+ goto err;
+ }
+
+ temp = ipu_csi_read(ipu, csi, CSI_SKIP);
+ temp &= ~(CSI_MAX_RATIO_SKIP_ISP_MASK | CSI_SKIP_ISP_MASK);
+ temp |= (max_ratio << CSI_MAX_RATIO_SKIP_ISP_SHIFT) |
+ (skip << CSI_SKIP_ISP_SHIFT);
+ ipu_csi_write(ipu, csi, temp, CSI_SKIP);
+
+err:
+ return retval;
+}
+
+/*!
+ * _ipu_csi_set_skip_smfc
+ *
+ * @param ipu ipu handler
+ * @param skip select frames to be skipped and set the
+ * correspond bits to 1
+ * @param max_ratio number of frames in a skipping set and the
+ * maximum value of max_ratio is 5
+ * @param id csi to smfc skipping id
+ * @param csi csi 0 or csi 1
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int _ipu_csi_set_skip_smfc(struct ipu_soc *ipu, uint32_t skip,
+ uint32_t max_ratio, uint32_t id, uint32_t csi)
+{
+ uint32_t temp;
+ int retval = 0;
+
+ if (max_ratio > 5 || id > 3) {
+ retval = -EINVAL;
+ goto err;
+ }
+
+ temp = ipu_csi_read(ipu, csi, CSI_SKIP);
+ temp &= ~(CSI_MAX_RATIO_SKIP_SMFC_MASK | CSI_ID_2_SKIP_MASK |
+ CSI_SKIP_SMFC_MASK);
+ temp |= (max_ratio << CSI_MAX_RATIO_SKIP_SMFC_SHIFT) |
+ (id << CSI_ID_2_SKIP_SHIFT) |
+ (skip << CSI_SKIP_SMFC_SHIFT);
+ ipu_csi_write(ipu, csi, temp, CSI_SKIP);
+
+err:
+ return retval;
+}
+
+/*!
+ * _ipu_smfc_init
+ * Map CSI frames to IDMAC channels.
+ *
+ * @param ipu ipu handler
+ * @param channel IDMAC channel 0-3
+ * @param mipi_id mipi id number 0-3
+ * @param csi csi0 or csi1
+ */
+void _ipu_smfc_init(struct ipu_soc *ipu, ipu_channel_t channel, uint32_t mipi_id, uint32_t csi)
+{
+ uint32_t temp;
+
+ temp = ipu_smfc_read(ipu, SMFC_MAP);
+
+ switch (channel) {
+ case CSI_MEM0:
+ temp &= ~SMFC_MAP_CH0_MASK;
+ temp |= ((csi << 2) | mipi_id) << SMFC_MAP_CH0_SHIFT;
+ break;
+ case CSI_MEM1:
+ temp &= ~SMFC_MAP_CH1_MASK;
+ temp |= ((csi << 2) | mipi_id) << SMFC_MAP_CH1_SHIFT;
+ break;
+ case CSI_MEM2:
+ temp &= ~SMFC_MAP_CH2_MASK;
+ temp |= ((csi << 2) | mipi_id) << SMFC_MAP_CH2_SHIFT;
+ break;
+ case CSI_MEM3:
+ temp &= ~SMFC_MAP_CH3_MASK;
+ temp |= ((csi << 2) | mipi_id) << SMFC_MAP_CH3_SHIFT;
+ break;
+ default:
+ return;
+ }
+
+ ipu_smfc_write(ipu, temp, SMFC_MAP);
+}
+
+/*!
+ * _ipu_smfc_set_wmc
+ * Caution: The number of required channels, the enabled channels
+ * and the FIFO size per channel are configured restrictedly.
+ *
+ * @param ipu ipu handler
+ * @param channel IDMAC channel 0-3
+ * @param set set 1 or clear 0
+ * @param level water mark level when FIFO is on the
+ * relative size
+ */
+void _ipu_smfc_set_wmc(struct ipu_soc *ipu, ipu_channel_t channel, bool set, uint32_t level)
+{
+ uint32_t temp;
+
+ temp = ipu_smfc_read(ipu, SMFC_WMC);
+
+ switch (channel) {
+ case CSI_MEM0:
+ if (set == true) {
+ temp &= ~SMFC_WM0_SET_MASK;
+ temp |= level << SMFC_WM0_SET_SHIFT;
+ } else {
+ temp &= ~SMFC_WM0_CLR_MASK;
+ temp |= level << SMFC_WM0_CLR_SHIFT;
+ }
+ break;
+ case CSI_MEM1:
+ if (set == true) {
+ temp &= ~SMFC_WM1_SET_MASK;
+ temp |= level << SMFC_WM1_SET_SHIFT;
+ } else {
+ temp &= ~SMFC_WM1_CLR_MASK;
+ temp |= level << SMFC_WM1_CLR_SHIFT;
+ }
+ break;
+ case CSI_MEM2:
+ if (set == true) {
+ temp &= ~SMFC_WM2_SET_MASK;
+ temp |= level << SMFC_WM2_SET_SHIFT;
+ } else {
+ temp &= ~SMFC_WM2_CLR_MASK;
+ temp |= level << SMFC_WM2_CLR_SHIFT;
+ }
+ break;
+ case CSI_MEM3:
+ if (set == true) {
+ temp &= ~SMFC_WM3_SET_MASK;
+ temp |= level << SMFC_WM3_SET_SHIFT;
+ } else {
+ temp &= ~SMFC_WM3_CLR_MASK;
+ temp |= level << SMFC_WM3_CLR_SHIFT;
+ }
+ break;
+ default:
+ return;
+ }
+
+ ipu_smfc_write(ipu, temp, SMFC_WMC);
+}
+
+/*!
+ * _ipu_smfc_set_burst_size
+ *
+ * @param ipu ipu handler
+ * @param channel IDMAC channel 0-3
+ * @param bs burst size of IDMAC channel,
+ * the value programmed here shoud be BURST_SIZE-1
+ */
+void _ipu_smfc_set_burst_size(struct ipu_soc *ipu, ipu_channel_t channel, uint32_t bs)
+{
+ uint32_t temp;
+
+ temp = ipu_smfc_read(ipu, SMFC_BS);
+
+ switch (channel) {
+ case CSI_MEM0:
+ temp &= ~SMFC_BS0_MASK;
+ temp |= bs << SMFC_BS0_SHIFT;
+ break;
+ case CSI_MEM1:
+ temp &= ~SMFC_BS1_MASK;
+ temp |= bs << SMFC_BS1_SHIFT;
+ break;
+ case CSI_MEM2:
+ temp &= ~SMFC_BS2_MASK;
+ temp |= bs << SMFC_BS2_SHIFT;
+ break;
+ case CSI_MEM3:
+ temp &= ~SMFC_BS3_MASK;
+ temp |= bs << SMFC_BS3_SHIFT;
+ break;
+ default:
+ return;
+ }
+
+ ipu_smfc_write(ipu, temp, SMFC_BS);
+}
+
+/*!
+ * _ipu_csi_init
+ *
+ * @param ipu ipu handler
+ * @param channel IDMAC channel
+ * @param csi csi 0 or csi 1
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int _ipu_csi_init(struct ipu_soc *ipu, ipu_channel_t channel, uint32_t csi)
+{
+ uint32_t csi_sens_conf, csi_dest;
+ int retval = 0;
+
+ switch (channel) {
+ case CSI_MEM0:
+ case CSI_MEM1:
+ case CSI_MEM2:
+ case CSI_MEM3:
+ csi_dest = CSI_DATA_DEST_IDMAC;
+ break;
+ case CSI_PRP_ENC_MEM:
+ case CSI_PRP_VF_MEM:
+ csi_dest = CSI_DATA_DEST_IC;
+ break;
+ default:
+ retval = -EINVAL;
+ goto err;
+ }
+
+ csi_sens_conf = ipu_csi_read(ipu, csi, CSI_SENS_CONF);
+ csi_sens_conf &= ~CSI_SENS_CONF_DATA_DEST_MASK;
+ ipu_csi_write(ipu, csi, csi_sens_conf | (csi_dest <<
+ CSI_SENS_CONF_DATA_DEST_SHIFT), CSI_SENS_CONF);
+err:
+ return retval;
+}
+
+/*!
+ * csi_irq_handler
+ *
+ * @param irq interrupt id
+ * @param dev_id pointer to ipu handler
+ *
+ * @return Returns if irq is handled
+ */
+static irqreturn_t csi_irq_handler(int irq, void *dev_id)
+{
+ struct ipu_soc *ipu = dev_id;
+ struct completion *comp = &ipu->csi_comp;
+
+ complete(comp);
+ return IRQ_HANDLED;
+}
+
+/*!
+ * _ipu_csi_wait4eof
+ *
+ * @param ipu ipu handler
+ * @param channel IDMAC channel
+ *
+ */
+void _ipu_csi_wait4eof(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ int ret;
+ int irq = 0;
+
+ if (channel == CSI_MEM0)
+ irq = IPU_IRQ_CSI0_OUT_EOF;
+ else if (channel == CSI_MEM1)
+ irq = IPU_IRQ_CSI1_OUT_EOF;
+ else if (channel == CSI_MEM2)
+ irq = IPU_IRQ_CSI2_OUT_EOF;
+ else if (channel == CSI_MEM3)
+ irq = IPU_IRQ_CSI3_OUT_EOF;
+ else if (channel == CSI_PRP_ENC_MEM)
+ irq = IPU_IRQ_PRP_ENC_OUT_EOF;
+ else if (channel == CSI_PRP_VF_MEM)
+ irq = IPU_IRQ_PRP_VF_OUT_EOF;
+ else{
+ dev_err(ipu->dev, "Not a CSI channel\n");
+ return;
+ }
+
+ init_completion(&ipu->csi_comp);
+ ret = ipu_request_irq(ipu, irq, csi_irq_handler, 0, NULL, ipu);
+ if (ret < 0) {
+ dev_err(ipu->dev, "CSI irq %d in use\n", irq);
+ return;
+ }
+ ret = wait_for_completion_timeout(&ipu->csi_comp, msecs_to_jiffies(500));
+ ipu_free_irq(ipu, irq, ipu);
+ dev_dbg(ipu->dev, "CSI stop timeout - %d * 10ms\n", 5 - ret);
+}
diff --git a/drivers/mxc/ipu3/ipu_common.c b/drivers/mxc/ipu3/ipu_common.c
new file mode 100644
index 000000000000..c5b82f78421f
--- /dev/null
+++ b/drivers/mxc/ipu3/ipu_common.c
@@ -0,0 +1,3494 @@
+/*
+ * Copyright 2005-2016 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file ipu_common.c
+ *
+ * @brief This file contains the IPU driver common API functions.
+ *
+ * @ingroup IPU
+ */
+#include <linux/busfreq-imx.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/ipu-v3.h>
+#include <linux/irq.h>
+#include <linux/irqdesc.h>
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/reset.h>
+#include <linux/spinlock.h>
+#include <linux/types.h>
+
+#include <asm/cacheflush.h>
+
+#include "ipu_param_mem.h"
+#include "ipu_regs.h"
+
+static struct ipu_soc ipu_array[MXC_IPU_MAX_NUM];
+
+/* Static functions */
+static irqreturn_t ipu_sync_irq_handler(int irq, void *desc);
+static irqreturn_t ipu_err_irq_handler(int irq, void *desc);
+
+static inline uint32_t channel_2_dma(ipu_channel_t ch, ipu_buffer_t type)
+{
+ return ((uint32_t) ch >> (6 * type)) & 0x3F;
+};
+
+static inline int _ipu_is_ic_chan(uint32_t dma_chan)
+{
+ return (((dma_chan >= 11) && (dma_chan <= 22) && (dma_chan != 17) &&
+ (dma_chan != 18)));
+}
+
+static inline int _ipu_is_vdi_out_chan(uint32_t dma_chan)
+{
+ return (dma_chan == 5);
+}
+
+static inline int _ipu_is_ic_graphic_chan(uint32_t dma_chan)
+{
+ return (dma_chan == 14 || dma_chan == 15);
+}
+
+/* Either DP BG or DP FG can be graphic window */
+static inline int _ipu_is_dp_graphic_chan(uint32_t dma_chan)
+{
+ return (dma_chan == 23 || dma_chan == 27);
+}
+
+static inline int _ipu_is_irt_chan(uint32_t dma_chan)
+{
+ return ((dma_chan >= 45) && (dma_chan <= 50));
+}
+
+static inline int _ipu_is_dmfc_chan(uint32_t dma_chan)
+{
+ return ((dma_chan >= 23) && (dma_chan <= 29));
+}
+
+static inline int _ipu_is_trb_chan(struct ipu_soc *ipu, uint32_t dma_chan)
+{
+ return (((dma_chan == 8) || (dma_chan == 9) ||
+ (dma_chan == 10) || (dma_chan == 13) ||
+ (dma_chan == 21) || (dma_chan == 23) ||
+ (dma_chan == 27) || (dma_chan == 28)) &&
+ (ipu->devtype >= IPUv3EX));
+}
+
+/*
+ * We usually use IDMAC 23 as full plane and IDMAC 27 as partial
+ * plane.
+ * IDMAC 23/24/28/41 can drive a display respectively - primary
+ * IDMAC 27 depends on IDMAC 23 - nonprimary
+ */
+static inline int _ipu_is_primary_disp_chan(uint32_t dma_chan)
+{
+ return ((dma_chan == 23) || (dma_chan == 24) ||
+ (dma_chan == 28) || (dma_chan == 41));
+}
+
+static inline int _ipu_is_sync_irq(uint32_t irq)
+{
+ /* sync interrupt register number */
+ int reg_num = irq / 32 + 1;
+
+ return ((reg_num == 1) || (reg_num == 2) || (reg_num == 3) ||
+ (reg_num == 4) || (reg_num == 7) || (reg_num == 8) ||
+ (reg_num == 11) || (reg_num == 12) || (reg_num == 13) ||
+ (reg_num == 14) || (reg_num == 15));
+}
+
+static inline uint32_t tri_cur_buf_mask(uint32_t dma_chan)
+{
+ uint32_t mask = 1UL << ((dma_chan * 2) & 0x1F);
+
+ return mask * 3;
+}
+
+static inline uint32_t tri_cur_buf_shift(uint32_t dma_chan)
+{
+ uint32_t mask = 1UL << ((dma_chan * 2) & 0x1F);
+
+ return ffs(mask) - 1;
+}
+
+#define idma_is_valid(ch) ((ch) != NO_DMA)
+#define idma_mask(ch) (idma_is_valid(ch) ? (1UL << ((ch) & 0x1F)) : 0)
+
+static inline bool idma_is_set(struct ipu_soc *ipu, uint32_t reg, uint32_t dma)
+{
+ return !!(ipu_idmac_read(ipu, reg) & idma_mask(dma));
+}
+
+static int ipu_clk_setup_enable(struct ipu_soc *ipu)
+{
+ char pixel_clk[11];
+ char pixel_clk_sel[15];
+ char pixel_clk_div[15];
+ char pixel_clk_parent0[5];
+ char pixel_clk_parent1[9];
+ char *pixel_clk_parents[2];
+ char di_clk[4];
+ char di_clk_sel[8];
+ struct clk *clk;
+ unsigned int di;
+ unsigned int ipu_id; /* for clk naming */
+ int ret;
+
+ dev_dbg(ipu->dev, "ipu_clk = %lu\n", clk_get_rate(ipu->ipu_clk));
+
+ ipu_id = ipu->id + 1;
+
+ pixel_clk_parents[0] = pixel_clk_parent0;
+ pixel_clk_parents[1] = pixel_clk_parent1;
+
+ for (di = 0; di < 2; di++) {
+ snprintf(pixel_clk_sel, sizeof(pixel_clk_sel),
+ "ipu%u_pclk%u_sel", ipu_id, di);
+ snprintf(pixel_clk_parent0, sizeof(pixel_clk_parent0),
+ "ipu%u", ipu_id);
+ snprintf(pixel_clk_parent1, sizeof(pixel_clk_parent1),
+ "ipu%u_di%u", ipu_id, di);
+ clk = clk_register_mux_pix_clk(ipu->dev, pixel_clk_sel,
+ (const char **)pixel_clk_parents,
+ ARRAY_SIZE(pixel_clk_parents),
+ 0, ipu->id, di, 0);
+ if (IS_ERR(clk)) {
+ dev_err(ipu->dev, "di%u mux clk register failed\n", di);
+ return PTR_ERR(clk);
+ }
+ ipu->pixel_clk_sel[di] = clk;
+
+ snprintf(pixel_clk_div, sizeof(pixel_clk_div),
+ "ipu%u_pclk%u_div", ipu_id, di);
+ clk = clk_register_div_pix_clk(ipu->dev, pixel_clk_div,
+ pixel_clk_sel, 0, ipu->id, di, 0);
+ if (IS_ERR(clk)) {
+ dev_err(ipu->dev, "di%u div clk register failed\n", di);
+ return PTR_ERR(clk);
+ }
+
+ snprintf(pixel_clk, sizeof(pixel_clk),
+ "ipu%u_pclk%u", ipu_id, di);
+ ipu->pixel_clk[di] = clk_register_gate_pix_clk(ipu->dev,
+ pixel_clk, pixel_clk_div,
+ CLK_SET_RATE_PARENT, ipu->id, di, 0);
+ if (IS_ERR(ipu->pixel_clk[di])) {
+ dev_err(ipu->dev,
+ "di%u gate clk register failed\n", di);
+ return PTR_ERR(ipu->pixel_clk[di]);
+ }
+
+ ret = clk_set_parent(ipu->pixel_clk_sel[di], ipu->ipu_clk);
+ if (ret) {
+ dev_err(ipu->dev, "pixel clk set parent failed\n");
+ return ret;
+ }
+
+ snprintf(di_clk, sizeof(di_clk), "di%u", di);
+ ipu->di_clk[di] = devm_clk_get(ipu->dev, di_clk);
+ if (IS_ERR(ipu->di_clk[di])) {
+ dev_err(ipu->dev, "di%u clk get failed\n", di);
+ return PTR_ERR(ipu->di_clk[di]);
+ }
+
+ snprintf(di_clk_sel, sizeof(di_clk_sel), "di%u_sel", di);
+ ipu->di_clk_sel[di] = devm_clk_get(ipu->dev, di_clk_sel);
+ if (IS_ERR(ipu->di_clk_sel[di])) {
+ dev_err(ipu->dev, "di%u sel clk get failed\n", di);
+ return PTR_ERR(ipu->di_clk_sel[di]);
+ }
+ }
+
+ return 0;
+}
+
+static int ipu_mem_reset(struct ipu_soc *ipu)
+{
+ int timeout = 1000;
+
+ ipu_cm_write(ipu, 0x807FFFFF, IPU_MEM_RST);
+
+ while (ipu_cm_read(ipu, IPU_MEM_RST) & 0x80000000) {
+ if (!timeout--)
+ return -ETIME;
+ msleep(1);
+ }
+
+ return 0;
+}
+
+struct ipu_soc *ipu_get_soc(int id)
+{
+ if (id >= MXC_IPU_MAX_NUM)
+ return ERR_PTR(-ENODEV);
+ else if (!ipu_array[id].online)
+ return ERR_PTR(-ENODEV);
+ else
+ return &(ipu_array[id]);
+}
+EXPORT_SYMBOL_GPL(ipu_get_soc);
+
+void _ipu_get(struct ipu_soc *ipu)
+{
+ int ret;
+
+ ret = clk_enable(ipu->ipu_clk);
+ if (ret < 0)
+ BUG();
+}
+
+void _ipu_put(struct ipu_soc *ipu)
+{
+ clk_disable(ipu->ipu_clk);
+}
+
+void ipu_disable_hsp_clk(struct ipu_soc *ipu)
+{
+ _ipu_put(ipu);
+}
+EXPORT_SYMBOL(ipu_disable_hsp_clk);
+
+struct ipu_devtype {
+ const char *name;
+ unsigned long cm_ofs;
+ unsigned long idmac_ofs;
+ unsigned long ic_ofs;
+ unsigned long csi0_ofs;
+ unsigned long csi1_ofs;
+ unsigned long di0_ofs;
+ unsigned long di1_ofs;
+ unsigned long smfc_ofs;
+ unsigned long dc_ofs;
+ unsigned long dmfc_ofs;
+ unsigned long vdi_ofs;
+ unsigned long cpmem_ofs;
+ unsigned long srm_ofs;
+ unsigned long tpm_ofs;
+ unsigned long dc_tmpl_ofs;
+ enum ipuv3_type type;
+ bool idmac_used_bufs_present;
+};
+
+struct ipu_platform_type {
+ struct ipu_devtype devtype;
+ unsigned int ch0123_axi;
+ unsigned int ch23_axi;
+ unsigned int ch27_axi;
+ unsigned int ch28_axi;
+ unsigned int normal_axi;
+ bool smfc_idmac_12bit_3planar_bs_fixup; /* workaround little stripes */
+ bool idmac_used_bufs_en_r;
+ bool idmac_used_bufs_en_w;
+ unsigned int idmac_used_bufs_max_r;
+ unsigned int idmac_used_bufs_max_w;
+};
+
+static struct ipu_platform_type ipu_type_imx51 = {
+ .devtype = {
+ .name = "IPUv3EX",
+ .cm_ofs = 0x1E000000,
+ .idmac_ofs = 0x1E008000,
+ .ic_ofs = 0x1E020000,
+ .csi0_ofs = 0x1E030000,
+ .csi1_ofs = 0x1E038000,
+ .di0_ofs = 0x1E040000,
+ .di1_ofs = 0x1E048000,
+ .smfc_ofs = 0x1E050000,
+ .dc_ofs = 0x1E058000,
+ .dmfc_ofs = 0x1E060000,
+ .vdi_ofs = 0x1E068000,
+ .cpmem_ofs = 0x1F000000,
+ .srm_ofs = 0x1F040000,
+ .tpm_ofs = 0x1F060000,
+ .dc_tmpl_ofs = 0x1F080000,
+ .type = IPUv3EX,
+ .idmac_used_bufs_present = false,
+ },
+ .ch0123_axi = 1,
+ .ch23_axi = 1,
+ .ch23_axi = 1,
+ .ch27_axi = 1,
+ .ch28_axi = 1,
+ .normal_axi = 0,
+ .smfc_idmac_12bit_3planar_bs_fixup = false,
+};
+
+static struct ipu_platform_type ipu_type_imx53 = {
+ .devtype = {
+ .name = "IPUv3M",
+ .cm_ofs = 0x06000000,
+ .idmac_ofs = 0x06008000,
+ .ic_ofs = 0x06020000,
+ .csi0_ofs = 0x06030000,
+ .csi1_ofs = 0x06038000,
+ .di0_ofs = 0x06040000,
+ .di1_ofs = 0x06048000,
+ .smfc_ofs = 0x06050000,
+ .dc_ofs = 0x06058000,
+ .dmfc_ofs = 0x06060000,
+ .vdi_ofs = 0x06068000,
+ .cpmem_ofs = 0x07000000,
+ .srm_ofs = 0x07040000,
+ .tpm_ofs = 0x07060000,
+ .dc_tmpl_ofs = 0x07080000,
+ .type = IPUv3M,
+ .idmac_used_bufs_present = true,
+ },
+ .ch0123_axi = 1,
+ .ch23_axi = 1,
+ .ch27_axi = 1,
+ .ch28_axi = 1,
+ .normal_axi = 0,
+ .idmac_used_bufs_en_r = false,
+ .idmac_used_bufs_en_w = false,
+ .smfc_idmac_12bit_3planar_bs_fixup = false,
+};
+
+static struct ipu_platform_type ipu_type_imx6q = {
+ .devtype = {
+ .name = "IPUv3H",
+ .cm_ofs = 0x00200000,
+ .idmac_ofs = 0x00208000,
+ .ic_ofs = 0x00220000,
+ .csi0_ofs = 0x00230000,
+ .csi1_ofs = 0x00238000,
+ .di0_ofs = 0x00240000,
+ .di1_ofs = 0x00248000,
+ .smfc_ofs = 0x00250000,
+ .dc_ofs = 0x00258000,
+ .dmfc_ofs = 0x00260000,
+ .vdi_ofs = 0x00268000,
+ .cpmem_ofs = 0x00300000,
+ .srm_ofs = 0x00340000,
+ .tpm_ofs = 0x00360000,
+ .dc_tmpl_ofs = 0x00380000,
+ .type = IPUv3H,
+ .idmac_used_bufs_present = true,
+ },
+ .ch0123_axi = 0,
+ .ch23_axi = 0,
+ .ch27_axi = 0,
+ .ch28_axi = 0,
+ .normal_axi = 1,
+ .idmac_used_bufs_en_r = false,
+ .idmac_used_bufs_en_w = false,
+ .smfc_idmac_12bit_3planar_bs_fixup = false,
+};
+
+static struct ipu_platform_type ipu_type_imx6qp = {
+ .devtype = {
+ .name = "IPUv3H",
+ .cm_ofs = 0x00200000,
+ .idmac_ofs = 0x00208000,
+ .ic_ofs = 0x00220000,
+ .csi0_ofs = 0x00230000,
+ .csi1_ofs = 0x00238000,
+ .di0_ofs = 0x00240000,
+ .di1_ofs = 0x00248000,
+ .smfc_ofs = 0x00250000,
+ .dc_ofs = 0x00258000,
+ .dmfc_ofs = 0x00260000,
+ .vdi_ofs = 0x00268000,
+ .cpmem_ofs = 0x00300000,
+ .srm_ofs = 0x00340000,
+ .tpm_ofs = 0x00360000,
+ .dc_tmpl_ofs = 0x00380000,
+ .type = IPUv3H,
+ .idmac_used_bufs_present = true,
+ },
+ .ch0123_axi = 0,
+ .ch23_axi = 0,
+ .ch27_axi = 2,
+ .ch28_axi = 3,
+ .normal_axi = 1,
+ .idmac_used_bufs_en_r = true,
+ .idmac_used_bufs_en_w = true,
+ .idmac_used_bufs_max_r = 0x3,
+ .idmac_used_bufs_max_w = 0x3,
+ .smfc_idmac_12bit_3planar_bs_fixup = true,
+ };
+
+static const struct of_device_id imx_ipuv3_dt_ids[] = {
+ { .compatible = "fsl,imx51-ipu", .data = &ipu_type_imx51, },
+ { .compatible = "fsl,imx53-ipu", .data = &ipu_type_imx53, },
+ { .compatible = "fsl,imx6q-ipu", .data = &ipu_type_imx6q, },
+ { .compatible = "fsl,imx6qp-ipu", .data = &ipu_type_imx6qp, },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, imx_ipuv3_dt_ids);
+
+/*!
+ * This function is called by the driver framework to initialize the IPU
+ * hardware.
+ *
+ * @param dev The device structure for the IPU passed in by the
+ * driver framework.
+ *
+ * @return Returns 0 on success or negative error code on error
+ */
+static int ipu_probe(struct platform_device *pdev)
+{
+ struct ipu_soc *ipu;
+ struct resource *res;
+ unsigned long ipu_base;
+ const struct of_device_id *of_id =
+ of_match_device(imx_ipuv3_dt_ids, &pdev->dev);
+ const struct ipu_platform_type *iputype = of_id->data;
+ const struct ipu_devtype *devtype = &iputype->devtype;
+ int ret = 0, id;
+ u32 bypass_reset, reg;
+
+ dev_dbg(&pdev->dev, "<%s>\n", __func__);
+
+ ret = of_property_read_u32(pdev->dev.of_node,
+ "bypass_reset", &bypass_reset);
+ if (ret < 0) {
+ dev_dbg(&pdev->dev, "can not get bypass_reset\n");
+ return ret;
+ }
+
+ id = of_alias_get_id(pdev->dev.of_node, "ipu");
+ if (id < 0) {
+ dev_dbg(&pdev->dev, "can not get alias id\n");
+ return id;
+ }
+
+ ipu = &ipu_array[id];
+ memset(ipu, 0, sizeof(struct ipu_soc));
+ ipu->bypass_reset = (bool)bypass_reset;
+ ipu->dev = &pdev->dev;
+ ipu->id = id;
+ ipu->devtype = devtype->type;
+ ipu->ch0123_axi = iputype->ch0123_axi;
+ ipu->ch23_axi = iputype->ch23_axi;
+ ipu->ch27_axi = iputype->ch27_axi;
+ ipu->ch28_axi = iputype->ch28_axi;
+ ipu->normal_axi = iputype->normal_axi;
+ ipu->smfc_idmac_12bit_3planar_bs_fixup =
+ iputype->smfc_idmac_12bit_3planar_bs_fixup;
+ spin_lock_init(&ipu->int_reg_spin_lock);
+ spin_lock_init(&ipu->rdy_reg_spin_lock);
+ mutex_init(&ipu->mutex_lock);
+
+ dev_dbg(&pdev->dev, "revision is %s\n", devtype->name);
+
+ ipu->irq_sync = platform_get_irq(pdev, 0);
+ ipu->irq_err = platform_get_irq(pdev, 1);
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+ if (!res || ipu->irq_sync < 0 || ipu->irq_err < 0) {
+ dev_err(&pdev->dev, "can't get device resources\n");
+ return -ENODEV;
+ }
+
+ if (!devm_request_mem_region(&pdev->dev, res->start,
+ resource_size(res), pdev->name))
+ return -EBUSY;
+
+ ret = devm_request_irq(&pdev->dev, ipu->irq_sync,
+ ipu_sync_irq_handler, 0, pdev->name, ipu);
+ if (ret) {
+ dev_err(ipu->dev, "request SYNC interrupt failed\n");
+ return ret;
+ }
+ ret = devm_request_irq(&pdev->dev, ipu->irq_err,
+ ipu_err_irq_handler, 0, pdev->name, ipu);
+ if (ret) {
+ dev_err(ipu->dev, "request ERR interrupt failed\n");
+ return ret;
+ }
+
+ ipu_base = res->start;
+
+ ipu->cm_reg = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->cm_ofs, PAGE_SIZE);
+ ipu->ic_reg = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->ic_ofs, PAGE_SIZE);
+ ipu->idmac_reg = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->idmac_ofs, PAGE_SIZE);
+ /* DP Registers are accessed thru the SRM */
+ ipu->dp_reg = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->srm_ofs, PAGE_SIZE);
+ ipu->dc_reg = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->dc_ofs, PAGE_SIZE);
+ ipu->dmfc_reg = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->dmfc_ofs, PAGE_SIZE);
+ ipu->di_reg[0] = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->di0_ofs, PAGE_SIZE);
+ ipu->di_reg[1] = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->di1_ofs, PAGE_SIZE);
+ ipu->smfc_reg = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->smfc_ofs, PAGE_SIZE);
+ ipu->csi_reg[0] = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->csi0_ofs, PAGE_SIZE);
+ ipu->csi_reg[1] = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->csi1_ofs, PAGE_SIZE);
+ ipu->cpmem_base = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->cpmem_ofs, SZ_128K);
+ ipu->tpmem_base = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->tpm_ofs, SZ_64K);
+ ipu->dc_tmpl_reg = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->dc_tmpl_ofs, SZ_128K);
+ ipu->vdi_reg = devm_ioremap(&pdev->dev,
+ ipu_base + devtype->vdi_ofs, PAGE_SIZE);
+ if (!ipu->cm_reg || !ipu->ic_reg || !ipu->idmac_reg ||
+ !ipu->dp_reg || !ipu->dc_reg || !ipu->dmfc_reg ||
+ !ipu->di_reg[0] || !ipu->di_reg[1] || !ipu->smfc_reg ||
+ !ipu->csi_reg[0] || !ipu->csi_reg[1] || !ipu->cpmem_base ||
+ !ipu->tpmem_base || !ipu->dc_tmpl_reg || !ipu->vdi_reg)
+ return -ENOMEM;
+
+ dev_dbg(ipu->dev, "IPU CM Regs = %p\n", ipu->cm_reg);
+ dev_dbg(ipu->dev, "IPU IC Regs = %p\n", ipu->ic_reg);
+ dev_dbg(ipu->dev, "IPU IDMAC Regs = %p\n", ipu->idmac_reg);
+ dev_dbg(ipu->dev, "IPU DP Regs = %p\n", ipu->dp_reg);
+ dev_dbg(ipu->dev, "IPU DC Regs = %p\n", ipu->dc_reg);
+ dev_dbg(ipu->dev, "IPU DMFC Regs = %p\n", ipu->dmfc_reg);
+ dev_dbg(ipu->dev, "IPU DI0 Regs = %p\n", ipu->di_reg[0]);
+ dev_dbg(ipu->dev, "IPU DI1 Regs = %p\n", ipu->di_reg[1]);
+ dev_dbg(ipu->dev, "IPU SMFC Regs = %p\n", ipu->smfc_reg);
+ dev_dbg(ipu->dev, "IPU CSI0 Regs = %p\n", ipu->csi_reg[0]);
+ dev_dbg(ipu->dev, "IPU CSI1 Regs = %p\n", ipu->csi_reg[1]);
+ dev_dbg(ipu->dev, "IPU CPMem = %p\n", ipu->cpmem_base);
+ dev_dbg(ipu->dev, "IPU TPMem = %p\n", ipu->tpmem_base);
+ dev_dbg(ipu->dev, "IPU DC Template Mem = %p\n", ipu->dc_tmpl_reg);
+ dev_dbg(ipu->dev, "IPU VDI Regs = %p\n", ipu->vdi_reg);
+
+ ipu->ipu_clk = devm_clk_get(ipu->dev, "bus");
+ if (IS_ERR(ipu->ipu_clk)) {
+ dev_err(ipu->dev, "clk_get ipu failed");
+ return PTR_ERR(ipu->ipu_clk);
+ }
+
+ /* ipu_clk is always prepared */
+ ret = clk_prepare_enable(ipu->ipu_clk);
+ if (ret < 0) {
+ dev_err(ipu->dev, "ipu clk enable failed\n");
+ return ret;
+ }
+
+ ipu->prg_clk = devm_clk_get(ipu->dev, "prg");
+ if (IS_ERR(ipu->prg_clk))
+ ipu->prg_clk = NULL;
+
+ ipu->online = true;
+
+ platform_set_drvdata(pdev, ipu);
+
+ if (!bypass_reset) {
+ ret = device_reset(&pdev->dev);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to reset: %d\n", ret);
+ return ret;
+ }
+
+ ipu_mem_reset(ipu);
+
+ ipu_disp_init(ipu);
+
+ /* Set MCU_T to divide MCU access window into 2 */
+ ipu_cm_write(ipu, 0x00400000L | (IPU_MCU_T_DEFAULT << 18),
+ IPU_DISP_GEN);
+ }
+
+ /* setup ipu clk tree after ipu reset */
+ ret = ipu_clk_setup_enable(ipu);
+ if (ret < 0) {
+ dev_err(ipu->dev, "ipu clk setup failed\n");
+ ipu->online = false;
+ return ret;
+ }
+
+ if (devtype->idmac_used_bufs_present) {
+ reg = ipu_idmac_read(ipu, IDMAC_CONF);
+ if (iputype->idmac_used_bufs_en_r)
+ reg |= IDMAC_CONF_USED_BUFS_EN_R;
+ else
+ reg &= ~IDMAC_CONF_USED_BUFS_EN_R;
+ if (iputype->idmac_used_bufs_en_w)
+ reg |= IDMAC_CONF_USED_BUFS_EN_W;
+ else
+ reg &= ~IDMAC_CONF_USED_BUFS_EN_W;
+
+ reg &= ~IDMAC_CONF_USED_BUFS_MAX_R_MASK;
+ reg |= (iputype->idmac_used_bufs_max_r <<
+ IDMAC_CONF_USED_BUFS_MAX_R_OFFSET);
+ reg &= ~IDMAC_CONF_USED_BUFS_MAX_W_MASK;
+ reg |= (iputype->idmac_used_bufs_max_w <<
+ IDMAC_CONF_USED_BUFS_MAX_W_OFFSET);
+ ipu_idmac_write(ipu, reg, IDMAC_CONF);
+ }
+
+ /* Set sync refresh channels and CSI->mem channel as high priority */
+ ipu_idmac_write(ipu, 0x18800003L, IDMAC_CHA_PRI(0));
+
+ /* Enable error interrupts by default */
+ ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(5));
+ ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(6));
+ ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(9));
+ ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(10));
+
+ if (!bypass_reset)
+ clk_disable(ipu->ipu_clk);
+
+ register_ipu_device(ipu, id);
+
+ pm_runtime_enable(&pdev->dev);
+
+ return ret;
+}
+
+int ipu_remove(struct platform_device *pdev)
+{
+ struct ipu_soc *ipu = platform_get_drvdata(pdev);
+
+ unregister_ipu_device(ipu, ipu->id);
+
+ clk_put(ipu->ipu_clk);
+
+ return 0;
+}
+
+void ipu_dump_registers(struct ipu_soc *ipu)
+{
+ dev_dbg(ipu->dev, "IPU_CONF = \t0x%08X\n", ipu_cm_read(ipu, IPU_CONF));
+ dev_dbg(ipu->dev, "IDMAC_CONF = \t0x%08X\n", ipu_idmac_read(ipu, IDMAC_CONF));
+ dev_dbg(ipu->dev, "IDMAC_CHA_EN1 = \t0x%08X\n",
+ ipu_idmac_read(ipu, IDMAC_CHA_EN(0)));
+ dev_dbg(ipu->dev, "IDMAC_CHA_EN2 = \t0x%08X\n",
+ ipu_idmac_read(ipu, IDMAC_CHA_EN(32)));
+ dev_dbg(ipu->dev, "IDMAC_CHA_PRI1 = \t0x%08X\n",
+ ipu_idmac_read(ipu, IDMAC_CHA_PRI(0)));
+ dev_dbg(ipu->dev, "IDMAC_CHA_PRI2 = \t0x%08X\n",
+ ipu_idmac_read(ipu, IDMAC_CHA_PRI(32)));
+ dev_dbg(ipu->dev, "IDMAC_BAND_EN1 = \t0x%08X\n",
+ ipu_idmac_read(ipu, IDMAC_BAND_EN(ipu->devtype, 0)));
+ dev_dbg(ipu->dev, "IDMAC_BAND_EN2 = \t0x%08X\n",
+ ipu_idmac_read(ipu, IDMAC_BAND_EN(ipu->devtype, 32)));
+ dev_dbg(ipu->dev, "IPU_CHA_DB_MODE_SEL0 = \t0x%08X\n",
+ ipu_cm_read(ipu, IPU_CHA_DB_MODE_SEL(0)));
+ dev_dbg(ipu->dev, "IPU_CHA_DB_MODE_SEL1 = \t0x%08X\n",
+ ipu_cm_read(ipu, IPU_CHA_DB_MODE_SEL(32)));
+ if (ipu->devtype >= IPUv3EX) {
+ dev_dbg(ipu->dev, "IPU_CHA_TRB_MODE_SEL0 = \t0x%08X\n",
+ ipu_cm_read(ipu, IPU_CHA_TRB_MODE_SEL(ipu->devtype, 0)));
+ dev_dbg(ipu->dev, "IPU_CHA_TRB_MODE_SEL1 = \t0x%08X\n",
+ ipu_cm_read(ipu,
+ IPU_CHA_TRB_MODE_SEL(ipu->devtype, 32)));
+ }
+ dev_dbg(ipu->dev, "DMFC_WR_CHAN = \t0x%08X\n",
+ ipu_dmfc_read(ipu, DMFC_WR_CHAN));
+ dev_dbg(ipu->dev, "DMFC_WR_CHAN_DEF = \t0x%08X\n",
+ ipu_dmfc_read(ipu, DMFC_WR_CHAN_DEF));
+ dev_dbg(ipu->dev, "DMFC_DP_CHAN = \t0x%08X\n",
+ ipu_dmfc_read(ipu, DMFC_DP_CHAN));
+ dev_dbg(ipu->dev, "DMFC_DP_CHAN_DEF = \t0x%08X\n",
+ ipu_dmfc_read(ipu, DMFC_DP_CHAN_DEF));
+ dev_dbg(ipu->dev, "DMFC_IC_CTRL = \t0x%08X\n",
+ ipu_dmfc_read(ipu, DMFC_IC_CTRL));
+ dev_dbg(ipu->dev, "IPU_FS_PROC_FLOW1 = \t0x%08X\n",
+ ipu_cm_read(ipu, IPU_FS_PROC_FLOW1));
+ dev_dbg(ipu->dev, "IPU_FS_PROC_FLOW2 = \t0x%08X\n",
+ ipu_cm_read(ipu, IPU_FS_PROC_FLOW2));
+ dev_dbg(ipu->dev, "IPU_FS_PROC_FLOW3 = \t0x%08X\n",
+ ipu_cm_read(ipu, IPU_FS_PROC_FLOW3));
+ dev_dbg(ipu->dev, "IPU_FS_DISP_FLOW1 = \t0x%08X\n",
+ ipu_cm_read(ipu, IPU_FS_DISP_FLOW1));
+ dev_dbg(ipu->dev, "IPU_VDIC_VDI_FSIZE = \t0x%08X\n",
+ ipu_vdi_read(ipu, VDI_FSIZE));
+ dev_dbg(ipu->dev, "IPU_VDIC_VDI_C = \t0x%08X\n",
+ ipu_vdi_read(ipu, VDI_C));
+ dev_dbg(ipu->dev, "IPU_IC_CONF = \t0x%08X\n",
+ ipu_ic_read(ipu, IC_CONF));
+}
+
+/*!
+ * This function is called to initialize a logical IPU channel.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID to init.
+ *
+ * @param params Input parameter containing union of channel
+ * initialization parameters.
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int32_t ipu_init_channel(struct ipu_soc *ipu, ipu_channel_t channel, ipu_channel_params_t *params)
+{
+ int ret = 0;
+ bool bad_pixfmt;
+ uint32_t ipu_conf, reg, in_g_pixel_fmt, sec_dma;
+
+ dev_dbg(ipu->dev, "init channel = %d\n", IPU_CHAN_ID(channel));
+
+ ret = pm_runtime_get_sync(ipu->dev);
+ if (ret < 0) {
+ dev_err(ipu->dev, "ch = %d, pm_runtime_get failed:%d!\n",
+ IPU_CHAN_ID(channel), ret);
+ dump_stack();
+ return ret;
+ }
+ /*
+ * Here, ret could be 1 if the device's runtime PM status was
+ * already 'active', so clear it to be 0.
+ */
+ ret = 0;
+
+ _ipu_get(ipu);
+
+ mutex_lock(&ipu->mutex_lock);
+
+ /* Re-enable error interrupts every time a channel is initialized */
+ ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(5));
+ ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(6));
+ ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(9));
+ ipu_cm_write(ipu, 0xFFFFFFFF, IPU_INT_CTRL(10));
+
+ if (ipu->channel_init_mask & (1L << IPU_CHAN_ID(channel))) {
+ dev_warn(ipu->dev, "Warning: channel already initialized %d\n",
+ IPU_CHAN_ID(channel));
+ }
+
+ ipu_conf = ipu_cm_read(ipu, IPU_CONF);
+
+ switch (channel) {
+ case CSI_MEM0:
+ case CSI_MEM1:
+ case CSI_MEM2:
+ case CSI_MEM3:
+ if (params->csi_mem.csi > 1) {
+ ret = -EINVAL;
+ goto err;
+ }
+
+ if (params->csi_mem.interlaced)
+ ipu->chan_is_interlaced[channel_2_dma(channel,
+ IPU_OUTPUT_BUFFER)] = true;
+ else
+ ipu->chan_is_interlaced[channel_2_dma(channel,
+ IPU_OUTPUT_BUFFER)] = false;
+
+ ipu->smfc_use_count++;
+ ipu->csi_channel[params->csi_mem.csi] = channel;
+
+ /*SMFC setting*/
+ if (params->csi_mem.mipi_en) {
+ ipu_conf |= (1 << (IPU_CONF_CSI0_DATA_SOURCE_OFFSET +
+ params->csi_mem.csi));
+ _ipu_smfc_init(ipu, channel, params->csi_mem.mipi_vc,
+ params->csi_mem.csi);
+ _ipu_csi_set_mipi_di(ipu, params->csi_mem.mipi_vc,
+ params->csi_mem.mipi_id, params->csi_mem.csi);
+ } else {
+ ipu_conf &= ~(1 << (IPU_CONF_CSI0_DATA_SOURCE_OFFSET +
+ params->csi_mem.csi));
+ _ipu_smfc_init(ipu, channel, 0, params->csi_mem.csi);
+ }
+
+ /*CSI data (include compander) dest*/
+ _ipu_csi_init(ipu, channel, params->csi_mem.csi);
+ break;
+ case CSI_PRP_ENC_MEM:
+ if (params->csi_prp_enc_mem.csi > 1) {
+ ret = -EINVAL;
+ goto err;
+ }
+ if ((ipu->using_ic_dirct_ch == MEM_VDI_PRP_VF_MEM) ||
+ (ipu->using_ic_dirct_ch == MEM_VDI_MEM)) {
+ ret = -EINVAL;
+ goto err;
+ }
+ ipu->using_ic_dirct_ch = CSI_PRP_ENC_MEM;
+
+ ipu->ic_use_count++;
+ ipu->csi_channel[params->csi_prp_enc_mem.csi] = channel;
+
+ if (params->csi_prp_enc_mem.mipi_en) {
+ ipu_conf |= (1 << (IPU_CONF_CSI0_DATA_SOURCE_OFFSET +
+ params->csi_prp_enc_mem.csi));
+ _ipu_csi_set_mipi_di(ipu,
+ params->csi_prp_enc_mem.mipi_vc,
+ params->csi_prp_enc_mem.mipi_id,
+ params->csi_prp_enc_mem.csi);
+ } else
+ ipu_conf &= ~(1 << (IPU_CONF_CSI0_DATA_SOURCE_OFFSET +
+ params->csi_prp_enc_mem.csi));
+
+ /*CSI0/1 feed into IC*/
+ ipu_conf &= ~IPU_CONF_IC_INPUT;
+ if (params->csi_prp_enc_mem.csi)
+ ipu_conf |= IPU_CONF_CSI_SEL;
+ else
+ ipu_conf &= ~IPU_CONF_CSI_SEL;
+
+ /*PRP skip buffer in memory, only valid when RWS_EN is true*/
+ reg = ipu_cm_read(ipu, IPU_FS_PROC_FLOW1);
+ ipu_cm_write(ipu, reg & ~FS_ENC_IN_VALID, IPU_FS_PROC_FLOW1);
+
+ /*CSI data (include compander) dest*/
+ _ipu_csi_init(ipu, channel, params->csi_prp_enc_mem.csi);
+ _ipu_ic_init_prpenc(ipu, params, true);
+ break;
+ case CSI_PRP_VF_MEM:
+ if (params->csi_prp_vf_mem.csi > 1) {
+ ret = -EINVAL;
+ goto err;
+ }
+ if ((ipu->using_ic_dirct_ch == MEM_VDI_PRP_VF_MEM) ||
+ (ipu->using_ic_dirct_ch == MEM_VDI_MEM)) {
+ ret = -EINVAL;
+ goto err;
+ }
+ ipu->using_ic_dirct_ch = CSI_PRP_VF_MEM;
+
+ ipu->ic_use_count++;
+ ipu->csi_channel[params->csi_prp_vf_mem.csi] = channel;
+
+ if (params->csi_prp_vf_mem.mipi_en) {
+ ipu_conf |= (1 << (IPU_CONF_CSI0_DATA_SOURCE_OFFSET +
+ params->csi_prp_vf_mem.csi));
+ _ipu_csi_set_mipi_di(ipu,
+ params->csi_prp_vf_mem.mipi_vc,
+ params->csi_prp_vf_mem.mipi_id,
+ params->csi_prp_vf_mem.csi);
+ } else
+ ipu_conf &= ~(1 << (IPU_CONF_CSI0_DATA_SOURCE_OFFSET +
+ params->csi_prp_vf_mem.csi));
+
+ /*CSI0/1 feed into IC*/
+ ipu_conf &= ~IPU_CONF_IC_INPUT;
+ if (params->csi_prp_vf_mem.csi)
+ ipu_conf |= IPU_CONF_CSI_SEL;
+ else
+ ipu_conf &= ~IPU_CONF_CSI_SEL;
+
+ /*PRP skip buffer in memory, only valid when RWS_EN is true*/
+ reg = ipu_cm_read(ipu, IPU_FS_PROC_FLOW1);
+ ipu_cm_write(ipu, reg & ~FS_VF_IN_VALID, IPU_FS_PROC_FLOW1);
+
+ /*CSI data (include compander) dest*/
+ _ipu_csi_init(ipu, channel, params->csi_prp_vf_mem.csi);
+ _ipu_ic_init_prpvf(ipu, params, true);
+ break;
+ case MEM_PRP_VF_MEM:
+ if (params->mem_prp_vf_mem.graphics_combine_en) {
+ sec_dma = channel_2_dma(channel, IPU_GRAPH_IN_BUFFER);
+ in_g_pixel_fmt = params->mem_prp_vf_mem.in_g_pixel_fmt;
+ bad_pixfmt =
+ _ipu_ch_param_bad_alpha_pos(in_g_pixel_fmt);
+
+ if (params->mem_prp_vf_mem.alpha_chan_en) {
+ if (bad_pixfmt) {
+ dev_err(ipu->dev, "bad pixel format "
+ "for graphics plane from "
+ "ch%d\n", sec_dma);
+ ret = -EINVAL;
+ goto err;
+ }
+ ipu->thrd_chan_en[IPU_CHAN_ID(channel)] = true;
+ }
+ ipu->sec_chan_en[IPU_CHAN_ID(channel)] = true;
+ }
+
+ reg = ipu_cm_read(ipu, IPU_FS_PROC_FLOW1);
+ ipu_cm_write(ipu, reg | FS_VF_IN_VALID, IPU_FS_PROC_FLOW1);
+
+ _ipu_ic_init_prpvf(ipu, params, false);
+ ipu->ic_use_count++;
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ if ((ipu->using_ic_dirct_ch == CSI_PRP_VF_MEM) ||
+ (ipu->using_ic_dirct_ch == MEM_VDI_MEM) ||
+ (ipu->using_ic_dirct_ch == CSI_PRP_ENC_MEM)) {
+ ret = -EINVAL;
+ goto err;
+ }
+ ipu->using_ic_dirct_ch = MEM_VDI_PRP_VF_MEM;
+ ipu->ic_use_count++;
+ ipu->vdi_use_count++;
+ reg = ipu_cm_read(ipu, IPU_FS_PROC_FLOW1);
+ reg &= ~FS_VDI_SRC_SEL_MASK;
+ ipu_cm_write(ipu, reg , IPU_FS_PROC_FLOW1);
+
+ if (params->mem_prp_vf_mem.graphics_combine_en)
+ ipu->sec_chan_en[IPU_CHAN_ID(channel)] = true;
+ _ipu_ic_init_prpvf(ipu, params, false);
+ _ipu_vdi_init(ipu, channel, params);
+ break;
+ case MEM_VDI_PRP_VF_MEM_P:
+ case MEM_VDI_PRP_VF_MEM_N:
+ case MEM_VDI_MEM_P:
+ case MEM_VDI_MEM_N:
+ _ipu_vdi_init(ipu, channel, params);
+ break;
+ case MEM_VDI_MEM:
+ if ((ipu->using_ic_dirct_ch == CSI_PRP_VF_MEM) ||
+ (ipu->using_ic_dirct_ch == MEM_VDI_PRP_VF_MEM) ||
+ (ipu->using_ic_dirct_ch == CSI_PRP_ENC_MEM)) {
+ ret = -EINVAL;
+ goto err;
+ }
+ ipu->using_ic_dirct_ch = MEM_VDI_MEM;
+ ipu->ic_use_count++;
+ ipu->vdi_use_count++;
+ _ipu_vdi_init(ipu, channel, params);
+ break;
+ case MEM_ROT_VF_MEM:
+ ipu->ic_use_count++;
+ ipu->rot_use_count++;
+ _ipu_ic_init_rotate_vf(ipu, params);
+ break;
+ case MEM_PRP_ENC_MEM:
+ ipu->ic_use_count++;
+ reg = ipu_cm_read(ipu, IPU_FS_PROC_FLOW1);
+ ipu_cm_write(ipu, reg | FS_ENC_IN_VALID, IPU_FS_PROC_FLOW1);
+ _ipu_ic_init_prpenc(ipu, params, false);
+ break;
+ case MEM_ROT_ENC_MEM:
+ ipu->ic_use_count++;
+ ipu->rot_use_count++;
+ _ipu_ic_init_rotate_enc(ipu, params);
+ break;
+ case MEM_PP_MEM:
+ if (params->mem_pp_mem.graphics_combine_en) {
+ sec_dma = channel_2_dma(channel, IPU_GRAPH_IN_BUFFER);
+ in_g_pixel_fmt = params->mem_pp_mem.in_g_pixel_fmt;
+ bad_pixfmt =
+ _ipu_ch_param_bad_alpha_pos(in_g_pixel_fmt);
+
+ if (params->mem_pp_mem.alpha_chan_en) {
+ if (bad_pixfmt) {
+ dev_err(ipu->dev, "bad pixel format "
+ "for graphics plane from "
+ "ch%d\n", sec_dma);
+ ret = -EINVAL;
+ goto err;
+ }
+ ipu->thrd_chan_en[IPU_CHAN_ID(channel)] = true;
+ }
+
+ ipu->sec_chan_en[IPU_CHAN_ID(channel)] = true;
+ }
+
+ _ipu_ic_init_pp(ipu, params);
+ ipu->ic_use_count++;
+ break;
+ case MEM_ROT_PP_MEM:
+ _ipu_ic_init_rotate_pp(ipu, params);
+ ipu->ic_use_count++;
+ ipu->rot_use_count++;
+ break;
+ case MEM_DC_SYNC:
+ if (params->mem_dc_sync.di > 1) {
+ ret = -EINVAL;
+ goto err;
+ }
+
+ ipu->dc_di_assignment[1] = params->mem_dc_sync.di;
+ _ipu_dc_init(ipu, 1, params->mem_dc_sync.di,
+ params->mem_dc_sync.interlaced,
+ params->mem_dc_sync.out_pixel_fmt);
+ ipu->di_use_count[params->mem_dc_sync.di]++;
+ ipu->dc_use_count++;
+ ipu->dmfc_use_count++;
+ break;
+ case MEM_BG_SYNC:
+ if (params->mem_dp_bg_sync.di > 1) {
+ ret = -EINVAL;
+ goto err;
+ }
+
+ if (params->mem_dp_bg_sync.alpha_chan_en)
+ ipu->thrd_chan_en[IPU_CHAN_ID(channel)] = true;
+
+ ipu->dc_di_assignment[5] = params->mem_dp_bg_sync.di;
+ _ipu_dp_init(ipu, channel, params->mem_dp_bg_sync.in_pixel_fmt,
+ params->mem_dp_bg_sync.out_pixel_fmt);
+ _ipu_dc_init(ipu, 5, params->mem_dp_bg_sync.di,
+ params->mem_dp_bg_sync.interlaced,
+ params->mem_dp_bg_sync.out_pixel_fmt);
+ ipu->di_use_count[params->mem_dp_bg_sync.di]++;
+ ipu->dc_use_count++;
+ ipu->dp_use_count++;
+ ipu->dmfc_use_count++;
+ break;
+ case MEM_FG_SYNC:
+ _ipu_dp_init(ipu, channel, params->mem_dp_fg_sync.in_pixel_fmt,
+ params->mem_dp_fg_sync.out_pixel_fmt);
+
+ if (params->mem_dp_fg_sync.alpha_chan_en)
+ ipu->thrd_chan_en[IPU_CHAN_ID(channel)] = true;
+
+ ipu->dc_use_count++;
+ ipu->dp_use_count++;
+ ipu->dmfc_use_count++;
+ break;
+ case DIRECT_ASYNC0:
+ if (params->direct_async.di > 1) {
+ ret = -EINVAL;
+ goto err;
+ }
+
+ ipu->dc_di_assignment[8] = params->direct_async.di;
+ _ipu_dc_init(ipu, 8, params->direct_async.di, false, IPU_PIX_FMT_GENERIC);
+ ipu->di_use_count[params->direct_async.di]++;
+ ipu->dc_use_count++;
+ break;
+ case DIRECT_ASYNC1:
+ if (params->direct_async.di > 1) {
+ ret = -EINVAL;
+ goto err;
+ }
+
+ ipu->dc_di_assignment[9] = params->direct_async.di;
+ _ipu_dc_init(ipu, 9, params->direct_async.di, false, IPU_PIX_FMT_GENERIC);
+ ipu->di_use_count[params->direct_async.di]++;
+ ipu->dc_use_count++;
+ break;
+ default:
+ dev_err(ipu->dev, "Missing channel initialization\n");
+ break;
+ }
+
+ ipu->channel_init_mask |= 1L << IPU_CHAN_ID(channel);
+
+ ipu_cm_write(ipu, ipu_conf, IPU_CONF);
+
+err:
+ mutex_unlock(&ipu->mutex_lock);
+ return ret;
+}
+EXPORT_SYMBOL(ipu_init_channel);
+
+/*!
+ * This function is called to uninitialize a logical IPU channel.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID to uninit.
+ */
+void ipu_uninit_channel(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ uint32_t reg;
+ uint32_t in_dma, out_dma = 0;
+ uint32_t ipu_conf;
+ uint32_t dc_chan = 0;
+ int ret;
+
+ mutex_lock(&ipu->mutex_lock);
+
+ if ((ipu->channel_init_mask & (1L << IPU_CHAN_ID(channel))) == 0) {
+ dev_dbg(ipu->dev, "Channel already uninitialized %d\n",
+ IPU_CHAN_ID(channel));
+ mutex_unlock(&ipu->mutex_lock);
+ return;
+ }
+
+ /* Make sure channel is disabled */
+ /* Get input and output dma channels */
+ in_dma = channel_2_dma(channel, IPU_VIDEO_IN_BUFFER);
+ out_dma = channel_2_dma(channel, IPU_OUTPUT_BUFFER);
+
+ if (idma_is_set(ipu, IDMAC_CHA_EN(in_dma), in_dma) ||
+ idma_is_set(ipu, IDMAC_CHA_EN(out_dma), out_dma)) {
+ dev_err(ipu->dev,
+ "Channel %d is not disabled, disable first\n",
+ IPU_CHAN_ID(channel));
+ mutex_unlock(&ipu->mutex_lock);
+ return;
+ }
+
+ ipu_conf = ipu_cm_read(ipu, IPU_CONF);
+
+ /* Reset the double buffer */
+ reg = ipu_cm_read(ipu, IPU_CHA_DB_MODE_SEL(in_dma));
+ ipu_cm_write(ipu, reg & ~idma_mask(in_dma), IPU_CHA_DB_MODE_SEL(in_dma));
+ reg = ipu_cm_read(ipu, IPU_CHA_DB_MODE_SEL(out_dma));
+ ipu_cm_write(ipu, reg & ~idma_mask(out_dma), IPU_CHA_DB_MODE_SEL(out_dma));
+
+ /* Reset the triple buffer */
+ reg = ipu_cm_read(ipu, IPU_CHA_TRB_MODE_SEL(ipu->devtype, in_dma));
+ ipu_cm_write(ipu, reg & ~idma_mask(in_dma),
+ IPU_CHA_TRB_MODE_SEL(ipu->devtype, in_dma));
+ reg = ipu_cm_read(ipu, IPU_CHA_TRB_MODE_SEL(ipu->devtype, out_dma));
+ ipu_cm_write(ipu, reg & ~idma_mask(out_dma),
+ IPU_CHA_TRB_MODE_SEL(ipu->devtype, out_dma));
+
+ if (_ipu_is_ic_chan(in_dma) || _ipu_is_dp_graphic_chan(in_dma)) {
+ ipu->sec_chan_en[IPU_CHAN_ID(channel)] = false;
+ ipu->thrd_chan_en[IPU_CHAN_ID(channel)] = false;
+ }
+
+ switch (channel) {
+ case CSI_MEM0:
+ case CSI_MEM1:
+ case CSI_MEM2:
+ case CSI_MEM3:
+ ipu->smfc_use_count--;
+ if (ipu->csi_channel[0] == channel) {
+ ipu->csi_channel[0] = CHAN_NONE;
+ } else if (ipu->csi_channel[1] == channel) {
+ ipu->csi_channel[1] = CHAN_NONE;
+ }
+ break;
+ case CSI_PRP_ENC_MEM:
+ ipu->ic_use_count--;
+ if (ipu->using_ic_dirct_ch == CSI_PRP_ENC_MEM)
+ ipu->using_ic_dirct_ch = 0;
+ _ipu_ic_uninit_prpenc(ipu);
+ if (ipu->csi_channel[0] == channel) {
+ ipu->csi_channel[0] = CHAN_NONE;
+ } else if (ipu->csi_channel[1] == channel) {
+ ipu->csi_channel[1] = CHAN_NONE;
+ }
+ break;
+ case CSI_PRP_VF_MEM:
+ ipu->ic_use_count--;
+ if (ipu->using_ic_dirct_ch == CSI_PRP_VF_MEM)
+ ipu->using_ic_dirct_ch = 0;
+ _ipu_ic_uninit_prpvf(ipu);
+ if (ipu->csi_channel[0] == channel) {
+ ipu->csi_channel[0] = CHAN_NONE;
+ } else if (ipu->csi_channel[1] == channel) {
+ ipu->csi_channel[1] = CHAN_NONE;
+ }
+ break;
+ case MEM_PRP_VF_MEM:
+ ipu->ic_use_count--;
+ _ipu_ic_uninit_prpvf(ipu);
+ reg = ipu_cm_read(ipu, IPU_FS_PROC_FLOW1);
+ ipu_cm_write(ipu, reg & ~FS_VF_IN_VALID, IPU_FS_PROC_FLOW1);
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ ipu->ic_use_count--;
+ ipu->vdi_use_count--;
+ if (ipu->using_ic_dirct_ch == MEM_VDI_PRP_VF_MEM)
+ ipu->using_ic_dirct_ch = 0;
+ _ipu_ic_uninit_prpvf(ipu);
+ _ipu_vdi_uninit(ipu);
+ reg = ipu_cm_read(ipu, IPU_FS_PROC_FLOW1);
+ ipu_cm_write(ipu, reg & ~FS_VF_IN_VALID, IPU_FS_PROC_FLOW1);
+ break;
+ case MEM_VDI_MEM:
+ ipu->ic_use_count--;
+ ipu->vdi_use_count--;
+ if (ipu->using_ic_dirct_ch == MEM_VDI_MEM)
+ ipu->using_ic_dirct_ch = 0;
+ _ipu_vdi_uninit(ipu);
+ break;
+ case MEM_VDI_PRP_VF_MEM_P:
+ case MEM_VDI_PRP_VF_MEM_N:
+ case MEM_VDI_MEM_P:
+ case MEM_VDI_MEM_N:
+ break;
+ case MEM_ROT_VF_MEM:
+ ipu->rot_use_count--;
+ ipu->ic_use_count--;
+ _ipu_ic_uninit_rotate_vf(ipu);
+ break;
+ case MEM_PRP_ENC_MEM:
+ ipu->ic_use_count--;
+ _ipu_ic_uninit_prpenc(ipu);
+ reg = ipu_cm_read(ipu, IPU_FS_PROC_FLOW1);
+ ipu_cm_write(ipu, reg & ~FS_ENC_IN_VALID, IPU_FS_PROC_FLOW1);
+ break;
+ case MEM_ROT_ENC_MEM:
+ ipu->rot_use_count--;
+ ipu->ic_use_count--;
+ _ipu_ic_uninit_rotate_enc(ipu);
+ break;
+ case MEM_PP_MEM:
+ ipu->ic_use_count--;
+ _ipu_ic_uninit_pp(ipu);
+ break;
+ case MEM_ROT_PP_MEM:
+ ipu->rot_use_count--;
+ ipu->ic_use_count--;
+ _ipu_ic_uninit_rotate_pp(ipu);
+ break;
+ case MEM_DC_SYNC:
+ dc_chan = 1;
+ _ipu_dc_uninit(ipu, 1);
+ ipu->di_use_count[ipu->dc_di_assignment[1]]--;
+ ipu->dc_use_count--;
+ ipu->dmfc_use_count--;
+ break;
+ case MEM_BG_SYNC:
+ dc_chan = 5;
+ _ipu_dp_uninit(ipu, channel);
+ _ipu_dc_uninit(ipu, 5);
+ ipu->di_use_count[ipu->dc_di_assignment[5]]--;
+ ipu->dc_use_count--;
+ ipu->dp_use_count--;
+ ipu->dmfc_use_count--;
+ break;
+ case MEM_FG_SYNC:
+ _ipu_dp_uninit(ipu, channel);
+ ipu->dc_use_count--;
+ ipu->dp_use_count--;
+ ipu->dmfc_use_count--;
+ break;
+ case DIRECT_ASYNC0:
+ dc_chan = 8;
+ _ipu_dc_uninit(ipu, 8);
+ ipu->di_use_count[ipu->dc_di_assignment[8]]--;
+ ipu->dc_use_count--;
+ break;
+ case DIRECT_ASYNC1:
+ dc_chan = 9;
+ _ipu_dc_uninit(ipu, 9);
+ ipu->di_use_count[ipu->dc_di_assignment[9]]--;
+ ipu->dc_use_count--;
+ break;
+ default:
+ break;
+ }
+
+ if (ipu->ic_use_count == 0)
+ ipu_conf &= ~IPU_CONF_IC_EN;
+ if (ipu->vdi_use_count == 0) {
+ ipu_conf &= ~IPU_CONF_ISP_EN;
+ ipu_conf &= ~IPU_CONF_VDI_EN;
+ ipu_conf &= ~IPU_CONF_IC_INPUT;
+ }
+ if (ipu->rot_use_count == 0)
+ ipu_conf &= ~IPU_CONF_ROT_EN;
+ if (ipu->dc_use_count == 0)
+ ipu_conf &= ~IPU_CONF_DC_EN;
+ if (ipu->dp_use_count == 0)
+ ipu_conf &= ~IPU_CONF_DP_EN;
+ if (ipu->dmfc_use_count == 0)
+ ipu_conf &= ~IPU_CONF_DMFC_EN;
+ if (ipu->di_use_count[0] == 0) {
+ ipu_conf &= ~IPU_CONF_DI0_EN;
+ }
+ if (ipu->di_use_count[1] == 0) {
+ ipu_conf &= ~IPU_CONF_DI1_EN;
+ }
+ if (ipu->smfc_use_count == 0)
+ ipu_conf &= ~IPU_CONF_SMFC_EN;
+
+ ipu_cm_write(ipu, ipu_conf, IPU_CONF);
+
+ ipu->channel_init_mask &= ~(1L << IPU_CHAN_ID(channel));
+
+ /*
+ * Disable pixel clk and its parent clock(if the parent clock
+ * usecount is 1) after clearing DC/DP/DI bits in IPU_CONF
+ * register to prevent LVDS display channel starvation.
+ */
+ if (_ipu_is_primary_disp_chan(in_dma) &&
+ ipu->pixel_clk_en[ipu->dc_di_assignment[dc_chan]]) {
+ clk_disable_unprepare(ipu->pixel_clk[ipu->dc_di_assignment[dc_chan]]);
+ ipu->pixel_clk_en[ipu->dc_di_assignment[dc_chan]] = false;
+ }
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ _ipu_put(ipu);
+
+ ret = pm_runtime_put_sync_suspend(ipu->dev);
+ if (ret < 0) {
+ dev_err(ipu->dev, "ch = %d, pm_runtime_put failed:%d!\n",
+ IPU_CHAN_ID(channel), ret);
+ dump_stack();
+ }
+
+ WARN_ON(ipu->ic_use_count < 0);
+ WARN_ON(ipu->vdi_use_count < 0);
+ WARN_ON(ipu->rot_use_count < 0);
+ WARN_ON(ipu->dc_use_count < 0);
+ WARN_ON(ipu->dp_use_count < 0);
+ WARN_ON(ipu->dmfc_use_count < 0);
+ WARN_ON(ipu->smfc_use_count < 0);
+}
+EXPORT_SYMBOL(ipu_uninit_channel);
+
+/*!
+ * This function is called to initialize buffer(s) for logical IPU channel.
+ *
+ * @param ipu ipu handler
+ *
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param type Input parameter which buffer to initialize.
+ *
+ * @param pixel_fmt Input parameter for pixel format of buffer.
+ * Pixel format is a FOURCC ASCII code.
+ *
+ * @param width Input parameter for width of buffer in pixels.
+ *
+ * @param height Input parameter for height of buffer in pixels.
+ *
+ * @param stride Input parameter for stride length of buffer
+ * in pixels.
+ *
+ * @param rot_mode Input parameter for rotation setting of buffer.
+ * A rotation setting other than
+ * IPU_ROTATE_VERT_FLIP
+ * should only be used for input buffers of
+ * rotation channels.
+ *
+ * @param phyaddr_0 Input parameter buffer 0 physical address.
+ *
+ * @param phyaddr_1 Input parameter buffer 1 physical address.
+ * Setting this to a value other than NULL enables
+ * double buffering mode.
+ *
+ * @param phyaddr_2 Input parameter buffer 2 physical address.
+ * Setting this to a value other than NULL enables
+ * triple buffering mode, phyaddr_1 should not be
+ * NULL then.
+ *
+ * @param u private u offset for additional cropping,
+ * zero if not used.
+ *
+ * @param v private v offset for additional cropping,
+ * zero if not used.
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int32_t ipu_init_channel_buffer(struct ipu_soc *ipu, ipu_channel_t channel,
+ ipu_buffer_t type,
+ uint32_t pixel_fmt,
+ uint16_t width, uint16_t height,
+ uint32_t stride,
+ ipu_rotate_mode_t rot_mode,
+ dma_addr_t phyaddr_0, dma_addr_t phyaddr_1,
+ dma_addr_t phyaddr_2,
+ uint32_t u, uint32_t v)
+{
+ uint32_t reg;
+ uint32_t dma_chan;
+ uint32_t burst_size;
+
+ dma_chan = channel_2_dma(channel, type);
+ if (!idma_is_valid(dma_chan))
+ return -EINVAL;
+
+ if (stride < width * bytes_per_pixel(pixel_fmt))
+ stride = width * bytes_per_pixel(pixel_fmt);
+
+ if (stride % 4) {
+ dev_err(ipu->dev,
+ "Stride not 32-bit aligned, stride = %d\n", stride);
+ return -EINVAL;
+ }
+ /* IC & IRT channels' width must be multiple of 8 pixels */
+ if ((_ipu_is_ic_chan(dma_chan) || _ipu_is_irt_chan(dma_chan))
+ && (width % 8)) {
+ dev_err(ipu->dev, "Width must be 8 pixel multiple\n");
+ return -EINVAL;
+ }
+
+ if (_ipu_is_vdi_out_chan(dma_chan) &&
+ ((width < 16) || (height < 16) || (width % 2) || (height % 4))) {
+ dev_err(ipu->dev, "vdi width/height limited err\n");
+ return -EINVAL;
+ }
+
+ /* IPUv3EX and IPUv3M support triple buffer */
+ if ((!_ipu_is_trb_chan(ipu, dma_chan)) && phyaddr_2) {
+ dev_err(ipu->dev, "Chan%d doesn't support triple buffer "
+ "mode\n", dma_chan);
+ return -EINVAL;
+ }
+ if (!phyaddr_1 && phyaddr_2) {
+ dev_err(ipu->dev, "Chan%d's buf1 physical addr is NULL for "
+ "triple buffer mode\n", dma_chan);
+ return -EINVAL;
+ }
+
+ mutex_lock(&ipu->mutex_lock);
+
+ /* Build parameter memory data for DMA channel */
+ _ipu_ch_param_init(ipu, dma_chan, pixel_fmt, width, height, stride, u, v, 0,
+ phyaddr_0, phyaddr_1, phyaddr_2);
+
+ /* Set correlative channel parameter of local alpha channel */
+ if ((_ipu_is_ic_graphic_chan(dma_chan) ||
+ _ipu_is_dp_graphic_chan(dma_chan)) &&
+ (ipu->thrd_chan_en[IPU_CHAN_ID(channel)] == true)) {
+ _ipu_ch_param_set_alpha_use_separate_channel(ipu, dma_chan, true);
+ _ipu_ch_param_set_alpha_buffer_memory(ipu, dma_chan);
+ _ipu_ch_param_set_alpha_condition_read(ipu, dma_chan);
+ /* fix alpha width as 8 and burst size as 16*/
+ _ipu_ch_params_set_alpha_width(ipu, dma_chan, 8);
+ _ipu_ch_param_set_burst_size(ipu, dma_chan, 16);
+ } else if (_ipu_is_ic_graphic_chan(dma_chan) &&
+ ipu_pixel_format_has_alpha(pixel_fmt))
+ _ipu_ch_param_set_alpha_use_separate_channel(ipu, dma_chan, false);
+
+ if (rot_mode)
+ _ipu_ch_param_set_rotation(ipu, dma_chan, rot_mode);
+
+ /* IC and ROT channels have restriction of 8 or 16 pix burst length */
+ if (_ipu_is_ic_chan(dma_chan) || _ipu_is_vdi_out_chan(dma_chan)) {
+ if ((width % 16) == 0)
+ _ipu_ch_param_set_burst_size(ipu, dma_chan, 16);
+ else
+ _ipu_ch_param_set_burst_size(ipu, dma_chan, 8);
+ } else if (_ipu_is_irt_chan(dma_chan)) {
+ _ipu_ch_param_set_burst_size(ipu, dma_chan, 8);
+ _ipu_ch_param_set_block_mode(ipu, dma_chan);
+ } else if (_ipu_is_dmfc_chan(dma_chan)) {
+ burst_size = _ipu_ch_param_get_burst_size(ipu, dma_chan);
+ _ipu_dmfc_set_wait4eot(ipu, dma_chan, width);
+ _ipu_dmfc_set_burst_size(ipu, dma_chan, burst_size);
+ }
+
+ if (_ipu_disp_chan_is_interlaced(ipu, channel) ||
+ ipu->chan_is_interlaced[dma_chan])
+ _ipu_ch_param_set_interlaced_scan(ipu, dma_chan);
+
+ if (_ipu_is_ic_chan(dma_chan) || _ipu_is_irt_chan(dma_chan) ||
+ _ipu_is_vdi_out_chan(dma_chan)) {
+ burst_size = _ipu_ch_param_get_burst_size(ipu, dma_chan);
+ _ipu_ic_idma_init(ipu, dma_chan, width, height, burst_size,
+ rot_mode);
+ } else if (_ipu_is_smfc_chan(dma_chan)) {
+ burst_size = _ipu_ch_param_get_burst_size(ipu, dma_chan);
+ /*
+ * This is different from IPUv3 spec, but it is confirmed
+ * in IPUforum that SMFC burst size should be NPB[6:3]
+ * when IDMAC works in 16-bit generic data mode.
+ */
+ if (pixel_fmt == IPU_PIX_FMT_GENERIC)
+ /* 8 bits per pixel */
+ burst_size = burst_size >> 4;
+ else if (pixel_fmt == IPU_PIX_FMT_GENERIC_16)
+ /* 16 bits per pixel */
+ burst_size = burst_size >> 3;
+ else
+ burst_size = burst_size >> 2;
+ _ipu_smfc_set_burst_size(ipu, channel, burst_size-1);
+ }
+
+ switch (dma_chan) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ _ipu_ch_param_set_axi_id(ipu, dma_chan, ipu->ch0123_axi);
+ break;
+ case 23:
+ _ipu_ch_param_set_axi_id(ipu, dma_chan, ipu->ch23_axi);
+ break;
+ case 27:
+ _ipu_ch_param_set_axi_id(ipu, dma_chan, ipu->ch27_axi);
+ break;
+ case 28:
+ _ipu_ch_param_set_axi_id(ipu, dma_chan, ipu->ch28_axi);
+ break;
+ default:
+ _ipu_ch_param_set_axi_id(ipu, dma_chan, ipu->normal_axi);
+ break;
+ }
+
+ if (idma_is_set(ipu, IDMAC_CHA_PRI(dma_chan), dma_chan) &&
+ ipu->devtype == IPUv3H) {
+ uint32_t reg = IDMAC_CH_LOCK_EN_1(ipu->devtype);
+ uint32_t value = 0;
+
+ switch (dma_chan) {
+ case 5:
+ value = 0x3;
+ break;
+ case 11:
+ value = 0x3 << 2;
+ break;
+ case 12:
+ value = 0x3 << 4;
+ break;
+ case 14:
+ value = 0x3 << 6;
+ break;
+ case 15:
+ value = 0x3 << 8;
+ break;
+ case 20:
+ value = 0x3 << 10;
+ break;
+ case 21:
+ value = 0x3 << 12;
+ break;
+ case 22:
+ value = 0x3 << 14;
+ break;
+ case 23:
+ value = 0x3 << 16;
+ break;
+ case 27:
+ value = 0x3 << 18;
+ break;
+ case 28:
+ value = 0x3 << 20;
+ break;
+ case 45:
+ reg = IDMAC_CH_LOCK_EN_2(ipu->devtype);
+ value = 0x3 << 0;
+ break;
+ case 46:
+ reg = IDMAC_CH_LOCK_EN_2(ipu->devtype);
+ value = 0x3 << 2;
+ break;
+ case 47:
+ reg = IDMAC_CH_LOCK_EN_2(ipu->devtype);
+ value = 0x3 << 4;
+ break;
+ case 48:
+ reg = IDMAC_CH_LOCK_EN_2(ipu->devtype);
+ value = 0x3 << 6;
+ break;
+ case 49:
+ reg = IDMAC_CH_LOCK_EN_2(ipu->devtype);
+ value = 0x3 << 8;
+ break;
+ case 50:
+ reg = IDMAC_CH_LOCK_EN_2(ipu->devtype);
+ value = 0x3 << 10;
+ break;
+ default:
+ break;
+ }
+ value |= ipu_idmac_read(ipu, reg);
+ ipu_idmac_write(ipu, value, reg);
+ }
+
+ _ipu_ch_param_dump(ipu, dma_chan);
+
+ if (phyaddr_2 && ipu->devtype >= IPUv3EX) {
+ reg = ipu_cm_read(ipu, IPU_CHA_DB_MODE_SEL(dma_chan));
+ reg &= ~idma_mask(dma_chan);
+ ipu_cm_write(ipu, reg, IPU_CHA_DB_MODE_SEL(dma_chan));
+
+ reg = ipu_cm_read(ipu,
+ IPU_CHA_TRB_MODE_SEL(ipu->devtype, dma_chan));
+ reg |= idma_mask(dma_chan);
+ ipu_cm_write(ipu, reg,
+ IPU_CHA_TRB_MODE_SEL(ipu->devtype, dma_chan));
+
+ /* Set IDMAC third buffer's cpmem number */
+ /* See __ipu_ch_get_third_buf_cpmem_num() for mapping */
+ ipu_idmac_write(ipu, 0x00444047L,
+ IDMAC_SUB_ADDR_4(ipu->devtype));
+ ipu_idmac_write(ipu, 0x46004241L,
+ IDMAC_SUB_ADDR_3(ipu->devtype));
+ ipu_idmac_write(ipu, 0x00000045L,
+ IDMAC_SUB_ADDR_1(ipu->devtype));
+
+ /* Reset to buffer 0 */
+ ipu_cm_write(ipu, tri_cur_buf_mask(dma_chan),
+ IPU_CHA_TRIPLE_CUR_BUF(ipu->devtype, dma_chan));
+ } else {
+ reg = ipu_cm_read(ipu,
+ IPU_CHA_TRB_MODE_SEL(ipu->devtype, dma_chan));
+ reg &= ~idma_mask(dma_chan);
+ ipu_cm_write(ipu, reg,
+ IPU_CHA_TRB_MODE_SEL(ipu->devtype, dma_chan));
+
+ reg = ipu_cm_read(ipu, IPU_CHA_DB_MODE_SEL(dma_chan));
+ if (phyaddr_1)
+ reg |= idma_mask(dma_chan);
+ else
+ reg &= ~idma_mask(dma_chan);
+ ipu_cm_write(ipu, reg, IPU_CHA_DB_MODE_SEL(dma_chan));
+
+ /* Reset to buffer 0 */
+ ipu_cm_write(ipu, idma_mask(dma_chan),
+ IPU_CHA_CUR_BUF(ipu->devtype, dma_chan));
+
+ }
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_init_channel_buffer);
+
+/*!
+ * This function is called to update the physical address of a buffer for
+ * a logical IPU channel.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param type Input parameter which buffer to initialize.
+ *
+ * @param bufNum Input parameter for buffer number to update.
+ * 0 or 1 are the only valid values.
+ *
+ * @param phyaddr Input parameter buffer physical address.
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail. This function will fail if the buffer is set to ready.
+ */
+int32_t ipu_update_channel_buffer(struct ipu_soc *ipu, ipu_channel_t channel,
+ ipu_buffer_t type, uint32_t bufNum, dma_addr_t phyaddr)
+{
+ uint32_t reg;
+ int ret = 0;
+ uint32_t dma_chan = channel_2_dma(channel, type);
+ unsigned long lock_flags;
+
+ if (dma_chan == IDMA_CHAN_INVALID)
+ return -EINVAL;
+
+ spin_lock_irqsave(&ipu->rdy_reg_spin_lock, lock_flags);
+ if (bufNum == 0)
+ reg = ipu_cm_read(ipu,
+ IPU_CHA_BUF0_RDY(ipu->devtype, dma_chan));
+ else if (bufNum == 1)
+ reg = ipu_cm_read(ipu,
+ IPU_CHA_BUF1_RDY(ipu->devtype, dma_chan));
+ else
+ reg = ipu_cm_read(ipu,
+ IPU_CHA_BUF2_RDY(ipu->devtype, dma_chan));
+
+ if ((reg & idma_mask(dma_chan)) == 0)
+ _ipu_ch_param_set_buffer(ipu, dma_chan, bufNum, phyaddr);
+ else
+ ret = -EACCES;
+ spin_unlock_irqrestore(&ipu->rdy_reg_spin_lock, lock_flags);
+
+ return ret;
+}
+EXPORT_SYMBOL(ipu_update_channel_buffer);
+
+/*!
+ * This function is called to update the band mode setting for
+ * a logical IPU channel.
+ *
+ * @param ipu ipu handler
+ *
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param type Input parameter which buffer to initialize.
+ *
+ * @param band_height Input parameter for band lines:
+ * shoule be log2(4/8/16/32/64/128/256).
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail.
+ */
+int32_t ipu_set_channel_bandmode(struct ipu_soc *ipu, ipu_channel_t channel,
+ ipu_buffer_t type, uint32_t band_height)
+{
+ uint32_t reg;
+ int ret = 0;
+ uint32_t dma_chan = channel_2_dma(channel, type);
+
+ if ((2 > band_height) || (8 < band_height))
+ return -EINVAL;
+
+ mutex_lock(&ipu->mutex_lock);
+
+ reg = ipu_idmac_read(ipu, IDMAC_BAND_EN(ipu->devtype, dma_chan));
+ reg |= 1 << (dma_chan % 32);
+ ipu_idmac_write(ipu, reg, IDMAC_BAND_EN(ipu->devtype, dma_chan));
+
+ _ipu_ch_param_set_bandmode(ipu, dma_chan, band_height);
+ dev_dbg(ipu->dev, "dma_chan:%d, band_height:%d.\n\n",
+ dma_chan, 1 << band_height);
+ mutex_unlock(&ipu->mutex_lock);
+
+ return ret;
+}
+EXPORT_SYMBOL(ipu_set_channel_bandmode);
+
+/*!
+ * This function is called to initialize a buffer for logical IPU channel.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param type Input parameter which buffer to initialize.
+ *
+ * @param pixel_fmt Input parameter for pixel format of buffer.
+ * Pixel format is a FOURCC ASCII code.
+ *
+ * @param width Input parameter for width of buffer in pixels.
+ *
+ * @param height Input parameter for height of buffer in pixels.
+ *
+ * @param stride Input parameter for stride length of buffer
+ * in pixels.
+ *
+ * @param u predefined private u offset for additional cropping,
+ * zero if not used.
+ *
+ * @param v predefined private v offset for additional cropping,
+ * zero if not used.
+ *
+ * @param vertical_offset vertical offset for Y coordinate
+ * in the existed frame
+ *
+ *
+ * @param horizontal_offset horizontal offset for X coordinate
+ * in the existed frame
+ *
+ *
+ * @return Returns 0 on success or negative error code on fail
+ * This function will fail if any buffer is set to ready.
+ */
+
+int32_t ipu_update_channel_offset(struct ipu_soc *ipu,
+ ipu_channel_t channel, ipu_buffer_t type,
+ uint32_t pixel_fmt,
+ uint16_t width, uint16_t height,
+ uint32_t stride,
+ uint32_t u, uint32_t v,
+ uint32_t vertical_offset, uint32_t horizontal_offset)
+{
+ int ret = 0;
+ uint32_t dma_chan = channel_2_dma(channel, type);
+ unsigned long lock_flags;
+
+ if (dma_chan == IDMA_CHAN_INVALID)
+ return -EINVAL;
+
+ spin_lock_irqsave(&ipu->rdy_reg_spin_lock, lock_flags);
+ if ((ipu_cm_read(ipu, IPU_CHA_BUF0_RDY(ipu->devtype, dma_chan)) &
+ idma_mask(dma_chan)) ||
+ (ipu_cm_read(ipu, IPU_CHA_BUF1_RDY(ipu->devtype, dma_chan)) &
+ idma_mask(dma_chan)) ||
+ ((ipu_cm_read(ipu, IPU_CHA_BUF2_RDY(ipu->devtype, dma_chan)) &
+ idma_mask(dma_chan)) &&
+ (ipu_cm_read(ipu, IPU_CHA_TRB_MODE_SEL(ipu->devtype, dma_chan)) &
+ idma_mask(dma_chan)) && _ipu_is_trb_chan(ipu, dma_chan)))
+ ret = -EACCES;
+ else
+ _ipu_ch_offset_update(ipu, dma_chan, pixel_fmt, width, height, stride,
+ u, v, 0, vertical_offset, horizontal_offset);
+ spin_unlock_irqrestore(&ipu->rdy_reg_spin_lock, lock_flags);
+
+ return ret;
+}
+EXPORT_SYMBOL(ipu_update_channel_offset);
+
+int32_t ipu_get_channel_offset(uint32_t pixel_fmt,
+ uint16_t width, uint16_t height,
+ uint32_t stride,
+ uint32_t u, uint32_t v,
+ uint32_t vertical_offset, uint32_t horizontal_offset,
+ uint32_t *u_offset, uint32_t *v_offset)
+{
+ return __ipu_ch_offset_calc(pixel_fmt, width, height, stride,
+ u, v, 0,
+ vertical_offset, horizontal_offset,
+ u_offset, v_offset);
+}
+EXPORT_SYMBOL(ipu_get_channel_offset);
+
+/*!
+ * This function is called to set a channel's buffer as ready.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param type Input parameter which buffer to initialize.
+ *
+ * @param bufNum Input parameter for which buffer number set to
+ * ready state.
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int32_t ipu_select_buffer(struct ipu_soc *ipu, ipu_channel_t channel,
+ ipu_buffer_t type, uint32_t bufNum)
+{
+ uint32_t dma_chan = channel_2_dma(channel, type);
+ unsigned long lock_flags;
+
+ if (dma_chan == IDMA_CHAN_INVALID)
+ return -EINVAL;
+
+ spin_lock_irqsave(&ipu->rdy_reg_spin_lock, lock_flags);
+ /* Mark buffer to be ready. */
+ if (bufNum == 0)
+ ipu_cm_write(ipu, idma_mask(dma_chan),
+ IPU_CHA_BUF0_RDY(ipu->devtype, dma_chan));
+ else if (bufNum == 1)
+ ipu_cm_write(ipu, idma_mask(dma_chan),
+ IPU_CHA_BUF1_RDY(ipu->devtype, dma_chan));
+ else
+ ipu_cm_write(ipu, idma_mask(dma_chan),
+ IPU_CHA_BUF2_RDY(ipu->devtype, dma_chan));
+ spin_unlock_irqrestore(&ipu->rdy_reg_spin_lock, lock_flags);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_select_buffer);
+
+/*!
+ * This function is called to set a channel's buffer as ready.
+ *
+ * @param ipu ipu handler
+ * @param bufNum Input parameter for which buffer number set to
+ * ready state.
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int32_t ipu_select_multi_vdi_buffer(struct ipu_soc *ipu, uint32_t bufNum)
+{
+
+ uint32_t dma_chan = channel_2_dma(MEM_VDI_PRP_VF_MEM, IPU_INPUT_BUFFER);
+ uint32_t mask_bit =
+ idma_mask(channel_2_dma(MEM_VDI_PRP_VF_MEM_P, IPU_INPUT_BUFFER))|
+ idma_mask(dma_chan)|
+ idma_mask(channel_2_dma(MEM_VDI_PRP_VF_MEM_N, IPU_INPUT_BUFFER));
+ unsigned long lock_flags;
+
+ spin_lock_irqsave(&ipu->rdy_reg_spin_lock, lock_flags);
+ /* Mark buffers to be ready. */
+ if (bufNum == 0)
+ ipu_cm_write(ipu, mask_bit,
+ IPU_CHA_BUF0_RDY(ipu->devtype, dma_chan));
+ else
+ ipu_cm_write(ipu, mask_bit,
+ IPU_CHA_BUF1_RDY(ipu->devtype, dma_chan));
+ spin_unlock_irqrestore(&ipu->rdy_reg_spin_lock, lock_flags);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_select_multi_vdi_buffer);
+
+#define NA -1
+static int proc_dest_sel[] = {
+ 0, 1, 1, 3, 5, 5, 4, 7, 8, 9, 10, 11, 12, 14, 15, 16,
+ 0, 1, 1, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 14, 31 };
+static int proc_src_sel[] = { 0, 6, 7, 6, 7, 8, 5, NA, NA, NA,
+ NA, NA, NA, NA, NA, 1, 2, 3, 4, 7, 8, NA, 8, NA };
+static int disp_src_sel[] = { 0, 6, 7, 8, 3, 4, 5, NA, NA, NA,
+ NA, NA, NA, NA, NA, 1, NA, 2, NA, 3, 4, 4, 4, 4 };
+
+
+/*!
+ * This function links 2 channels together for automatic frame
+ * synchronization. The output of the source channel is linked to the input of
+ * the destination channel.
+ *
+ * @param ipu ipu handler
+ * @param src_ch Input parameter for the logical channel ID of
+ * the source channel.
+ *
+ * @param dest_ch Input parameter for the logical channel ID of
+ * the destination channel.
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail.
+ */
+int32_t ipu_link_channels(struct ipu_soc *ipu, ipu_channel_t src_ch, ipu_channel_t dest_ch)
+{
+ int retval = 0;
+ uint32_t fs_proc_flow1;
+ uint32_t fs_proc_flow2;
+ uint32_t fs_proc_flow3;
+ uint32_t fs_disp_flow1;
+
+ mutex_lock(&ipu->mutex_lock);
+
+ fs_proc_flow1 = ipu_cm_read(ipu, IPU_FS_PROC_FLOW1);
+ fs_proc_flow2 = ipu_cm_read(ipu, IPU_FS_PROC_FLOW2);
+ fs_proc_flow3 = ipu_cm_read(ipu, IPU_FS_PROC_FLOW3);
+ fs_disp_flow1 = ipu_cm_read(ipu, IPU_FS_DISP_FLOW1);
+
+ switch (src_ch) {
+ case CSI_MEM0:
+ fs_proc_flow3 &= ~FS_SMFC0_DEST_SEL_MASK;
+ fs_proc_flow3 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_SMFC0_DEST_SEL_OFFSET;
+ break;
+ case CSI_MEM1:
+ fs_proc_flow3 &= ~FS_SMFC1_DEST_SEL_MASK;
+ fs_proc_flow3 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_SMFC1_DEST_SEL_OFFSET;
+ break;
+ case CSI_MEM2:
+ fs_proc_flow3 &= ~FS_SMFC2_DEST_SEL_MASK;
+ fs_proc_flow3 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_SMFC2_DEST_SEL_OFFSET;
+ break;
+ case CSI_MEM3:
+ fs_proc_flow3 &= ~FS_SMFC3_DEST_SEL_MASK;
+ fs_proc_flow3 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_SMFC3_DEST_SEL_OFFSET;
+ break;
+ case CSI_PRP_ENC_MEM:
+ fs_proc_flow2 &= ~FS_PRPENC_DEST_SEL_MASK;
+ fs_proc_flow2 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_PRPENC_DEST_SEL_OFFSET;
+ break;
+ case CSI_PRP_VF_MEM:
+ fs_proc_flow2 &= ~FS_PRPVF_DEST_SEL_MASK;
+ fs_proc_flow2 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_PRPVF_DEST_SEL_OFFSET;
+ break;
+ case MEM_PP_MEM:
+ fs_proc_flow2 &= ~FS_PP_DEST_SEL_MASK;
+ fs_proc_flow2 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_PP_DEST_SEL_OFFSET;
+ break;
+ case MEM_ROT_PP_MEM:
+ fs_proc_flow2 &= ~FS_PP_ROT_DEST_SEL_MASK;
+ fs_proc_flow2 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_PP_ROT_DEST_SEL_OFFSET;
+ break;
+ case MEM_PRP_ENC_MEM:
+ fs_proc_flow2 &= ~FS_PRPENC_DEST_SEL_MASK;
+ fs_proc_flow2 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_PRPENC_DEST_SEL_OFFSET;
+ break;
+ case MEM_ROT_ENC_MEM:
+ fs_proc_flow2 &= ~FS_PRPENC_ROT_DEST_SEL_MASK;
+ fs_proc_flow2 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_PRPENC_ROT_DEST_SEL_OFFSET;
+ break;
+ case MEM_PRP_VF_MEM:
+ fs_proc_flow2 &= ~FS_PRPVF_DEST_SEL_MASK;
+ fs_proc_flow2 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_PRPVF_DEST_SEL_OFFSET;
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ fs_proc_flow2 &= ~FS_PRPVF_DEST_SEL_MASK;
+ fs_proc_flow2 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_PRPVF_DEST_SEL_OFFSET;
+ break;
+ case MEM_ROT_VF_MEM:
+ fs_proc_flow2 &= ~FS_PRPVF_ROT_DEST_SEL_MASK;
+ fs_proc_flow2 |=
+ proc_dest_sel[IPU_CHAN_ID(dest_ch)] <<
+ FS_PRPVF_ROT_DEST_SEL_OFFSET;
+ break;
+ case MEM_VDOA_MEM:
+ fs_proc_flow3 &= ~FS_VDOA_DEST_SEL_MASK;
+ if (MEM_VDI_MEM == dest_ch)
+ fs_proc_flow3 |= FS_VDOA_DEST_SEL_VDI;
+ else if (MEM_PP_MEM == dest_ch)
+ fs_proc_flow3 |= FS_VDOA_DEST_SEL_IC;
+ else {
+ retval = -EINVAL;
+ goto err;
+ }
+ break;
+ default:
+ retval = -EINVAL;
+ goto err;
+ }
+
+ switch (dest_ch) {
+ case MEM_PP_MEM:
+ fs_proc_flow1 &= ~FS_PP_SRC_SEL_MASK;
+ if (MEM_VDOA_MEM == src_ch)
+ fs_proc_flow1 |= FS_PP_SRC_SEL_VDOA;
+ else
+ fs_proc_flow1 |= proc_src_sel[IPU_CHAN_ID(src_ch)] <<
+ FS_PP_SRC_SEL_OFFSET;
+ break;
+ case MEM_ROT_PP_MEM:
+ fs_proc_flow1 &= ~FS_PP_ROT_SRC_SEL_MASK;
+ fs_proc_flow1 |=
+ proc_src_sel[IPU_CHAN_ID(src_ch)] <<
+ FS_PP_ROT_SRC_SEL_OFFSET;
+ break;
+ case MEM_PRP_ENC_MEM:
+ fs_proc_flow1 &= ~FS_PRP_SRC_SEL_MASK;
+ fs_proc_flow1 |=
+ proc_src_sel[IPU_CHAN_ID(src_ch)] << FS_PRP_SRC_SEL_OFFSET;
+ break;
+ case MEM_ROT_ENC_MEM:
+ fs_proc_flow1 &= ~FS_PRPENC_ROT_SRC_SEL_MASK;
+ fs_proc_flow1 |=
+ proc_src_sel[IPU_CHAN_ID(src_ch)] <<
+ FS_PRPENC_ROT_SRC_SEL_OFFSET;
+ break;
+ case MEM_PRP_VF_MEM:
+ fs_proc_flow1 &= ~FS_PRP_SRC_SEL_MASK;
+ fs_proc_flow1 |=
+ proc_src_sel[IPU_CHAN_ID(src_ch)] << FS_PRP_SRC_SEL_OFFSET;
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ fs_proc_flow1 &= ~FS_PRP_SRC_SEL_MASK;
+ fs_proc_flow1 |=
+ proc_src_sel[IPU_CHAN_ID(src_ch)] << FS_PRP_SRC_SEL_OFFSET;
+ break;
+ case MEM_ROT_VF_MEM:
+ fs_proc_flow1 &= ~FS_PRPVF_ROT_SRC_SEL_MASK;
+ fs_proc_flow1 |=
+ proc_src_sel[IPU_CHAN_ID(src_ch)] <<
+ FS_PRPVF_ROT_SRC_SEL_OFFSET;
+ break;
+ case MEM_DC_SYNC:
+ fs_disp_flow1 &= ~FS_DC1_SRC_SEL_MASK;
+ fs_disp_flow1 |=
+ disp_src_sel[IPU_CHAN_ID(src_ch)] << FS_DC1_SRC_SEL_OFFSET;
+ break;
+ case MEM_BG_SYNC:
+ fs_disp_flow1 &= ~FS_DP_SYNC0_SRC_SEL_MASK;
+ fs_disp_flow1 |=
+ disp_src_sel[IPU_CHAN_ID(src_ch)] <<
+ FS_DP_SYNC0_SRC_SEL_OFFSET;
+ break;
+ case MEM_FG_SYNC:
+ fs_disp_flow1 &= ~FS_DP_SYNC1_SRC_SEL_MASK;
+ fs_disp_flow1 |=
+ disp_src_sel[IPU_CHAN_ID(src_ch)] <<
+ FS_DP_SYNC1_SRC_SEL_OFFSET;
+ break;
+ case MEM_DC_ASYNC:
+ fs_disp_flow1 &= ~FS_DC2_SRC_SEL_MASK;
+ fs_disp_flow1 |=
+ disp_src_sel[IPU_CHAN_ID(src_ch)] << FS_DC2_SRC_SEL_OFFSET;
+ break;
+ case MEM_BG_ASYNC0:
+ fs_disp_flow1 &= ~FS_DP_ASYNC0_SRC_SEL_MASK;
+ fs_disp_flow1 |=
+ disp_src_sel[IPU_CHAN_ID(src_ch)] <<
+ FS_DP_ASYNC0_SRC_SEL_OFFSET;
+ break;
+ case MEM_FG_ASYNC0:
+ fs_disp_flow1 &= ~FS_DP_ASYNC1_SRC_SEL_MASK;
+ fs_disp_flow1 |=
+ disp_src_sel[IPU_CHAN_ID(src_ch)] <<
+ FS_DP_ASYNC1_SRC_SEL_OFFSET;
+ break;
+ case MEM_VDI_MEM:
+ fs_proc_flow1 &= ~FS_VDI_SRC_SEL_MASK;
+ if (MEM_VDOA_MEM == src_ch)
+ fs_proc_flow1 |= FS_VDI_SRC_SEL_VDOA;
+ else {
+ retval = -EINVAL;
+ goto err;
+ }
+ break;
+ default:
+ retval = -EINVAL;
+ goto err;
+ }
+
+ ipu_cm_write(ipu, fs_proc_flow1, IPU_FS_PROC_FLOW1);
+ ipu_cm_write(ipu, fs_proc_flow2, IPU_FS_PROC_FLOW2);
+ ipu_cm_write(ipu, fs_proc_flow3, IPU_FS_PROC_FLOW3);
+ ipu_cm_write(ipu, fs_disp_flow1, IPU_FS_DISP_FLOW1);
+
+err:
+ mutex_unlock(&ipu->mutex_lock);
+ return retval;
+}
+EXPORT_SYMBOL(ipu_link_channels);
+
+/*!
+ * This function unlinks 2 channels and disables automatic frame
+ * synchronization.
+ *
+ * @param ipu ipu handler
+ * @param src_ch Input parameter for the logical channel ID of
+ * the source channel.
+ *
+ * @param dest_ch Input parameter for the logical channel ID of
+ * the destination channel.
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail.
+ */
+int32_t ipu_unlink_channels(struct ipu_soc *ipu, ipu_channel_t src_ch, ipu_channel_t dest_ch)
+{
+ int retval = 0;
+ uint32_t fs_proc_flow1;
+ uint32_t fs_proc_flow2;
+ uint32_t fs_proc_flow3;
+ uint32_t fs_disp_flow1;
+
+ mutex_lock(&ipu->mutex_lock);
+
+ fs_proc_flow1 = ipu_cm_read(ipu, IPU_FS_PROC_FLOW1);
+ fs_proc_flow2 = ipu_cm_read(ipu, IPU_FS_PROC_FLOW2);
+ fs_proc_flow3 = ipu_cm_read(ipu, IPU_FS_PROC_FLOW3);
+ fs_disp_flow1 = ipu_cm_read(ipu, IPU_FS_DISP_FLOW1);
+
+ switch (src_ch) {
+ case CSI_MEM0:
+ fs_proc_flow3 &= ~FS_SMFC0_DEST_SEL_MASK;
+ break;
+ case CSI_MEM1:
+ fs_proc_flow3 &= ~FS_SMFC1_DEST_SEL_MASK;
+ break;
+ case CSI_MEM2:
+ fs_proc_flow3 &= ~FS_SMFC2_DEST_SEL_MASK;
+ break;
+ case CSI_MEM3:
+ fs_proc_flow3 &= ~FS_SMFC3_DEST_SEL_MASK;
+ break;
+ case CSI_PRP_ENC_MEM:
+ fs_proc_flow2 &= ~FS_PRPENC_DEST_SEL_MASK;
+ break;
+ case CSI_PRP_VF_MEM:
+ fs_proc_flow2 &= ~FS_PRPVF_DEST_SEL_MASK;
+ break;
+ case MEM_PP_MEM:
+ fs_proc_flow2 &= ~FS_PP_DEST_SEL_MASK;
+ break;
+ case MEM_ROT_PP_MEM:
+ fs_proc_flow2 &= ~FS_PP_ROT_DEST_SEL_MASK;
+ break;
+ case MEM_PRP_ENC_MEM:
+ fs_proc_flow2 &= ~FS_PRPENC_DEST_SEL_MASK;
+ break;
+ case MEM_ROT_ENC_MEM:
+ fs_proc_flow2 &= ~FS_PRPENC_ROT_DEST_SEL_MASK;
+ break;
+ case MEM_PRP_VF_MEM:
+ fs_proc_flow2 &= ~FS_PRPVF_DEST_SEL_MASK;
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ fs_proc_flow2 &= ~FS_PRPVF_DEST_SEL_MASK;
+ break;
+ case MEM_ROT_VF_MEM:
+ fs_proc_flow2 &= ~FS_PRPVF_ROT_DEST_SEL_MASK;
+ break;
+ case MEM_VDOA_MEM:
+ fs_proc_flow3 &= ~FS_VDOA_DEST_SEL_MASK;
+ break;
+ default:
+ retval = -EINVAL;
+ goto err;
+ }
+
+ switch (dest_ch) {
+ case MEM_PP_MEM:
+ fs_proc_flow1 &= ~FS_PP_SRC_SEL_MASK;
+ break;
+ case MEM_ROT_PP_MEM:
+ fs_proc_flow1 &= ~FS_PP_ROT_SRC_SEL_MASK;
+ break;
+ case MEM_PRP_ENC_MEM:
+ fs_proc_flow1 &= ~FS_PRP_SRC_SEL_MASK;
+ break;
+ case MEM_ROT_ENC_MEM:
+ fs_proc_flow1 &= ~FS_PRPENC_ROT_SRC_SEL_MASK;
+ break;
+ case MEM_PRP_VF_MEM:
+ fs_proc_flow1 &= ~FS_PRP_SRC_SEL_MASK;
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ fs_proc_flow1 &= ~FS_PRP_SRC_SEL_MASK;
+ break;
+ case MEM_ROT_VF_MEM:
+ fs_proc_flow1 &= ~FS_PRPVF_ROT_SRC_SEL_MASK;
+ break;
+ case MEM_DC_SYNC:
+ fs_disp_flow1 &= ~FS_DC1_SRC_SEL_MASK;
+ break;
+ case MEM_BG_SYNC:
+ fs_disp_flow1 &= ~FS_DP_SYNC0_SRC_SEL_MASK;
+ break;
+ case MEM_FG_SYNC:
+ fs_disp_flow1 &= ~FS_DP_SYNC1_SRC_SEL_MASK;
+ break;
+ case MEM_DC_ASYNC:
+ fs_disp_flow1 &= ~FS_DC2_SRC_SEL_MASK;
+ break;
+ case MEM_BG_ASYNC0:
+ fs_disp_flow1 &= ~FS_DP_ASYNC0_SRC_SEL_MASK;
+ break;
+ case MEM_FG_ASYNC0:
+ fs_disp_flow1 &= ~FS_DP_ASYNC1_SRC_SEL_MASK;
+ break;
+ case MEM_VDI_MEM:
+ fs_proc_flow1 &= ~FS_VDI_SRC_SEL_MASK;
+ break;
+ default:
+ retval = -EINVAL;
+ goto err;
+ }
+
+ ipu_cm_write(ipu, fs_proc_flow1, IPU_FS_PROC_FLOW1);
+ ipu_cm_write(ipu, fs_proc_flow2, IPU_FS_PROC_FLOW2);
+ ipu_cm_write(ipu, fs_proc_flow3, IPU_FS_PROC_FLOW3);
+ ipu_cm_write(ipu, fs_disp_flow1, IPU_FS_DISP_FLOW1);
+
+err:
+ mutex_unlock(&ipu->mutex_lock);
+ return retval;
+}
+EXPORT_SYMBOL(ipu_unlink_channels);
+
+/*!
+ * This function check whether a logical channel was enabled.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @return This function returns 1 while request channel is enabled or
+ * 0 for not enabled.
+ */
+int32_t ipu_is_channel_busy(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ uint32_t reg;
+ uint32_t in_dma;
+ uint32_t out_dma;
+
+ out_dma = channel_2_dma(channel, IPU_OUTPUT_BUFFER);
+ in_dma = channel_2_dma(channel, IPU_VIDEO_IN_BUFFER);
+
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(in_dma));
+ if (reg & idma_mask(in_dma))
+ return 1;
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(out_dma));
+ if (reg & idma_mask(out_dma))
+ return 1;
+ return 0;
+}
+EXPORT_SYMBOL(ipu_is_channel_busy);
+
+/*!
+ * This function enables a logical channel.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail.
+ */
+int32_t ipu_enable_channel(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ uint32_t reg;
+ uint32_t ipu_conf;
+ uint32_t in_dma;
+ uint32_t out_dma;
+ uint32_t sec_dma;
+ uint32_t thrd_dma;
+ uint32_t di = 0;
+
+ mutex_lock(&ipu->mutex_lock);
+
+ if (ipu->channel_enable_mask & (1L << IPU_CHAN_ID(channel))) {
+ dev_err(ipu->dev, "Warning: channel already enabled %d\n",
+ IPU_CHAN_ID(channel));
+ mutex_unlock(&ipu->mutex_lock);
+ return -EACCES;
+ }
+
+ /* Get input and output dma channels */
+ out_dma = channel_2_dma(channel, IPU_OUTPUT_BUFFER);
+ in_dma = channel_2_dma(channel, IPU_VIDEO_IN_BUFFER);
+
+ ipu_conf = ipu_cm_read(ipu, IPU_CONF);
+ switch (channel) {
+ case MEM_BG_SYNC:
+ di = ipu->dc_di_assignment[5];
+ if (ipu->di_use_count[di] > 0)
+ ipu_conf |= di ? IPU_CONF_DI1_EN : IPU_CONF_DI0_EN;
+ if (ipu->dp_use_count > 0)
+ ipu_conf |= IPU_CONF_DP_EN;
+ if (ipu->dc_use_count > 0)
+ ipu_conf |= IPU_CONF_DC_EN;
+ if (ipu->dmfc_use_count > 0)
+ ipu_conf |= IPU_CONF_DMFC_EN;
+ break;
+ case MEM_DC_SYNC:
+ di = ipu->dc_di_assignment[1];
+ if (ipu->di_use_count[di] > 0)
+ ipu_conf |= di ? IPU_CONF_DI1_EN : IPU_CONF_DI0_EN;
+ if (ipu->dc_use_count > 0)
+ ipu_conf |= IPU_CONF_DC_EN;
+ if (ipu->dmfc_use_count > 0)
+ ipu_conf |= IPU_CONF_DMFC_EN;
+ break;
+ case MEM_FG_SYNC:
+ if (ipu->dp_use_count > 0)
+ ipu_conf |= IPU_CONF_DP_EN;
+ if (ipu->dc_use_count > 0)
+ ipu_conf |= IPU_CONF_DC_EN;
+ if (ipu->dmfc_use_count > 0)
+ ipu_conf |= IPU_CONF_DMFC_EN;
+ break;
+ case DIRECT_ASYNC0:
+ di = ipu->dc_di_assignment[8];
+ /* fall through */
+ case DIRECT_ASYNC1:
+ di = ipu->dc_di_assignment[9];
+ if (ipu->di_use_count[di] > 0)
+ ipu_conf |= di ? IPU_CONF_DI1_EN : IPU_CONF_DI0_EN;
+ if (ipu->dc_use_count > 0)
+ ipu_conf |= IPU_CONF_DC_EN;
+ break;
+ case MEM_ROT_PP_MEM:
+ case MEM_ROT_ENC_MEM:
+ case MEM_ROT_VF_MEM:
+ if (ipu->rot_use_count > 0)
+ ipu_conf |= IPU_CONF_ROT_EN;
+ /* fall through */
+ case MEM_PP_MEM:
+ case MEM_PRP_ENC_MEM:
+ case MEM_PRP_VF_MEM:
+ case CSI_PRP_ENC_MEM:
+ case CSI_PRP_VF_MEM:
+ if (ipu->ic_use_count > 0)
+ ipu_conf |= IPU_CONF_IC_EN;
+ break;
+ case CSI_MEM0:
+ case CSI_MEM1:
+ case CSI_MEM2:
+ case CSI_MEM3:
+ if (ipu->smfc_use_count > 0)
+ ipu_conf |= IPU_CONF_SMFC_EN;
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ case MEM_VDI_MEM:
+ if (ipu->vdi_use_count > 0) {
+ ipu_conf |= IPU_CONF_ISP_EN;
+ ipu_conf |= IPU_CONF_VDI_EN;
+ ipu_conf |= IPU_CONF_IC_INPUT;
+ }
+ if (ipu->ic_use_count > 0)
+ ipu_conf |= IPU_CONF_IC_EN;
+ break;
+ default:
+ break;
+ }
+ ipu_cm_write(ipu, ipu_conf, IPU_CONF);
+
+ if (idma_is_valid(in_dma)) {
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(in_dma));
+ ipu_idmac_write(ipu, reg | idma_mask(in_dma), IDMAC_CHA_EN(in_dma));
+ }
+ if (idma_is_valid(out_dma)) {
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(out_dma));
+ ipu_idmac_write(ipu, reg | idma_mask(out_dma), IDMAC_CHA_EN(out_dma));
+ }
+
+ if ((ipu->sec_chan_en[IPU_CHAN_ID(channel)]) &&
+ ((channel == MEM_PP_MEM) || (channel == MEM_PRP_VF_MEM) ||
+ (channel == MEM_VDI_PRP_VF_MEM))) {
+ sec_dma = channel_2_dma(channel, IPU_GRAPH_IN_BUFFER);
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(sec_dma));
+ ipu_idmac_write(ipu, reg | idma_mask(sec_dma), IDMAC_CHA_EN(sec_dma));
+ }
+ if ((ipu->thrd_chan_en[IPU_CHAN_ID(channel)]) &&
+ ((channel == MEM_PP_MEM) || (channel == MEM_PRP_VF_MEM))) {
+ thrd_dma = channel_2_dma(channel, IPU_ALPHA_IN_BUFFER);
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(thrd_dma));
+ ipu_idmac_write(ipu, reg | idma_mask(thrd_dma), IDMAC_CHA_EN(thrd_dma));
+
+ sec_dma = channel_2_dma(channel, IPU_GRAPH_IN_BUFFER);
+ reg = ipu_idmac_read(ipu, IDMAC_SEP_ALPHA);
+ ipu_idmac_write(ipu, reg | idma_mask(sec_dma), IDMAC_SEP_ALPHA);
+ } else if ((ipu->thrd_chan_en[IPU_CHAN_ID(channel)]) &&
+ ((channel == MEM_BG_SYNC) || (channel == MEM_FG_SYNC))) {
+ thrd_dma = channel_2_dma(channel, IPU_ALPHA_IN_BUFFER);
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(thrd_dma));
+ ipu_idmac_write(ipu, reg | idma_mask(thrd_dma), IDMAC_CHA_EN(thrd_dma));
+ reg = ipu_idmac_read(ipu, IDMAC_SEP_ALPHA);
+ ipu_idmac_write(ipu, reg | idma_mask(in_dma), IDMAC_SEP_ALPHA);
+ }
+
+ if ((channel == MEM_DC_SYNC) || (channel == MEM_BG_SYNC) ||
+ (channel == MEM_FG_SYNC)) {
+ reg = ipu_idmac_read(ipu, IDMAC_WM_EN(in_dma));
+ ipu_idmac_write(ipu, reg | idma_mask(in_dma), IDMAC_WM_EN(in_dma));
+
+ _ipu_dp_dc_enable(ipu, channel);
+ }
+
+ if (_ipu_is_ic_chan(in_dma) || _ipu_is_ic_chan(out_dma) ||
+ _ipu_is_irt_chan(in_dma) || _ipu_is_irt_chan(out_dma) ||
+ _ipu_is_vdi_out_chan(out_dma))
+ _ipu_ic_enable_task(ipu, channel);
+
+ ipu->channel_enable_mask |= 1L << IPU_CHAN_ID(channel);
+
+ if (ipu->prg_clk)
+ clk_prepare_enable(ipu->prg_clk);
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_enable_channel);
+
+/*!
+ * This function check buffer ready for a logical channel.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param type Input parameter which buffer to clear.
+ *
+ * @param bufNum Input parameter for which buffer number clear
+ * ready state.
+ *
+ */
+int32_t ipu_check_buffer_ready(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type,
+ uint32_t bufNum)
+{
+ uint32_t dma_chan = channel_2_dma(channel, type);
+ uint32_t reg;
+ unsigned long lock_flags;
+
+ if (dma_chan == IDMA_CHAN_INVALID)
+ return -EINVAL;
+
+ spin_lock_irqsave(&ipu->rdy_reg_spin_lock, lock_flags);
+ if (bufNum == 0)
+ reg = ipu_cm_read(ipu,
+ IPU_CHA_BUF0_RDY(ipu->devtype, dma_chan));
+ else if (bufNum == 1)
+ reg = ipu_cm_read(ipu,
+ IPU_CHA_BUF1_RDY(ipu->devtype, dma_chan));
+ else
+ reg = ipu_cm_read(ipu,
+ IPU_CHA_BUF2_RDY(ipu->devtype, dma_chan));
+ spin_unlock_irqrestore(&ipu->rdy_reg_spin_lock, lock_flags);
+
+ if (reg & idma_mask(dma_chan))
+ return 1;
+ else
+ return 0;
+}
+EXPORT_SYMBOL(ipu_check_buffer_ready);
+
+/*!
+ * This function clear buffer ready for a logical channel.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param type Input parameter which buffer to clear.
+ *
+ * @param bufNum Input parameter for which buffer number clear
+ * ready state.
+ *
+ */
+void _ipu_clear_buffer_ready(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type,
+ uint32_t bufNum)
+{
+ uint32_t dma_ch = channel_2_dma(channel, type);
+
+ if (!idma_is_valid(dma_ch))
+ return;
+
+ ipu_cm_write(ipu, 0xF0300000, IPU_GPR); /* write one to clear */
+ if (bufNum == 0)
+ ipu_cm_write(ipu, idma_mask(dma_ch),
+ IPU_CHA_BUF0_RDY(ipu->devtype, dma_ch));
+ else if (bufNum == 1)
+ ipu_cm_write(ipu, idma_mask(dma_ch),
+ IPU_CHA_BUF1_RDY(ipu->devtype, dma_ch));
+ else
+ ipu_cm_write(ipu, idma_mask(dma_ch),
+ IPU_CHA_BUF2_RDY(ipu->devtype, dma_ch));
+ ipu_cm_write(ipu, 0x0, IPU_GPR); /* write one to set */
+}
+
+void ipu_clear_buffer_ready(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type,
+ uint32_t bufNum)
+{
+ unsigned long lock_flags;
+
+ spin_lock_irqsave(&ipu->rdy_reg_spin_lock, lock_flags);
+ _ipu_clear_buffer_ready(ipu, channel, type, bufNum);
+ spin_unlock_irqrestore(&ipu->rdy_reg_spin_lock, lock_flags);
+}
+EXPORT_SYMBOL(ipu_clear_buffer_ready);
+
+/*!
+ * This function disables a logical channel.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param wait_for_stop Flag to set whether to wait for channel end
+ * of frame or return immediately.
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail.
+ */
+int32_t ipu_disable_channel(struct ipu_soc *ipu, ipu_channel_t channel, bool wait_for_stop)
+{
+ uint32_t reg;
+ uint32_t in_dma;
+ uint32_t out_dma;
+ uint32_t sec_dma = NO_DMA;
+ uint32_t thrd_dma = NO_DMA;
+ uint16_t fg_pos_x, fg_pos_y;
+ unsigned long lock_flags;
+
+ mutex_lock(&ipu->mutex_lock);
+
+ if ((ipu->channel_enable_mask & (1L << IPU_CHAN_ID(channel))) == 0) {
+ dev_dbg(ipu->dev, "Channel already disabled %d\n",
+ IPU_CHAN_ID(channel));
+ mutex_unlock(&ipu->mutex_lock);
+ return -EACCES;
+ }
+
+ /* Get input and output dma channels */
+ out_dma = channel_2_dma(channel, IPU_OUTPUT_BUFFER);
+ in_dma = channel_2_dma(channel, IPU_VIDEO_IN_BUFFER);
+
+ if ((idma_is_valid(in_dma) &&
+ !idma_is_set(ipu, IDMAC_CHA_EN(in_dma), in_dma))
+ && (idma_is_valid(out_dma) &&
+ !idma_is_set(ipu, IDMAC_CHA_EN(out_dma), out_dma))) {
+ mutex_unlock(&ipu->mutex_lock);
+ return -EINVAL;
+ }
+
+ if (ipu->sec_chan_en[IPU_CHAN_ID(channel)])
+ sec_dma = channel_2_dma(channel, IPU_GRAPH_IN_BUFFER);
+ if (ipu->thrd_chan_en[IPU_CHAN_ID(channel)]) {
+ sec_dma = channel_2_dma(channel, IPU_GRAPH_IN_BUFFER);
+ thrd_dma = channel_2_dma(channel, IPU_ALPHA_IN_BUFFER);
+ }
+
+ if ((channel == MEM_BG_SYNC) || (channel == MEM_FG_SYNC) ||
+ (channel == MEM_DC_SYNC)) {
+ if (channel == MEM_FG_SYNC) {
+ _ipu_disp_get_window_pos(ipu, channel, &fg_pos_x, &fg_pos_y);
+ _ipu_disp_set_window_pos(ipu, channel, 0, 0);
+ }
+
+ _ipu_dp_dc_disable(ipu, channel, false);
+
+ /*
+ * wait for BG channel EOF then disable FG-IDMAC,
+ * it avoid FG NFB4EOF error.
+ */
+ if ((channel == MEM_FG_SYNC) && (ipu_is_channel_busy(ipu, MEM_BG_SYNC))) {
+ int timeout = 50;
+
+ ipu_cm_write(ipu, IPUIRQ_2_MASK(IPU_IRQ_BG_SYNC_EOF),
+ IPUIRQ_2_STATREG(ipu->devtype,
+ IPU_IRQ_BG_SYNC_EOF));
+ while ((ipu_cm_read(ipu,
+ IPUIRQ_2_STATREG(ipu->devtype,
+ IPU_IRQ_BG_SYNC_EOF)) &
+ IPUIRQ_2_MASK(IPU_IRQ_BG_SYNC_EOF)) == 0) {
+ msleep(10);
+ timeout -= 10;
+ if (timeout <= 0) {
+ dev_err(ipu->dev, "warning: wait for bg sync eof timeout\n");
+ break;
+ }
+ }
+ }
+ } else if (wait_for_stop && !_ipu_is_smfc_chan(out_dma) &&
+ channel != CSI_PRP_VF_MEM && channel != CSI_PRP_ENC_MEM) {
+ while (idma_is_set(ipu, IDMAC_CHA_BUSY(ipu->devtype, in_dma),
+ in_dma) ||
+ idma_is_set(ipu, IDMAC_CHA_BUSY(ipu->devtype, out_dma),
+ out_dma) ||
+ (ipu->sec_chan_en[IPU_CHAN_ID(channel)] &&
+ idma_is_set(ipu, IDMAC_CHA_BUSY(ipu->devtype, sec_dma),
+ sec_dma)) ||
+ (ipu->thrd_chan_en[IPU_CHAN_ID(channel)] &&
+ idma_is_set(ipu, IDMAC_CHA_BUSY(ipu->devtype, thrd_dma),
+ thrd_dma))) {
+ uint32_t irq = 0xffffffff;
+ int timeout = 50000;
+
+ if (idma_is_set(ipu, IDMAC_CHA_BUSY(ipu->devtype,
+ out_dma), out_dma))
+ irq = out_dma;
+ if (ipu->sec_chan_en[IPU_CHAN_ID(channel)] &&
+ idma_is_set(ipu, IDMAC_CHA_BUSY(ipu->devtype,
+ sec_dma), sec_dma))
+ irq = sec_dma;
+ if (ipu->thrd_chan_en[IPU_CHAN_ID(channel)] &&
+ idma_is_set(ipu, IDMAC_CHA_BUSY(ipu->devtype,
+ thrd_dma), thrd_dma))
+ irq = thrd_dma;
+ if (idma_is_set(ipu, IDMAC_CHA_BUSY(ipu->devtype,
+ in_dma), in_dma))
+ irq = in_dma;
+
+ if (irq == 0xffffffff) {
+ dev_dbg(ipu->dev, "warning: no channel busy, break\n");
+ break;
+ }
+
+ ipu_cm_write(ipu, IPUIRQ_2_MASK(irq),
+ IPUIRQ_2_STATREG(ipu->devtype, irq));
+
+ dev_dbg(ipu->dev, "warning: channel %d busy, need wait\n", irq);
+
+ while (((ipu_cm_read(ipu,
+ IPUIRQ_2_STATREG(ipu->devtype, irq))
+ & IPUIRQ_2_MASK(irq)) == 0) &&
+ (idma_is_set(ipu, IDMAC_CHA_BUSY(ipu->devtype,
+ irq), irq))) {
+ udelay(10);
+ timeout -= 10;
+ if (timeout <= 0) {
+ ipu_dump_registers(ipu);
+ dev_err(ipu->dev, "warning: disable ipu dma channel %d during its busy state\n", irq);
+ break;
+ }
+ }
+ dev_dbg(ipu->dev, "wait_time:%d\n", 50000 - timeout);
+
+ }
+ }
+
+ if ((channel == MEM_BG_SYNC) || (channel == MEM_FG_SYNC) ||
+ (channel == MEM_DC_SYNC)) {
+ reg = ipu_idmac_read(ipu, IDMAC_WM_EN(in_dma));
+ ipu_idmac_write(ipu, reg & ~idma_mask(in_dma), IDMAC_WM_EN(in_dma));
+ }
+
+ /* Disable IC task */
+ if (_ipu_is_ic_chan(in_dma) || _ipu_is_ic_chan(out_dma) ||
+ _ipu_is_irt_chan(in_dma) || _ipu_is_irt_chan(out_dma) ||
+ _ipu_is_vdi_out_chan(out_dma))
+ _ipu_ic_disable_task(ipu, channel);
+
+ /* Disable DMA channel(s) */
+ if (idma_is_valid(in_dma)) {
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(in_dma));
+ ipu_idmac_write(ipu, reg & ~idma_mask(in_dma), IDMAC_CHA_EN(in_dma));
+ ipu_cm_write(ipu, idma_mask(in_dma),
+ IPU_CHA_CUR_BUF(ipu->devtype, in_dma));
+ ipu_cm_write(ipu, tri_cur_buf_mask(in_dma),
+ IPU_CHA_TRIPLE_CUR_BUF(ipu->devtype, in_dma));
+ }
+ if (idma_is_valid(out_dma)) {
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(out_dma));
+ ipu_idmac_write(ipu, reg & ~idma_mask(out_dma), IDMAC_CHA_EN(out_dma));
+ ipu_cm_write(ipu, idma_mask(out_dma),
+ IPU_CHA_CUR_BUF(ipu->devtype, out_dma));
+ ipu_cm_write(ipu, tri_cur_buf_mask(out_dma),
+ IPU_CHA_TRIPLE_CUR_BUF(ipu->devtype, out_dma));
+ }
+ if (ipu->sec_chan_en[IPU_CHAN_ID(channel)] && idma_is_valid(sec_dma)) {
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(sec_dma));
+ ipu_idmac_write(ipu, reg & ~idma_mask(sec_dma), IDMAC_CHA_EN(sec_dma));
+ ipu_cm_write(ipu, idma_mask(sec_dma),
+ IPU_CHA_CUR_BUF(ipu->devtype, sec_dma));
+ }
+ if (ipu->thrd_chan_en[IPU_CHAN_ID(channel)] && idma_is_valid(thrd_dma)) {
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(thrd_dma));
+ ipu_idmac_write(ipu, reg & ~idma_mask(thrd_dma), IDMAC_CHA_EN(thrd_dma));
+ if (channel == MEM_BG_SYNC || channel == MEM_FG_SYNC) {
+ reg = ipu_idmac_read(ipu, IDMAC_SEP_ALPHA);
+ ipu_idmac_write(ipu, reg & ~idma_mask(in_dma), IDMAC_SEP_ALPHA);
+ } else {
+ reg = ipu_idmac_read(ipu, IDMAC_SEP_ALPHA);
+ ipu_idmac_write(ipu, reg & ~idma_mask(sec_dma), IDMAC_SEP_ALPHA);
+ }
+ ipu_cm_write(ipu, idma_mask(thrd_dma),
+ IPU_CHA_CUR_BUF(ipu->devtype, thrd_dma));
+ }
+
+ if (channel == MEM_FG_SYNC)
+ _ipu_disp_set_window_pos(ipu, channel, fg_pos_x, fg_pos_y);
+
+ spin_lock_irqsave(&ipu->rdy_reg_spin_lock, lock_flags);
+ /* Set channel buffers NOT to be ready */
+ if (idma_is_valid(in_dma)) {
+ _ipu_clear_buffer_ready(ipu, channel, IPU_VIDEO_IN_BUFFER, 0);
+ _ipu_clear_buffer_ready(ipu, channel, IPU_VIDEO_IN_BUFFER, 1);
+ _ipu_clear_buffer_ready(ipu, channel, IPU_VIDEO_IN_BUFFER, 2);
+ }
+ if (idma_is_valid(out_dma)) {
+ _ipu_clear_buffer_ready(ipu, channel, IPU_OUTPUT_BUFFER, 0);
+ _ipu_clear_buffer_ready(ipu, channel, IPU_OUTPUT_BUFFER, 1);
+ }
+ if (ipu->sec_chan_en[IPU_CHAN_ID(channel)] && idma_is_valid(sec_dma)) {
+ _ipu_clear_buffer_ready(ipu, channel, IPU_GRAPH_IN_BUFFER, 0);
+ _ipu_clear_buffer_ready(ipu, channel, IPU_GRAPH_IN_BUFFER, 1);
+ }
+ if (ipu->thrd_chan_en[IPU_CHAN_ID(channel)] && idma_is_valid(thrd_dma)) {
+ _ipu_clear_buffer_ready(ipu, channel, IPU_ALPHA_IN_BUFFER, 0);
+ _ipu_clear_buffer_ready(ipu, channel, IPU_ALPHA_IN_BUFFER, 1);
+ }
+ spin_unlock_irqrestore(&ipu->rdy_reg_spin_lock, lock_flags);
+
+ ipu->channel_enable_mask &= ~(1L << IPU_CHAN_ID(channel));
+
+ if (ipu->prg_clk)
+ clk_disable_unprepare(ipu->prg_clk);
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_disable_channel);
+
+/*!
+ * This function enables CSI.
+ *
+ * @param ipu ipu handler
+ * @param csi csi num 0 or 1
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail.
+ */
+int32_t ipu_enable_csi(struct ipu_soc *ipu, uint32_t csi)
+{
+ uint32_t reg;
+
+ if (csi > 1) {
+ dev_err(ipu->dev, "Wrong csi num_%d\n", csi);
+ return -EINVAL;
+ }
+
+ _ipu_get(ipu);
+ mutex_lock(&ipu->mutex_lock);
+ ipu->csi_use_count[csi]++;
+
+ if (ipu->csi_use_count[csi] == 1) {
+ reg = ipu_cm_read(ipu, IPU_CONF);
+ if (csi == 0)
+ ipu_cm_write(ipu, reg | IPU_CONF_CSI0_EN, IPU_CONF);
+ else
+ ipu_cm_write(ipu, reg | IPU_CONF_CSI1_EN, IPU_CONF);
+ }
+ mutex_unlock(&ipu->mutex_lock);
+ _ipu_put(ipu);
+ return 0;
+}
+EXPORT_SYMBOL(ipu_enable_csi);
+
+/*!
+ * This function disables CSI.
+ *
+ * @param ipu ipu handler
+ * @param csi csi num 0 or 1
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail.
+ */
+int32_t ipu_disable_csi(struct ipu_soc *ipu, uint32_t csi)
+{
+ uint32_t reg;
+
+ if (csi > 1) {
+ dev_err(ipu->dev, "Wrong csi num_%d\n", csi);
+ return -EINVAL;
+ }
+ _ipu_get(ipu);
+ mutex_lock(&ipu->mutex_lock);
+ ipu->csi_use_count[csi]--;
+ if (ipu->csi_use_count[csi] == 0) {
+ _ipu_csi_wait4eof(ipu, ipu->csi_channel[csi]);
+ reg = ipu_cm_read(ipu, IPU_CONF);
+ if (csi == 0)
+ ipu_cm_write(ipu, reg & ~IPU_CONF_CSI0_EN, IPU_CONF);
+ else
+ ipu_cm_write(ipu, reg & ~IPU_CONF_CSI1_EN, IPU_CONF);
+ }
+ mutex_unlock(&ipu->mutex_lock);
+ _ipu_put(ipu);
+ return 0;
+}
+EXPORT_SYMBOL(ipu_disable_csi);
+
+static irqreturn_t ipu_sync_irq_handler(int irq, void *desc)
+{
+ struct ipu_soc *ipu = desc;
+ int i;
+ uint32_t line, bit, int_stat, int_ctrl;
+ irqreturn_t result = IRQ_NONE;
+ const int int_reg[] = { 1, 2, 3, 4, 11, 12, 13, 14, 15, 0 };
+
+ spin_lock(&ipu->int_reg_spin_lock);
+
+ for (i = 0; int_reg[i] != 0; i++) {
+ int_stat = ipu_cm_read(ipu,
+ IPU_INT_STAT(ipu->devtype, int_reg[i]));
+ int_ctrl = ipu_cm_read(ipu, IPU_INT_CTRL(int_reg[i]));
+ int_stat &= int_ctrl;
+ ipu_cm_write(ipu, int_stat,
+ IPU_INT_STAT(ipu->devtype, int_reg[i]));
+ while ((line = ffs(int_stat)) != 0) {
+ bit = --line;
+ int_stat &= ~(1UL << line);
+ line += (int_reg[i] - 1) * 32;
+ result |=
+ ipu->irq_list[line].handler(line,
+ ipu->irq_list[line].
+ dev_id);
+ if (ipu->irq_list[line].flags & IPU_IRQF_ONESHOT) {
+ int_ctrl &= ~(1UL << bit);
+ ipu_cm_write(ipu, int_ctrl,
+ IPU_INT_CTRL(int_reg[i]));
+ }
+ }
+ }
+
+ spin_unlock(&ipu->int_reg_spin_lock);
+
+ return result;
+}
+
+static irqreturn_t ipu_err_irq_handler(int irq, void *desc)
+{
+ struct ipu_soc *ipu = desc;
+ int i;
+ uint32_t int_stat;
+ const int err_reg[] = { 5, 6, 9, 10, 0 };
+
+ spin_lock(&ipu->int_reg_spin_lock);
+
+ for (i = 0; err_reg[i] != 0; i++) {
+ int_stat = ipu_cm_read(ipu,
+ IPU_INT_STAT(ipu->devtype, err_reg[i]));
+ int_stat &= ipu_cm_read(ipu, IPU_INT_CTRL(err_reg[i]));
+ if (int_stat) {
+ ipu_cm_write(ipu, int_stat,
+ IPU_INT_STAT(ipu->devtype, err_reg[i]));
+ dev_warn(ipu->dev,
+ "IPU Warning - IPU_INT_STAT_%d = 0x%08X\n",
+ err_reg[i], int_stat);
+ /* Disable interrupts so we only get error once */
+ int_stat = ipu_cm_read(ipu, IPU_INT_CTRL(err_reg[i])) &
+ ~int_stat;
+ ipu_cm_write(ipu, int_stat, IPU_INT_CTRL(err_reg[i]));
+ }
+ }
+
+ spin_unlock(&ipu->int_reg_spin_lock);
+
+ return IRQ_HANDLED;
+}
+
+/*!
+ * This function enables the interrupt for the specified interrupt line.
+ * The interrupt lines are defined in \b ipu_irq_line enum.
+ *
+ * @param ipu ipu handler
+ * @param irq Interrupt line to enable interrupt for.
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail.
+ */
+int ipu_enable_irq(struct ipu_soc *ipu, uint32_t irq)
+{
+ uint32_t reg;
+ unsigned long lock_flags;
+ int ret = 0;
+
+ _ipu_get(ipu);
+
+ spin_lock_irqsave(&ipu->int_reg_spin_lock, lock_flags);
+
+ /*
+ * Check sync interrupt handler only, since we do nothing for
+ * error interrupts but than print out register values in the
+ * error interrupt source handler.
+ */
+ if (_ipu_is_sync_irq(irq) && (ipu->irq_list[irq].handler == NULL)) {
+ dev_err(ipu->dev, "handler hasn't been registered on sync "
+ "irq %d\n", irq);
+ ret = -EACCES;
+ goto out;
+ }
+
+ reg = ipu_cm_read(ipu, IPUIRQ_2_CTRLREG(irq));
+ reg |= IPUIRQ_2_MASK(irq);
+ ipu_cm_write(ipu, reg, IPUIRQ_2_CTRLREG(irq));
+out:
+ spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags);
+
+ _ipu_put(ipu);
+
+ return ret;
+}
+EXPORT_SYMBOL(ipu_enable_irq);
+
+/*!
+ * This function disables the interrupt for the specified interrupt line.
+ * The interrupt lines are defined in \b ipu_irq_line enum.
+ *
+ * @param ipu ipu handler
+ * @param irq Interrupt line to disable interrupt for.
+ *
+ */
+void ipu_disable_irq(struct ipu_soc *ipu, uint32_t irq)
+{
+ uint32_t reg;
+ unsigned long lock_flags;
+
+ _ipu_get(ipu);
+
+ spin_lock_irqsave(&ipu->int_reg_spin_lock, lock_flags);
+
+ reg = ipu_cm_read(ipu, IPUIRQ_2_CTRLREG(irq));
+ reg &= ~IPUIRQ_2_MASK(irq);
+ ipu_cm_write(ipu, reg, IPUIRQ_2_CTRLREG(irq));
+
+ spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags);
+
+ _ipu_put(ipu);
+}
+EXPORT_SYMBOL(ipu_disable_irq);
+
+/*!
+ * This function clears the interrupt for the specified interrupt line.
+ * The interrupt lines are defined in \b ipu_irq_line enum.
+ *
+ * @param ipu ipu handler
+ * @param irq Interrupt line to clear interrupt for.
+ *
+ */
+void ipu_clear_irq(struct ipu_soc *ipu, uint32_t irq)
+{
+ unsigned long lock_flags;
+
+ _ipu_get(ipu);
+
+ spin_lock_irqsave(&ipu->int_reg_spin_lock, lock_flags);
+
+ ipu_cm_write(ipu, IPUIRQ_2_MASK(irq),
+ IPUIRQ_2_STATREG(ipu->devtype, irq));
+
+ spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags);
+
+ _ipu_put(ipu);
+}
+EXPORT_SYMBOL(ipu_clear_irq);
+
+/*!
+ * This function returns the current interrupt status for the specified
+ * interrupt line. The interrupt lines are defined in \b ipu_irq_line enum.
+ *
+ * @param ipu ipu handler
+ * @param irq Interrupt line to get status for.
+ *
+ * @return Returns true if the interrupt is pending/asserted or false if
+ * the interrupt is not pending.
+ */
+bool ipu_get_irq_status(struct ipu_soc *ipu, uint32_t irq)
+{
+ uint32_t reg;
+ unsigned long lock_flags;
+
+ _ipu_get(ipu);
+
+ spin_lock_irqsave(&ipu->int_reg_spin_lock, lock_flags);
+ reg = ipu_cm_read(ipu, IPUIRQ_2_STATREG(ipu->devtype, irq));
+ spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags);
+
+ _ipu_put(ipu);
+
+ if (reg & IPUIRQ_2_MASK(irq))
+ return true;
+ else
+ return false;
+}
+EXPORT_SYMBOL(ipu_get_irq_status);
+
+/*!
+ * This function registers an interrupt handler function for the specified
+ * interrupt line. The interrupt lines are defined in \b ipu_irq_line enum.
+ *
+ * @param ipu ipu handler
+ * @param irq Interrupt line to get status for.
+ *
+ * @param handler Input parameter for address of the handler
+ * function.
+ *
+ * @param irq_flags Flags for interrupt mode. Currently not used.
+ *
+ * @param devname Input parameter for string name of driver
+ * registering the handler.
+ *
+ * @param dev_id Input parameter for pointer of data to be
+ * passed to the handler.
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail.
+ */
+int ipu_request_irq(struct ipu_soc *ipu, uint32_t irq,
+ irqreturn_t(*handler) (int, void *),
+ uint32_t irq_flags, const char *devname, void *dev_id)
+{
+ uint32_t reg;
+ unsigned long lock_flags;
+ int ret = 0;
+
+ BUG_ON(irq >= IPU_IRQ_COUNT);
+
+ _ipu_get(ipu);
+
+ spin_lock_irqsave(&ipu->int_reg_spin_lock, lock_flags);
+
+ if (ipu->irq_list[irq].handler != NULL) {
+ dev_err(ipu->dev,
+ "handler already installed on irq %d\n", irq);
+ ret = -EINVAL;
+ goto out;
+ }
+
+ /*
+ * Check sync interrupt handler only, since we do nothing for
+ * error interrupts but than print out register values in the
+ * error interrupt source handler.
+ */
+ if (_ipu_is_sync_irq(irq) && (handler == NULL)) {
+ dev_err(ipu->dev, "handler is NULL for sync irq %d\n", irq);
+ ret = -EINVAL;
+ goto out;
+ }
+
+ ipu->irq_list[irq].handler = handler;
+ ipu->irq_list[irq].flags = irq_flags;
+ ipu->irq_list[irq].dev_id = dev_id;
+ ipu->irq_list[irq].name = devname;
+
+ /* clear irq stat for previous use */
+ ipu_cm_write(ipu, IPUIRQ_2_MASK(irq),
+ IPUIRQ_2_STATREG(ipu->devtype, irq));
+ /* enable the interrupt */
+ reg = ipu_cm_read(ipu, IPUIRQ_2_CTRLREG(irq));
+ reg |= IPUIRQ_2_MASK(irq);
+ ipu_cm_write(ipu, reg, IPUIRQ_2_CTRLREG(irq));
+out:
+ spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags);
+
+ _ipu_put(ipu);
+
+ return ret;
+}
+EXPORT_SYMBOL(ipu_request_irq);
+
+/*!
+ * This function unregisters an interrupt handler for the specified interrupt
+ * line. The interrupt lines are defined in \b ipu_irq_line enum.
+ *
+ * @param ipu ipu handler
+ * @param irq Interrupt line to get status for.
+ *
+ * @param dev_id Input parameter for pointer of data to be passed
+ * to the handler. This must match value passed to
+ * ipu_request_irq().
+ *
+ */
+void ipu_free_irq(struct ipu_soc *ipu, uint32_t irq, void *dev_id)
+{
+ uint32_t reg;
+ unsigned long lock_flags;
+
+ _ipu_get(ipu);
+
+ spin_lock_irqsave(&ipu->int_reg_spin_lock, lock_flags);
+
+ /* disable the interrupt */
+ reg = ipu_cm_read(ipu, IPUIRQ_2_CTRLREG(irq));
+ reg &= ~IPUIRQ_2_MASK(irq);
+ ipu_cm_write(ipu, reg, IPUIRQ_2_CTRLREG(irq));
+ if (ipu->irq_list[irq].dev_id == dev_id)
+ memset(&ipu->irq_list[irq], 0, sizeof(ipu->irq_list[irq]));
+
+ spin_unlock_irqrestore(&ipu->int_reg_spin_lock, lock_flags);
+
+ _ipu_put(ipu);
+}
+EXPORT_SYMBOL(ipu_free_irq);
+
+uint32_t ipu_get_cur_buffer_idx(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type)
+{
+ uint32_t reg, dma_chan;
+
+ dma_chan = channel_2_dma(channel, type);
+ if (!idma_is_valid(dma_chan))
+ return -EINVAL;
+
+ reg = ipu_cm_read(ipu, IPU_CHA_TRB_MODE_SEL(ipu->devtype, dma_chan));
+ if ((reg & idma_mask(dma_chan)) && _ipu_is_trb_chan(ipu, dma_chan)) {
+ reg = ipu_cm_read(ipu,
+ IPU_CHA_TRIPLE_CUR_BUF(ipu->devtype, dma_chan));
+ return (reg & tri_cur_buf_mask(dma_chan)) >>
+ tri_cur_buf_shift(dma_chan);
+ } else {
+ reg = ipu_cm_read(ipu, IPU_CHA_CUR_BUF(ipu->devtype, dma_chan));
+ if (reg & idma_mask(dma_chan))
+ return 1;
+ else
+ return 0;
+ }
+}
+EXPORT_SYMBOL(ipu_get_cur_buffer_idx);
+
+uint32_t _ipu_channel_status(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ uint32_t stat = 0;
+ uint32_t task_stat_reg = ipu_cm_read(ipu,
+ IPU_PROC_TASK_STAT(ipu->devtype));
+
+ switch (channel) {
+ case MEM_PRP_VF_MEM:
+ stat = (task_stat_reg & TSTAT_VF_MASK) >> TSTAT_VF_OFFSET;
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ stat = (task_stat_reg & TSTAT_VF_MASK) >> TSTAT_VF_OFFSET;
+ break;
+ case MEM_ROT_VF_MEM:
+ stat =
+ (task_stat_reg & TSTAT_VF_ROT_MASK) >> TSTAT_VF_ROT_OFFSET;
+ break;
+ case MEM_PRP_ENC_MEM:
+ stat = (task_stat_reg & TSTAT_ENC_MASK) >> TSTAT_ENC_OFFSET;
+ break;
+ case MEM_ROT_ENC_MEM:
+ stat =
+ (task_stat_reg & TSTAT_ENC_ROT_MASK) >>
+ TSTAT_ENC_ROT_OFFSET;
+ break;
+ case MEM_PP_MEM:
+ stat = (task_stat_reg & TSTAT_PP_MASK) >> TSTAT_PP_OFFSET;
+ break;
+ case MEM_ROT_PP_MEM:
+ stat =
+ (task_stat_reg & TSTAT_PP_ROT_MASK) >> TSTAT_PP_ROT_OFFSET;
+ break;
+
+ default:
+ stat = TASK_STAT_IDLE;
+ break;
+ }
+ return stat;
+}
+
+/*!
+ * This function check for a logical channel status
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @return This function returns 0 on idle and 1 on busy.
+ *
+ */
+uint32_t ipu_channel_status(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ uint32_t dma_status;
+
+ _ipu_get(ipu);
+ mutex_lock(&ipu->mutex_lock);
+ dma_status = ipu_is_channel_busy(ipu, channel);
+ mutex_unlock(&ipu->mutex_lock);
+ _ipu_put(ipu);
+
+ dev_dbg(ipu->dev, "%s, dma_status:%d.\n", __func__, dma_status);
+
+ return dma_status;
+}
+EXPORT_SYMBOL(ipu_channel_status);
+
+int32_t ipu_swap_channel(struct ipu_soc *ipu, ipu_channel_t from_ch, ipu_channel_t to_ch)
+{
+ uint32_t reg;
+ unsigned long lock_flags;
+ int from_dma = channel_2_dma(from_ch, IPU_INPUT_BUFFER);
+ int to_dma = channel_2_dma(to_ch, IPU_INPUT_BUFFER);
+
+ mutex_lock(&ipu->mutex_lock);
+
+ /* enable target channel */
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(to_dma));
+ ipu_idmac_write(ipu, reg | idma_mask(to_dma), IDMAC_CHA_EN(to_dma));
+
+ ipu->channel_enable_mask |= 1L << IPU_CHAN_ID(to_ch);
+
+ /* switch dp dc */
+ _ipu_dp_dc_disable(ipu, from_ch, true);
+
+ /* disable source channel */
+ reg = ipu_idmac_read(ipu, IDMAC_CHA_EN(from_dma));
+ ipu_idmac_write(ipu, reg & ~idma_mask(from_dma), IDMAC_CHA_EN(from_dma));
+ ipu_cm_write(ipu, idma_mask(from_dma),
+ IPU_CHA_CUR_BUF(ipu->devtype, from_dma));
+ ipu_cm_write(ipu, tri_cur_buf_mask(from_dma),
+ IPU_CHA_TRIPLE_CUR_BUF(ipu->devtype, from_dma));
+
+ ipu->channel_enable_mask &= ~(1L << IPU_CHAN_ID(from_ch));
+
+ spin_lock_irqsave(&ipu->rdy_reg_spin_lock, lock_flags);
+ _ipu_clear_buffer_ready(ipu, from_ch, IPU_VIDEO_IN_BUFFER, 0);
+ _ipu_clear_buffer_ready(ipu, from_ch, IPU_VIDEO_IN_BUFFER, 1);
+ _ipu_clear_buffer_ready(ipu, from_ch, IPU_VIDEO_IN_BUFFER, 2);
+ spin_unlock_irqrestore(&ipu->rdy_reg_spin_lock, lock_flags);
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_swap_channel);
+
+uint32_t bytes_per_pixel(uint32_t fmt)
+{
+ switch (fmt) {
+ case IPU_PIX_FMT_GENERIC: /*generic data */
+ case IPU_PIX_FMT_RGB332:
+ case IPU_PIX_FMT_YUV420P:
+ case IPU_PIX_FMT_YVU420P:
+ case IPU_PIX_FMT_YUV422P:
+ case IPU_PIX_FMT_YUV444P:
+ case IPU_PIX_FMT_NV12:
+ case PRE_PIX_FMT_NV21:
+ case IPU_PIX_FMT_NV16:
+ case PRE_PIX_FMT_NV61:
+ return 1;
+ break;
+ case IPU_PIX_FMT_GENERIC_16: /* generic data */
+ case IPU_PIX_FMT_RGB565:
+ case IPU_PIX_FMT_BGRA4444:
+ case IPU_PIX_FMT_BGRA5551:
+ case IPU_PIX_FMT_YUYV:
+ case IPU_PIX_FMT_UYVY:
+ case IPU_PIX_FMT_GPU16_SB_ST:
+ case IPU_PIX_FMT_GPU16_SB_SRT:
+ case IPU_PIX_FMT_GPU16_ST:
+ case IPU_PIX_FMT_GPU16_SRT:
+ return 2;
+ break;
+ case IPU_PIX_FMT_BGR24:
+ case IPU_PIX_FMT_RGB24:
+ case IPU_PIX_FMT_YUV444:
+ return 3;
+ break;
+ case IPU_PIX_FMT_GENERIC_32: /*generic data */
+ case IPU_PIX_FMT_BGR32:
+ case IPU_PIX_FMT_BGRA32:
+ case IPU_PIX_FMT_RGB32:
+ case IPU_PIX_FMT_RGBA32:
+ case IPU_PIX_FMT_ABGR32:
+ case IPU_PIX_FMT_GPU32_SB_ST:
+ case IPU_PIX_FMT_GPU32_SB_SRT:
+ case IPU_PIX_FMT_GPU32_ST:
+ case IPU_PIX_FMT_GPU32_SRT:
+ case IPU_PIX_FMT_AYUV:
+ return 4;
+ break;
+ default:
+ return 1;
+ break;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(bytes_per_pixel);
+
+ipu_color_space_t format_to_colorspace(uint32_t fmt)
+{
+ switch (fmt) {
+ case IPU_PIX_FMT_RGB666:
+ case IPU_PIX_FMT_RGB565:
+ case IPU_PIX_FMT_BGRA4444:
+ case IPU_PIX_FMT_BGRA5551:
+ case IPU_PIX_FMT_BGR24:
+ case IPU_PIX_FMT_RGB24:
+ case IPU_PIX_FMT_GBR24:
+ case IPU_PIX_FMT_BGR32:
+ case IPU_PIX_FMT_BGRA32:
+ case IPU_PIX_FMT_RGB32:
+ case IPU_PIX_FMT_RGBA32:
+ case IPU_PIX_FMT_ABGR32:
+ case IPU_PIX_FMT_LVDS666:
+ case IPU_PIX_FMT_LVDS888:
+ case IPU_PIX_FMT_GPU32_SB_ST:
+ case IPU_PIX_FMT_GPU32_SB_SRT:
+ case IPU_PIX_FMT_GPU32_ST:
+ case IPU_PIX_FMT_GPU32_SRT:
+ case IPU_PIX_FMT_GPU16_SB_ST:
+ case IPU_PIX_FMT_GPU16_SB_SRT:
+ case IPU_PIX_FMT_GPU16_ST:
+ case IPU_PIX_FMT_GPU16_SRT:
+ return RGB;
+ break;
+
+ default:
+ return YCbCr;
+ break;
+ }
+ return RGB;
+}
+EXPORT_SYMBOL(format_to_colorspace);
+
+bool ipu_pixel_format_has_alpha(uint32_t fmt)
+{
+ switch (fmt) {
+ case IPU_PIX_FMT_RGBA32:
+ case IPU_PIX_FMT_BGRA32:
+ case IPU_PIX_FMT_ABGR32:
+ return true;
+ break;
+ default:
+ return false;
+ break;
+ }
+ return false;
+}
+
+bool ipu_ch_param_bad_alpha_pos(uint32_t pixel_fmt)
+{
+ return _ipu_ch_param_bad_alpha_pos(pixel_fmt);
+}
+EXPORT_SYMBOL(ipu_ch_param_bad_alpha_pos);
+
+bool ipu_pixel_format_is_gpu_tile(uint32_t fmt)
+{
+ switch (fmt) {
+ case IPU_PIX_FMT_GPU32_SB_ST:
+ case IPU_PIX_FMT_GPU32_SB_SRT:
+ case IPU_PIX_FMT_GPU32_ST:
+ case IPU_PIX_FMT_GPU32_SRT:
+ case IPU_PIX_FMT_GPU16_SB_ST:
+ case IPU_PIX_FMT_GPU16_SB_SRT:
+ case IPU_PIX_FMT_GPU16_ST:
+ case IPU_PIX_FMT_GPU16_SRT:
+ return true;
+ default:
+ return false;
+ }
+}
+EXPORT_SYMBOL(ipu_pixel_format_is_gpu_tile);
+
+bool ipu_pixel_format_is_split_gpu_tile(uint32_t fmt)
+{
+ switch (fmt) {
+ case IPU_PIX_FMT_GPU32_SB_ST:
+ case IPU_PIX_FMT_GPU32_SB_SRT:
+ case IPU_PIX_FMT_GPU16_SB_ST:
+ case IPU_PIX_FMT_GPU16_SB_SRT:
+ return true;
+ default:
+ return false;
+ }
+}
+EXPORT_SYMBOL(ipu_pixel_format_is_split_gpu_tile);
+
+bool ipu_pixel_format_is_pre_yuv(uint32_t fmt)
+{
+ switch (fmt) {
+ case PRE_PIX_FMT_NV21:
+ case PRE_PIX_FMT_NV61:
+ return true;
+ default:
+ return false;
+ }
+}
+EXPORT_SYMBOL(ipu_pixel_format_is_pre_yuv);
+
+bool ipu_pixel_format_is_multiplanar_yuv(uint32_t fmt)
+{
+ switch (fmt) {
+ case IPU_PIX_FMT_YVU410P:
+ case IPU_PIX_FMT_YUV420P:
+ case IPU_PIX_FMT_YUV420P2:
+ case IPU_PIX_FMT_YVU420P:
+ case IPU_PIX_FMT_YUV422P:
+ case IPU_PIX_FMT_YVU422P:
+ case IPU_PIX_FMT_YUV444P:
+ case IPU_PIX_FMT_NV12:
+ case PRE_PIX_FMT_NV21:
+ case IPU_PIX_FMT_NV16:
+ case PRE_PIX_FMT_NV61:
+ return true;
+ default:
+ return false;
+ }
+}
+EXPORT_SYMBOL(ipu_pixel_format_is_multiplanar_yuv);
+
+int ipu_ch_param_get_axi_id(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type)
+{
+ uint32_t dma_chan = channel_2_dma(channel, type);
+ int axi_id;
+
+ if (!idma_is_valid(dma_chan))
+ return -EINVAL;
+
+ _ipu_get(ipu);
+ mutex_lock(&ipu->mutex_lock);
+ axi_id = _ipu_ch_param_get_axi_id(ipu, dma_chan);
+ mutex_unlock(&ipu->mutex_lock);
+ _ipu_put(ipu);
+
+ return axi_id;
+}
+EXPORT_SYMBOL(ipu_ch_param_get_axi_id);
+
+#ifdef CONFIG_PM
+int ipu_runtime_suspend(struct device *dev)
+{
+ release_bus_freq(BUS_FREQ_HIGH);
+ dev_dbg(dev, "ipu busfreq high release.\n");
+
+ return 0;
+}
+
+int ipu_runtime_resume(struct device *dev)
+{
+ request_bus_freq(BUS_FREQ_HIGH);
+ dev_dbg(dev, "ipu busfreq high requst.\n");
+
+ return 0;
+}
+
+static const struct dev_pm_ops ipu_pm_ops = {
+ SET_RUNTIME_PM_OPS(ipu_runtime_suspend, ipu_runtime_resume, NULL)
+};
+#endif
+
+/*!
+ * This structure contains pointers to the power management callback functions.
+ */
+static struct platform_driver mxcipu_driver = {
+ .driver = {
+ .name = "imx-ipuv3",
+ .of_match_table = imx_ipuv3_dt_ids,
+ #ifdef CONFIG_PM
+ .pm = &ipu_pm_ops,
+ #endif
+ },
+ .probe = ipu_probe,
+ .remove = ipu_remove,
+};
+
+int32_t __init ipu_gen_init(void)
+{
+ int32_t ret;
+
+ ret = platform_driver_register(&mxcipu_driver);
+ return 0;
+}
+
+subsys_initcall(ipu_gen_init);
+
+static void __exit ipu_gen_uninit(void)
+{
+ platform_driver_unregister(&mxcipu_driver);
+}
+
+module_exit(ipu_gen_uninit);
diff --git a/drivers/mxc/ipu3/ipu_device.c b/drivers/mxc/ipu3/ipu_device.c
new file mode 100644
index 000000000000..9b9112c2e565
--- /dev/null
+++ b/drivers/mxc/ipu3/ipu_device.c
@@ -0,0 +1,3756 @@
+/*
+ * Copyright 2005-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file ipu_device.c
+ *
+ * @brief This file contains the IPUv3 driver device interface and fops functions.
+ *
+ * @ingroup IPU
+ */
+#include <linux/clk.h>
+#include <linux/cpumask.h>
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/ipu-v3.h>
+#include <linux/kernel.h>
+#include <linux/kthread.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/poll.h>
+#include <linux/sched.h>
+#include <uapi/linux/sched/types.h>
+#include <linux/sched/types.h>
+#include <linux/sched/rt.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/time.h>
+#include <linux/types.h>
+#include <linux/vmalloc.h>
+#include <linux/wait.h>
+
+#include <asm/cacheflush.h>
+#include <asm/outercache.h>
+
+#include "ipu_param_mem.h"
+#include "ipu_regs.h"
+#include "vdoa.h"
+
+#define CHECK_RETCODE(cont, str, err, label, ret) \
+do { \
+ if (cont) { \
+ dev_err(t->dev, "ERR:[0x%p]-no:0x%x "#str" ret:%d," \
+ "line:%d\n", t, t->task_no, ret, __LINE__);\
+ if (ret != -EACCES) { \
+ t->state = err; \
+ goto label; \
+ } \
+ } \
+} while (0)
+
+#define CHECK_RETCODE_CONT(cont, str, err, ret) \
+do { \
+ if (cont) { \
+ dev_err(t->dev, "ERR:[0x%p]-no:0x%x"#str" ret:%d," \
+ "line:%d\n", t, t->task_no, ret, __LINE__);\
+ if (ret != -EACCES) { \
+ if (t->state == STATE_OK) \
+ t->state = err; \
+ } \
+ } \
+} while (0)
+
+#undef DBG_IPU_PERF
+#ifdef DBG_IPU_PERF
+#define CHECK_PERF(ts) \
+do { \
+ getnstimeofday(ts); \
+} while (0)
+
+#define DECLARE_PERF_VAR \
+ struct timespec ts_queue; \
+ struct timespec ts_dotask; \
+ struct timespec ts_waitirq; \
+ struct timespec ts_sche; \
+ struct timespec ts_rel; \
+ struct timespec ts_frame
+
+#define PRINT_TASK_STATISTICS \
+do { \
+ ts_queue = timespec_sub(tsk->ts_dotask, tsk->ts_queue); \
+ ts_dotask = timespec_sub(tsk->ts_waitirq, tsk->ts_dotask); \
+ ts_waitirq = timespec_sub(tsk->ts_inirq, tsk->ts_waitirq); \
+ ts_sche = timespec_sub(tsk->ts_wakeup, tsk->ts_inirq); \
+ ts_rel = timespec_sub(tsk->ts_rel, tsk->ts_wakeup); \
+ ts_frame = timespec_sub(tsk->ts_rel, tsk->ts_queue); \
+ dev_dbg(tsk->dev, "[0x%p] no-0x%x, ts_q:%ldus, ts_do:%ldus," \
+ "ts_waitirq:%ldus,ts_sche:%ldus, ts_rel:%ldus," \
+ "ts_frame: %ldus\n", tsk, tsk->task_no, \
+ ts_queue.tv_nsec / NSEC_PER_USEC + ts_queue.tv_sec * USEC_PER_SEC,\
+ ts_dotask.tv_nsec / NSEC_PER_USEC + ts_dotask.tv_sec * USEC_PER_SEC,\
+ ts_waitirq.tv_nsec / NSEC_PER_USEC + ts_waitirq.tv_sec * USEC_PER_SEC,\
+ ts_sche.tv_nsec / NSEC_PER_USEC + ts_sche.tv_sec * USEC_PER_SEC,\
+ ts_rel.tv_nsec / NSEC_PER_USEC + ts_rel.tv_sec * USEC_PER_SEC,\
+ ts_frame.tv_nsec / NSEC_PER_USEC + ts_frame.tv_sec * USEC_PER_SEC); \
+ if ((ts_frame.tv_nsec/NSEC_PER_USEC + ts_frame.tv_sec*USEC_PER_SEC) > \
+ 80000) \
+ dev_dbg(tsk->dev, "ts_frame larger than 80ms [0x%p] no-0x%x.\n"\
+ , tsk, tsk->task_no); \
+} while (0)
+#else
+#define CHECK_PERF(ts)
+#define DECLARE_PERF_VAR
+#define PRINT_TASK_STATISTICS
+#endif
+
+#define IPU_PP_CH_VF (IPU_TASK_ID_VF - 1)
+#define IPU_PP_CH_PP (IPU_TASK_ID_PP - 1)
+#define MAX_PP_CH (IPU_TASK_ID_MAX - 1)
+#define VDOA_DEF_TIMEOUT_MS (HZ/2)
+
+/* Strucutures and variables for exporting MXC IPU as device*/
+typedef enum {
+ STATE_OK = 0,
+ STATE_QUEUE,
+ STATE_IN_PROGRESS,
+ STATE_ERR,
+ STATE_TIMEOUT,
+ STATE_RES_TIMEOUT,
+ STATE_NO_IPU,
+ STATE_NO_IRQ,
+ STATE_IPU_BUSY,
+ STATE_IRQ_FAIL,
+ STATE_IRQ_TIMEOUT,
+ STATE_ENABLE_CHAN_FAIL,
+ STATE_DISABLE_CHAN_FAIL,
+ STATE_SEL_BUF_FAIL,
+ STATE_INIT_CHAN_FAIL,
+ STATE_LINK_CHAN_FAIL,
+ STATE_UNLINK_CHAN_FAIL,
+ STATE_INIT_CHAN_BUF_FAIL,
+ STATE_INIT_CHAN_BAND_FAIL,
+ STATE_SYS_NO_MEM,
+ STATE_VDOA_IRQ_TIMEOUT,
+ STATE_VDOA_IRQ_FAIL,
+ STATE_VDOA_TASK_FAIL,
+} ipu_state_t;
+
+enum {
+ INPUT_CHAN_VDI_P = 1,
+ INPUT_CHAN,
+ INPUT_CHAN_VDI_N,
+};
+
+struct ipu_state_msg {
+ int state;
+ char *msg;
+} state_msg[] = {
+ {STATE_OK, "ok"},
+ {STATE_QUEUE, "split queue"},
+ {STATE_IN_PROGRESS, "split in progress"},
+ {STATE_ERR, "error"},
+ {STATE_TIMEOUT, "split task timeout"},
+ {STATE_RES_TIMEOUT, "wait resource timeout"},
+ {STATE_NO_IPU, "no ipu found"},
+ {STATE_NO_IRQ, "no irq found for task"},
+ {STATE_IPU_BUSY, "ipu busy"},
+ {STATE_IRQ_FAIL, "request irq failed"},
+ {STATE_IRQ_TIMEOUT, "wait for irq timeout"},
+ {STATE_ENABLE_CHAN_FAIL, "ipu enable channel fail"},
+ {STATE_DISABLE_CHAN_FAIL, "ipu disable channel fail"},
+ {STATE_SEL_BUF_FAIL, "ipu select buf fail"},
+ {STATE_INIT_CHAN_FAIL, "ipu init channel fail"},
+ {STATE_LINK_CHAN_FAIL, "ipu link channel fail"},
+ {STATE_UNLINK_CHAN_FAIL, "ipu unlink channel fail"},
+ {STATE_INIT_CHAN_BUF_FAIL, "ipu init channel buffer fail"},
+ {STATE_INIT_CHAN_BAND_FAIL, "ipu init channel band mode fail"},
+ {STATE_SYS_NO_MEM, "sys no mem: -ENOMEM"},
+ {STATE_VDOA_IRQ_TIMEOUT, "wait for vdoa irq timeout"},
+ {STATE_VDOA_IRQ_FAIL, "vdoa irq fail"},
+ {STATE_VDOA_TASK_FAIL, "vdoa task fail"},
+};
+
+struct stripe_setting {
+ u32 iw;
+ u32 ih;
+ u32 ow;
+ u32 oh;
+ u32 outh_resize_ratio;
+ u32 outv_resize_ratio;
+ u32 i_left_pos;
+ u32 i_right_pos;
+ u32 i_top_pos;
+ u32 i_bottom_pos;
+ u32 o_left_pos;
+ u32 o_right_pos;
+ u32 o_top_pos;
+ u32 o_bottom_pos;
+ u32 rl_split_line;
+ u32 ud_split_line;
+};
+
+struct task_set {
+#define NULL_MODE 0x0
+#define IC_MODE 0x1
+#define ROT_MODE 0x2
+#define VDI_MODE 0x4
+#define IPU_PREPROCESS_MODE_MASK (IC_MODE | ROT_MODE | VDI_MODE)
+/* VDOA_MODE means this task use vdoa, and VDOA has two modes:
+ * BAND MODE and non-BAND MODE. Non-band mode will do transfer data
+ * to memory. BAND mode needs hareware sync with IPU, it is used default
+ * if connected to VDIC.
+ */
+#define VDOA_MODE 0x8
+#define VDOA_BAND_MODE 0x10
+ u8 mode;
+#define IC_VF 0x1
+#define IC_PP 0x2
+#define ROT_VF 0x4
+#define ROT_PP 0x8
+#define VDI_VF 0x10
+#define VDOA_ONLY 0x20
+ u8 task;
+#define NO_SPLIT 0x0
+#define RL_SPLIT 0x1
+#define UD_SPLIT 0x2
+#define LEFT_STRIPE 0x1
+#define RIGHT_STRIPE 0x2
+#define UP_STRIPE 0x4
+#define DOWN_STRIPE 0x8
+#define SPLIT_MASK 0xF
+ u8 split_mode;
+ u8 band_lines;
+ ipu_channel_t ic_chan;
+ ipu_channel_t rot_chan;
+ ipu_channel_t vdi_ic_p_chan;
+ ipu_channel_t vdi_ic_n_chan;
+
+ u32 i_off;
+ u32 i_uoff;
+ u32 i_voff;
+ u32 istride;
+
+ u32 ov_off;
+ u32 ov_uoff;
+ u32 ov_voff;
+ u32 ovstride;
+
+ u32 ov_alpha_off;
+ u32 ov_alpha_stride;
+
+ u32 o_off;
+ u32 o_uoff;
+ u32 o_voff;
+ u32 ostride;
+
+ u32 r_fmt;
+ u32 r_width;
+ u32 r_height;
+ u32 r_stride;
+ dma_addr_t r_paddr;
+
+ struct stripe_setting sp_setting;
+};
+
+struct ipu_split_task {
+ struct ipu_task task;
+ struct ipu_task_entry *parent_task;
+ struct ipu_task_entry *child_task;
+ u32 task_no;
+};
+
+struct ipu_task_entry {
+ struct ipu_input input;
+ struct ipu_output output;
+
+ bool overlay_en;
+ struct ipu_overlay overlay;
+#define DEF_TIMEOUT_MS 1000
+#define DEF_DELAY_MS 20
+ int timeout;
+ int irq;
+
+ u8 task_id;
+ u8 ipu_id;
+ u8 task_in_list;
+ u8 split_done;
+ struct mutex split_lock;
+ struct mutex vdic_lock;
+ wait_queue_head_t split_waitq;
+
+ struct list_head node;
+ struct list_head split_list;
+ struct ipu_soc *ipu;
+ struct device *dev;
+ struct task_set set;
+ wait_queue_head_t task_waitq;
+ struct completion irq_comp;
+ struct kref refcount;
+ ipu_state_t state;
+ u32 task_no;
+ atomic_t done;
+ atomic_t res_free;
+ atomic_t res_get;
+
+ struct ipu_task_entry *parent;
+ char *vditmpbuf[2];
+ u32 old_save_lines;
+ u32 old_size;
+ bool buf1filled;
+ bool buf0filled;
+
+ vdoa_handle_t vdoa_handle;
+ struct vdoa_output_mem {
+ void *vaddr;
+ dma_addr_t paddr;
+ int size;
+ } vdoa_dma;
+
+#ifdef DBG_IPU_PERF
+ struct timespec ts_queue;
+ struct timespec ts_dotask;
+ struct timespec ts_waitirq;
+ struct timespec ts_inirq;
+ struct timespec ts_wakeup;
+ struct timespec ts_rel;
+#endif
+};
+
+struct ipu_channel_tabel {
+ struct mutex lock;
+ u8 used[MXC_IPU_MAX_NUM][MAX_PP_CH];
+ u8 vdoa_used;
+};
+
+struct ipu_thread_data {
+ struct ipu_soc *ipu;
+ u32 id;
+ u32 is_vdoa;
+};
+
+struct ipu_alloc_list {
+ struct list_head list;
+ dma_addr_t phy_addr;
+ void *cpu_addr;
+ u32 size;
+ void *file_index;
+};
+
+static LIST_HEAD(ipu_alloc_list);
+static DEFINE_MUTEX(ipu_alloc_lock);
+static struct ipu_channel_tabel ipu_ch_tbl;
+static LIST_HEAD(ipu_task_list);
+static DEFINE_SPINLOCK(ipu_task_list_lock);
+static DECLARE_WAIT_QUEUE_HEAD(thread_waitq);
+static DECLARE_WAIT_QUEUE_HEAD(res_waitq);
+static atomic_t req_cnt;
+static atomic_t file_index = ATOMIC_INIT(1);
+static int major;
+static int max_ipu_no;
+static int thread_id;
+static atomic_t frame_no;
+static struct class *ipu_class;
+static struct device *ipu_dev;
+static int debug;
+module_param(debug, int, 0600);
+#ifdef DBG_IPU_PERF
+static struct timespec ts_frame_max;
+static u32 ts_frame_avg;
+static atomic_t frame_cnt;
+#endif
+
+static bool deinterlace_3_field(struct ipu_task_entry *t)
+{
+ return ((t->set.mode & VDI_MODE) &&
+ (t->input.deinterlace.motion != HIGH_MOTION));
+}
+
+static u32 tiled_filed_size(struct ipu_task_entry *t)
+{
+ u32 field_size;
+
+ /* note: page_align is required by VPU hw ouput buffer */
+ field_size = TILED_NV12_FRAME_SIZE(t->input.width, t->input.height/2);
+ return field_size;
+}
+
+static bool only_ic(u8 mode)
+{
+ mode = mode & IPU_PREPROCESS_MODE_MASK;
+ return ((mode == IC_MODE) || (mode == VDI_MODE));
+}
+
+static bool only_rot(u8 mode)
+{
+ mode = mode & IPU_PREPROCESS_MODE_MASK;
+ return (mode == ROT_MODE);
+}
+
+static bool ic_and_rot(u8 mode)
+{
+ mode = mode & IPU_PREPROCESS_MODE_MASK;
+ return ((mode == (IC_MODE | ROT_MODE)) ||
+ (mode == (VDI_MODE | ROT_MODE)));
+}
+
+static bool need_split(struct ipu_task_entry *t)
+{
+ return ((t->set.split_mode != NO_SPLIT) || (t->task_no & SPLIT_MASK));
+}
+
+unsigned int fmt_to_bpp(unsigned int pixelformat)
+{
+ u32 bpp;
+
+ switch (pixelformat) {
+ case IPU_PIX_FMT_RGB565:
+ /*interleaved 422*/
+ case IPU_PIX_FMT_YUYV:
+ case IPU_PIX_FMT_UYVY:
+ /*non-interleaved 422*/
+ case IPU_PIX_FMT_YUV422P:
+ case IPU_PIX_FMT_YVU422P:
+ bpp = 16;
+ break;
+ case IPU_PIX_FMT_BGR24:
+ case IPU_PIX_FMT_RGB24:
+ case IPU_PIX_FMT_YUV444:
+ case IPU_PIX_FMT_YUV444P:
+ bpp = 24;
+ break;
+ case IPU_PIX_FMT_BGR32:
+ case IPU_PIX_FMT_BGRA32:
+ case IPU_PIX_FMT_RGB32:
+ case IPU_PIX_FMT_RGBA32:
+ case IPU_PIX_FMT_ABGR32:
+ bpp = 32;
+ break;
+ /*non-interleaved 420*/
+ case IPU_PIX_FMT_YUV420P:
+ case IPU_PIX_FMT_YVU420P:
+ case IPU_PIX_FMT_YUV420P2:
+ case IPU_PIX_FMT_NV12:
+ bpp = 12;
+ break;
+ default:
+ bpp = 8;
+ break;
+ }
+ return bpp;
+}
+EXPORT_SYMBOL_GPL(fmt_to_bpp);
+
+cs_t colorspaceofpixel(int fmt)
+{
+ switch (fmt) {
+ case IPU_PIX_FMT_RGB565:
+ case IPU_PIX_FMT_RGB666:
+ case IPU_PIX_FMT_BGR24:
+ case IPU_PIX_FMT_RGB24:
+ case IPU_PIX_FMT_BGRA32:
+ case IPU_PIX_FMT_BGR32:
+ case IPU_PIX_FMT_RGBA32:
+ case IPU_PIX_FMT_RGB32:
+ case IPU_PIX_FMT_ABGR32:
+ return RGB_CS;
+ break;
+ case IPU_PIX_FMT_UYVY:
+ case IPU_PIX_FMT_YUYV:
+ case IPU_PIX_FMT_YUV420P2:
+ case IPU_PIX_FMT_YUV420P:
+ case IPU_PIX_FMT_YVU420P:
+ case IPU_PIX_FMT_YVU422P:
+ case IPU_PIX_FMT_YUV422P:
+ case IPU_PIX_FMT_YUV444:
+ case IPU_PIX_FMT_YUV444P:
+ case IPU_PIX_FMT_NV12:
+ case IPU_PIX_FMT_TILED_NV12:
+ case IPU_PIX_FMT_TILED_NV12F:
+ return YUV_CS;
+ break;
+ default:
+ return NULL_CS;
+ }
+}
+EXPORT_SYMBOL_GPL(colorspaceofpixel);
+
+int need_csc(int ifmt, int ofmt)
+{
+ cs_t ics, ocs;
+
+ ics = colorspaceofpixel(ifmt);
+ ocs = colorspaceofpixel(ofmt);
+
+ if ((ics == NULL_CS) || (ocs == NULL_CS))
+ return -1;
+ else if (ics != ocs)
+ return 1;
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(need_csc);
+
+static int soc_max_in_width(u32 is_vdoa)
+{
+ return is_vdoa ? 8192 : 4096;
+}
+
+static int soc_max_vdi_in_width(struct ipu_soc *ipu)
+{
+ int i;
+
+ if (!ipu) {
+ for (i = 0; i < max_ipu_no; i++) {
+ ipu = ipu_get_soc(i);
+ if (!IS_ERR_OR_NULL(ipu))
+ break;
+ }
+
+ if (i == max_ipu_no)
+ return 720;
+ }
+ return IPU_MAX_VDI_IN_WIDTH(ipu->devtype);
+}
+static int soc_max_in_height(void)
+{
+ return 4096;
+}
+
+static int soc_max_out_width(void)
+{
+ /* mx51/mx53/mx6q is 1024*/
+ return 1024;
+}
+
+static int soc_max_out_height(void)
+{
+ /* mx51/mx53/mx6q is 1024*/
+ return 1024;
+}
+
+static void dump_task_info(struct ipu_task_entry *t)
+{
+ if (!debug)
+ return;
+ dev_dbg(t->dev, "[0x%p]input:\n", (void *)t);
+ dev_dbg(t->dev, "[0x%p]\tformat = 0x%x\n", (void *)t, t->input.format);
+ dev_dbg(t->dev, "[0x%p]\twidth = %d\n", (void *)t, t->input.width);
+ dev_dbg(t->dev, "[0x%p]\theight = %d\n", (void *)t, t->input.height);
+ dev_dbg(t->dev, "[0x%p]\tcrop.w = %d\n", (void *)t, t->input.crop.w);
+ dev_dbg(t->dev, "[0x%p]\tcrop.h = %d\n", (void *)t, t->input.crop.h);
+ dev_dbg(t->dev, "[0x%p]\tcrop.pos.x = %d\n",
+ (void *)t, t->input.crop.pos.x);
+ dev_dbg(t->dev, "[0x%p]\tcrop.pos.y = %d\n",
+ (void *)t, t->input.crop.pos.y);
+ dev_dbg(t->dev, "[0x%p]input buffer:\n", (void *)t);
+ dev_dbg(t->dev, "[0x%p]\tpaddr = 0x%x\n", (void *)t, t->input.paddr);
+ dev_dbg(t->dev, "[0x%p]\ti_off = 0x%x\n", (void *)t, t->set.i_off);
+ dev_dbg(t->dev, "[0x%p]\ti_uoff = 0x%x\n", (void *)t, t->set.i_uoff);
+ dev_dbg(t->dev, "[0x%p]\ti_voff = 0x%x\n", (void *)t, t->set.i_voff);
+ dev_dbg(t->dev, "[0x%p]\tistride = %d\n", (void *)t, t->set.istride);
+ if (t->input.deinterlace.enable) {
+ dev_dbg(t->dev, "[0x%p]deinterlace enabled with:\n", (void *)t);
+ if (t->input.deinterlace.motion != HIGH_MOTION) {
+ dev_dbg(t->dev, "[0x%p]\tlow/medium motion\n", (void *)t);
+ dev_dbg(t->dev, "[0x%p]\tpaddr_n = 0x%x\n",
+ (void *)t, t->input.paddr_n);
+ } else
+ dev_dbg(t->dev, "[0x%p]\thigh motion\n", (void *)t);
+ }
+
+ dev_dbg(t->dev, "[0x%p]output:\n", (void *)t);
+ dev_dbg(t->dev, "[0x%p]\tformat = 0x%x\n", (void *)t, t->output.format);
+ dev_dbg(t->dev, "[0x%p]\twidth = %d\n", (void *)t, t->output.width);
+ dev_dbg(t->dev, "[0x%p]\theight = %d\n", (void *)t, t->output.height);
+ dev_dbg(t->dev, "[0x%p]\tcrop.w = %d\n", (void *)t, t->output.crop.w);
+ dev_dbg(t->dev, "[0x%p]\tcrop.h = %d\n", (void *)t, t->output.crop.h);
+ dev_dbg(t->dev, "[0x%p]\tcrop.pos.x = %d\n",
+ (void *)t, t->output.crop.pos.x);
+ dev_dbg(t->dev, "[0x%p]\tcrop.pos.y = %d\n",
+ (void *)t, t->output.crop.pos.y);
+ dev_dbg(t->dev, "[0x%p]\trotate = %d\n", (void *)t, t->output.rotate);
+ dev_dbg(t->dev, "[0x%p]output buffer:\n", (void *)t);
+ dev_dbg(t->dev, "[0x%p]\tpaddr = 0x%x\n", (void *)t, t->output.paddr);
+ dev_dbg(t->dev, "[0x%p]\to_off = 0x%x\n", (void *)t, t->set.o_off);
+ dev_dbg(t->dev, "[0x%p]\to_uoff = 0x%x\n", (void *)t, t->set.o_uoff);
+ dev_dbg(t->dev, "[0x%p]\to_voff = 0x%x\n", (void *)t, t->set.o_voff);
+ dev_dbg(t->dev, "[0x%p]\tostride = %d\n", (void *)t, t->set.ostride);
+
+ if (t->overlay_en) {
+ dev_dbg(t->dev, "[0x%p]overlay:\n", (void *)t);
+ dev_dbg(t->dev, "[0x%p]\tformat = 0x%x\n",
+ (void *)t, t->overlay.format);
+ dev_dbg(t->dev, "[0x%p]\twidth = %d\n",
+ (void *)t, t->overlay.width);
+ dev_dbg(t->dev, "[0x%p]\theight = %d\n",
+ (void *)t, t->overlay.height);
+ dev_dbg(t->dev, "[0x%p]\tcrop.w = %d\n",
+ (void *)t, t->overlay.crop.w);
+ dev_dbg(t->dev, "[0x%p]\tcrop.h = %d\n",
+ (void *)t, t->overlay.crop.h);
+ dev_dbg(t->dev, "[0x%p]\tcrop.pos.x = %d\n",
+ (void *)t, t->overlay.crop.pos.x);
+ dev_dbg(t->dev, "[0x%p]\tcrop.pos.y = %d\n",
+ (void *)t, t->overlay.crop.pos.y);
+ dev_dbg(t->dev, "[0x%p]overlay buffer:\n", (void *)t);
+ dev_dbg(t->dev, "[0x%p]\tpaddr = 0x%x\n",
+ (void *)t, t->overlay.paddr);
+ dev_dbg(t->dev, "[0x%p]\tov_off = 0x%x\n",
+ (void *)t, t->set.ov_off);
+ dev_dbg(t->dev, "[0x%p]\tov_uoff = 0x%x\n",
+ (void *)t, t->set.ov_uoff);
+ dev_dbg(t->dev, "[0x%p]\tov_voff = 0x%x\n",
+ (void *)t, t->set.ov_voff);
+ dev_dbg(t->dev, "[0x%p]\tovstride = %d\n",
+ (void *)t, t->set.ovstride);
+ if (t->overlay.alpha.mode == IPU_ALPHA_MODE_LOCAL) {
+ dev_dbg(t->dev, "[0x%p]local alpha enabled with:\n",
+ (void *)t);
+ dev_dbg(t->dev, "[0x%p]\tpaddr = 0x%x\n",
+ (void *)t, t->overlay.alpha.loc_alp_paddr);
+ dev_dbg(t->dev, "[0x%p]\tov_alpha_off = 0x%x\n",
+ (void *)t, t->set.ov_alpha_off);
+ dev_dbg(t->dev, "[0x%p]\tov_alpha_stride = %d\n",
+ (void *)t, t->set.ov_alpha_stride);
+ } else
+ dev_dbg(t->dev, "[0x%p]globle alpha enabled with value 0x%x\n",
+ (void *)t, t->overlay.alpha.gvalue);
+ if (t->overlay.colorkey.enable)
+ dev_dbg(t->dev, "[0x%p]colorkey enabled with value 0x%x\n",
+ (void *)t, t->overlay.colorkey.value);
+ }
+
+ dev_dbg(t->dev, "[0x%p]want task_id = %d\n", (void *)t, t->task_id);
+ dev_dbg(t->dev, "[0x%p]want task mode is 0x%x\n",
+ (void *)t, t->set.mode);
+ dev_dbg(t->dev, "[0x%p]\tIC_MODE = 0x%x\n", (void *)t, IC_MODE);
+ dev_dbg(t->dev, "[0x%p]\tROT_MODE = 0x%x\n", (void *)t, ROT_MODE);
+ dev_dbg(t->dev, "[0x%p]\tVDI_MODE = 0x%x\n", (void *)t, VDI_MODE);
+ dev_dbg(t->dev, "[0x%p]\tTask_no = 0x%x\n\n\n", (void *)t, t->task_no);
+}
+
+static void dump_check_err(struct device *dev, int err)
+{
+ switch (err) {
+ case IPU_CHECK_ERR_INPUT_CROP:
+ dev_err(dev, "input crop setting error\n");
+ break;
+ case IPU_CHECK_ERR_OUTPUT_CROP:
+ dev_err(dev, "output crop setting error\n");
+ break;
+ case IPU_CHECK_ERR_OVERLAY_CROP:
+ dev_err(dev, "overlay crop setting error\n");
+ break;
+ case IPU_CHECK_ERR_INPUT_OVER_LIMIT:
+ dev_err(dev, "input over limitation\n");
+ break;
+ case IPU_CHECK_ERR_OVERLAY_WITH_VDI:
+ dev_err(dev, "do not support overlay with deinterlace\n");
+ break;
+ case IPU_CHECK_ERR_OV_OUT_NO_FIT:
+ dev_err(dev,
+ "width/height of overlay and ic output should be same\n");
+ break;
+ case IPU_CHECK_ERR_PROC_NO_NEED:
+ dev_err(dev, "no ipu processing need\n");
+ break;
+ case IPU_CHECK_ERR_SPLIT_INPUTW_OVER:
+ dev_err(dev, "split mode input width overflow\n");
+ break;
+ case IPU_CHECK_ERR_SPLIT_INPUTH_OVER:
+ dev_err(dev, "split mode input height overflow\n");
+ break;
+ case IPU_CHECK_ERR_SPLIT_OUTPUTW_OVER:
+ dev_err(dev, "split mode output width overflow\n");
+ break;
+ case IPU_CHECK_ERR_SPLIT_OUTPUTH_OVER:
+ dev_err(dev, "split mode output height overflow\n");
+ break;
+ case IPU_CHECK_ERR_SPLIT_WITH_ROT:
+ dev_err(dev, "not support split mode with rotation\n");
+ break;
+ case IPU_CHECK_ERR_W_DOWNSIZE_OVER:
+ dev_err(dev, "horizontal downsizing ratio overflow\n");
+ break;
+ case IPU_CHECK_ERR_H_DOWNSIZE_OVER:
+ dev_err(dev, "vertical downsizing ratio overflow\n");
+ break;
+ default:
+ break;
+ }
+}
+
+static void dump_check_warn(struct device *dev, int warn)
+{
+ if (warn & IPU_CHECK_WARN_INPUT_OFFS_NOT8ALIGN)
+ dev_warn(dev, "input u/v offset not 8 align\n");
+ if (warn & IPU_CHECK_WARN_OUTPUT_OFFS_NOT8ALIGN)
+ dev_warn(dev, "output u/v offset not 8 align\n");
+ if (warn & IPU_CHECK_WARN_OVERLAY_OFFS_NOT8ALIGN)
+ dev_warn(dev, "overlay u/v offset not 8 align\n");
+}
+
+static int set_crop(struct ipu_crop *crop, int width, int height, int fmt)
+{
+ if ((width == 0) || (height == 0)) {
+ pr_err("Invalid param: width=%d, height=%d\n", width, height);
+ return -EINVAL;
+ }
+
+ if ((IPU_PIX_FMT_TILED_NV12 == fmt) ||
+ (IPU_PIX_FMT_TILED_NV12F == fmt)) {
+ if (crop->w || crop->h) {
+ if (((crop->w + crop->pos.x) > width)
+ || ((crop->h + crop->pos.y) > height)
+ || (0 != (crop->w % IPU_PIX_FMT_TILED_NV12_MBALIGN))
+ || (0 != (crop->h % IPU_PIX_FMT_TILED_NV12_MBALIGN))
+ || (0 != (crop->pos.x % IPU_PIX_FMT_TILED_NV12_MBALIGN))
+ || (0 != (crop->pos.y % IPU_PIX_FMT_TILED_NV12_MBALIGN))
+ ) {
+ pr_err("set_crop error MB align.\n");
+ return -EINVAL;
+ }
+ } else {
+ crop->pos.x = 0;
+ crop->pos.y = 0;
+ crop->w = width;
+ crop->h = height;
+ if ((0 != (crop->w % IPU_PIX_FMT_TILED_NV12_MBALIGN))
+ || (0 != (crop->h % IPU_PIX_FMT_TILED_NV12_MBALIGN))) {
+ pr_err("set_crop error w/h MB align.\n");
+ return -EINVAL;
+ }
+ }
+ } else {
+ if (crop->w || crop->h) {
+ if (((crop->w + crop->pos.x) > (width + 16))
+ || ((crop->h + crop->pos.y) > height + 16)) {
+ pr_err("set_crop error exceeds width/height.\n");
+ return -EINVAL;
+ }
+ } else {
+ crop->pos.x = 0;
+ crop->pos.y = 0;
+ crop->w = width;
+ crop->h = height;
+ }
+ crop->w -= crop->w%8;
+ crop->h -= crop->h%8;
+ }
+
+ if ((crop->w == 0) || (crop->h == 0)) {
+ pr_err("Invalid crop param: crop.w=%d, crop.h=%d\n",
+ crop->w, crop->h);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static void update_offset(unsigned int fmt,
+ unsigned int width, unsigned int height,
+ unsigned int pos_x, unsigned int pos_y,
+ int *off, int *uoff, int *voff, int *stride)
+{
+ /* NOTE: u v offset should based on start point of off*/
+ switch (fmt) {
+ case IPU_PIX_FMT_YUV420P2:
+ case IPU_PIX_FMT_YUV420P:
+ *off = pos_y * width + pos_x;
+ *uoff = (width * (height - pos_y) - pos_x)
+ + (width/2) * (pos_y/2) + pos_x/2;
+ /* In case height is odd, round up to even */
+ *voff = *uoff + (width/2) * ((height+1)/2);
+ break;
+ case IPU_PIX_FMT_YVU420P:
+ *off = pos_y * width + pos_x;
+ *voff = (width * (height - pos_y) - pos_x)
+ + (width/2) * (pos_y/2) + pos_x/2;
+ /* In case height is odd, round up to even */
+ *uoff = *voff + (width/2) * ((height+1)/2);
+ break;
+ case IPU_PIX_FMT_YVU422P:
+ *off = pos_y * width + pos_x;
+ *voff = (width * (height - pos_y) - pos_x)
+ + (width/2) * pos_y + pos_x/2;
+ *uoff = *voff + (width/2) * height;
+ break;
+ case IPU_PIX_FMT_YUV422P:
+ *off = pos_y * width + pos_x;
+ *uoff = (width * (height - pos_y) - pos_x)
+ + (width/2) * pos_y + pos_x/2;
+ *voff = *uoff + (width/2) * height;
+ break;
+ case IPU_PIX_FMT_YUV444P:
+ *off = pos_y * width + pos_x;
+ *uoff = width * height;
+ *voff = width * height * 2;
+ break;
+ case IPU_PIX_FMT_NV12:
+ *off = pos_y * width + pos_x;
+ *uoff = (width * (height - pos_y) - pos_x)
+ + width * (pos_y/2) + pos_x;
+ break;
+ case IPU_PIX_FMT_TILED_NV12:
+ /*
+ * tiled format, progressive:
+ * assuming that line is aligned with MB height (aligned to 16)
+ * offset = line * stride + (pixel / MB_width) * pixels_in_MB
+ * = line * stride + (pixel / 16) * 256
+ * = line * stride + pixel * 16
+ */
+ *off = pos_y * width + (pos_x << 4);
+ *uoff = ALIGN(width * height, SZ_4K) + (*off >> 1) - *off;
+ break;
+ case IPU_PIX_FMT_TILED_NV12F:
+ /*
+ * tiled format, interlaced:
+ * same as above, only number of pixels in MB is 128,
+ * instead of 256
+ */
+ *off = (pos_y >> 1) * width + (pos_x << 3);
+ *uoff = ALIGN(width * height/2, SZ_4K) + (*off >> 1) - *off;
+ break;
+ default:
+ *off = (pos_y * width + pos_x) * fmt_to_bpp(fmt)/8;
+ break;
+ }
+ *stride = width * bytes_per_pixel(fmt);
+}
+
+static int update_split_setting(struct ipu_task_entry *t, bool vdi_split)
+{
+ struct stripe_param left_stripe;
+ struct stripe_param right_stripe;
+ struct stripe_param up_stripe;
+ struct stripe_param down_stripe;
+ u32 iw, ih, ow, oh;
+ u32 max_width;
+ int ret;
+
+ if (t->output.rotate >= IPU_ROTATE_90_RIGHT)
+ return IPU_CHECK_ERR_SPLIT_WITH_ROT;
+
+ iw = t->input.crop.w;
+ ih = t->input.crop.h;
+
+ ow = t->output.crop.w;
+ oh = t->output.crop.h;
+
+ memset(&left_stripe, 0, sizeof(left_stripe));
+ memset(&right_stripe, 0, sizeof(right_stripe));
+ memset(&up_stripe, 0, sizeof(up_stripe));
+ memset(&down_stripe, 0, sizeof(down_stripe));
+
+ if (t->set.split_mode & RL_SPLIT) {
+ /*
+ * We do want equal strips: initialize stripes in case
+ * calc_stripes returns before actually doing the calculation
+ */
+ left_stripe.input_width = iw / 2;
+ left_stripe.output_width = ow / 2;
+ right_stripe.input_column = iw / 2;
+ right_stripe.output_column = ow / 2;
+
+ if (vdi_split)
+ max_width = soc_max_vdi_in_width(t->ipu);
+ else
+ max_width = soc_max_out_width();
+ ret = ipu_calc_stripes_sizes(iw,
+ ow,
+ max_width,
+ (((unsigned long long)1) << 32), /* 32bit for fractional*/
+ 1, /* equal stripes */
+ t->input.format,
+ t->output.format,
+ &left_stripe,
+ &right_stripe);
+ if (ret < 0)
+ return IPU_CHECK_ERR_W_DOWNSIZE_OVER;
+ else if (ret)
+ dev_dbg(t->dev, "Warn: no:0x%x,calc_stripes ret:%d\n",
+ t->task_no, ret);
+ t->set.sp_setting.iw = left_stripe.input_width;
+ t->set.sp_setting.ow = left_stripe.output_width;
+ t->set.sp_setting.outh_resize_ratio = left_stripe.irr;
+ t->set.sp_setting.i_left_pos = left_stripe.input_column;
+ t->set.sp_setting.o_left_pos = left_stripe.output_column;
+ t->set.sp_setting.i_right_pos = right_stripe.input_column;
+ t->set.sp_setting.o_right_pos = right_stripe.output_column;
+ } else {
+ t->set.sp_setting.iw = iw;
+ t->set.sp_setting.ow = ow;
+ t->set.sp_setting.outh_resize_ratio = 0;
+ t->set.sp_setting.i_left_pos = 0;
+ t->set.sp_setting.o_left_pos = 0;
+ t->set.sp_setting.i_right_pos = 0;
+ t->set.sp_setting.o_right_pos = 0;
+ }
+ if ((t->set.sp_setting.iw + t->set.sp_setting.i_right_pos) > (iw+16))
+ return IPU_CHECK_ERR_SPLIT_INPUTW_OVER;
+ if (((t->set.sp_setting.ow + t->set.sp_setting.o_right_pos) > ow)
+ || (t->set.sp_setting.ow > soc_max_out_width()))
+ return IPU_CHECK_ERR_SPLIT_OUTPUTW_OVER;
+ if (rounddown(t->set.sp_setting.ow, 8) * 8 <=
+ rounddown(t->set.sp_setting.iw, 8))
+ return IPU_CHECK_ERR_W_DOWNSIZE_OVER;
+
+ if (t->set.split_mode & UD_SPLIT) {
+ /*
+ * We do want equal strips: initialize stripes in case
+ * calc_stripes returns before actually doing the calculation
+ */
+ up_stripe.input_width = ih / 2;
+ up_stripe.output_width = oh / 2;
+ down_stripe.input_column = ih / 2;
+ down_stripe.output_column = oh / 2;
+ ret = ipu_calc_stripes_sizes(ih,
+ oh,
+ soc_max_out_height(),
+ (((unsigned long long)1) << 32), /* 32bit for fractional*/
+ 0x1 | 0x2, /* equal stripes and vertical */
+ t->input.format,
+ t->output.format,
+ &up_stripe,
+ &down_stripe);
+ if (ret < 0)
+ return IPU_CHECK_ERR_H_DOWNSIZE_OVER;
+ else if (ret)
+ dev_err(t->dev, "Warn: no:0x%x,calc_stripes ret:%d\n",
+ t->task_no, ret);
+ t->set.sp_setting.ih = up_stripe.input_width;
+ t->set.sp_setting.oh = up_stripe.output_width;
+ t->set.sp_setting.outv_resize_ratio = up_stripe.irr;
+ t->set.sp_setting.i_top_pos = up_stripe.input_column;
+ t->set.sp_setting.o_top_pos = up_stripe.output_column;
+ t->set.sp_setting.i_bottom_pos = down_stripe.input_column;
+ t->set.sp_setting.o_bottom_pos = down_stripe.output_column;
+ } else {
+ t->set.sp_setting.ih = ih;
+ t->set.sp_setting.oh = oh;
+ t->set.sp_setting.outv_resize_ratio = 0;
+ t->set.sp_setting.i_top_pos = 0;
+ t->set.sp_setting.o_top_pos = 0;
+ t->set.sp_setting.i_bottom_pos = 0;
+ t->set.sp_setting.o_bottom_pos = 0;
+ }
+
+ /* downscale case: enforce limits */
+ if (((t->set.sp_setting.ih + t->set.sp_setting.i_bottom_pos) > (ih))
+ && (t->set.sp_setting.ih >= t->set.sp_setting.oh))
+ return IPU_CHECK_ERR_SPLIT_INPUTH_OVER;
+ /* upscale case: relax limits because ipu_calc_stripes_sizes() may
+ create input stripe that falls just outside of the input window */
+ else if ((t->set.sp_setting.ih + t->set.sp_setting.i_bottom_pos)
+ > (ih+16))
+ return IPU_CHECK_ERR_SPLIT_INPUTH_OVER;
+ if (((t->set.sp_setting.oh + t->set.sp_setting.o_bottom_pos) > oh)
+ || (t->set.sp_setting.oh > soc_max_out_height()))
+ return IPU_CHECK_ERR_SPLIT_OUTPUTH_OVER;
+ if (rounddown(t->set.sp_setting.oh, 8) * 8 <=
+ rounddown(t->set.sp_setting.ih, 8))
+ return IPU_CHECK_ERR_H_DOWNSIZE_OVER;
+
+ return IPU_CHECK_OK;
+}
+
+static int check_task(struct ipu_task_entry *t)
+{
+ int tmp;
+ int ret = IPU_CHECK_OK;
+ int timeout;
+ bool vdi_split = false;
+ int ocw, och;
+
+ if ((IPU_PIX_FMT_TILED_NV12 == t->overlay.format) ||
+ (IPU_PIX_FMT_TILED_NV12F == t->overlay.format) ||
+ (IPU_PIX_FMT_TILED_NV12 == t->output.format) ||
+ (IPU_PIX_FMT_TILED_NV12F == t->output.format) ||
+ ((IPU_PIX_FMT_TILED_NV12F == t->input.format) &&
+ !t->input.deinterlace.enable)) {
+ ret = IPU_CHECK_ERR_NOT_SUPPORT;
+ goto done;
+ }
+
+ /* check input */
+ ret = set_crop(&t->input.crop, t->input.width, t->input.height,
+ t->input.format);
+ if (ret < 0) {
+ ret = IPU_CHECK_ERR_INPUT_CROP;
+ goto done;
+ } else
+ update_offset(t->input.format, t->input.width, t->input.height,
+ t->input.crop.pos.x, t->input.crop.pos.y,
+ &t->set.i_off, &t->set.i_uoff,
+ &t->set.i_voff, &t->set.istride);
+
+ /* check output */
+ ret = set_crop(&t->output.crop, t->output.width, t->output.height,
+ t->output.format);
+ if (ret < 0) {
+ ret = IPU_CHECK_ERR_OUTPUT_CROP;
+ goto done;
+ } else
+ update_offset(t->output.format,
+ t->output.width, t->output.height,
+ t->output.crop.pos.x, t->output.crop.pos.y,
+ &t->set.o_off, &t->set.o_uoff,
+ &t->set.o_voff, &t->set.ostride);
+
+ if (t->output.rotate >= IPU_ROTATE_90_RIGHT) {
+ /*
+ * Cache output width and height and
+ * swap them so that we may check
+ * downsize overflow correctly.
+ */
+ ocw = t->output.crop.h;
+ och = t->output.crop.w;
+ } else {
+ ocw = t->output.crop.w;
+ och = t->output.crop.h;
+ }
+
+ if (ocw * 8 <= t->input.crop.w) {
+ ret = IPU_CHECK_ERR_W_DOWNSIZE_OVER;
+ goto done;
+ }
+
+ if (och * 8 <= t->input.crop.h) {
+ ret = IPU_CHECK_ERR_H_DOWNSIZE_OVER;
+ goto done;
+ }
+
+ if ((IPU_PIX_FMT_TILED_NV12 == t->input.format) ||
+ (IPU_PIX_FMT_TILED_NV12F == t->input.format)) {
+ if ((t->input.crop.w > soc_max_in_width(1)) ||
+ (t->input.crop.h > soc_max_in_height())) {
+ ret = IPU_CHECK_ERR_INPUT_OVER_LIMIT;
+ goto done;
+ }
+ /* output fmt: NV12 and YUYV, now don't support resize */
+ if (((IPU_PIX_FMT_NV12 != t->output.format) &&
+ (IPU_PIX_FMT_YUYV != t->output.format)) ||
+ (t->input.crop.w != t->output.crop.w) ||
+ (t->input.crop.h != t->output.crop.h)) {
+ ret = IPU_CHECK_ERR_NOT_SUPPORT;
+ goto done;
+ }
+ }
+
+ /* check overlay if there is */
+ if (t->overlay_en) {
+ if (t->input.deinterlace.enable) {
+ ret = IPU_CHECK_ERR_OVERLAY_WITH_VDI;
+ goto done;
+ }
+
+ ret = set_crop(&t->overlay.crop, t->overlay.width,
+ t->overlay.height, t->overlay.format);
+ if (ret < 0) {
+ ret = IPU_CHECK_ERR_OVERLAY_CROP;
+ goto done;
+ } else {
+ ocw = t->output.crop.w;
+ och = t->output.crop.h;
+
+ if (t->output.rotate >= IPU_ROTATE_90_RIGHT) {
+ ocw = t->output.crop.h;
+ och = t->output.crop.w;
+ }
+ if ((t->overlay.crop.w != ocw) ||
+ (t->overlay.crop.h != och)) {
+ ret = IPU_CHECK_ERR_OV_OUT_NO_FIT;
+ goto done;
+ }
+
+ update_offset(t->overlay.format,
+ t->overlay.width, t->overlay.height,
+ t->overlay.crop.pos.x, t->overlay.crop.pos.y,
+ &t->set.ov_off, &t->set.ov_uoff,
+ &t->set.ov_voff, &t->set.ovstride);
+ if (t->overlay.alpha.mode == IPU_ALPHA_MODE_LOCAL) {
+ t->set.ov_alpha_stride = t->overlay.width;
+ t->set.ov_alpha_off = t->overlay.crop.pos.y *
+ t->overlay.width + t->overlay.crop.pos.x;
+ }
+ }
+ }
+
+ /* input overflow? */
+ if (!((IPU_PIX_FMT_TILED_NV12 == t->input.format) ||
+ (IPU_PIX_FMT_TILED_NV12F == t->input.format))) {
+ if ((t->input.crop.w > soc_max_in_width(0)) ||
+ (t->input.crop.h > soc_max_in_height())) {
+ ret = IPU_CHECK_ERR_INPUT_OVER_LIMIT;
+ goto done;
+ }
+ }
+
+ /* check task mode */
+ t->set.mode = NULL_MODE;
+ t->set.split_mode = NO_SPLIT;
+
+ if (t->output.rotate >= IPU_ROTATE_90_RIGHT) {
+ /*output swap*/
+ tmp = t->output.crop.w;
+ t->output.crop.w = t->output.crop.h;
+ t->output.crop.h = tmp;
+ }
+
+ if (t->output.rotate >= IPU_ROTATE_90_RIGHT)
+ t->set.mode |= ROT_MODE;
+
+ /*need resize or CSC?*/
+ if ((t->input.crop.w != t->output.crop.w) ||
+ (t->input.crop.h != t->output.crop.h) ||
+ need_csc(t->input.format, t->output.format))
+ t->set.mode |= IC_MODE;
+
+ /*need cropping?*/
+ if ((t->input.crop.w != t->input.width) ||
+ (t->input.crop.h != t->input.height) ||
+ (t->output.crop.w != t->output.width) ||
+ (t->output.crop.h != t->output.height))
+ t->set.mode |= IC_MODE;
+
+ /*need flip?*/
+ if ((t->set.mode == NULL_MODE) && (t->output.rotate > IPU_ROTATE_NONE))
+ t->set.mode |= IC_MODE;
+
+ /*need IDMAC do format(same color space)?*/
+ if ((t->set.mode == NULL_MODE) && (t->input.format != t->output.format))
+ t->set.mode |= IC_MODE;
+
+ /*overlay support*/
+ if (t->overlay_en)
+ t->set.mode |= IC_MODE;
+
+ /*deinterlace*/
+ if (t->input.deinterlace.enable) {
+ t->set.mode &= ~IC_MODE;
+ t->set.mode |= VDI_MODE;
+ }
+ if ((IPU_PIX_FMT_TILED_NV12 == t->input.format) ||
+ (IPU_PIX_FMT_TILED_NV12F == t->input.format)) {
+ if (t->set.mode & ROT_MODE) {
+ ret = IPU_CHECK_ERR_NOT_SUPPORT;
+ goto done;
+ }
+ t->set.mode |= VDOA_MODE;
+ if (IPU_PIX_FMT_TILED_NV12F == t->input.format)
+ t->set.mode |= VDOA_BAND_MODE;
+ t->set.mode &= ~IC_MODE;
+ }
+
+ if ((t->set.mode & (IC_MODE | VDI_MODE)) &&
+ (IPU_PIX_FMT_TILED_NV12F != t->input.format)) {
+ if (t->output.crop.w > soc_max_out_width())
+ t->set.split_mode |= RL_SPLIT;
+ if (t->output.crop.h > soc_max_out_height())
+ t->set.split_mode |= UD_SPLIT;
+ if (!t->set.split_mode && (t->set.mode & VDI_MODE) &&
+ (t->input.crop.w >
+ soc_max_vdi_in_width(t->ipu))) {
+ t->set.split_mode |= RL_SPLIT;
+ vdi_split = true;
+ }
+ if (t->set.split_mode) {
+ if ((t->set.split_mode == RL_SPLIT) ||
+ (t->set.split_mode == UD_SPLIT))
+ timeout = DEF_TIMEOUT_MS * 2 + DEF_DELAY_MS;
+ else
+ timeout = DEF_TIMEOUT_MS * 4 + DEF_DELAY_MS;
+ if (t->timeout < timeout)
+ t->timeout = timeout;
+
+ ret = update_split_setting(t, vdi_split);
+ if (ret > IPU_CHECK_ERR_MIN)
+ goto done;
+ }
+ }
+
+ if (t->output.rotate >= IPU_ROTATE_90_RIGHT) {
+ /*output swap*/
+ tmp = t->output.crop.w;
+ t->output.crop.w = t->output.crop.h;
+ t->output.crop.h = tmp;
+ }
+
+ if (t->set.mode == NULL_MODE) {
+ ret = IPU_CHECK_ERR_PROC_NO_NEED;
+ goto done;
+ }
+
+ if ((t->set.i_uoff % 8) || (t->set.i_voff % 8))
+ ret |= IPU_CHECK_WARN_INPUT_OFFS_NOT8ALIGN;
+ if ((t->set.o_uoff % 8) || (t->set.o_voff % 8))
+ ret |= IPU_CHECK_WARN_OUTPUT_OFFS_NOT8ALIGN;
+ if (t->overlay_en && ((t->set.ov_uoff % 8) || (t->set.ov_voff % 8)))
+ ret |= IPU_CHECK_WARN_OVERLAY_OFFS_NOT8ALIGN;
+
+done:
+ /* dump msg */
+ if (debug) {
+ if (ret > IPU_CHECK_ERR_MIN)
+ dump_check_err(t->dev, ret);
+ else if (ret != IPU_CHECK_OK)
+ dump_check_warn(t->dev, ret);
+ }
+
+ return ret;
+}
+
+static int prepare_task(struct ipu_task_entry *t)
+{
+ int ret = 0;
+
+ ret = check_task(t);
+ if (ret > IPU_CHECK_ERR_MIN)
+ return -EINVAL;
+
+ if (t->set.mode & VDI_MODE) {
+ t->task_id = IPU_TASK_ID_VF;
+ t->set.task = VDI_VF;
+ if (t->set.mode & ROT_MODE)
+ t->set.task |= ROT_VF;
+ }
+
+ if (VDOA_MODE == t->set.mode) {
+ if (t->set.task != 0) {
+ dev_err(t->dev, "ERR: vdoa only task:0x%x, [0x%p].\n",
+ t->set.task, t);
+ return -EINVAL;
+ }
+ t->set.task |= VDOA_ONLY;
+ }
+
+ if (VDOA_BAND_MODE & t->set.mode) {
+ /* to save band size: 1<<3 = 8 lines */
+ t->set.band_lines = 3;
+ }
+
+ dump_task_info(t);
+
+ return ret;
+}
+
+static uint32_t ic_vf_pp_is_busy(struct ipu_soc *ipu, bool is_vf)
+{
+ uint32_t status;
+ uint32_t status_vf;
+ uint32_t status_rot;
+
+ if (is_vf) {
+ status = ipu_channel_status(ipu, MEM_VDI_PRP_VF_MEM);
+ status_vf = ipu_channel_status(ipu, MEM_PRP_VF_MEM);
+ status_rot = ipu_channel_status(ipu, MEM_ROT_VF_MEM);
+ return status || status_vf || status_rot;
+ } else {
+ status = ipu_channel_status(ipu, MEM_PP_MEM);
+ status_rot = ipu_channel_status(ipu, MEM_ROT_PP_MEM);
+ return status || status_rot;
+ }
+}
+
+static int _get_vdoa_ipu_res(struct ipu_task_entry *t)
+{
+ int i;
+ struct ipu_soc *ipu;
+ u8 *used;
+ uint32_t found_ipu = 0;
+ uint32_t found_vdoa = 0;
+ struct ipu_channel_tabel *tbl = &ipu_ch_tbl;
+
+ mutex_lock(&tbl->lock);
+ if (t->set.mode & VDOA_MODE) {
+ if (NULL != t->vdoa_handle)
+ found_vdoa = 1;
+ else {
+ found_vdoa = tbl->vdoa_used ? 0 : 1;
+ if (found_vdoa) {
+ tbl->vdoa_used = 1;
+ vdoa_get_handle(&t->vdoa_handle);
+ } else
+ /* first get vdoa->ipu resource sequence */
+ goto out;
+ if (t->set.task & VDOA_ONLY)
+ goto out;
+ }
+ }
+
+ for (i = 0; i < max_ipu_no; i++) {
+ ipu = ipu_get_soc(i);
+ if (IS_ERR(ipu))
+ dev_err(t->dev, "no:0x%x,found_vdoa:%d, ipu:%d\n",
+ t->task_no, found_vdoa, i);
+
+ used = &tbl->used[i][IPU_PP_CH_VF];
+ if (t->set.mode & VDI_MODE) {
+ if (0 == *used) {
+ *used = 1;
+ found_ipu = 1;
+ break;
+ }
+ } else if ((t->set.mode & IC_MODE) || only_rot(t->set.mode)) {
+ if (0 == *used) {
+ t->task_id = IPU_TASK_ID_VF;
+ if (t->set.mode & IC_MODE)
+ t->set.task |= IC_VF;
+ if (t->set.mode & ROT_MODE)
+ t->set.task |= ROT_VF;
+ *used = 1;
+ found_ipu = 1;
+ break;
+ }
+ } else
+ dev_err(t->dev, "no:0x%x,found_vdoa:%d, mode:0x%x\n",
+ t->task_no, found_vdoa, t->set.mode);
+ }
+ if (found_ipu)
+ goto next;
+
+ for (i = 0; i < max_ipu_no; i++) {
+ ipu = ipu_get_soc(i);
+ if (IS_ERR(ipu))
+ dev_err(t->dev, "no:0x%x,found_vdoa:%d, ipu:%d\n",
+ t->task_no, found_vdoa, i);
+
+ if ((t->set.mode & IC_MODE) || only_rot(t->set.mode)) {
+ used = &tbl->used[i][IPU_PP_CH_PP];
+ if (0 == *used) {
+ t->task_id = IPU_TASK_ID_PP;
+ if (t->set.mode & IC_MODE)
+ t->set.task |= IC_PP;
+ if (t->set.mode & ROT_MODE)
+ t->set.task |= ROT_PP;
+ *used = 1;
+ found_ipu = 1;
+ break;
+ }
+ }
+ }
+
+next:
+ if (found_ipu) {
+ t->ipu = ipu;
+ t->ipu_id = i;
+ t->dev = ipu->dev;
+ if (atomic_inc_return(&t->res_get) == 2)
+ dev_err(t->dev,
+ "ERR no:0x%x,found_vdoa:%d,get ipu twice\n",
+ t->task_no, found_vdoa);
+ }
+out:
+ dev_dbg(t->dev,
+ "%s:no:0x%x,found_vdoa:%d, found_ipu:%d\n",
+ __func__, t->task_no, found_vdoa, found_ipu);
+ mutex_unlock(&tbl->lock);
+ if (t->set.task & VDOA_ONLY)
+ return found_vdoa;
+ else if (t->set.mode & VDOA_MODE)
+ return found_vdoa && found_ipu;
+ else
+ return found_ipu;
+}
+
+static void put_vdoa_ipu_res(struct ipu_task_entry *tsk, int vdoa_only)
+{
+ int ret;
+ int rel_vdoa = 0, rel_ipu = 0;
+ struct ipu_channel_tabel *tbl = &ipu_ch_tbl;
+
+ mutex_lock(&tbl->lock);
+ if (tsk->set.mode & VDOA_MODE) {
+ if (!tbl->vdoa_used && tsk->vdoa_handle)
+ dev_err(tsk->dev,
+ "ERR no:0x%x,vdoa not used,mode:0x%x\n",
+ tsk->task_no, tsk->set.mode);
+ if (tbl->vdoa_used && tsk->vdoa_handle) {
+ tbl->vdoa_used = 0;
+ vdoa_put_handle(&tsk->vdoa_handle);
+ if (tsk->ipu)
+ tsk->ipu->vdoa_en = 0;
+ rel_vdoa = 1;
+ if (vdoa_only || (tsk->set.task & VDOA_ONLY))
+ goto out;
+ }
+ }
+
+ if (tsk->ipu_id != 0 && tsk->ipu_id != 1) {
+ dev_err(tsk->dev,
+ "%s:invalid ipu id, no:0x%x, rel_vdoa:%d, rel_ipu:%d\n",
+ __func__, tsk->task_no, rel_vdoa, rel_ipu);
+ goto out;
+ }
+
+ tbl->used[tsk->ipu_id][tsk->task_id - 1] = 0;
+ rel_ipu = 1;
+ ret = atomic_inc_return(&tsk->res_free);
+ if (ret == 2)
+ dev_err(tsk->dev,
+ "ERR no:0x%x,rel_vdoa:%d,put ipu twice\n",
+ tsk->task_no, rel_vdoa);
+out:
+ dev_dbg(tsk->dev,
+ "%s:no:0x%x,rel_vdoa:%d, rel_ipu:%d\n",
+ __func__, tsk->task_no, rel_vdoa, rel_ipu);
+ mutex_unlock(&tbl->lock);
+}
+
+static int get_vdoa_ipu_res(struct ipu_task_entry *t)
+{
+ int ret;
+ uint32_t found = 0;
+
+ found = _get_vdoa_ipu_res(t);
+ if (!found) {
+ t->ipu_id = -1;
+ t->ipu = NULL;
+ /* blocking to get resource */
+ ret = atomic_inc_return(&req_cnt);
+ dev_dbg(t->dev,
+ "wait_res:no:0x%x,req_cnt:%d\n", t->task_no, ret);
+ ret = wait_event_timeout(res_waitq, _get_vdoa_ipu_res(t),
+ msecs_to_jiffies(t->timeout - DEF_DELAY_MS));
+ if (ret == 0) {
+ dev_err(t->dev, "ERR[0x%p,no-0x%x] wait_res timeout:%dms!\n",
+ t, t->task_no, t->timeout - DEF_DELAY_MS);
+ ret = -ETIMEDOUT;
+ t->state = STATE_RES_TIMEOUT;
+ goto out;
+ } else {
+ if (!(t->set.task & VDOA_ONLY) && (!t->ipu))
+ dev_err(t->dev,
+ "ERR[no-0x%x] can not get ipu!\n",
+ t->task_no);
+ ret = atomic_read(&req_cnt);
+ if (ret > 0)
+ ret = atomic_dec_return(&req_cnt);
+ else
+ dev_err(t->dev,
+ "ERR[no-0x%x] req_cnt:%d mismatch!\n",
+ t->task_no, ret);
+ dev_dbg(t->dev, "no-0x%x,[0x%p],req_cnt:%d, got_res!\n",
+ t->task_no, t, ret);
+ found = 1;
+ }
+ }
+
+out:
+ return found;
+}
+
+static struct ipu_task_entry *create_task_entry(struct ipu_task *task)
+{
+ struct ipu_task_entry *tsk;
+
+ tsk = kzalloc(sizeof(struct ipu_task_entry), GFP_KERNEL);
+ if (!tsk)
+ return ERR_PTR(-ENOMEM);
+ kref_init(&tsk->refcount);
+ tsk->state = -EINVAL;
+ tsk->ipu_id = -1;
+ tsk->dev = ipu_dev;
+ tsk->input = task->input;
+ tsk->output = task->output;
+ tsk->overlay_en = task->overlay_en;
+ if (tsk->overlay_en)
+ tsk->overlay = task->overlay;
+ if (task->timeout > DEF_TIMEOUT_MS)
+ tsk->timeout = task->timeout;
+ else
+ tsk->timeout = DEF_TIMEOUT_MS;
+
+ return tsk;
+}
+
+static void task_mem_free(struct kref *ref)
+{
+ struct ipu_task_entry *tsk =
+ container_of(ref, struct ipu_task_entry, refcount);
+ kfree(tsk);
+}
+
+int create_split_child_task(struct ipu_split_task *sp_task)
+{
+ int ret = 0;
+ struct ipu_task_entry *tsk;
+
+ tsk = create_task_entry(&sp_task->task);
+ if (IS_ERR(tsk))
+ return PTR_ERR(tsk);
+
+ sp_task->child_task = tsk;
+ tsk->task_no = sp_task->task_no;
+
+ ret = prepare_task(tsk);
+ if (ret < 0)
+ goto err;
+
+ tsk->parent = sp_task->parent_task;
+ tsk->set.sp_setting = sp_task->parent_task->set.sp_setting;
+
+ list_add(&tsk->node, &tsk->parent->split_list);
+ dev_dbg(tsk->dev, "[0x%p] sp_tsk Q list,no-0x%x\n", tsk, tsk->task_no);
+ tsk->state = STATE_QUEUE;
+ CHECK_PERF(&tsk->ts_queue);
+err:
+ return ret;
+}
+
+static inline int sp_task_check_done(struct ipu_split_task *sp_task,
+ struct ipu_task_entry *parent, int num, int *idx)
+{
+ int i;
+ int ret = 0;
+ struct ipu_task_entry *tsk;
+ struct mutex *lock = &parent->split_lock;
+
+ *idx = -EINVAL;
+ mutex_lock(lock);
+ for (i = 0; i < num; i++) {
+ tsk = sp_task[i].child_task;
+ if (tsk && tsk->split_done) {
+ *idx = i;
+ ret = 1;
+ goto out;
+ }
+ }
+
+out:
+ mutex_unlock(lock);
+ return ret;
+}
+
+static int create_split_task(
+ int stripe,
+ struct ipu_split_task *sp_task)
+{
+ struct ipu_task *task = &(sp_task->task);
+ struct ipu_task_entry *t = sp_task->parent_task;
+ int ret;
+
+ sp_task->task_no |= stripe;
+
+ task->input = t->input;
+ task->output = t->output;
+ task->overlay_en = t->overlay_en;
+ if (task->overlay_en)
+ task->overlay = t->overlay;
+ task->task_id = t->task_id;
+ if ((t->set.split_mode == RL_SPLIT) ||
+ (t->set.split_mode == UD_SPLIT))
+ task->timeout = t->timeout / 2;
+ else
+ task->timeout = t->timeout / 4;
+
+ task->input.crop.w = t->set.sp_setting.iw;
+ task->input.crop.h = t->set.sp_setting.ih;
+ if (task->overlay_en) {
+ task->overlay.crop.w = t->set.sp_setting.ow;
+ task->overlay.crop.h = t->set.sp_setting.oh;
+ }
+ if (t->output.rotate >= IPU_ROTATE_90_RIGHT) {
+ task->output.crop.w = t->set.sp_setting.oh;
+ task->output.crop.h = t->set.sp_setting.ow;
+ t->set.sp_setting.rl_split_line = t->set.sp_setting.o_bottom_pos;
+ t->set.sp_setting.ud_split_line = t->set.sp_setting.o_right_pos;
+
+ } else {
+ task->output.crop.w = t->set.sp_setting.ow;
+ task->output.crop.h = t->set.sp_setting.oh;
+ t->set.sp_setting.rl_split_line = t->set.sp_setting.o_right_pos;
+ t->set.sp_setting.ud_split_line = t->set.sp_setting.o_bottom_pos;
+ }
+
+ if (stripe & LEFT_STRIPE)
+ task->input.crop.pos.x += t->set.sp_setting.i_left_pos;
+ else if (stripe & RIGHT_STRIPE)
+ task->input.crop.pos.x += t->set.sp_setting.i_right_pos;
+ if (stripe & UP_STRIPE)
+ task->input.crop.pos.y += t->set.sp_setting.i_top_pos;
+ else if (stripe & DOWN_STRIPE)
+ task->input.crop.pos.y += t->set.sp_setting.i_bottom_pos;
+
+ if (task->overlay_en) {
+ if (stripe & LEFT_STRIPE)
+ task->overlay.crop.pos.x += t->set.sp_setting.o_left_pos;
+ else if (stripe & RIGHT_STRIPE)
+ task->overlay.crop.pos.x += t->set.sp_setting.o_right_pos;
+ if (stripe & UP_STRIPE)
+ task->overlay.crop.pos.y += t->set.sp_setting.o_top_pos;
+ else if (stripe & DOWN_STRIPE)
+ task->overlay.crop.pos.y += t->set.sp_setting.o_bottom_pos;
+ }
+
+ switch (t->output.rotate) {
+ case IPU_ROTATE_NONE:
+ if (stripe & LEFT_STRIPE)
+ task->output.crop.pos.x += t->set.sp_setting.o_left_pos;
+ else if (stripe & RIGHT_STRIPE)
+ task->output.crop.pos.x += t->set.sp_setting.o_right_pos;
+ if (stripe & UP_STRIPE)
+ task->output.crop.pos.y += t->set.sp_setting.o_top_pos;
+ else if (stripe & DOWN_STRIPE)
+ task->output.crop.pos.y += t->set.sp_setting.o_bottom_pos;
+ break;
+ case IPU_ROTATE_VERT_FLIP:
+ if (stripe & LEFT_STRIPE)
+ task->output.crop.pos.x += t->set.sp_setting.o_left_pos;
+ else if (stripe & RIGHT_STRIPE)
+ task->output.crop.pos.x += t->set.sp_setting.o_right_pos;
+ if (stripe & UP_STRIPE)
+ task->output.crop.pos.y =
+ t->output.crop.pos.y + t->output.crop.h
+ - t->set.sp_setting.o_top_pos - t->set.sp_setting.oh;
+ else if (stripe & DOWN_STRIPE)
+ task->output.crop.pos.y =
+ t->output.crop.pos.y + t->output.crop.h
+ - t->set.sp_setting.o_bottom_pos - t->set.sp_setting.oh;
+ break;
+ case IPU_ROTATE_HORIZ_FLIP:
+ if (stripe & LEFT_STRIPE)
+ task->output.crop.pos.x =
+ t->output.crop.pos.x + t->output.crop.w
+ - t->set.sp_setting.o_left_pos - t->set.sp_setting.ow;
+ else if (stripe & RIGHT_STRIPE)
+ task->output.crop.pos.x =
+ t->output.crop.pos.x + t->output.crop.w
+ - t->set.sp_setting.o_right_pos - t->set.sp_setting.ow;
+ if (stripe & UP_STRIPE)
+ task->output.crop.pos.y += t->set.sp_setting.o_top_pos;
+ else if (stripe & DOWN_STRIPE)
+ task->output.crop.pos.y += t->set.sp_setting.o_bottom_pos;
+ break;
+ case IPU_ROTATE_180:
+ if (stripe & LEFT_STRIPE)
+ task->output.crop.pos.x =
+ t->output.crop.pos.x + t->output.crop.w
+ - t->set.sp_setting.o_left_pos - t->set.sp_setting.ow;
+ else if (stripe & RIGHT_STRIPE)
+ task->output.crop.pos.x =
+ t->output.crop.pos.x + t->output.crop.w
+ - t->set.sp_setting.o_right_pos - t->set.sp_setting.ow;
+ if (stripe & UP_STRIPE)
+ task->output.crop.pos.y =
+ t->output.crop.pos.y + t->output.crop.h
+ - t->set.sp_setting.o_top_pos - t->set.sp_setting.oh;
+ else if (stripe & DOWN_STRIPE)
+ task->output.crop.pos.y =
+ t->output.crop.pos.y + t->output.crop.h
+ - t->set.sp_setting.o_bottom_pos - t->set.sp_setting.oh;
+ break;
+ case IPU_ROTATE_90_RIGHT:
+ if (stripe & UP_STRIPE)
+ task->output.crop.pos.x =
+ t->output.crop.pos.x + t->output.crop.w
+ - t->set.sp_setting.o_top_pos - t->set.sp_setting.oh;
+ else if (stripe & DOWN_STRIPE)
+ task->output.crop.pos.x =
+ t->output.crop.pos.x + t->output.crop.w
+ - t->set.sp_setting.o_bottom_pos - t->set.sp_setting.oh;
+ if (stripe & LEFT_STRIPE)
+ task->output.crop.pos.y += t->set.sp_setting.o_left_pos;
+ else if (stripe & RIGHT_STRIPE)
+ task->output.crop.pos.y += t->set.sp_setting.o_right_pos;
+ break;
+ case IPU_ROTATE_90_RIGHT_HFLIP:
+ if (stripe & UP_STRIPE)
+ task->output.crop.pos.x += t->set.sp_setting.o_top_pos;
+ else if (stripe & DOWN_STRIPE)
+ task->output.crop.pos.x += t->set.sp_setting.o_bottom_pos;
+ if (stripe & LEFT_STRIPE)
+ task->output.crop.pos.y += t->set.sp_setting.o_left_pos;
+ else if (stripe & RIGHT_STRIPE)
+ task->output.crop.pos.y += t->set.sp_setting.o_right_pos;
+ break;
+ case IPU_ROTATE_90_RIGHT_VFLIP:
+ if (stripe & UP_STRIPE)
+ task->output.crop.pos.x =
+ t->output.crop.pos.x + t->output.crop.w
+ - t->set.sp_setting.o_top_pos - t->set.sp_setting.oh;
+ else if (stripe & DOWN_STRIPE)
+ task->output.crop.pos.x =
+ t->output.crop.pos.x + t->output.crop.w
+ - t->set.sp_setting.o_bottom_pos - t->set.sp_setting.oh;
+ if (stripe & LEFT_STRIPE)
+ task->output.crop.pos.y =
+ t->output.crop.pos.y + t->output.crop.h
+ - t->set.sp_setting.o_left_pos - t->set.sp_setting.ow;
+ else if (stripe & RIGHT_STRIPE)
+ task->output.crop.pos.y =
+ t->output.crop.pos.y + t->output.crop.h
+ - t->set.sp_setting.o_right_pos - t->set.sp_setting.ow;
+ break;
+ case IPU_ROTATE_90_LEFT:
+ if (stripe & UP_STRIPE)
+ task->output.crop.pos.x += t->set.sp_setting.o_top_pos;
+ else if (stripe & DOWN_STRIPE)
+ task->output.crop.pos.x += t->set.sp_setting.o_bottom_pos;
+ if (stripe & LEFT_STRIPE)
+ task->output.crop.pos.y =
+ t->output.crop.pos.y + t->output.crop.h
+ - t->set.sp_setting.o_left_pos - t->set.sp_setting.ow;
+ else if (stripe & RIGHT_STRIPE)
+ task->output.crop.pos.y =
+ t->output.crop.pos.y + t->output.crop.h
+ - t->set.sp_setting.o_right_pos - t->set.sp_setting.ow;
+ break;
+ default:
+ dev_err(t->dev, "ERR:should not be here\n");
+ break;
+ }
+
+ ret = create_split_child_task(sp_task);
+ if (ret < 0)
+ dev_err(t->dev, "ERR:create_split_child_task() ret:%d\n", ret);
+ return ret;
+}
+
+static int queue_split_task(struct ipu_task_entry *t,
+ struct ipu_split_task *sp_task, uint32_t size)
+{
+ int err[4];
+ int ret = 0;
+ int i, j;
+ struct ipu_task_entry *tsk = NULL;
+ struct mutex *lock = &t->split_lock;
+ struct mutex *vdic_lock = &t->vdic_lock;
+
+ dev_dbg(t->dev, "Split task 0x%p, no-0x%x, size:%d\n",
+ t, t->task_no, size);
+ mutex_init(lock);
+ mutex_init(vdic_lock);
+ init_waitqueue_head(&t->split_waitq);
+ INIT_LIST_HEAD(&t->split_list);
+ for (j = 0; j < size; j++) {
+ memset(&sp_task[j], 0, sizeof(*sp_task));
+ sp_task[j].parent_task = t;
+ sp_task[j].task_no = t->task_no;
+ }
+
+ if (t->set.split_mode == RL_SPLIT) {
+ i = 0;
+ err[i] = create_split_task(RIGHT_STRIPE, &sp_task[i]);
+ if (err[i] < 0)
+ goto err_start;
+ i = 1;
+ err[i] = create_split_task(LEFT_STRIPE, &sp_task[i]);
+ } else if (t->set.split_mode == UD_SPLIT) {
+ i = 0;
+ err[i] = create_split_task(DOWN_STRIPE, &sp_task[i]);
+ if (err[i] < 0)
+ goto err_start;
+ i = 1;
+ err[i] = create_split_task(UP_STRIPE, &sp_task[i]);
+ } else {
+ i = 0;
+ err[i] = create_split_task(RIGHT_STRIPE | DOWN_STRIPE, &sp_task[i]);
+ if (err[i] < 0)
+ goto err_start;
+ i = 1;
+ err[i] = create_split_task(LEFT_STRIPE | DOWN_STRIPE, &sp_task[i]);
+ if (err[i] < 0)
+ goto err_start;
+ i = 2;
+ err[i] = create_split_task(RIGHT_STRIPE | UP_STRIPE, &sp_task[i]);
+ if (err[i] < 0)
+ goto err_start;
+ i = 3;
+ err[i] = create_split_task(LEFT_STRIPE | UP_STRIPE, &sp_task[i]);
+ }
+
+err_start:
+ for (j = 0; j < (i + 1); j++) {
+ if (err[j] < 0) {
+ if (sp_task[j].child_task)
+ dev_err(t->dev,
+ "sp_task[%d],no-0x%x fail state:%d, queue err:%d.\n",
+ j, sp_task[j].child_task->task_no,
+ sp_task[j].child_task->state, err[j]);
+ goto err_exit;
+ }
+ dev_dbg(t->dev, "[0x%p] sp_task[%d], no-0x%x state:%s, queue ret:%d.\n",
+ sp_task[j].child_task, j, sp_task[j].child_task->task_no,
+ state_msg[sp_task[j].child_task->state].msg, err[j]);
+ }
+
+ return ret;
+
+err_exit:
+ for (j = 0; j < (i + 1); j++) {
+ if (err[j] < 0 && !ret)
+ ret = err[j];
+ tsk = sp_task[j].child_task;
+ if (!tsk)
+ continue;
+ kfree(tsk);
+ }
+ t->state = STATE_ERR;
+ return ret;
+
+}
+
+static int init_tiled_buf(struct ipu_soc *ipu, struct ipu_task_entry *t,
+ ipu_channel_t channel, uint32_t ch_type)
+{
+ int ret = 0;
+ int i;
+ uint32_t ipu_fmt;
+ dma_addr_t inbuf_base = 0;
+ u32 field_size;
+ struct vdoa_params param;
+ struct vdoa_ipu_buf buf;
+ struct ipu_soc *ipu_idx;
+ u32 ipu_stride, obuf_size;
+ u32 height, width;
+ ipu_buffer_t type;
+
+ if ((IPU_PIX_FMT_YUYV != t->output.format) &&
+ (IPU_PIX_FMT_NV12 != t->output.format)) {
+ dev_err(t->dev, "ERR:[0x%d] output format\n", t->task_no);
+ return -EINVAL;
+ }
+
+ memset(&param, 0, sizeof(param));
+ /* init channel tiled bufs */
+ if (deinterlace_3_field(t) &&
+ (IPU_PIX_FMT_TILED_NV12F == t->input.format)) {
+ field_size = tiled_filed_size(t);
+ if (INPUT_CHAN_VDI_P == ch_type) {
+ inbuf_base = t->input.paddr + field_size;
+ param.vfield_buf.prev_veba = inbuf_base + t->set.i_off;
+ } else if (INPUT_CHAN == ch_type) {
+ inbuf_base = t->input.paddr_n;
+ param.vfield_buf.cur_veba = inbuf_base + t->set.i_off;
+ } else if (INPUT_CHAN_VDI_N == ch_type) {
+ inbuf_base = t->input.paddr_n + field_size;
+ param.vfield_buf.next_veba = inbuf_base + t->set.i_off;
+ } else
+ return -EINVAL;
+ height = t->input.crop.h >> 1; /* field format for vdoa */
+ width = t->input.crop.w;
+ param.vfield_buf.vubo = t->set.i_uoff;
+ param.interlaced = 1;
+ param.scan_order = 1;
+ type = IPU_INPUT_BUFFER;
+ } else if ((IPU_PIX_FMT_TILED_NV12 == t->input.format) &&
+ (INPUT_CHAN == ch_type)) {
+ height = t->input.crop.h;
+ width = t->input.crop.w;
+ param.vframe_buf.veba = t->input.paddr + t->set.i_off;
+ param.vframe_buf.vubo = t->set.i_uoff;
+ type = IPU_INPUT_BUFFER;
+ } else
+ return -EINVAL;
+
+ param.band_mode = (t->set.mode & VDOA_BAND_MODE) ? 1 : 0;
+ if (param.band_mode && (t->set.band_lines != 3) &&
+ (t->set.band_lines != 4) && (t->set.band_lines != 5))
+ return -EINVAL;
+ else if (param.band_mode)
+ param.band_lines = (1 << t->set.band_lines);
+ for (i = 0; i < max_ipu_no; i++) {
+ ipu_idx = ipu_get_soc(i);
+ if (!IS_ERR(ipu_idx) && ipu_idx == ipu)
+ break;
+ }
+ if (t->set.task & VDOA_ONLY)
+ /* dummy, didn't need ipu res */
+ i = 0;
+ if (max_ipu_no == i) {
+ dev_err(t->dev, "ERR:[0x%p] get ipu num\n", t);
+ return -EINVAL;
+ }
+
+ param.ipu_num = i;
+ param.vpu_stride = t->input.width;
+ param.height = height;
+ param.width = width;
+ if (IPU_PIX_FMT_NV12 == t->output.format)
+ param.pfs = VDOA_PFS_NV12;
+ else
+ param.pfs = VDOA_PFS_YUYV;
+ ipu_fmt = (param.pfs == VDOA_PFS_YUYV) ? IPU_PIX_FMT_YUYV :
+ IPU_PIX_FMT_NV12;
+ ipu_stride = param.width * bytes_per_pixel(ipu_fmt);
+ obuf_size = PAGE_ALIGN(param.width * param.height *
+ fmt_to_bpp(ipu_fmt)/8);
+ dev_dbg(t->dev, "band_mode:%d, band_lines:%d\n",
+ param.band_mode, param.band_lines);
+ if (!param.band_mode) {
+ /* note: if only for tiled -> raster convert and
+ no other post-processing, we don't need alloc buf
+ and use output buffer directly.
+ */
+ if (t->set.task & VDOA_ONLY)
+ param.ieba0 = t->output.paddr;
+ else {
+ dev_err(t->dev, "ERR:[0x%d] vdoa task\n", t->task_no);
+ return -EINVAL;
+ }
+ } else {
+ if (IPU_PIX_FMT_TILED_NV12F != t->input.format) {
+ dev_err(t->dev, "ERR [0x%d] vdoa task\n", t->task_no);
+ return -EINVAL;
+ }
+ }
+ ret = vdoa_setup(t->vdoa_handle, &param);
+ if (ret)
+ goto done;
+ vdoa_get_output_buf(t->vdoa_handle, &buf);
+ if (t->set.task & VDOA_ONLY)
+ goto done;
+
+ ret = ipu_init_channel_buffer(ipu,
+ channel,
+ type,
+ ipu_fmt,
+ width,
+ height,
+ ipu_stride,
+ IPU_ROTATE_NONE,
+ buf.ieba0,
+ buf.ieba1,
+ 0,
+ buf.iubo,
+ 0);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_BUF_FAIL;
+ goto done;
+ }
+
+ if (param.band_mode) {
+ ret = ipu_set_channel_bandmode(ipu, channel,
+ type, t->set.band_lines);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_BAND_FAIL;
+ goto done;
+ }
+ }
+done:
+ return ret;
+}
+
+static int init_tiled_ch_bufs(struct ipu_soc *ipu, struct ipu_task_entry *t)
+{
+ int ret = 0;
+
+ if (IPU_PIX_FMT_TILED_NV12 == t->input.format) {
+ ret = init_tiled_buf(ipu, t, t->set.ic_chan, INPUT_CHAN);
+ CHECK_RETCODE(ret < 0, "init tiled_ch", t->state, done, ret);
+ } else if (IPU_PIX_FMT_TILED_NV12F == t->input.format) {
+ ret = init_tiled_buf(ipu, t, t->set.ic_chan, INPUT_CHAN);
+ CHECK_RETCODE(ret < 0, "init tiled_ch-c", t->state, done, ret);
+ ret = init_tiled_buf(ipu, t, t->set.vdi_ic_p_chan,
+ INPUT_CHAN_VDI_P);
+ CHECK_RETCODE(ret < 0, "init tiled_ch-p", t->state, done, ret);
+ ret = init_tiled_buf(ipu, t, t->set.vdi_ic_n_chan,
+ INPUT_CHAN_VDI_N);
+ CHECK_RETCODE(ret < 0, "init tiled_ch-n", t->state, done, ret);
+ } else {
+ ret = -EINVAL;
+ dev_err(t->dev, "ERR[no-0x%x] invalid fmt:0x%x!\n",
+ t->task_no, t->input.format);
+ }
+
+done:
+ return ret;
+}
+
+static int init_ic(struct ipu_soc *ipu, struct ipu_task_entry *t)
+{
+ int ret = 0;
+ ipu_channel_params_t params;
+ dma_addr_t inbuf = 0, ovbuf = 0, ov_alp_buf = 0;
+ dma_addr_t inbuf_p = 0, inbuf_n = 0;
+ dma_addr_t outbuf = 0;
+ int out_uoff = 0, out_voff = 0, out_rot;
+ int out_w = 0, out_h = 0, out_stride;
+ int out_fmt;
+ u32 vdi_frame_idx = 0;
+
+ memset(&params, 0, sizeof(params));
+
+ /* is it need link a rot channel */
+ if (ic_and_rot(t->set.mode)) {
+ outbuf = t->set.r_paddr;
+ out_w = t->set.r_width;
+ out_h = t->set.r_height;
+ out_stride = t->set.r_stride;
+ out_fmt = t->set.r_fmt;
+ out_uoff = 0;
+ out_voff = 0;
+ out_rot = IPU_ROTATE_NONE;
+ } else {
+ outbuf = t->output.paddr + t->set.o_off;
+ out_w = t->output.crop.w;
+ out_h = t->output.crop.h;
+ out_stride = t->set.ostride;
+ out_fmt = t->output.format;
+ out_uoff = t->set.o_uoff;
+ out_voff = t->set.o_voff;
+ out_rot = t->output.rotate;
+ }
+
+ /* settings */
+ params.mem_prp_vf_mem.in_width = t->input.crop.w;
+ params.mem_prp_vf_mem.out_width = out_w;
+ params.mem_prp_vf_mem.in_height = t->input.crop.h;
+ params.mem_prp_vf_mem.out_height = out_h;
+ params.mem_prp_vf_mem.in_pixel_fmt = t->input.format;
+ params.mem_prp_vf_mem.out_pixel_fmt = out_fmt;
+ params.mem_prp_vf_mem.motion_sel = t->input.deinterlace.motion;
+
+ params.mem_prp_vf_mem.outh_resize_ratio =
+ t->set.sp_setting.outh_resize_ratio;
+ params.mem_prp_vf_mem.outv_resize_ratio =
+ t->set.sp_setting.outv_resize_ratio;
+
+ if (t->overlay_en) {
+ params.mem_prp_vf_mem.in_g_pixel_fmt = t->overlay.format;
+ params.mem_prp_vf_mem.graphics_combine_en = 1;
+ if (t->overlay.alpha.mode == IPU_ALPHA_MODE_GLOBAL)
+ params.mem_prp_vf_mem.global_alpha_en = 1;
+ else if (t->overlay.alpha.loc_alp_paddr)
+ params.mem_prp_vf_mem.alpha_chan_en = 1;
+ /* otherwise, alpha bending per pixel is used. */
+ params.mem_prp_vf_mem.alpha = t->overlay.alpha.gvalue;
+ if (t->overlay.colorkey.enable) {
+ params.mem_prp_vf_mem.key_color_en = 1;
+ params.mem_prp_vf_mem.key_color = t->overlay.colorkey.value;
+ }
+ }
+
+ if (t->input.deinterlace.enable) {
+ if (t->input.deinterlace.field_fmt & IPU_DEINTERLACE_FIELD_MASK)
+ params.mem_prp_vf_mem.field_fmt =
+ IPU_DEINTERLACE_FIELD_BOTTOM;
+ else
+ params.mem_prp_vf_mem.field_fmt =
+ IPU_DEINTERLACE_FIELD_TOP;
+
+ if (t->input.deinterlace.field_fmt & IPU_DEINTERLACE_RATE_EN)
+ vdi_frame_idx = t->input.deinterlace.field_fmt &
+ IPU_DEINTERLACE_RATE_FRAME1;
+ }
+
+ if (t->set.mode & VDOA_MODE)
+ ipu->vdoa_en = 1;
+
+ /* init channels */
+ if (!(t->set.task & VDOA_ONLY)) {
+ ret = ipu_init_channel(ipu, t->set.ic_chan, &params);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_FAIL;
+ goto done;
+ }
+ }
+
+ if (deinterlace_3_field(t)) {
+ ret = ipu_init_channel(ipu, t->set.vdi_ic_p_chan, &params);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_FAIL;
+ goto done;
+ }
+ ret = ipu_init_channel(ipu, t->set.vdi_ic_n_chan, &params);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_FAIL;
+ goto done;
+ }
+ }
+
+ /* init channel bufs */
+ if ((IPU_PIX_FMT_TILED_NV12 == t->input.format) ||
+ (IPU_PIX_FMT_TILED_NV12F == t->input.format)) {
+ ret = init_tiled_ch_bufs(ipu, t);
+ if (ret < 0)
+ goto done;
+ } else {
+ if ((deinterlace_3_field(t)) &&
+ (IPU_PIX_FMT_TILED_NV12F != t->input.format)) {
+ if (params.mem_prp_vf_mem.field_fmt ==
+ IPU_DEINTERLACE_FIELD_TOP) {
+ if (vdi_frame_idx) {
+ inbuf_p = t->input.paddr + t->set.istride +
+ t->set.i_off;
+ inbuf = t->input.paddr_n + t->set.i_off;
+ inbuf_n = t->input.paddr_n + t->set.istride +
+ t->set.i_off;
+ params.mem_prp_vf_mem.field_fmt =
+ IPU_DEINTERLACE_FIELD_BOTTOM;
+ } else {
+ inbuf_p = t->input.paddr + t->set.i_off;
+ inbuf = t->input.paddr + t->set.istride + t->set.i_off;
+ inbuf_n = t->input.paddr_n + t->set.i_off;
+ }
+ } else {
+ if (vdi_frame_idx) {
+ inbuf_p = t->input.paddr + t->set.i_off;
+ inbuf = t->input.paddr_n + t->set.istride + t->set.i_off;
+ inbuf_n = t->input.paddr_n + t->set.i_off;
+ params.mem_prp_vf_mem.field_fmt =
+ IPU_DEINTERLACE_FIELD_TOP;
+ } else {
+ inbuf_p = t->input.paddr + t->set.istride +
+ t->set.i_off;
+ inbuf = t->input.paddr + t->set.i_off;
+ inbuf_n = t->input.paddr_n + t->set.istride +
+ t->set.i_off;
+ }
+ }
+ } else {
+ if (t->input.deinterlace.enable) {
+ if (params.mem_prp_vf_mem.field_fmt ==
+ IPU_DEINTERLACE_FIELD_TOP) {
+ if (vdi_frame_idx) {
+ inbuf = t->input.paddr + t->set.istride + t->set.i_off;
+ params.mem_prp_vf_mem.field_fmt =
+ IPU_DEINTERLACE_FIELD_BOTTOM;
+ } else
+ inbuf = t->input.paddr + t->set.i_off;
+ } else {
+ if (vdi_frame_idx) {
+ inbuf = t->input.paddr + t->set.i_off;
+ params.mem_prp_vf_mem.field_fmt =
+ IPU_DEINTERLACE_FIELD_TOP;
+ } else
+ inbuf = t->input.paddr + t->set.istride + t->set.i_off;
+ }
+ } else
+ inbuf = t->input.paddr + t->set.i_off;
+ }
+
+ if (t->overlay_en)
+ ovbuf = t->overlay.paddr + t->set.ov_off;
+ }
+ if (t->overlay_en && (t->overlay.alpha.mode == IPU_ALPHA_MODE_LOCAL))
+ ov_alp_buf = t->overlay.alpha.loc_alp_paddr
+ + t->set.ov_alpha_off;
+
+ if ((IPU_PIX_FMT_TILED_NV12 != t->input.format) &&
+ (IPU_PIX_FMT_TILED_NV12F != t->input.format)) {
+ ret = ipu_init_channel_buffer(ipu,
+ t->set.ic_chan,
+ IPU_INPUT_BUFFER,
+ t->input.format,
+ t->input.crop.w,
+ t->input.crop.h,
+ t->set.istride,
+ IPU_ROTATE_NONE,
+ inbuf,
+ 0,
+ 0,
+ t->set.i_uoff,
+ t->set.i_voff);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_BUF_FAIL;
+ goto done;
+ }
+ }
+ if (deinterlace_3_field(t) &&
+ (IPU_PIX_FMT_TILED_NV12F != t->input.format)) {
+ ret = ipu_init_channel_buffer(ipu,
+ t->set.vdi_ic_p_chan,
+ IPU_INPUT_BUFFER,
+ t->input.format,
+ t->input.crop.w,
+ t->input.crop.h,
+ t->set.istride,
+ IPU_ROTATE_NONE,
+ inbuf_p,
+ 0,
+ 0,
+ t->set.i_uoff,
+ t->set.i_voff);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_BUF_FAIL;
+ goto done;
+ }
+
+ ret = ipu_init_channel_buffer(ipu,
+ t->set.vdi_ic_n_chan,
+ IPU_INPUT_BUFFER,
+ t->input.format,
+ t->input.crop.w,
+ t->input.crop.h,
+ t->set.istride,
+ IPU_ROTATE_NONE,
+ inbuf_n,
+ 0,
+ 0,
+ t->set.i_uoff,
+ t->set.i_voff);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_BUF_FAIL;
+ goto done;
+ }
+ }
+
+ if (t->overlay_en) {
+ ret = ipu_init_channel_buffer(ipu,
+ t->set.ic_chan,
+ IPU_GRAPH_IN_BUFFER,
+ t->overlay.format,
+ t->overlay.crop.w,
+ t->overlay.crop.h,
+ t->set.ovstride,
+ IPU_ROTATE_NONE,
+ ovbuf,
+ 0,
+ 0,
+ t->set.ov_uoff,
+ t->set.ov_voff);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_BUF_FAIL;
+ goto done;
+ }
+ }
+
+ if (t->overlay.alpha.mode == IPU_ALPHA_MODE_LOCAL) {
+ ret = ipu_init_channel_buffer(ipu,
+ t->set.ic_chan,
+ IPU_ALPHA_IN_BUFFER,
+ IPU_PIX_FMT_GENERIC,
+ t->overlay.crop.w,
+ t->overlay.crop.h,
+ t->set.ov_alpha_stride,
+ IPU_ROTATE_NONE,
+ ov_alp_buf,
+ 0,
+ 0,
+ 0, 0);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_BUF_FAIL;
+ goto done;
+ }
+ }
+
+ if (!(t->set.task & VDOA_ONLY)) {
+ ret = ipu_init_channel_buffer(ipu,
+ t->set.ic_chan,
+ IPU_OUTPUT_BUFFER,
+ out_fmt,
+ out_w,
+ out_h,
+ out_stride,
+ out_rot,
+ outbuf,
+ 0,
+ 0,
+ out_uoff,
+ out_voff);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_BUF_FAIL;
+ goto done;
+ }
+ }
+
+ if ((t->set.mode & VDOA_BAND_MODE) && (t->set.task & VDI_VF)) {
+ ret = ipu_link_channels(ipu, MEM_VDOA_MEM, t->set.ic_chan);
+ CHECK_RETCODE(ret < 0, "ipu_link_ch vdoa_ic",
+ STATE_LINK_CHAN_FAIL, done, ret);
+ }
+
+done:
+ return ret;
+}
+
+static void uninit_ic(struct ipu_soc *ipu, struct ipu_task_entry *t)
+{
+ int ret;
+
+ if ((t->set.mode & VDOA_BAND_MODE) && (t->set.task & VDI_VF)) {
+ ret = ipu_unlink_channels(ipu, MEM_VDOA_MEM, t->set.ic_chan);
+ CHECK_RETCODE_CONT(ret < 0, "ipu_unlink_ch vdoa_ic",
+ STATE_UNLINK_CHAN_FAIL, ret);
+ }
+ ipu_uninit_channel(ipu, t->set.ic_chan);
+ if (deinterlace_3_field(t)) {
+ ipu_uninit_channel(ipu, t->set.vdi_ic_p_chan);
+ ipu_uninit_channel(ipu, t->set.vdi_ic_n_chan);
+ }
+}
+
+static int init_rot(struct ipu_soc *ipu, struct ipu_task_entry *t)
+{
+ int ret = 0;
+ dma_addr_t inbuf = 0, outbuf = 0;
+ int in_uoff = 0, in_voff = 0;
+ int in_fmt, in_width, in_height, in_stride;
+
+ /* init channel */
+ ret = ipu_init_channel(ipu, t->set.rot_chan, NULL);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_FAIL;
+ goto done;
+ }
+
+ /* init channel buf */
+ /* is it need link to a ic channel */
+ if (ic_and_rot(t->set.mode)) {
+ in_fmt = t->set.r_fmt;
+ in_width = t->set.r_width;
+ in_height = t->set.r_height;
+ in_stride = t->set.r_stride;
+ inbuf = t->set.r_paddr;
+ in_uoff = 0;
+ in_voff = 0;
+ } else {
+ in_fmt = t->input.format;
+ in_width = t->input.crop.w;
+ in_height = t->input.crop.h;
+ in_stride = t->set.istride;
+ inbuf = t->input.paddr + t->set.i_off;
+ in_uoff = t->set.i_uoff;
+ in_voff = t->set.i_voff;
+ }
+ outbuf = t->output.paddr + t->set.o_off;
+
+ ret = ipu_init_channel_buffer(ipu,
+ t->set.rot_chan,
+ IPU_INPUT_BUFFER,
+ in_fmt,
+ in_width,
+ in_height,
+ in_stride,
+ t->output.rotate,
+ inbuf,
+ 0,
+ 0,
+ in_uoff,
+ in_voff);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_BUF_FAIL;
+ goto done;
+ }
+
+ ret = ipu_init_channel_buffer(ipu,
+ t->set.rot_chan,
+ IPU_OUTPUT_BUFFER,
+ t->output.format,
+ t->output.crop.w,
+ t->output.crop.h,
+ t->set.ostride,
+ IPU_ROTATE_NONE,
+ outbuf,
+ 0,
+ 0,
+ t->set.o_uoff,
+ t->set.o_voff);
+ if (ret < 0) {
+ t->state = STATE_INIT_CHAN_BUF_FAIL;
+ goto done;
+ }
+
+done:
+ return ret;
+}
+
+static void uninit_rot(struct ipu_soc *ipu, struct ipu_task_entry *t)
+{
+ ipu_uninit_channel(ipu, t->set.rot_chan);
+}
+
+static int get_irq(struct ipu_task_entry *t)
+{
+ int irq;
+ ipu_channel_t chan;
+
+ if (only_ic(t->set.mode))
+ chan = t->set.ic_chan;
+ else
+ chan = t->set.rot_chan;
+
+ switch (chan) {
+ case MEM_ROT_VF_MEM:
+ irq = IPU_IRQ_PRP_VF_ROT_OUT_EOF;
+ break;
+ case MEM_ROT_PP_MEM:
+ irq = IPU_IRQ_PP_ROT_OUT_EOF;
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ case MEM_PRP_VF_MEM:
+ irq = IPU_IRQ_PRP_VF_OUT_EOF;
+ break;
+ case MEM_PP_MEM:
+ irq = IPU_IRQ_PP_OUT_EOF;
+ break;
+ case MEM_VDI_MEM:
+ irq = IPU_IRQ_VDIC_OUT_EOF;
+ break;
+ default:
+ irq = -EINVAL;
+ }
+
+ return irq;
+}
+
+static irqreturn_t task_irq_handler(int irq, void *dev_id)
+{
+ struct ipu_task_entry *prev_tsk = dev_id;
+
+ CHECK_PERF(&prev_tsk->ts_inirq);
+ complete(&prev_tsk->irq_comp);
+ dev_dbg(prev_tsk->dev, "[0x%p] no-0x%x in-irq!",
+ prev_tsk, prev_tsk->task_no);
+
+ return IRQ_HANDLED;
+}
+
+/* Fix deinterlace up&down split mode medium line */
+static void vdi_split_process(struct ipu_soc *ipu, struct ipu_task_entry *t)
+{
+ u32 vdi_size;
+ u32 vdi_save_lines;
+ u32 stripe_mode;
+ u32 task_no;
+ u32 i, offset_addr;
+ u32 line_size;
+ unsigned char *base_off;
+ struct ipu_task_entry *parent = t->parent;
+ struct mutex *lock = &parent->vdic_lock;
+
+ if (!parent) {
+ dev_err(t->dev, "ERR[0x%x]invalid parent\n", t->task_no);
+ return;
+ }
+ mutex_lock(lock);
+ stripe_mode = t->task_no & 0xf;
+ task_no = t->task_no >> 4;
+
+ /* Save both luma and chroma part for interleaved YUV(e.g. YUYV).
+ * Save luma part for non-interleaved and partial-interleaved
+ * YUV format (e.g NV12 and YV12). */
+ if (t->output.format == IPU_PIX_FMT_YUYV ||
+ t->output.format == IPU_PIX_FMT_UYVY)
+ line_size = t->output.crop.w * fmt_to_bpp(t->output.format)/8;
+ else
+ line_size = t->output.crop.w;
+
+ vdi_save_lines = (t->output.crop.h - t->set.sp_setting.ud_split_line)/2;
+ vdi_size = vdi_save_lines * line_size;
+ if (vdi_save_lines <= 0) {
+ dev_err(t->dev, "[0x%p] vdi_save_line error\n", (void *)t);
+ mutex_unlock(lock);
+ return;
+ }
+
+ /*check vditmpbuf buffer have alloced or buffer size is changed */
+ if ((vdi_save_lines != parent->old_save_lines) ||
+ (vdi_size != parent->old_size)) {
+ if (parent->vditmpbuf[0] != NULL)
+ kfree(parent->vditmpbuf[0]);
+ if (parent->vditmpbuf[1] != NULL)
+ kfree(parent->vditmpbuf[1]);
+
+ parent->vditmpbuf[0] = kmalloc(vdi_size, GFP_KERNEL);
+ if (parent->vditmpbuf[0] == NULL) {
+ dev_err(t->dev,
+ "[0x%p]Falied Alloc vditmpbuf[0]\n", (void *)t);
+ mutex_unlock(lock);
+ return;
+ }
+ memset(parent->vditmpbuf[0], 0, vdi_size);
+
+ parent->vditmpbuf[1] = kmalloc(vdi_size, GFP_KERNEL);
+ if (parent->vditmpbuf[1] == NULL) {
+ dev_err(t->dev,
+ "[0x%p]Falied Alloc vditmpbuf[1]\n", (void *)t);
+ mutex_unlock(lock);
+ return;
+ }
+ memset(parent->vditmpbuf[1], 0, vdi_size);
+
+ parent->old_save_lines = vdi_save_lines;
+ parent->old_size = vdi_size;
+ }
+
+ if (pfn_valid(t->output.paddr >> PAGE_SHIFT)) {
+ base_off = page_address(pfn_to_page(t->output.paddr >> PAGE_SHIFT));
+ base_off += t->output.paddr & ((1 << PAGE_SHIFT) - 1);
+ } else {
+ base_off = (char *)ioremap_nocache(t->output.paddr,
+ t->output.width * t->output.height *
+ fmt_to_bpp(t->output.format)/8);
+ }
+ if (base_off == NULL) {
+ dev_err(t->dev, "ERR[0x%p]Failed get virtual address\n", t);
+ mutex_unlock(lock);
+ return;
+ }
+
+ /* UP stripe or UP&LEFT stripe */
+ if ((stripe_mode == UP_STRIPE) ||
+ (stripe_mode == (UP_STRIPE | LEFT_STRIPE))) {
+ if (!parent->buf0filled) {
+ offset_addr = t->set.o_off +
+ t->set.sp_setting.ud_split_line*t->set.ostride;
+ dmac_flush_range(base_off + offset_addr,
+ base_off + offset_addr + vdi_size);
+ outer_flush_range(t->output.paddr + offset_addr,
+ t->output.paddr + offset_addr + vdi_size);
+
+ for (i = 0; i < vdi_save_lines; i++)
+ memcpy(parent->vditmpbuf[0] + i*line_size,
+ base_off + offset_addr +
+ i*t->set.ostride, line_size);
+ parent->buf0filled = true;
+ } else {
+ offset_addr = t->set.o_off + (t->output.crop.h -
+ vdi_save_lines) * t->set.ostride;
+ for (i = 0; i < vdi_save_lines; i++)
+ memcpy(base_off + offset_addr + i*t->set.ostride,
+ parent->vditmpbuf[0] + i*line_size, line_size);
+
+ dmac_flush_range(base_off + offset_addr,
+ base_off + offset_addr + i*t->set.ostride);
+ outer_flush_range(t->output.paddr + offset_addr,
+ t->output.paddr + offset_addr + i*t->set.ostride);
+ parent->buf0filled = false;
+ }
+ }
+ /*Down stripe or Down&Left stripe*/
+ else if ((stripe_mode == DOWN_STRIPE) ||
+ (stripe_mode == (DOWN_STRIPE | LEFT_STRIPE))) {
+ if (!parent->buf0filled) {
+ offset_addr = t->set.o_off + vdi_save_lines*t->set.ostride;
+ dmac_flush_range(base_off + offset_addr,
+ base_off + offset_addr + vdi_size);
+ outer_flush_range(t->output.paddr + offset_addr,
+ t->output.paddr + offset_addr + vdi_size);
+
+ for (i = 0; i < vdi_save_lines; i++)
+ memcpy(parent->vditmpbuf[0] + i*line_size,
+ base_off + offset_addr + i*t->set.ostride,
+ line_size);
+ parent->buf0filled = true;
+ } else {
+ offset_addr = t->set.o_off;
+ for (i = 0; i < vdi_save_lines; i++)
+ memcpy(base_off + offset_addr + i*t->set.ostride,
+ parent->vditmpbuf[0] + i*line_size,
+ line_size);
+
+ dmac_flush_range(base_off + offset_addr,
+ base_off + offset_addr + i*t->set.ostride);
+ outer_flush_range(t->output.paddr + offset_addr,
+ t->output.paddr + offset_addr + i*t->set.ostride);
+ parent->buf0filled = false;
+ }
+ }
+ /*Up&Right stripe*/
+ else if (stripe_mode == (UP_STRIPE | RIGHT_STRIPE)) {
+ if (!parent->buf1filled) {
+ offset_addr = t->set.o_off +
+ t->set.sp_setting.ud_split_line*t->set.ostride;
+ dmac_flush_range(base_off + offset_addr,
+ base_off + offset_addr + vdi_size);
+ outer_flush_range(t->output.paddr + offset_addr,
+ t->output.paddr + offset_addr + vdi_size);
+
+ for (i = 0; i < vdi_save_lines; i++)
+ memcpy(parent->vditmpbuf[1] + i*line_size,
+ base_off + offset_addr + i*t->set.ostride,
+ line_size);
+ parent->buf1filled = true;
+ } else {
+ offset_addr = t->set.o_off +
+ (t->output.crop.h - vdi_save_lines)*t->set.ostride;
+ for (i = 0; i < vdi_save_lines; i++)
+ memcpy(base_off + offset_addr + i*t->set.ostride,
+ parent->vditmpbuf[1] + i*line_size,
+ line_size);
+
+ dmac_flush_range(base_off + offset_addr,
+ base_off + offset_addr + i*t->set.ostride);
+ outer_flush_range(t->output.paddr + offset_addr,
+ t->output.paddr + offset_addr + i*t->set.ostride);
+ parent->buf1filled = false;
+ }
+ }
+ /*Down stripe or Down&Right stript*/
+ else if (stripe_mode == (DOWN_STRIPE | RIGHT_STRIPE)) {
+ if (!parent->buf1filled) {
+ offset_addr = t->set.o_off + vdi_save_lines*t->set.ostride;
+ dmac_flush_range(base_off + offset_addr,
+ base_off + offset_addr + vdi_save_lines*t->set.ostride);
+ outer_flush_range(t->output.paddr + offset_addr,
+ t->output.paddr + offset_addr + vdi_save_lines*t->set.ostride);
+
+ for (i = 0; i < vdi_save_lines; i++)
+ memcpy(parent->vditmpbuf[1] + i*line_size,
+ base_off + offset_addr + i*t->set.ostride,
+ line_size);
+ parent->buf1filled = true;
+ } else {
+ offset_addr = t->set.o_off;
+ for (i = 0; i < vdi_save_lines; i++)
+ memcpy(base_off + offset_addr + i*t->set.ostride,
+ parent->vditmpbuf[1] + i*line_size,
+ line_size);
+
+ dmac_flush_range(base_off + offset_addr,
+ base_off + offset_addr + vdi_save_lines*t->set.ostride);
+ outer_flush_range(t->output.paddr + offset_addr,
+ t->output.paddr + offset_addr + vdi_save_lines*t->set.ostride);
+ parent->buf1filled = false;
+ }
+ }
+ if (!pfn_valid(t->output.paddr >> PAGE_SHIFT))
+ iounmap(base_off);
+ mutex_unlock(lock);
+}
+
+static void do_task_release(struct ipu_task_entry *t, int fail)
+{
+ int ret;
+ struct ipu_soc *ipu = t->ipu;
+
+ if (t->input.deinterlace.enable && !fail &&
+ (t->task_no & (UP_STRIPE | DOWN_STRIPE)))
+ vdi_split_process(ipu, t);
+
+ ipu_free_irq(ipu, t->irq, t);
+
+ if (t->vdoa_dma.vaddr)
+ dma_free_coherent(t->dev,
+ t->vdoa_dma.size,
+ t->vdoa_dma.vaddr,
+ t->vdoa_dma.paddr);
+
+ if (only_ic(t->set.mode)) {
+ ret = ipu_disable_channel(ipu, t->set.ic_chan, true);
+ CHECK_RETCODE_CONT(ret < 0, "ipu_disable_ch only_ic",
+ STATE_DISABLE_CHAN_FAIL, ret);
+ if (deinterlace_3_field(t)) {
+ ret = ipu_disable_channel(ipu, t->set.vdi_ic_p_chan,
+ true);
+ CHECK_RETCODE_CONT(ret < 0, "ipu_disable_ch only_ic_p",
+ STATE_DISABLE_CHAN_FAIL, ret);
+ ret = ipu_disable_channel(ipu, t->set.vdi_ic_n_chan,
+ true);
+ CHECK_RETCODE_CONT(ret < 0, "ipu_disable_ch only_ic_n",
+ STATE_DISABLE_CHAN_FAIL, ret);
+ }
+ } else if (only_rot(t->set.mode)) {
+ ret = ipu_disable_channel(ipu, t->set.rot_chan, true);
+ CHECK_RETCODE_CONT(ret < 0, "ipu_disable_ch only_rot",
+ STATE_DISABLE_CHAN_FAIL, ret);
+ } else if (ic_and_rot(t->set.mode)) {
+ ret = ipu_unlink_channels(ipu, t->set.ic_chan, t->set.rot_chan);
+ CHECK_RETCODE_CONT(ret < 0, "ipu_unlink_ch",
+ STATE_UNLINK_CHAN_FAIL, ret);
+ ret = ipu_disable_channel(ipu, t->set.rot_chan, true);
+ CHECK_RETCODE_CONT(ret < 0, "ipu_disable_ch ic_and_rot-rot",
+ STATE_DISABLE_CHAN_FAIL, ret);
+ ret = ipu_disable_channel(ipu, t->set.ic_chan, true);
+ CHECK_RETCODE_CONT(ret < 0, "ipu_disable_ch ic_and_rot-ic",
+ STATE_DISABLE_CHAN_FAIL, ret);
+ if (deinterlace_3_field(t)) {
+ ret = ipu_disable_channel(ipu, t->set.vdi_ic_p_chan,
+ true);
+ CHECK_RETCODE_CONT(ret < 0, "ipu_disable_ch icrot-ic-p",
+ STATE_DISABLE_CHAN_FAIL, ret);
+ ret = ipu_disable_channel(ipu, t->set.vdi_ic_n_chan,
+ true);
+ CHECK_RETCODE_CONT(ret < 0, "ipu_disable_ch icrot-ic-n",
+ STATE_DISABLE_CHAN_FAIL, ret);
+ }
+ }
+
+ if (only_ic(t->set.mode))
+ uninit_ic(ipu, t);
+ else if (only_rot(t->set.mode))
+ uninit_rot(ipu, t);
+ else if (ic_and_rot(t->set.mode)) {
+ uninit_ic(ipu, t);
+ uninit_rot(ipu, t);
+ }
+
+ t->state = STATE_OK;
+ CHECK_PERF(&t->ts_rel);
+ return;
+}
+
+static void do_task_vdoa_only(struct ipu_task_entry *t)
+{
+ int ret;
+
+ ret = init_tiled_ch_bufs(NULL, t);
+ CHECK_RETCODE(ret < 0, "do_vdoa_only", STATE_ERR, out, ret);
+ ret = vdoa_start(t->vdoa_handle, VDOA_DEF_TIMEOUT_MS);
+ vdoa_stop(t->vdoa_handle);
+ CHECK_RETCODE(ret < 0, "vdoa_wait4complete, do_vdoa_only",
+ STATE_VDOA_IRQ_TIMEOUT, out, ret);
+
+ t->state = STATE_OK;
+out:
+ return;
+}
+
+static void do_task(struct ipu_task_entry *t)
+{
+ int r_size;
+ int irq;
+ int ret;
+ uint32_t busy;
+ struct ipu_soc *ipu = t->ipu;
+
+ CHECK_PERF(&t->ts_dotask);
+
+ if (!ipu) {
+ t->state = STATE_NO_IPU;
+ return;
+ }
+
+ init_completion(&t->irq_comp);
+ dev_dbg(ipu->dev, "[0x%p]Do task no:0x%x: id %d\n", (void *)t,
+ t->task_no, t->task_id);
+ dump_task_info(t);
+
+ if (t->set.task & IC_PP) {
+ t->set.ic_chan = MEM_PP_MEM;
+ dev_dbg(ipu->dev, "[0x%p]ic channel MEM_PP_MEM\n", (void *)t);
+ } else if (t->set.task & IC_VF) {
+ t->set.ic_chan = MEM_PRP_VF_MEM;
+ dev_dbg(ipu->dev, "[0x%p]ic channel MEM_PRP_VF_MEM\n", (void *)t);
+ } else if (t->set.task & VDI_VF) {
+ if (t->set.mode & VDOA_BAND_MODE) {
+ t->set.ic_chan = MEM_VDI_MEM;
+ if (deinterlace_3_field(t)) {
+ t->set.vdi_ic_p_chan = MEM_VDI_MEM_P;
+ t->set.vdi_ic_n_chan = MEM_VDI_MEM_N;
+ }
+ dev_dbg(ipu->dev, "[0x%p]ic ch MEM_VDI_MEM\n",
+ (void *)t);
+ } else {
+ t->set.ic_chan = MEM_VDI_PRP_VF_MEM;
+ if (deinterlace_3_field(t)) {
+ t->set.vdi_ic_p_chan = MEM_VDI_PRP_VF_MEM_P;
+ t->set.vdi_ic_n_chan = MEM_VDI_PRP_VF_MEM_N;
+ }
+ dev_dbg(ipu->dev,
+ "[0x%p]ic ch MEM_VDI_PRP_VF_MEM\n", t);
+ }
+ }
+
+ if (t->set.task & ROT_PP) {
+ t->set.rot_chan = MEM_ROT_PP_MEM;
+ dev_dbg(ipu->dev, "[0x%p]rot channel MEM_ROT_PP_MEM\n", (void *)t);
+ } else if (t->set.task & ROT_VF) {
+ t->set.rot_chan = MEM_ROT_VF_MEM;
+ dev_dbg(ipu->dev, "[0x%p]rot channel MEM_ROT_VF_MEM\n", (void *)t);
+ }
+
+ if (t->task_id == IPU_TASK_ID_VF)
+ busy = ic_vf_pp_is_busy(ipu, true);
+ else if (t->task_id == IPU_TASK_ID_PP)
+ busy = ic_vf_pp_is_busy(ipu, false);
+ else {
+ dev_err(ipu->dev, "ERR[no:0x%x]ipu task_id:%d invalid!\n",
+ t->task_no, t->task_id);
+ return;
+ }
+ if (busy) {
+ dev_err(ipu->dev, "ERR[0x%p-no:0x%x]ipu task_id:%d busy!\n",
+ (void *)t, t->task_no, t->task_id);
+ t->state = STATE_IPU_BUSY;
+ return;
+ }
+
+ irq = get_irq(t);
+ if (irq < 0) {
+ t->state = STATE_NO_IRQ;
+ return;
+ }
+ t->irq = irq;
+
+ /* channel setup */
+ if (only_ic(t->set.mode)) {
+ dev_dbg(t->dev, "[0x%p]only ic mode\n", (void *)t);
+ ret = init_ic(ipu, t);
+ CHECK_RETCODE(ret < 0, "init_ic only_ic",
+ t->state, chan_setup, ret);
+ } else if (only_rot(t->set.mode)) {
+ dev_dbg(t->dev, "[0x%p]only rot mode\n", (void *)t);
+ ret = init_rot(ipu, t);
+ CHECK_RETCODE(ret < 0, "init_rot only_rot",
+ t->state, chan_setup, ret);
+ } else if (ic_and_rot(t->set.mode)) {
+ int rot_idx = (t->task_id == IPU_TASK_ID_VF) ? 0 : 1;
+
+ dev_dbg(t->dev, "[0x%p]ic + rot mode\n", (void *)t);
+ t->set.r_fmt = t->output.format;
+ if (t->output.rotate >= IPU_ROTATE_90_RIGHT) {
+ t->set.r_width = t->output.crop.h;
+ t->set.r_height = t->output.crop.w;
+ } else {
+ t->set.r_width = t->output.crop.w;
+ t->set.r_height = t->output.crop.h;
+ }
+ t->set.r_stride = t->set.r_width *
+ bytes_per_pixel(t->set.r_fmt);
+ r_size = PAGE_ALIGN(t->set.r_width * t->set.r_height
+ * fmt_to_bpp(t->set.r_fmt)/8);
+
+ if (r_size > ipu->rot_dma[rot_idx].size) {
+ dev_dbg(t->dev, "[0x%p]realloc rot buffer\n", (void *)t);
+
+ if (ipu->rot_dma[rot_idx].vaddr)
+ dma_free_coherent(t->dev,
+ ipu->rot_dma[rot_idx].size,
+ ipu->rot_dma[rot_idx].vaddr,
+ ipu->rot_dma[rot_idx].paddr);
+
+ ipu->rot_dma[rot_idx].size = r_size;
+ ipu->rot_dma[rot_idx].vaddr = dma_alloc_coherent(t->dev,
+ r_size,
+ &ipu->rot_dma[rot_idx].paddr,
+ GFP_DMA | GFP_KERNEL);
+ CHECK_RETCODE(ipu->rot_dma[rot_idx].vaddr == NULL,
+ "ic_and_rot", STATE_SYS_NO_MEM,
+ chan_setup, -ENOMEM);
+ }
+ t->set.r_paddr = ipu->rot_dma[rot_idx].paddr;
+
+ dev_dbg(t->dev, "[0x%p]rotation:\n", (void *)t);
+ dev_dbg(t->dev, "[0x%p]\tformat = 0x%x\n", (void *)t, t->set.r_fmt);
+ dev_dbg(t->dev, "[0x%p]\twidth = %d\n", (void *)t, t->set.r_width);
+ dev_dbg(t->dev, "[0x%p]\theight = %d\n", (void *)t, t->set.r_height);
+ dev_dbg(t->dev, "[0x%p]\tpaddr = 0x%x\n", (void *)t, t->set.r_paddr);
+ dev_dbg(t->dev, "[0x%p]\trstride = %d\n", (void *)t, t->set.r_stride);
+
+ ret = init_ic(ipu, t);
+ CHECK_RETCODE(ret < 0, "init_ic ic_and_rot",
+ t->state, chan_setup, ret);
+ ret = init_rot(ipu, t);
+ CHECK_RETCODE(ret < 0, "init_rot ic_and_rot",
+ t->state, chan_setup, ret);
+ ret = ipu_link_channels(ipu, t->set.ic_chan,
+ t->set.rot_chan);
+ CHECK_RETCODE(ret < 0, "ipu_link_ch ic_and_rot",
+ STATE_LINK_CHAN_FAIL, chan_setup, ret);
+ } else {
+ dev_err(t->dev, "ERR [0x%p]do task: should not be here\n", t);
+ t->state = STATE_ERR;
+ return;
+ }
+
+ ret = ipu_request_irq(ipu, irq, task_irq_handler, 0, NULL, t);
+ CHECK_RETCODE(ret < 0, "ipu_req_irq",
+ STATE_IRQ_FAIL, chan_setup, ret);
+
+ /* enable/start channel */
+ if (only_ic(t->set.mode)) {
+ ret = ipu_enable_channel(ipu, t->set.ic_chan);
+ CHECK_RETCODE(ret < 0, "ipu_enable_ch only_ic",
+ STATE_ENABLE_CHAN_FAIL, chan_en, ret);
+ if (deinterlace_3_field(t)) {
+ ret = ipu_enable_channel(ipu, t->set.vdi_ic_p_chan);
+ CHECK_RETCODE(ret < 0, "ipu_enable_ch only_ic_p",
+ STATE_ENABLE_CHAN_FAIL, chan_en, ret);
+ ret = ipu_enable_channel(ipu, t->set.vdi_ic_n_chan);
+ CHECK_RETCODE(ret < 0, "ipu_enable_ch only_ic_n",
+ STATE_ENABLE_CHAN_FAIL, chan_en, ret);
+ }
+
+ ret = ipu_select_buffer(ipu, t->set.ic_chan, IPU_OUTPUT_BUFFER,
+ 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf only_ic",
+ STATE_SEL_BUF_FAIL, chan_buf, ret);
+ if (t->overlay_en) {
+ ret = ipu_select_buffer(ipu, t->set.ic_chan,
+ IPU_GRAPH_IN_BUFFER, 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf only_ic_g",
+ STATE_SEL_BUF_FAIL, chan_buf, ret);
+ if (t->overlay.alpha.mode == IPU_ALPHA_MODE_LOCAL) {
+ ret = ipu_select_buffer(ipu, t->set.ic_chan,
+ IPU_ALPHA_IN_BUFFER, 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf only_ic_a",
+ STATE_SEL_BUF_FAIL, chan_buf,
+ ret);
+ }
+ }
+ if (!(t->set.mode & VDOA_BAND_MODE)) {
+ if (deinterlace_3_field(t))
+ ipu_select_multi_vdi_buffer(ipu, 0);
+ else {
+ ret = ipu_select_buffer(ipu, t->set.ic_chan,
+ IPU_INPUT_BUFFER, 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf only_ic_i",
+ STATE_SEL_BUF_FAIL, chan_buf, ret);
+ }
+ }
+ } else if (only_rot(t->set.mode)) {
+ ret = ipu_enable_channel(ipu, t->set.rot_chan);
+ CHECK_RETCODE(ret < 0, "ipu_enable_ch only_rot",
+ STATE_ENABLE_CHAN_FAIL, chan_en, ret);
+ ret = ipu_select_buffer(ipu, t->set.rot_chan,
+ IPU_OUTPUT_BUFFER, 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf only_rot_o",
+ STATE_SEL_BUF_FAIL, chan_buf, ret);
+ ret = ipu_select_buffer(ipu, t->set.rot_chan,
+ IPU_INPUT_BUFFER, 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf only_rot_i",
+ STATE_SEL_BUF_FAIL, chan_buf, ret);
+ } else if (ic_and_rot(t->set.mode)) {
+ ret = ipu_enable_channel(ipu, t->set.rot_chan);
+ CHECK_RETCODE(ret < 0, "ipu_enable_ch ic_and_rot-rot",
+ STATE_ENABLE_CHAN_FAIL, chan_en, ret);
+ ret = ipu_enable_channel(ipu, t->set.ic_chan);
+ CHECK_RETCODE(ret < 0, "ipu_enable_ch ic_and_rot-ic",
+ STATE_ENABLE_CHAN_FAIL, chan_en, ret);
+ if (deinterlace_3_field(t)) {
+ ret = ipu_enable_channel(ipu, t->set.vdi_ic_p_chan);
+ CHECK_RETCODE(ret < 0, "ipu_enable_ch ic_and_rot-p",
+ STATE_ENABLE_CHAN_FAIL, chan_en, ret);
+ ret = ipu_enable_channel(ipu, t->set.vdi_ic_n_chan);
+ CHECK_RETCODE(ret < 0, "ipu_enable_ch ic_and_rot-n",
+ STATE_ENABLE_CHAN_FAIL, chan_en, ret);
+ }
+
+ ret = ipu_select_buffer(ipu, t->set.rot_chan,
+ IPU_OUTPUT_BUFFER, 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf ic_and_rot-rot-o",
+ STATE_SEL_BUF_FAIL, chan_buf, ret);
+ if (t->overlay_en) {
+ ret = ipu_select_buffer(ipu, t->set.ic_chan,
+ IPU_GRAPH_IN_BUFFER, 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf ic_and_rot-ic-g",
+ STATE_SEL_BUF_FAIL, chan_buf, ret);
+ if (t->overlay.alpha.mode == IPU_ALPHA_MODE_LOCAL) {
+ ret = ipu_select_buffer(ipu, t->set.ic_chan,
+ IPU_ALPHA_IN_BUFFER, 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf icrot-ic-a",
+ STATE_SEL_BUF_FAIL,
+ chan_buf, ret);
+ }
+ }
+ ret = ipu_select_buffer(ipu, t->set.ic_chan,
+ IPU_OUTPUT_BUFFER, 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf ic_and_rot-ic-o",
+ STATE_SEL_BUF_FAIL, chan_buf, ret);
+ if (deinterlace_3_field(t))
+ ipu_select_multi_vdi_buffer(ipu, 0);
+ else {
+ ret = ipu_select_buffer(ipu, t->set.ic_chan,
+ IPU_INPUT_BUFFER, 0);
+ CHECK_RETCODE(ret < 0, "ipu_sel_buf ic_and_rot-ic-i",
+ STATE_SEL_BUF_FAIL, chan_buf, ret);
+ }
+ }
+
+ if (need_split(t))
+ t->state = STATE_IN_PROGRESS;
+
+ if (t->set.mode & VDOA_BAND_MODE) {
+ ret = vdoa_start(t->vdoa_handle, VDOA_DEF_TIMEOUT_MS);
+ CHECK_RETCODE(ret < 0, "vdoa_wait4complete, do_vdoa_band",
+ STATE_VDOA_IRQ_TIMEOUT, chan_rel, ret);
+ }
+
+ CHECK_PERF(&t->ts_waitirq);
+ ret = wait_for_completion_timeout(&t->irq_comp,
+ msecs_to_jiffies(t->timeout - DEF_DELAY_MS));
+ CHECK_PERF(&t->ts_wakeup);
+ CHECK_RETCODE(ret == 0, "wait_for_comp_timeout",
+ STATE_IRQ_TIMEOUT, chan_rel, ret);
+ dev_dbg(t->dev, "[0x%p] no-0x%x ipu irq done!", t, t->task_no);
+
+chan_rel:
+chan_buf:
+chan_en:
+chan_setup:
+ if (t->set.mode & VDOA_BAND_MODE)
+ vdoa_stop(t->vdoa_handle);
+ do_task_release(t, t->state >= STATE_ERR);
+ return;
+}
+
+static void do_task_vdoa_vdi(struct ipu_task_entry *t)
+{
+ int i;
+ int ret;
+ u32 stripe_width;
+
+ /* FIXME: crop mode not support now */
+ stripe_width = t->input.width >> 1;
+ t->input.crop.pos.x = 0;
+ t->input.crop.pos.y = 0;
+ t->input.crop.w = stripe_width;
+ t->input.crop.h = t->input.height;
+ t->output.crop.w = stripe_width;
+ t->output.crop.h = t->input.height;
+
+ for (i = 0; i < 2; i++) {
+ t->input.crop.pos.x = t->input.crop.pos.x + i * stripe_width;
+ t->output.crop.pos.x = t->output.crop.pos.x + i * stripe_width;
+ /* check input */
+ ret = set_crop(&t->input.crop, t->input.width, t->input.height,
+ t->input.format);
+ if (ret < 0) {
+ ret = STATE_ERR;
+ goto done;
+ } else
+ update_offset(t->input.format,
+ t->input.width, t->input.height,
+ t->input.crop.pos.x,
+ t->input.crop.pos.y,
+ &t->set.i_off, &t->set.i_uoff,
+ &t->set.i_voff, &t->set.istride);
+ dev_dbg(t->dev, "i_off:0x%x, i_uoff:0x%x, istride:%d.\n",
+ t->set.i_off, t->set.i_uoff, t->set.istride);
+ /* check output */
+ ret = set_crop(&t->output.crop, t->input.width,
+ t->output.height, t->output.format);
+ if (ret < 0) {
+ ret = STATE_ERR;
+ goto done;
+ } else
+ update_offset(t->output.format,
+ t->output.width, t->output.height,
+ t->output.crop.pos.x,
+ t->output.crop.pos.y,
+ &t->set.o_off, &t->set.o_uoff,
+ &t->set.o_voff, &t->set.ostride);
+
+ dev_dbg(t->dev, "o_off:0x%x, o_uoff:0x%x, ostride:%d.\n",
+ t->set.o_off, t->set.o_uoff, t->set.ostride);
+
+ do_task(t);
+ }
+
+ return;
+done:
+ dev_err(t->dev, "ERR %s set_crop.\n", __func__);
+ t->state = ret;
+ return;
+}
+
+static void get_res_do_task(struct ipu_task_entry *t)
+{
+ uint32_t found;
+ uint32_t split_child;
+ struct mutex *lock;
+
+ found = get_vdoa_ipu_res(t);
+ if (!found) {
+ dev_err(t->dev, "ERR:[0x%p] no-0x%x can not get res\n",
+ t, t->task_no);
+ return;
+ } else {
+ if (t->set.task & VDOA_ONLY)
+ do_task_vdoa_only(t);
+ else if ((IPU_PIX_FMT_TILED_NV12F == t->input.format) &&
+ (t->set.mode & VDOA_BAND_MODE) &&
+ (t->input.crop.w >
+ soc_max_vdi_in_width(t->ipu)))
+ do_task_vdoa_vdi(t);
+ else
+ do_task(t);
+ put_vdoa_ipu_res(t, 0);
+ }
+ if (t->state != STATE_OK) {
+ dev_err(t->dev, "ERR:[0x%p] no-0x%x state: %s\n",
+ t, t->task_no, state_msg[t->state].msg);
+ }
+
+ split_child = need_split(t) && t->parent;
+ if (split_child) {
+ lock = &t->parent->split_lock;
+ mutex_lock(lock);
+ t->split_done = 1;
+ mutex_unlock(lock);
+ wake_up(&t->parent->split_waitq);
+ }
+
+ return;
+}
+
+static void wait_split_task_complete(struct ipu_task_entry *parent,
+ struct ipu_split_task *sp_task, uint32_t size)
+{
+ struct ipu_task_entry *tsk = NULL;
+ int ret = 0, rc;
+ int j, idx = -1;
+ unsigned long flags;
+ struct mutex *lock = &parent->split_lock;
+ int k, busy_vf, busy_pp;
+ struct ipu_soc *ipu;
+ DECLARE_PERF_VAR;
+
+ for (j = 0; j < size; j++) {
+ rc = wait_event_timeout(
+ parent->split_waitq,
+ sp_task_check_done(sp_task, parent, size, &idx),
+ msecs_to_jiffies(parent->timeout - DEF_DELAY_MS));
+ if (!rc) {
+ dev_err(parent->dev,
+ "ERR:[0x%p] no-0x%x, split_task timeout,j:%d,"
+ "size:%d.\n",
+ parent, parent->task_no, j, size);
+ ret = -ETIMEDOUT;
+ goto out;
+ } else {
+ if (idx < 0) {
+ dev_err(parent->dev,
+ "ERR:[0x%p] no-0x%x, invalid task idx:%d\n",
+ parent, parent->task_no, idx);
+ continue;
+ }
+ tsk = sp_task[idx].child_task;
+ mutex_lock(lock);
+ if (!tsk->split_done || !tsk->ipu)
+ dev_err(tsk->dev,
+ "ERR:no-0x%x,split not done:%d/null ipu:0x%p\n",
+ tsk->task_no, tsk->split_done, tsk->ipu);
+ tsk->split_done = 0;
+ mutex_unlock(lock);
+
+ dev_dbg(tsk->dev,
+ "[0x%p] no-0x%x sp_tsk[%d] done,state:%d.\n",
+ tsk, tsk->task_no, idx, tsk->state);
+ #ifdef DBG_IPU_PERF
+ CHECK_PERF(&tsk->ts_rel);
+ PRINT_TASK_STATISTICS;
+ #endif
+ }
+ }
+
+out:
+ if (ret == -ETIMEDOUT) {
+ /* debug */
+ for (k = 0; k < max_ipu_no; k++) {
+ ipu = ipu_get_soc(k);
+ if (IS_ERR(ipu)) {
+ dev_err(parent->dev, "no:0x%x, null ipu:%d\n",
+ parent->task_no, k);
+ } else {
+ busy_vf = ic_vf_pp_is_busy(ipu, true);
+ busy_pp = ic_vf_pp_is_busy(ipu, false);
+ dev_err(parent->dev,
+ "ERR:ipu[%d] busy_vf:%d, busy_pp:%d.\n",
+ k, busy_vf, busy_pp);
+ }
+ }
+ for (k = 0; k < size; k++) {
+ tsk = sp_task[k].child_task;
+ if (!tsk)
+ continue;
+ dev_err(parent->dev,
+ "ERR: sp_task[%d][0x%p] no-0x%x done:%d,"
+ "state:%s,on_list:%d, ipu:0x%p,timeout!\n",
+ k, tsk, tsk->task_no, tsk->split_done,
+ state_msg[tsk->state].msg, tsk->task_in_list,
+ tsk->ipu);
+ }
+ }
+
+ for (j = 0; j < size; j++) {
+ tsk = sp_task[j].child_task;
+ if (!tsk)
+ continue;
+ spin_lock_irqsave(&ipu_task_list_lock, flags);
+ if (tsk->task_in_list) {
+ list_del(&tsk->node);
+ tsk->task_in_list = 0;
+ dev_dbg(tsk->dev,
+ "[0x%p] no-0x%x,id:%d sp_tsk timeout list_del.\n",
+ tsk, tsk->task_no, tsk->task_id);
+ }
+ spin_unlock_irqrestore(&ipu_task_list_lock, flags);
+ if (!tsk->ipu)
+ continue;
+ if (tsk->state != STATE_OK) {
+ dev_err(tsk->dev,
+ "ERR:[0x%p] no-0x%x,id:%d, sp_tsk state: %s\n",
+ tsk, tsk->task_no, tsk->task_id,
+ state_msg[tsk->state].msg);
+ }
+ kref_put(&tsk->refcount, task_mem_free);
+ }
+
+ kfree(parent->vditmpbuf[0]);
+ kfree(parent->vditmpbuf[1]);
+
+ if (ret < 0)
+ parent->state = STATE_TIMEOUT;
+ else
+ parent->state = STATE_OK;
+ return;
+}
+
+static inline int find_task(struct ipu_task_entry **t, int thread_id)
+{
+ int found;
+ unsigned long flags;
+ struct ipu_task_entry *tsk;
+ struct list_head *task_list = &ipu_task_list;
+
+ *t = NULL;
+ spin_lock_irqsave(&ipu_task_list_lock, flags);
+ found = !list_empty(task_list);
+ if (found) {
+ tsk = list_first_entry(task_list, struct ipu_task_entry, node);
+ if (tsk->task_in_list) {
+ list_del(&tsk->node);
+ tsk->task_in_list = 0;
+ *t = tsk;
+ kref_get(&tsk->refcount);
+ dev_dbg(tsk->dev,
+ "thread_id:%d,[0x%p] task_no:0x%x,mode:0x%x list_del\n",
+ thread_id, tsk, tsk->task_no, tsk->set.mode);
+ } else
+ dev_err(tsk->dev,
+ "thread_id:%d,task_no:0x%x,mode:0x%x not on list_del\n",
+ thread_id, tsk->task_no, tsk->set.mode);
+ }
+ spin_unlock_irqrestore(&ipu_task_list_lock, flags);
+
+ return found;
+}
+
+static int ipu_task_thread(void *argv)
+{
+ struct ipu_task_entry *tsk;
+ struct ipu_task_entry *sp_tsk0;
+ struct ipu_split_task sp_task[4];
+ /* priority lower than irq_thread */
+ const struct sched_param param = {
+ .sched_priority = MAX_USER_RT_PRIO/2 - 1,
+ };
+ int ret;
+ int curr_thread_id;
+ uint32_t size;
+ unsigned long flags;
+ unsigned int cpu;
+ struct cpumask cpu_mask;
+ struct ipu_thread_data *data = (struct ipu_thread_data *)argv;
+
+ thread_id++;
+ curr_thread_id = thread_id;
+ sched_setscheduler(current, SCHED_FIFO, &param);
+
+ if (!data->is_vdoa) {
+ cpu = cpumask_first(cpu_online_mask);
+ cpumask_set_cpu(cpu, &cpu_mask);
+ ret = sched_setaffinity(data->ipu->thread[data->id]->pid,
+ &cpu_mask);
+ if (ret < 0) {
+ pr_err("%s: sched_setaffinity fail:%d.\n", __func__, ret);
+ }
+ pr_debug("%s: sched_setaffinity cpu:%d.\n", __func__, cpu);
+ }
+
+ while (!kthread_should_stop()) {
+ int split_fail = 0;
+ int split_parent;
+ int split_child;
+
+ wait_event_interruptible(thread_waitq, find_task(&tsk, curr_thread_id));
+
+ if (!tsk) {
+ pr_err("thread:%d can not find task.\n",
+ curr_thread_id);
+ continue;
+ }
+
+ /* note: other threads run split child task */
+ split_parent = need_split(tsk) && !tsk->parent;
+ split_child = need_split(tsk) && tsk->parent;
+ if (split_parent) {
+ if ((tsk->set.split_mode == RL_SPLIT) ||
+ (tsk->set.split_mode == UD_SPLIT))
+ size = 2;
+ else
+ size = 4;
+ ret = queue_split_task(tsk, sp_task, size);
+ if (ret < 0) {
+ split_fail = 1;
+ } else {
+ struct list_head *pos;
+
+ spin_lock_irqsave(&ipu_task_list_lock, flags);
+
+ sp_tsk0 = list_first_entry(&tsk->split_list,
+ struct ipu_task_entry, node);
+ list_del(&sp_tsk0->node);
+
+ list_for_each(pos, &tsk->split_list) {
+ struct ipu_task_entry *tmp;
+
+ tmp = list_entry(pos,
+ struct ipu_task_entry, node);
+ tmp->task_in_list = 1;
+ dev_dbg(tmp->dev,
+ "[0x%p] no-0x%x,id:%d sp_tsk "
+ "add_to_list.\n", tmp,
+ tmp->task_no, tmp->task_id);
+ }
+ /* add to global list */
+ list_splice(&tsk->split_list, &ipu_task_list);
+
+ spin_unlock_irqrestore(&ipu_task_list_lock,
+ flags);
+ /* let the parent thread do the first sp_task */
+ /* FIXME: ensure the correct sequence for split
+ 4size: 5/6->9/a*/
+ wake_up_interruptible(&thread_waitq);
+ get_res_do_task(sp_tsk0);
+ dev_dbg(sp_tsk0->dev,
+ "thread:%d complete tsk no:0x%x.\n",
+ curr_thread_id, sp_tsk0->task_no);
+ ret = atomic_read(&req_cnt);
+ if (ret > 0) {
+ wake_up(&res_waitq);
+ dev_dbg(sp_tsk0->dev,
+ "sp_tsk0 sche thread:%d no:0x%x,"
+ "req_cnt:%d\n", curr_thread_id,
+ sp_tsk0->task_no, ret);
+ /* For other threads to get_res */
+ schedule();
+ }
+ }
+ } else
+ get_res_do_task(tsk);
+
+ /* wait for all 4 sp_task finished here or timeout
+ and then release all resources */
+ if (split_parent && !split_fail)
+ wait_split_task_complete(tsk, sp_task, size);
+
+ if (!split_child) {
+ atomic_inc(&tsk->done);
+ wake_up(&tsk->task_waitq);
+ }
+
+ dev_dbg(tsk->dev, "thread:%d complete tsk no:0x%x-[0x%p].\n",
+ curr_thread_id, tsk->task_no, tsk);
+ ret = atomic_read(&req_cnt);
+ if (ret > 0) {
+ wake_up(&res_waitq);
+ dev_dbg(tsk->dev, "sche thread:%d no:0x%x,req_cnt:%d\n",
+ curr_thread_id, tsk->task_no, ret);
+ /* note: give cpu to other threads to get_res */
+ schedule();
+ }
+
+ kref_put(&tsk->refcount, task_mem_free);
+ }
+
+ pr_info("ERR %s exit.\n", __func__);
+ return 0;
+}
+
+int ipu_check_task(struct ipu_task *task)
+{
+ struct ipu_task_entry *tsk;
+ int ret = 0;
+
+ tsk = create_task_entry(task);
+ if (IS_ERR(tsk))
+ return PTR_ERR(tsk);
+
+ ret = check_task(tsk);
+
+ task->input = tsk->input;
+ task->output = tsk->output;
+ task->overlay = tsk->overlay;
+ dump_task_info(tsk);
+
+ kref_put(&tsk->refcount, task_mem_free);
+ if (ret != 0)
+ pr_debug("%s ret:%d.\n", __func__, ret);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(ipu_check_task);
+
+int ipu_queue_task(struct ipu_task *task)
+{
+ struct ipu_task_entry *tsk;
+ unsigned long flags;
+ int ret;
+ u32 tmp_task_no;
+ DECLARE_PERF_VAR;
+
+ tsk = create_task_entry(task);
+ if (IS_ERR(tsk))
+ return PTR_ERR(tsk);
+
+ CHECK_PERF(&tsk->ts_queue);
+ ret = prepare_task(tsk);
+ if (ret < 0)
+ goto done;
+
+ if (need_split(tsk)) {
+ CHECK_PERF(&tsk->ts_dotask);
+ CHECK_PERF(&tsk->ts_waitirq);
+ CHECK_PERF(&tsk->ts_inirq);
+ CHECK_PERF(&tsk->ts_wakeup);
+ }
+
+ /* task_no last four bits for split task type*/
+ tmp_task_no = atomic_inc_return(&frame_no);
+ tsk->task_no = tmp_task_no << 4;
+ init_waitqueue_head(&tsk->task_waitq);
+
+ spin_lock_irqsave(&ipu_task_list_lock, flags);
+ list_add_tail(&tsk->node, &ipu_task_list);
+ tsk->task_in_list = 1;
+ dev_dbg(tsk->dev, "[0x%p,no-0x%x] list_add_tail\n", tsk, tsk->task_no);
+ spin_unlock_irqrestore(&ipu_task_list_lock, flags);
+ wake_up_interruptible(&thread_waitq);
+
+ ret = wait_event_timeout(tsk->task_waitq, atomic_read(&tsk->done),
+ msecs_to_jiffies(tsk->timeout));
+ if (0 == ret) {
+ /* note: the timeout should larger than the internal timeout!*/
+ ret = -ETIMEDOUT;
+ dev_err(tsk->dev, "ERR: [0x%p] no-0x%x, timeout:%dms!\n",
+ tsk, tsk->task_no, tsk->timeout);
+ } else {
+ if (STATE_OK != tsk->state) {
+ dev_err(tsk->dev, "ERR: [0x%p] no-0x%x,state %d: %s\n",
+ tsk, tsk->task_no, tsk->state,
+ state_msg[tsk->state].msg);
+ ret = -ECANCELED;
+ } else
+ ret = 0;
+ }
+
+ spin_lock_irqsave(&ipu_task_list_lock, flags);
+ if (tsk->task_in_list) {
+ list_del(&tsk->node);
+ tsk->task_in_list = 0;
+ dev_dbg(tsk->dev, "[0x%p] no:0x%x list_del\n",
+ tsk, tsk->task_no);
+ }
+ spin_unlock_irqrestore(&ipu_task_list_lock, flags);
+
+#ifdef DBG_IPU_PERF
+ CHECK_PERF(&tsk->ts_rel);
+ PRINT_TASK_STATISTICS;
+ if (ts_frame_avg == 0)
+ ts_frame_avg = ts_frame.tv_nsec / NSEC_PER_USEC +
+ ts_frame.tv_sec * USEC_PER_SEC;
+ else
+ ts_frame_avg = (ts_frame_avg + ts_frame.tv_nsec / NSEC_PER_USEC
+ + ts_frame.tv_sec * USEC_PER_SEC)/2;
+ if (timespec_compare(&ts_frame, &ts_frame_max) > 0)
+ ts_frame_max = ts_frame;
+
+ atomic_inc(&frame_cnt);
+
+ if ((atomic_read(&frame_cnt) % 1000) == 0)
+ pr_debug("ipu_dev: max frame time:%ldus, avg frame time:%dus,"
+ "frame_cnt:%d\n", ts_frame_max.tv_nsec / NSEC_PER_USEC
+ + ts_frame_max.tv_sec * USEC_PER_SEC,
+ ts_frame_avg, atomic_read(&frame_cnt));
+#endif
+done:
+ if (ret < 0)
+ dev_err(tsk->dev, "ERR: no-0x%x,ipu_queue_task err:%d\n",
+ tsk->task_no, ret);
+
+ kref_put(&tsk->refcount, task_mem_free);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(ipu_queue_task);
+
+static int mxc_ipu_open(struct inode *inode, struct file *file)
+{
+ file->private_data = (void *)atomic_inc_return(&file_index);
+ return 0;
+}
+
+static long mxc_ipu_ioctl(struct file *file,
+ unsigned int cmd, unsigned long arg)
+{
+ int __user *argp = (void __user *)arg;
+ int ret = 0;
+
+ switch (cmd) {
+ case IPU_CHECK_TASK:
+ {
+ struct ipu_task task;
+
+ if (copy_from_user
+ (&task, (struct ipu_task *) arg,
+ sizeof(struct ipu_task)))
+ return -EFAULT;
+ ret = ipu_check_task(&task);
+ if (copy_to_user((struct ipu_task *) arg,
+ &task, sizeof(struct ipu_task)))
+ return -EFAULT;
+ break;
+ }
+ case IPU_QUEUE_TASK:
+ {
+ struct ipu_task task;
+
+ if (copy_from_user
+ (&task, (struct ipu_task *) arg,
+ sizeof(struct ipu_task)))
+ return -EFAULT;
+ ret = ipu_queue_task(&task);
+ break;
+ }
+ case IPU_ALLOC:
+ {
+ int size;
+ struct ipu_alloc_list *mem;
+
+ mem = kzalloc(sizeof(*mem), GFP_KERNEL);
+ if (mem == NULL)
+ return -ENOMEM;
+
+ if (get_user(size, argp)) {
+ kfree(mem);
+ return -EFAULT;
+ }
+
+ mem->size = PAGE_ALIGN(size);
+
+ mem->cpu_addr = dma_alloc_coherent(ipu_dev, size,
+ &mem->phy_addr,
+ GFP_DMA | GFP_KERNEL);
+ if (mem->cpu_addr == NULL) {
+ kfree(mem);
+ return -ENOMEM;
+ }
+ mem->file_index = file->private_data;
+ mutex_lock(&ipu_alloc_lock);
+ list_add(&mem->list, &ipu_alloc_list);
+ mutex_unlock(&ipu_alloc_lock);
+
+ if (put_user(mem->phy_addr, argp)) {
+ mutex_lock(&ipu_alloc_lock);
+ list_del(&mem->list);
+ mutex_unlock(&ipu_alloc_lock);
+ dma_free_coherent(ipu_dev,
+ mem->size,
+ mem->cpu_addr,
+ mem->phy_addr);
+ kfree(mem);
+ return -EFAULT;
+ }
+
+ dev_dbg(ipu_dev, "allocated %d bytes @ 0x%08X\n",
+ mem->size, mem->phy_addr);
+
+ break;
+ }
+ case IPU_FREE:
+ {
+ unsigned long offset;
+ struct ipu_alloc_list *mem;
+
+ if (get_user(offset, argp))
+ return -EFAULT;
+
+ ret = -EINVAL;
+ mutex_lock(&ipu_alloc_lock);
+ list_for_each_entry(mem, &ipu_alloc_list, list) {
+ if (mem->phy_addr == offset) {
+ list_del(&mem->list);
+ dma_free_coherent(ipu_dev,
+ mem->size,
+ mem->cpu_addr,
+ mem->phy_addr);
+ kfree(mem);
+ ret = 0;
+ break;
+ }
+ }
+ mutex_unlock(&ipu_alloc_lock);
+ if (0 == ret)
+ dev_dbg(ipu_dev, "free %d bytes @ 0x%08X\n",
+ mem->size, mem->phy_addr);
+
+ break;
+ }
+ default:
+ break;
+ }
+ return ret;
+}
+
+static int mxc_ipu_mmap(struct file *file, struct vm_area_struct *vma)
+{
+ bool found = false;
+ u32 len;
+ unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
+ struct ipu_alloc_list *mem;
+
+ mutex_lock(&ipu_alloc_lock);
+ list_for_each_entry(mem, &ipu_alloc_list, list) {
+ if (offset == mem->phy_addr) {
+ found = true;
+ len = mem->size;
+ break;
+ }
+ }
+ mutex_unlock(&ipu_alloc_lock);
+ if (!found)
+ return -EINVAL;
+
+ if (vma->vm_end - vma->vm_start > len)
+ return -EINVAL;
+
+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+
+ if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
+ vma->vm_end - vma->vm_start,
+ vma->vm_page_prot)) {
+ printk(KERN_ERR
+ "mmap failed!\n");
+ return -ENOBUFS;
+ }
+ return 0;
+}
+
+static int mxc_ipu_release(struct inode *inode, struct file *file)
+{
+ struct ipu_alloc_list *mem;
+ struct ipu_alloc_list *n;
+
+ mutex_lock(&ipu_alloc_lock);
+ list_for_each_entry_safe(mem, n, &ipu_alloc_list, list) {
+ if ((mem->cpu_addr != 0) &&
+ (file->private_data == mem->file_index)) {
+ list_del(&mem->list);
+ dma_free_coherent(ipu_dev,
+ mem->size,
+ mem->cpu_addr,
+ mem->phy_addr);
+ dev_dbg(ipu_dev, "rel-free %d bytes @ 0x%08X\n",
+ mem->size, mem->phy_addr);
+ kfree(mem);
+ }
+ }
+ mutex_unlock(&ipu_alloc_lock);
+ atomic_dec(&file_index);
+
+ return 0;
+}
+
+static struct file_operations mxc_ipu_fops = {
+ .owner = THIS_MODULE,
+ .open = mxc_ipu_open,
+ .mmap = mxc_ipu_mmap,
+ .release = mxc_ipu_release,
+ .unlocked_ioctl = mxc_ipu_ioctl,
+};
+
+int register_ipu_device(struct ipu_soc *ipu, int id)
+{
+ int ret = 0;
+ static int idx;
+ static struct ipu_thread_data thread_data[5];
+
+ if (!major) {
+ major = register_chrdev(0, "mxc_ipu", &mxc_ipu_fops);
+ if (major < 0) {
+ printk(KERN_ERR "Unable to register mxc_ipu as a char device\n");
+ ret = major;
+ goto register_cdev_fail;
+ }
+
+ ipu_class = class_create(THIS_MODULE, "mxc_ipu");
+ if (IS_ERR(ipu_class)) {
+ ret = PTR_ERR(ipu_class);
+ goto ipu_class_fail;
+ }
+
+ ipu_dev = device_create(ipu_class, NULL, MKDEV(major, 0),
+ NULL, "mxc_ipu");
+ if (IS_ERR(ipu_dev)) {
+ ret = PTR_ERR(ipu_dev);
+ goto dev_create_fail;
+ }
+ ipu_dev->dma_mask = kmalloc(sizeof(*ipu_dev->dma_mask), GFP_KERNEL);
+ *ipu_dev->dma_mask = DMA_BIT_MASK(32);
+ ipu_dev->coherent_dma_mask = DMA_BIT_MASK(32);
+
+ mutex_init(&ipu_ch_tbl.lock);
+ }
+ max_ipu_no = ++id;
+ ipu->rot_dma[0].size = 0;
+ ipu->rot_dma[1].size = 0;
+
+ thread_data[idx].ipu = ipu;
+ thread_data[idx].id = 0;
+ thread_data[idx].is_vdoa = 0;
+ ipu->thread[0] = kthread_run(ipu_task_thread, &thread_data[idx++],
+ "ipu%d_task", id);
+ if (IS_ERR(ipu->thread[0])) {
+ ret = PTR_ERR(ipu->thread[0]);
+ goto kthread0_fail;
+ }
+
+ thread_data[idx].ipu = ipu;
+ thread_data[idx].id = 1;
+ thread_data[idx].is_vdoa = 0;
+ ipu->thread[1] = kthread_run(ipu_task_thread, &thread_data[idx++],
+ "ipu%d_task", id);
+ if (IS_ERR(ipu->thread[1])) {
+ ret = PTR_ERR(ipu->thread[1]);
+ goto kthread1_fail;
+ }
+
+
+ return ret;
+
+kthread1_fail:
+ kthread_stop(ipu->thread[0]);
+kthread0_fail:
+ if (id == 0)
+ device_destroy(ipu_class, MKDEV(major, 0));
+dev_create_fail:
+ if (id == 0) {
+ class_destroy(ipu_class);
+ }
+ipu_class_fail:
+ if (id == 0)
+ unregister_chrdev(major, "mxc_ipu");
+register_cdev_fail:
+ return ret;
+}
+
+void unregister_ipu_device(struct ipu_soc *ipu, int id)
+{
+ int i;
+
+ kthread_stop(ipu->thread[0]);
+ kthread_stop(ipu->thread[1]);
+ for (i = 0; i < 2; i++) {
+ if (ipu->rot_dma[i].vaddr)
+ dma_free_coherent(ipu_dev,
+ ipu->rot_dma[i].size,
+ ipu->rot_dma[i].vaddr,
+ ipu->rot_dma[i].paddr);
+ }
+
+ if (major) {
+ device_destroy(ipu_class, MKDEV(major, 0));
+ class_destroy(ipu_class);
+ unregister_chrdev(major, "mxc_ipu");
+ major = 0;
+ }
+}
diff --git a/drivers/mxc/ipu3/ipu_disp.c b/drivers/mxc/ipu3/ipu_disp.c
new file mode 100644
index 000000000000..33ff22ca860f
--- /dev/null
+++ b/drivers/mxc/ipu3/ipu_disp.c
@@ -0,0 +1,1993 @@
+/*
+ * Copyright 2005-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file ipu_disp.c
+ *
+ * @brief IPU display submodule API functions
+ *
+ * @ingroup IPU
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/errno.h>
+#include <linux/io.h>
+#include <linux/ipu-v3.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <linux/types.h>
+
+#include <asm/atomic.h>
+
+#include "ipu_param_mem.h"
+#include "ipu_regs.h"
+
+struct dp_csc_param_t {
+ int mode;
+ void *coeff;
+};
+
+#define SYNC_WAVE 0
+#define NULL_WAVE (-1)
+#define ASYNC_SER_WAVE 6
+
+/* DC display ID assignments */
+#define DC_DISP_ID_SYNC(di) (di)
+#define DC_DISP_ID_SERIAL 2
+#define DC_DISP_ID_ASYNC 3
+
+int dmfc_type_setup;
+
+void _ipu_dmfc_init(struct ipu_soc *ipu, int dmfc_type, int first)
+{
+ u32 dmfc_wr_chan, dmfc_dp_chan;
+
+ if (first) {
+ if (dmfc_type_setup > dmfc_type)
+ dmfc_type = dmfc_type_setup;
+ else
+ dmfc_type_setup = dmfc_type;
+
+ /* disable DMFC-IC channel*/
+ ipu_dmfc_write(ipu, 0x2, DMFC_IC_CTRL);
+ } else if (dmfc_type_setup >= DMFC_HIGH_RESOLUTION_DC) {
+ dev_dbg(ipu->dev, "DMFC high resolution has set, will not change\n");
+ return;
+ } else
+ dmfc_type_setup = dmfc_type;
+
+ if (dmfc_type == DMFC_HIGH_RESOLUTION_DC) {
+ /* 1 - segment 0~3;
+ * 5B - segement 4, 5;
+ * 5F - segement 6, 7;
+ * 1C, 2C and 6B, 6F unused;
+ */
+ dev_info(ipu->dev, "IPU DMFC DC HIGH RESOLUTION: 1(0~3), 5B(4,5), 5F(6,7)\n");
+ dmfc_wr_chan = 0x00000088;
+ dmfc_dp_chan = 0x00009694;
+ ipu->dmfc_size_28 = 256*4;
+ ipu->dmfc_size_29 = 0;
+ ipu->dmfc_size_24 = 0;
+ ipu->dmfc_size_27 = 128*4;
+ ipu->dmfc_size_23 = 128*4;
+ } else if (dmfc_type == DMFC_HIGH_RESOLUTION_DP) {
+ /* 1 - segment 0, 1;
+ * 5B - segement 2~5;
+ * 5F - segement 6,7;
+ * 1C, 2C and 6B, 6F unused;
+ */
+ dev_info(ipu->dev, "IPU DMFC DP HIGH RESOLUTION: 1(0,1), 5B(2~5), 5F(6,7)\n");
+ dmfc_wr_chan = 0x00000090;
+ dmfc_dp_chan = 0x0000968a;
+ ipu->dmfc_size_28 = 128*4;
+ ipu->dmfc_size_29 = 0;
+ ipu->dmfc_size_24 = 0;
+ ipu->dmfc_size_27 = 128*4;
+ ipu->dmfc_size_23 = 256*4;
+ } else if (dmfc_type == DMFC_HIGH_RESOLUTION_ONLY_DP) {
+ /* 5B - segement 0~3;
+ * 5F - segement 4~7;
+ * 1, 1C, 2C and 6B, 6F unused;
+ */
+ dev_info(ipu->dev, "IPU DMFC ONLY-DP HIGH RESOLUTION: 5B(0~3), 5F(4~7)\n");
+ dmfc_wr_chan = 0x00000000;
+ dmfc_dp_chan = 0x00008c88;
+ ipu->dmfc_size_28 = 0;
+ ipu->dmfc_size_29 = 0;
+ ipu->dmfc_size_24 = 0;
+ ipu->dmfc_size_27 = 256*4;
+ ipu->dmfc_size_23 = 256*4;
+ } else {
+ /* 1 - segment 0, 1;
+ * 5B - segement 4, 5;
+ * 5F - segement 6, 7;
+ * 1C, 2C and 6B, 6F unused;
+ */
+ dev_info(ipu->dev, "IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)\n");
+ dmfc_wr_chan = 0x00000090;
+ dmfc_dp_chan = 0x00009694;
+ ipu->dmfc_size_28 = 128*4;
+ ipu->dmfc_size_29 = 0;
+ ipu->dmfc_size_24 = 0;
+ ipu->dmfc_size_27 = 128*4;
+ ipu->dmfc_size_23 = 128*4;
+ }
+ ipu_dmfc_write(ipu, dmfc_wr_chan, DMFC_WR_CHAN);
+ ipu_dmfc_write(ipu, 0x202020F6, DMFC_WR_CHAN_DEF);
+ ipu_dmfc_write(ipu, dmfc_dp_chan, DMFC_DP_CHAN);
+ /* Enable chan 5 watermark set at 5 bursts and clear at 7 bursts */
+ ipu_dmfc_write(ipu, 0x2020F6F6, DMFC_DP_CHAN_DEF);
+}
+
+static int __init dmfc_setup(char *options)
+{
+ get_option(&options, &dmfc_type_setup);
+ if (dmfc_type_setup > DMFC_HIGH_RESOLUTION_ONLY_DP)
+ dmfc_type_setup = DMFC_HIGH_RESOLUTION_ONLY_DP;
+ return 1;
+}
+__setup("dmfc=", dmfc_setup);
+
+void _ipu_dmfc_set_wait4eot(struct ipu_soc *ipu, int dma_chan, int width)
+{
+ u32 dmfc_gen1 = ipu_dmfc_read(ipu, DMFC_GENERAL1);
+
+ if (width >= HIGH_RESOLUTION_WIDTH) {
+ if (dma_chan == 23)
+ _ipu_dmfc_init(ipu, DMFC_HIGH_RESOLUTION_DP, 0);
+ else if (dma_chan == 28)
+ _ipu_dmfc_init(ipu, DMFC_HIGH_RESOLUTION_DC, 0);
+ }
+
+ if (dma_chan == 23) { /*5B*/
+ if (ipu->dmfc_size_23/width > 3)
+ dmfc_gen1 |= 1UL << 20;
+ else
+ dmfc_gen1 &= ~(1UL << 20);
+ } else if (dma_chan == 24) { /*6B*/
+ if (ipu->dmfc_size_24/width > 1)
+ dmfc_gen1 |= 1UL << 22;
+ else
+ dmfc_gen1 &= ~(1UL << 22);
+ } else if (dma_chan == 27) { /*5F*/
+ if (ipu->dmfc_size_27/width > 2)
+ dmfc_gen1 |= 1UL << 21;
+ else
+ dmfc_gen1 &= ~(1UL << 21);
+ } else if (dma_chan == 28) { /*1*/
+ if (ipu->dmfc_size_28/width > 2)
+ dmfc_gen1 |= 1UL << 16;
+ else
+ dmfc_gen1 &= ~(1UL << 16);
+ } else if (dma_chan == 29) { /*6F*/
+ if (ipu->dmfc_size_29/width > 1)
+ dmfc_gen1 |= 1UL << 23;
+ else
+ dmfc_gen1 &= ~(1UL << 23);
+ }
+
+ ipu_dmfc_write(ipu, dmfc_gen1, DMFC_GENERAL1);
+}
+
+void _ipu_dmfc_set_burst_size(struct ipu_soc *ipu, int dma_chan, int burst_size)
+{
+ u32 dmfc_wr_chan = ipu_dmfc_read(ipu, DMFC_WR_CHAN);
+ u32 dmfc_dp_chan = ipu_dmfc_read(ipu, DMFC_DP_CHAN);
+ int dmfc_bs = 0;
+
+ switch (burst_size) {
+ case 64:
+ dmfc_bs = 0x40;
+ break;
+ case 32:
+ case 20:
+ dmfc_bs = 0x80;
+ break;
+ case 16:
+ dmfc_bs = 0xc0;
+ break;
+ default:
+ dev_err(ipu->dev, "Unsupported burst size %d\n",
+ burst_size);
+ return;
+ }
+
+ if (dma_chan == 23) { /*5B*/
+ dmfc_dp_chan &= ~(0xc0);
+ dmfc_dp_chan |= dmfc_bs;
+ } else if (dma_chan == 27) { /*5F*/
+ dmfc_dp_chan &= ~(0xc000);
+ dmfc_dp_chan |= (dmfc_bs << 8);
+ } else if (dma_chan == 28) { /*1*/
+ dmfc_wr_chan &= ~(0xc0);
+ dmfc_wr_chan |= dmfc_bs;
+ }
+
+ ipu_dmfc_write(ipu, dmfc_wr_chan, DMFC_WR_CHAN);
+ ipu_dmfc_write(ipu, dmfc_dp_chan, DMFC_DP_CHAN);
+}
+
+static void _ipu_di_data_wave_config(struct ipu_soc *ipu,
+ int di, int wave_gen,
+ int access_size, int component_size)
+{
+ u32 reg;
+ reg = (access_size << DI_DW_GEN_ACCESS_SIZE_OFFSET) |
+ (component_size << DI_DW_GEN_COMPONENT_SIZE_OFFSET);
+ ipu_di_write(ipu, di, reg, DI_DW_GEN(wave_gen));
+}
+
+static void _ipu_di_data_pin_config(struct ipu_soc *ipu,
+ int di, int wave_gen, int di_pin, int set,
+ int up, int down)
+{
+ u32 reg;
+
+ reg = ipu_di_read(ipu, di, DI_DW_GEN(wave_gen));
+ reg &= ~(0x3 << (di_pin * 2));
+ reg |= set << (di_pin * 2);
+ ipu_di_write(ipu, di, reg, DI_DW_GEN(wave_gen));
+
+ ipu_di_write(ipu, di, (down << 16) | up, DI_DW_SET(wave_gen, set));
+}
+
+static void _ipu_di_sync_config(struct ipu_soc *ipu,
+ int di, int wave_gen,
+ int run_count, int run_src,
+ int offset_count, int offset_src,
+ int repeat_count, int cnt_clr_src,
+ int cnt_polarity_gen_en,
+ int cnt_polarity_clr_src,
+ int cnt_polarity_trigger_src,
+ int cnt_up, int cnt_down)
+{
+ u32 reg;
+
+ if ((run_count >= 0x1000) || (offset_count >= 0x1000) || (repeat_count >= 0x1000) ||
+ (cnt_up >= 0x400) || (cnt_down >= 0x400)) {
+ dev_err(ipu->dev, "DI%d counters out of range.\n", di);
+ return;
+ }
+
+ reg = (run_count << 19) | (++run_src << 16) |
+ (offset_count << 3) | ++offset_src;
+ ipu_di_write(ipu, di, reg, DI_SW_GEN0(wave_gen));
+ reg = (cnt_polarity_gen_en << 29) | (++cnt_clr_src << 25) |
+ (++cnt_polarity_trigger_src << 12) | (++cnt_polarity_clr_src << 9);
+ reg |= (cnt_down << 16) | cnt_up;
+ if (repeat_count == 0) {
+ /* Enable auto reload */
+ reg |= 0x10000000;
+ }
+ ipu_di_write(ipu, di, reg, DI_SW_GEN1(wave_gen));
+ reg = ipu_di_read(ipu, di, DI_STP_REP(wave_gen));
+ reg &= ~(0xFFFF << (16 * ((wave_gen - 1) & 0x1)));
+ reg |= repeat_count << (16 * ((wave_gen - 1) & 0x1));
+ ipu_di_write(ipu, di, reg, DI_STP_REP(wave_gen));
+}
+
+static void _ipu_dc_map_link(struct ipu_soc *ipu,
+ int current_map,
+ int base_map_0, int buf_num_0,
+ int base_map_1, int buf_num_1,
+ int base_map_2, int buf_num_2)
+{
+ int ptr_0 = base_map_0 * 3 + buf_num_0;
+ int ptr_1 = base_map_1 * 3 + buf_num_1;
+ int ptr_2 = base_map_2 * 3 + buf_num_2;
+ int ptr;
+ u32 reg;
+ ptr = (ptr_2 << 10) + (ptr_1 << 5) + ptr_0;
+
+ reg = ipu_dc_read(ipu, DC_MAP_CONF_PTR(current_map));
+ reg &= ~(0x1F << ((16 * (current_map & 0x1))));
+ reg |= ptr << ((16 * (current_map & 0x1)));
+ ipu_dc_write(ipu, reg, DC_MAP_CONF_PTR(current_map));
+}
+
+static void _ipu_dc_map_config(struct ipu_soc *ipu,
+ int map, int byte_num, int offset, int mask)
+{
+ int ptr = map * 3 + byte_num;
+ u32 reg;
+
+ reg = ipu_dc_read(ipu, DC_MAP_CONF_VAL(ptr));
+ reg &= ~(0xFFFF << (16 * (ptr & 0x1)));
+ reg |= ((offset << 8) | mask) << (16 * (ptr & 0x1));
+ ipu_dc_write(ipu, reg, DC_MAP_CONF_VAL(ptr));
+
+ reg = ipu_dc_read(ipu, DC_MAP_CONF_PTR(map));
+ reg &= ~(0x1F << ((16 * (map & 0x1)) + (5 * byte_num)));
+ reg |= ptr << ((16 * (map & 0x1)) + (5 * byte_num));
+ ipu_dc_write(ipu, reg, DC_MAP_CONF_PTR(map));
+}
+
+static void _ipu_dc_map_clear(struct ipu_soc *ipu, int map)
+{
+ u32 reg = ipu_dc_read(ipu, DC_MAP_CONF_PTR(map));
+ ipu_dc_write(ipu, reg & ~(0xFFFF << (16 * (map & 0x1))),
+ DC_MAP_CONF_PTR(map));
+}
+
+static void _ipu_dc_write_tmpl(struct ipu_soc *ipu,
+ int word, u32 opcode, u32 operand, int map,
+ int wave, int glue, int sync, int stop)
+{
+ u32 reg;
+
+ if (opcode == WRG) {
+ reg = sync;
+ reg |= (glue << 4);
+ reg |= (++wave << 11);
+ reg |= ((operand & 0x1FFFF) << 15);
+ ipu_dc_tmpl_write(ipu, reg, word * 8);
+
+ reg = (operand >> 17);
+ reg |= opcode << 7;
+ reg |= (stop << 9);
+ ipu_dc_tmpl_write(ipu, reg, word * 8 + 4);
+ } else {
+ reg = sync;
+ reg |= (glue << 4);
+ reg |= (++wave << 11);
+ reg |= (++map << 15);
+ reg |= (operand << 20) & 0xFFF00000;
+ ipu_dc_tmpl_write(ipu, reg, word * 8);
+
+ reg = (operand >> 12);
+ reg |= opcode << 4;
+ reg |= (stop << 9);
+ ipu_dc_tmpl_write(ipu, reg, word * 8 + 4);
+ }
+}
+
+static void _ipu_dc_link_event(struct ipu_soc *ipu,
+ int chan, int event, int addr, int priority)
+{
+ u32 reg;
+ u32 address_shift;
+ if (event < DC_EVEN_UGDE0) {
+ reg = ipu_dc_read(ipu, DC_RL_CH(chan, event));
+ reg &= ~(0xFFFF << (16 * (event & 0x1)));
+ reg |= ((addr << 8) | priority) << (16 * (event & 0x1));
+ ipu_dc_write(ipu, reg, DC_RL_CH(chan, event));
+ } else {
+ reg = ipu_dc_read(ipu, DC_UGDE_0((event - DC_EVEN_UGDE0) / 2));
+ if ((event - DC_EVEN_UGDE0) & 0x1) {
+ reg &= ~(0x2FF << 16);
+ reg |= (addr << 16);
+ reg |= priority ? (2 << 24) : 0x0;
+ } else {
+ reg &= ~0xFC00FFFF;
+ if (priority)
+ chan = (chan >> 1) +
+ ((((chan & 0x1) + ((chan & 0x2) >> 1))) | (chan >> 3));
+ else
+ chan = 0x7;
+ address_shift = ((event - DC_EVEN_UGDE0) >> 1) ? 7 : 8;
+ reg |= (addr << address_shift) | (priority << 3) | chan;
+ }
+ ipu_dc_write(ipu, reg, DC_UGDE_0((event - DC_EVEN_UGDE0) / 2));
+ }
+}
+
+/* Y = R * 1.200 + G * 2.343 + B * .453 + 0.250;
+ U = R * -.672 + G * -1.328 + B * 2.000 + 512.250.;
+ V = R * 2.000 + G * -1.672 + B * -.328 + 512.250.;*/
+static const int rgb2ycbcr_coeff[5][3] = {
+ {0x4D, 0x96, 0x1D},
+ {-0x2B, -0x55, 0x80},
+ {0x80, -0x6B, -0x15},
+ {0x0000, 0x0200, 0x0200}, /* B0, B1, B2 */
+ {0x2, 0x2, 0x2}, /* S0, S1, S2 */
+};
+
+/* R = (1.164 * (Y - 16)) + (1.596 * (Cr - 128));
+ G = (1.164 * (Y - 16)) - (0.392 * (Cb - 128)) - (0.813 * (Cr - 128));
+ B = (1.164 * (Y - 16)) + (2.017 * (Cb - 128); */
+static const int ycbcr2rgb_coeff[5][3] = {
+ {0x095, 0x000, 0x0CC},
+ {0x095, 0x3CE, 0x398},
+ {0x095, 0x0FF, 0x000},
+ {0x3E42, 0x010A, 0x3DD6}, /*B0,B1,B2 */
+ {0x1, 0x1, 0x1}, /*S0,S1,S2 */
+};
+
+#define mask_a(a) ((u32)(a) & 0x3FF)
+#define mask_b(b) ((u32)(b) & 0x3FFF)
+
+/* Pls keep S0, S1 and S2 as 0x2 by using this convertion */
+static int _rgb_to_yuv(int n, int red, int green, int blue)
+{
+ int c;
+ c = red * rgb2ycbcr_coeff[n][0];
+ c += green * rgb2ycbcr_coeff[n][1];
+ c += blue * rgb2ycbcr_coeff[n][2];
+ c /= 16;
+ c += rgb2ycbcr_coeff[3][n] * 4;
+ c += 8;
+ c /= 16;
+ if (c < 0)
+ c = 0;
+ if (c > 255)
+ c = 255;
+ return c;
+}
+
+/*
+ * Row is for BG: RGB2YUV YUV2RGB RGB2RGB YUV2YUV CSC_NONE
+ * Column is for FG: RGB2YUV YUV2RGB RGB2RGB YUV2YUV CSC_NONE
+ */
+static struct dp_csc_param_t dp_csc_array[CSC_NUM][CSC_NUM] = {
+{
+ {DP_COM_CONF_CSC_DEF_BOTH, (void *)&rgb2ycbcr_coeff},
+ {0, 0}, {0, 0},
+ {DP_COM_CONF_CSC_DEF_BG, (void *)&rgb2ycbcr_coeff},
+ {DP_COM_CONF_CSC_DEF_BG, (void *)&rgb2ycbcr_coeff}
+},
+{
+ {0, 0},
+ {DP_COM_CONF_CSC_DEF_BOTH, (void *)&ycbcr2rgb_coeff},
+ {DP_COM_CONF_CSC_DEF_BG, (void *)&ycbcr2rgb_coeff},
+ {0, 0},
+ {DP_COM_CONF_CSC_DEF_BG, (void *)&ycbcr2rgb_coeff}
+},
+{
+ {0, 0},
+ {DP_COM_CONF_CSC_DEF_FG, (void *)&ycbcr2rgb_coeff},
+ {0, 0}, {0, 0}, {0, 0}
+},
+{
+ {DP_COM_CONF_CSC_DEF_FG, (void *)&rgb2ycbcr_coeff},
+ {0, 0}, {0, 0}, {0, 0}, {0, 0}
+},
+{
+ {DP_COM_CONF_CSC_DEF_FG, (void *)&rgb2ycbcr_coeff},
+ {DP_COM_CONF_CSC_DEF_FG, (void *)&ycbcr2rgb_coeff},
+ {0, 0}, {0, 0}, {0, 0}
+}
+};
+
+void __ipu_dp_csc_setup(struct ipu_soc *ipu,
+ int dp, struct dp_csc_param_t dp_csc_param,
+ bool srm_mode_update)
+{
+ u32 reg;
+ const int (*coeff)[5][3];
+
+ if (dp_csc_param.mode >= 0) {
+ reg = ipu_dp_read(ipu, DP_COM_CONF(dp));
+ reg &= ~DP_COM_CONF_CSC_DEF_MASK;
+ reg |= dp_csc_param.mode;
+ ipu_dp_write(ipu, reg, DP_COM_CONF(dp));
+ }
+
+ coeff = dp_csc_param.coeff;
+
+ if (coeff) {
+ ipu_dp_write(ipu, mask_a((*coeff)[0][0]) |
+ (mask_a((*coeff)[0][1]) << 16), DP_CSC_A_0(dp));
+ ipu_dp_write(ipu, mask_a((*coeff)[0][2]) |
+ (mask_a((*coeff)[1][0]) << 16), DP_CSC_A_1(dp));
+ ipu_dp_write(ipu, mask_a((*coeff)[1][1]) |
+ (mask_a((*coeff)[1][2]) << 16), DP_CSC_A_2(dp));
+ ipu_dp_write(ipu, mask_a((*coeff)[2][0]) |
+ (mask_a((*coeff)[2][1]) << 16), DP_CSC_A_3(dp));
+ ipu_dp_write(ipu, mask_a((*coeff)[2][2]) |
+ (mask_b((*coeff)[3][0]) << 16) |
+ ((*coeff)[4][0] << 30), DP_CSC_0(dp));
+ ipu_dp_write(ipu, mask_b((*coeff)[3][1]) | ((*coeff)[4][1] << 14) |
+ (mask_b((*coeff)[3][2]) << 16) |
+ ((*coeff)[4][2] << 30), DP_CSC_1(dp));
+ }
+
+ if (srm_mode_update) {
+ reg = ipu_cm_read(ipu, IPU_SRM_PRI2) | 0x8;
+ ipu_cm_write(ipu, reg, IPU_SRM_PRI2);
+ }
+}
+
+int _ipu_dp_init(struct ipu_soc *ipu,
+ ipu_channel_t channel, uint32_t in_pixel_fmt,
+ uint32_t out_pixel_fmt)
+{
+ int in_fmt, out_fmt;
+ int dp;
+ int partial = false;
+ uint32_t reg;
+
+ if (channel == MEM_FG_SYNC) {
+ dp = DP_SYNC;
+ partial = true;
+ } else if (channel == MEM_BG_SYNC) {
+ dp = DP_SYNC;
+ partial = false;
+ } else if (channel == MEM_BG_ASYNC0) {
+ dp = DP_ASYNC0;
+ partial = false;
+ } else {
+ return -EINVAL;
+ }
+
+ in_fmt = format_to_colorspace(in_pixel_fmt);
+ out_fmt = format_to_colorspace(out_pixel_fmt);
+
+ if (partial) {
+ if (in_fmt == RGB) {
+ if (out_fmt == RGB)
+ ipu->fg_csc_type = RGB2RGB;
+ else
+ ipu->fg_csc_type = RGB2YUV;
+ } else {
+ if (out_fmt == RGB)
+ ipu->fg_csc_type = YUV2RGB;
+ else
+ ipu->fg_csc_type = YUV2YUV;
+ }
+ } else {
+ if (in_fmt == RGB) {
+ if (out_fmt == RGB)
+ ipu->bg_csc_type = RGB2RGB;
+ else
+ ipu->bg_csc_type = RGB2YUV;
+ } else {
+ if (out_fmt == RGB)
+ ipu->bg_csc_type = YUV2RGB;
+ else
+ ipu->bg_csc_type = YUV2YUV;
+ }
+ }
+
+ /* Transform color key from rgb to yuv if CSC is enabled */
+ reg = ipu_dp_read(ipu, DP_COM_CONF(dp));
+ if (ipu->color_key_4rgb && (reg & DP_COM_CONF_GWCKE) &&
+ (((ipu->fg_csc_type == RGB2YUV) && (ipu->bg_csc_type == YUV2YUV)) ||
+ ((ipu->fg_csc_type == YUV2YUV) && (ipu->bg_csc_type == RGB2YUV)) ||
+ ((ipu->fg_csc_type == YUV2YUV) && (ipu->bg_csc_type == YUV2YUV)) ||
+ ((ipu->fg_csc_type == YUV2RGB) && (ipu->bg_csc_type == YUV2RGB)))) {
+ int red, green, blue;
+ int y, u, v;
+ uint32_t color_key = ipu_dp_read(ipu, DP_GRAPH_WIND_CTRL(dp)) & 0xFFFFFFL;
+
+ dev_dbg(ipu->dev, "_ipu_dp_init color key 0x%x need change to yuv fmt!\n", color_key);
+
+ red = (color_key >> 16) & 0xFF;
+ green = (color_key >> 8) & 0xFF;
+ blue = color_key & 0xFF;
+
+ y = _rgb_to_yuv(0, red, green, blue);
+ u = _rgb_to_yuv(1, red, green, blue);
+ v = _rgb_to_yuv(2, red, green, blue);
+ color_key = (y << 16) | (u << 8) | v;
+
+ reg = ipu_dp_read(ipu, DP_GRAPH_WIND_CTRL(dp)) & 0xFF000000L;
+ ipu_dp_write(ipu, reg | color_key, DP_GRAPH_WIND_CTRL(dp));
+ ipu->color_key_4rgb = false;
+
+ dev_dbg(ipu->dev, "_ipu_dp_init color key change to yuv fmt 0x%x!\n", color_key);
+ }
+
+ __ipu_dp_csc_setup(ipu, dp,
+ dp_csc_array[ipu->bg_csc_type][ipu->fg_csc_type],
+ false);
+
+ return 0;
+}
+
+void _ipu_dp_uninit(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ int dp;
+ int partial = false;
+
+ if (channel == MEM_FG_SYNC) {
+ dp = DP_SYNC;
+ partial = true;
+ } else if (channel == MEM_BG_SYNC) {
+ dp = DP_SYNC;
+ partial = false;
+ } else if (channel == MEM_BG_ASYNC0) {
+ dp = DP_ASYNC0;
+ partial = false;
+ } else {
+ return;
+ }
+
+ if (partial)
+ ipu->fg_csc_type = CSC_NONE;
+ else
+ ipu->bg_csc_type = CSC_NONE;
+
+ __ipu_dp_csc_setup(ipu, dp, dp_csc_array[ipu->bg_csc_type][ipu->fg_csc_type], false);
+}
+
+void _ipu_dc_init(struct ipu_soc *ipu, int dc_chan, int di, bool interlaced, uint32_t pixel_fmt)
+{
+ u32 reg = 0;
+
+ if ((dc_chan == 1) || (dc_chan == 5)) {
+ if (interlaced) {
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NL, 0, 3);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_EOL, 0, 2);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_DATA, 0, 1);
+ } else {
+ if (di) {
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NL, 2, 3);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_EOL, 3, 2);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_DATA, 1, 1);
+ if ((pixel_fmt == IPU_PIX_FMT_YUYV) ||
+ (pixel_fmt == IPU_PIX_FMT_UYVY) ||
+ (pixel_fmt == IPU_PIX_FMT_YVYU) ||
+ (pixel_fmt == IPU_PIX_FMT_VYUY)) {
+ _ipu_dc_link_event(ipu, dc_chan, DC_ODD_UGDE1, 9, 5);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVEN_UGDE1, 8, 5);
+ }
+ } else {
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NL, 5, 3);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_EOL, 6, 2);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_DATA, 12, 1);
+ if ((pixel_fmt == IPU_PIX_FMT_YUYV) ||
+ (pixel_fmt == IPU_PIX_FMT_UYVY) ||
+ (pixel_fmt == IPU_PIX_FMT_YVYU) ||
+ (pixel_fmt == IPU_PIX_FMT_VYUY)) {
+ _ipu_dc_link_event(ipu, dc_chan, DC_ODD_UGDE0, 10, 5);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVEN_UGDE0, 11, 5);
+ }
+ }
+ }
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NF, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NFIELD, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_EOF, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_EOFIELD, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_CHAN, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_ADDR, 0, 0);
+
+ reg = 0x2;
+ reg |= DC_DISP_ID_SYNC(di) << DC_WR_CH_CONF_PROG_DISP_ID_OFFSET;
+ reg |= di << 2;
+ if (interlaced)
+ reg |= DC_WR_CH_CONF_FIELD_MODE;
+ } else if ((dc_chan == 8) || (dc_chan == 9)) {
+ /* async channels */
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_DATA_W_0, 0x64, 1);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_DATA_W_1, 0x64, 1);
+
+ reg = 0x3;
+ reg |= DC_DISP_ID_SERIAL << DC_WR_CH_CONF_PROG_DISP_ID_OFFSET;
+ }
+ ipu_dc_write(ipu, reg, DC_WR_CH_CONF(dc_chan));
+
+ ipu_dc_write(ipu, 0x00000000, DC_WR_CH_ADDR(dc_chan));
+
+ ipu_dc_write(ipu, 0x00000084, DC_GEN);
+}
+
+void _ipu_dc_uninit(struct ipu_soc *ipu, int dc_chan)
+{
+ if ((dc_chan == 1) || (dc_chan == 5)) {
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NL, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_EOL, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_DATA, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NF, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NFIELD, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_EOF, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_EOFIELD, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_CHAN, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_ADDR, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_ODD_UGDE0, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVEN_UGDE0, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_ODD_UGDE1, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVEN_UGDE1, 0, 0);
+ } else if ((dc_chan == 8) || (dc_chan == 9)) {
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_ADDR_W_0, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_ADDR_W_1, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_CHAN_W_0, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_CHAN_W_1, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_DATA_W_0, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_DATA_W_1, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_ADDR_R_0, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_ADDR_R_1, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_CHAN_R_0, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_CHAN_R_1, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_DATA_R_0, 0, 0);
+ _ipu_dc_link_event(ipu, dc_chan, DC_EVT_NEW_DATA_R_1, 0, 0);
+ }
+}
+
+int _ipu_disp_chan_is_interlaced(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ if (channel == MEM_DC_SYNC)
+ return !!(ipu_dc_read(ipu, DC_WR_CH_CONF_1) &
+ DC_WR_CH_CONF_FIELD_MODE);
+ else if ((channel == MEM_BG_SYNC) || (channel == MEM_FG_SYNC))
+ return !!(ipu_dc_read(ipu, DC_WR_CH_CONF_5) &
+ DC_WR_CH_CONF_FIELD_MODE);
+ return 0;
+}
+
+void _ipu_dp_dc_enable(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ int di;
+ uint32_t reg;
+ uint32_t dc_chan;
+ int irq = 0;
+
+ if (channel == MEM_FG_SYNC)
+ irq = IPU_IRQ_DP_SF_END;
+ else if (channel == MEM_DC_SYNC)
+ dc_chan = 1;
+ else if (channel == MEM_BG_SYNC)
+ dc_chan = 5;
+ else
+ return;
+
+ if (channel == MEM_FG_SYNC) {
+ /* Enable FG channel */
+ reg = ipu_dp_read(ipu, DP_COM_CONF(DP_SYNC));
+ ipu_dp_write(ipu, reg | DP_COM_CONF_FG_EN, DP_COM_CONF(DP_SYNC));
+
+ reg = ipu_cm_read(ipu, IPU_SRM_PRI2) | 0x8;
+ ipu_cm_write(ipu, reg, IPU_SRM_PRI2);
+ return;
+ } else if (channel == MEM_BG_SYNC) {
+ reg = ipu_cm_read(ipu, IPU_SRM_PRI2) | 0x8;
+ ipu_cm_write(ipu, reg, IPU_SRM_PRI2);
+ }
+
+ di = ipu->dc_di_assignment[dc_chan];
+
+ /* Make sure other DC sync channel is not assigned same DI */
+ reg = ipu_dc_read(ipu, DC_WR_CH_CONF(6 - dc_chan));
+ if ((di << 2) == (reg & DC_WR_CH_CONF_PROG_DI_ID)) {
+ reg &= ~DC_WR_CH_CONF_PROG_DI_ID;
+ reg |= di ? 0 : DC_WR_CH_CONF_PROG_DI_ID;
+ ipu_dc_write(ipu, reg, DC_WR_CH_CONF(6 - dc_chan));
+ }
+
+ reg = ipu_dc_read(ipu, DC_WR_CH_CONF(dc_chan));
+ reg |= 4 << DC_WR_CH_CONF_PROG_TYPE_OFFSET;
+ ipu_dc_write(ipu, reg, DC_WR_CH_CONF(dc_chan));
+
+ clk_prepare_enable(ipu->pixel_clk[di]);
+ ipu->pixel_clk_en[ipu->dc_di_assignment[dc_chan]] = true;
+}
+
+static irqreturn_t dc_irq_handler(int irq, void *dev_id)
+{
+ struct ipu_soc *ipu = dev_id;
+ struct completion *comp = &ipu->dc_comp;
+ uint32_t reg;
+ uint32_t dc_chan;
+
+ if (irq == IPU_IRQ_DC_FC_1)
+ dc_chan = 1;
+ else
+ dc_chan = 5;
+
+ if (!ipu->dc_swap) {
+ reg = ipu_dc_read(ipu, DC_WR_CH_CONF(dc_chan));
+ reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK;
+ ipu_dc_write(ipu, reg, DC_WR_CH_CONF(dc_chan));
+
+ reg = ipu_cm_read(ipu, IPU_DISP_GEN);
+ if (ipu->dc_di_assignment[dc_chan])
+ reg &= ~DI1_COUNTER_RELEASE;
+ else
+ reg &= ~DI0_COUNTER_RELEASE;
+ ipu_cm_write(ipu, reg, IPU_DISP_GEN);
+ }
+
+ complete(comp);
+ return IRQ_HANDLED;
+}
+
+void _ipu_dp_dc_disable(struct ipu_soc *ipu, ipu_channel_t channel, bool swap)
+{
+ int ret;
+ uint32_t reg;
+ uint32_t csc;
+ uint32_t dc_chan;
+ int irq = 0;
+ int timeout = 50;
+
+ ipu->dc_swap = swap;
+
+ if (channel == MEM_DC_SYNC) {
+ dc_chan = 1;
+ irq = IPU_IRQ_DC_FC_1;
+ } else if (channel == MEM_BG_SYNC) {
+ dc_chan = 5;
+ irq = IPU_IRQ_DP_SF_END;
+ } else if (channel == MEM_FG_SYNC) {
+ /* Disable FG channel */
+ dc_chan = 5;
+
+ reg = ipu_dp_read(ipu, DP_COM_CONF(DP_SYNC));
+ csc = reg & DP_COM_CONF_CSC_DEF_MASK;
+ if (csc == DP_COM_CONF_CSC_DEF_FG)
+ reg &= ~DP_COM_CONF_CSC_DEF_MASK;
+
+ reg &= ~DP_COM_CONF_FG_EN;
+ ipu_dp_write(ipu, reg, DP_COM_CONF(DP_SYNC));
+
+ reg = ipu_cm_read(ipu, IPU_SRM_PRI2) | 0x8;
+ ipu_cm_write(ipu, reg, IPU_SRM_PRI2);
+
+ if (ipu_is_channel_busy(ipu, MEM_BG_SYNC)) {
+ ipu_cm_write(ipu, IPUIRQ_2_MASK(IPU_IRQ_DP_SF_END),
+ IPUIRQ_2_STATREG(ipu->devtype,
+ IPU_IRQ_DP_SF_END));
+ while ((ipu_cm_read(ipu,
+ IPUIRQ_2_STATREG(ipu->devtype,
+ IPU_IRQ_DP_SF_END)) &
+ IPUIRQ_2_MASK(IPU_IRQ_DP_SF_END)) == 0) {
+ msleep(2);
+ timeout -= 2;
+ if (timeout <= 0)
+ break;
+ }
+ }
+ return;
+ } else {
+ return;
+ }
+
+ init_completion(&ipu->dc_comp);
+ ret = ipu_request_irq(ipu, irq, dc_irq_handler, 0, NULL, ipu);
+ if (ret < 0) {
+ dev_err(ipu->dev, "DC irq %d in use\n", irq);
+ return;
+ }
+ ret = wait_for_completion_timeout(&ipu->dc_comp, msecs_to_jiffies(50));
+ ipu_free_irq(ipu, irq, ipu);
+ dev_dbg(ipu->dev, "DC stop timeout - %d * 10ms\n", 5 - ret);
+
+ if (ipu->dc_swap) {
+ /* Swap DC channel 1 and 5 settings, and disable old dc chan */
+ reg = ipu_dc_read(ipu, DC_WR_CH_CONF(dc_chan));
+ ipu_dc_write(ipu, reg, DC_WR_CH_CONF(6 - dc_chan));
+ reg &= ~DC_WR_CH_CONF_PROG_TYPE_MASK;
+ reg ^= DC_WR_CH_CONF_PROG_DI_ID;
+ ipu_dc_write(ipu, reg, DC_WR_CH_CONF(dc_chan));
+ }
+}
+
+void _ipu_init_dc_mappings(struct ipu_soc *ipu)
+{
+ /* IPU_PIX_FMT_RGB24 */
+ _ipu_dc_map_clear(ipu, 0);
+ _ipu_dc_map_config(ipu, 0, 0, 7, 0xFF);
+ _ipu_dc_map_config(ipu, 0, 1, 15, 0xFF);
+ _ipu_dc_map_config(ipu, 0, 2, 23, 0xFF);
+
+ /* IPU_PIX_FMT_RGB666 */
+ _ipu_dc_map_clear(ipu, 1);
+ _ipu_dc_map_config(ipu, 1, 0, 5, 0xFC);
+ _ipu_dc_map_config(ipu, 1, 1, 11, 0xFC);
+ _ipu_dc_map_config(ipu, 1, 2, 17, 0xFC);
+
+ /* IPU_PIX_FMT_YUV444 */
+ _ipu_dc_map_clear(ipu, 2);
+ _ipu_dc_map_config(ipu, 2, 0, 15, 0xFF);
+ _ipu_dc_map_config(ipu, 2, 1, 23, 0xFF);
+ _ipu_dc_map_config(ipu, 2, 2, 7, 0xFF);
+
+ /* IPU_PIX_FMT_RGB565 */
+ _ipu_dc_map_clear(ipu, 3);
+ _ipu_dc_map_config(ipu, 3, 0, 4, 0xF8);
+ _ipu_dc_map_config(ipu, 3, 1, 10, 0xFC);
+ _ipu_dc_map_config(ipu, 3, 2, 15, 0xF8);
+
+ /* IPU_PIX_FMT_LVDS666 */
+ _ipu_dc_map_clear(ipu, 4);
+ _ipu_dc_map_config(ipu, 4, 0, 5, 0xFC);
+ _ipu_dc_map_config(ipu, 4, 1, 13, 0xFC);
+ _ipu_dc_map_config(ipu, 4, 2, 21, 0xFC);
+
+ /* IPU_PIX_FMT_VYUY 16bit width */
+ _ipu_dc_map_clear(ipu, 5);
+ _ipu_dc_map_config(ipu, 5, 0, 7, 0xFF);
+ _ipu_dc_map_config(ipu, 5, 1, 0, 0x0);
+ _ipu_dc_map_config(ipu, 5, 2, 15, 0xFF);
+ _ipu_dc_map_clear(ipu, 6);
+ _ipu_dc_map_config(ipu, 6, 0, 0, 0x0);
+ _ipu_dc_map_config(ipu, 6, 1, 7, 0xFF);
+ _ipu_dc_map_config(ipu, 6, 2, 15, 0xFF);
+
+ /* IPU_PIX_FMT_UYUV 16bit width */
+ _ipu_dc_map_clear(ipu, 7);
+ _ipu_dc_map_link(ipu, 7, 6, 0, 6, 1, 6, 2);
+ _ipu_dc_map_clear(ipu, 8);
+ _ipu_dc_map_link(ipu, 8, 5, 0, 5, 1, 5, 2);
+
+ /* IPU_PIX_FMT_YUYV 16bit width */
+ _ipu_dc_map_clear(ipu, 9);
+ _ipu_dc_map_link(ipu, 9, 5, 2, 5, 1, 5, 0);
+ _ipu_dc_map_clear(ipu, 10);
+ _ipu_dc_map_link(ipu, 10, 5, 1, 5, 2, 5, 0);
+
+ /* IPU_PIX_FMT_YVYU 16bit width */
+ _ipu_dc_map_clear(ipu, 11);
+ _ipu_dc_map_link(ipu, 11, 5, 1, 5, 2, 5, 0);
+ _ipu_dc_map_clear(ipu, 12);
+ _ipu_dc_map_link(ipu, 12, 5, 2, 5, 1, 5, 0);
+
+ /* IPU_PIX_FMT_GBR24 */
+ /* IPU_PIX_FMT_VYU444 */
+ _ipu_dc_map_clear(ipu, 13);
+ _ipu_dc_map_link(ipu, 13, 0, 2, 0, 0, 0, 1);
+
+ /* IPU_PIX_FMT_BGR24 */
+ _ipu_dc_map_clear(ipu, 14);
+ _ipu_dc_map_link(ipu, 14, 0, 2, 0, 1, 0, 0);
+}
+
+int _ipu_pixfmt_to_map(uint32_t fmt)
+{
+ switch (fmt) {
+ case IPU_PIX_FMT_GENERIC:
+ case IPU_PIX_FMT_RGB24:
+ return 0;
+ case IPU_PIX_FMT_RGB666:
+ return 1;
+ case IPU_PIX_FMT_YUV444:
+ return 2;
+ case IPU_PIX_FMT_RGB565:
+ return 3;
+ case IPU_PIX_FMT_LVDS666:
+ return 4;
+ case IPU_PIX_FMT_VYUY:
+ return 6;
+ case IPU_PIX_FMT_UYVY:
+ return 8;
+ case IPU_PIX_FMT_YUYV:
+ return 10;
+ case IPU_PIX_FMT_YVYU:
+ return 12;
+ case IPU_PIX_FMT_GBR24:
+ case IPU_PIX_FMT_VYU444:
+ return 13;
+ case IPU_PIX_FMT_BGR24:
+ return 14;
+ }
+
+ return -1;
+}
+
+/*!
+ * This function sets the colorspace for of dp.
+ * modes.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param param If it's not NULL, update the csc table
+ * with this parameter.
+ *
+ * @return N/A
+ */
+void _ipu_dp_set_csc_coefficients(struct ipu_soc *ipu, ipu_channel_t channel, int32_t param[][3])
+{
+ int dp;
+ struct dp_csc_param_t dp_csc_param;
+
+ if (channel == MEM_FG_SYNC)
+ dp = DP_SYNC;
+ else if (channel == MEM_BG_SYNC)
+ dp = DP_SYNC;
+ else if (channel == MEM_BG_ASYNC0)
+ dp = DP_ASYNC0;
+ else
+ return;
+
+ dp_csc_param.mode = -1;
+ dp_csc_param.coeff = param;
+ __ipu_dp_csc_setup(ipu, dp, dp_csc_param, true);
+}
+
+void ipu_set_csc_coefficients(struct ipu_soc *ipu, ipu_channel_t channel, int32_t param[][3])
+{
+ _ipu_dp_set_csc_coefficients(ipu, channel, param);
+}
+EXPORT_SYMBOL(ipu_set_csc_coefficients);
+
+/*!
+ * This function is called to adapt synchronous LCD panel to IPU restriction.
+ *
+ */
+void adapt_panel_to_ipu_restricitions(struct ipu_soc *ipu, uint16_t *v_start_width,
+ uint16_t *v_sync_width,
+ uint16_t *v_end_width)
+{
+ if (*v_end_width < 2) {
+ uint16_t diff = 2 - *v_end_width;
+ if (*v_start_width >= diff) {
+ *v_end_width = 2;
+ *v_start_width = *v_start_width - diff;
+ } else if (*v_sync_width > diff) {
+ *v_end_width = 2;
+ *v_sync_width = *v_sync_width - diff;
+ } else
+ dev_err(ipu->dev, "WARNING: try to adapt timming, but failed\n");
+ dev_err(ipu->dev, "WARNING: adapt panel end blank lines\n");
+ }
+}
+
+/*!
+ * This function is called to initialize a synchronous LCD panel.
+ *
+ * @param ipu ipu handler
+ * @param disp The DI the panel is attached to.
+ *
+ * @param pixel_clk Desired pixel clock frequency in Hz.
+ *
+ * @param pixel_fmt Input parameter for pixel format of buffer.
+ * Pixel format is a FOURCC ASCII code.
+ *
+ * @param width The width of panel in pixels.
+ *
+ * @param height The height of panel in pixels.
+ *
+ * @param hStartWidth The number of pixel clocks between the HSYNC
+ * signal pulse and the start of valid data.
+ *
+ * @param hSyncWidth The width of the HSYNC signal in units of pixel
+ * clocks.
+ *
+ * @param hEndWidth The number of pixel clocks between the end of
+ * valid data and the HSYNC signal for next line.
+ *
+ * @param vStartWidth The number of lines between the VSYNC
+ * signal pulse and the start of valid data.
+ *
+ * @param vSyncWidth The width of the VSYNC signal in units of lines
+ *
+ * @param vEndWidth The number of lines between the end of valid
+ * data and the VSYNC signal for next frame.
+ *
+ * @param sig Bitfield of signal polarities for LCD interface.
+ *
+ * @return This function returns 0 on success or negative error code on
+ * fail.
+ */
+int32_t ipu_init_sync_panel(struct ipu_soc *ipu, int disp, uint32_t pixel_clk,
+ uint16_t width, uint16_t height,
+ uint32_t pixel_fmt,
+ uint16_t h_start_width, uint16_t h_sync_width,
+ uint16_t h_end_width, uint16_t v_start_width,
+ uint16_t v_sync_width, uint16_t v_end_width,
+ uint32_t v_to_h_sync, ipu_di_signal_cfg_t sig)
+{
+ uint32_t field0_offset = 0;
+ uint32_t field1_offset;
+ uint32_t reg;
+ uint32_t di_gen, vsync_cnt;
+ uint32_t div, rounded_pixel_clk;
+ uint32_t h_total, v_total;
+ int map;
+ int ret;
+ struct clk *ldb_di0_clk, *ldb_di1_clk;
+ struct clk *di_parent;
+
+ dev_dbg(ipu->dev, "panel size = %d x %d\n", width, height);
+
+ if ((v_sync_width == 0) || (h_sync_width == 0))
+ return -EINVAL;
+
+ adapt_panel_to_ipu_restricitions(ipu, &v_start_width, &v_sync_width, &v_end_width);
+ h_total = width + h_sync_width + h_start_width + h_end_width;
+ v_total = height + v_sync_width + v_start_width + v_end_width;
+
+ /* Init clocking */
+ dev_dbg(ipu->dev, "pixel clk = %d\n", pixel_clk);
+
+ di_parent = clk_get_parent(ipu->di_clk_sel[disp]);
+ if (!di_parent) {
+ dev_err(ipu->dev, "get di clk parent fail\n");
+ return -EINVAL;
+ }
+ ldb_di0_clk = clk_get(ipu->dev, "ldb_di0");
+ if (IS_ERR(ldb_di0_clk)) {
+ dev_err(ipu->dev, "clk_get di0 failed");
+ return PTR_ERR(ldb_di0_clk);
+ }
+ ldb_di1_clk = clk_get(ipu->dev, "ldb_di1");
+ if (IS_ERR(ldb_di1_clk)) {
+ dev_err(ipu->dev, "clk_get di1 failed");
+ return PTR_ERR(ldb_di1_clk);
+ }
+ if (!strcmp(__clk_get_name(di_parent), __clk_get_name(ldb_di0_clk)) ||
+ !strcmp(__clk_get_name(di_parent), __clk_get_name(ldb_di1_clk))) {
+ /* if di clk parent is tve/ldb, then keep it;*/
+ dev_dbg(ipu->dev, "use special clk parent\n");
+ ret = clk_set_parent(ipu->pixel_clk_sel[disp], ipu->di_clk[disp]);
+ if (ret) {
+ dev_err(ipu->dev, "set pixel clk error:%d\n", ret);
+ return ret;
+ }
+ clk_put(ldb_di0_clk);
+ clk_put(ldb_di1_clk);
+ } else {
+ /* try ipu clk first*/
+ dev_dbg(ipu->dev, "try ipu internal clk\n");
+ ret = clk_set_parent(ipu->pixel_clk_sel[disp], ipu->ipu_clk);
+ if (ret) {
+ dev_err(ipu->dev, "set pixel clk error:%d\n", ret);
+ return ret;
+ }
+ rounded_pixel_clk = clk_round_rate(ipu->pixel_clk[disp], pixel_clk);
+ dev_dbg(ipu->dev, "rounded pix clk:%d\n", rounded_pixel_clk);
+ /*
+ * we will only use 1/2 fraction for ipu clk,
+ * so if the clk rate is not fit, try ext clk.
+ */
+ if (!sig.int_clk &&
+ ((rounded_pixel_clk >= pixel_clk + pixel_clk/200) ||
+ (rounded_pixel_clk <= pixel_clk - pixel_clk/200))) {
+ dev_dbg(ipu->dev, "try ipu ext di clk\n");
+
+ rounded_pixel_clk =
+ clk_round_rate(ipu->di_clk[disp], pixel_clk);
+ ret = clk_set_rate(ipu->di_clk[disp],
+ rounded_pixel_clk);
+ if (ret) {
+ dev_err(ipu->dev,
+ "set di clk rate error:%d\n", ret);
+ return ret;
+ }
+ dev_dbg(ipu->dev, "di clk:%d\n", rounded_pixel_clk);
+ ret = clk_set_parent(ipu->pixel_clk_sel[disp],
+ ipu->di_clk[disp]);
+ if (ret) {
+ dev_err(ipu->dev,
+ "set pixel clk parent error:%d\n", ret);
+ return ret;
+ }
+ }
+ }
+ rounded_pixel_clk = clk_round_rate(ipu->pixel_clk[disp], pixel_clk);
+ if (rounded_pixel_clk == 0) {
+ dev_err(ipu->dev, "rounded pixel clock should not be zero\n");
+ return -EINVAL;
+ }
+ dev_dbg(ipu->dev, "round pixel clk:%d\n", rounded_pixel_clk);
+ ret = clk_set_rate(ipu->pixel_clk[disp], rounded_pixel_clk);
+ if (ret) {
+ dev_err(ipu->dev, "set pixel clk rate error:%d\n", ret);
+ return ret;
+ }
+ msleep(5);
+ /* Get integer portion of divider */
+ div = clk_get_rate(clk_get_parent(ipu->pixel_clk_sel[disp])) / rounded_pixel_clk;
+ dev_dbg(ipu->dev, "div:%d\n", div);
+ if (!div) {
+ dev_err(ipu->dev, "invalid pixel clk div = 0\n");
+ return -EINVAL;
+ }
+
+
+ mutex_lock(&ipu->mutex_lock);
+
+ _ipu_di_data_wave_config(ipu, disp, SYNC_WAVE, div - 1, div - 1);
+ _ipu_di_data_pin_config(ipu, disp, SYNC_WAVE, DI_PIN15, 3, 0, div * 2);
+
+ map = _ipu_pixfmt_to_map(pixel_fmt);
+ if (map < 0) {
+ dev_dbg(ipu->dev, "IPU_DISP: No MAP\n");
+ mutex_unlock(&ipu->mutex_lock);
+ return -EINVAL;
+ }
+
+ /*clear DI*/
+ di_gen = ipu_di_read(ipu, disp, DI_GENERAL);
+ di_gen &= (0x3 << 20);
+ ipu_di_write(ipu, disp, di_gen, DI_GENERAL);
+
+ if (sig.interlaced) {
+ if (ipu->devtype >= IPUv3EX) {
+ /* Setup internal HSYNC waveform */
+ _ipu_di_sync_config(ipu,
+ disp, /* display */
+ 1, /* counter */
+ h_total/2 - 1, /* run count */
+ DI_SYNC_CLK, /* run_resolution */
+ 0, /* offset */
+ DI_SYNC_NONE, /* offset resolution */
+ 0, /* repeat count */
+ DI_SYNC_NONE, /* CNT_CLR_SEL */
+ 0, /* CNT_POLARITY_GEN_EN */
+ DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */
+ DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */
+ 0, /* COUNT UP */
+ 0 /* COUNT DOWN */
+ );
+
+ /* Field 1 VSYNC waveform */
+ _ipu_di_sync_config(ipu,
+ disp, /* display */
+ 2, /* counter */
+ h_total - 1, /* run count */
+ DI_SYNC_CLK, /* run_resolution */
+ 0, /* offset */
+ DI_SYNC_NONE, /* offset resolution */
+ 0, /* repeat count */
+ DI_SYNC_NONE, /* CNT_CLR_SEL */
+ 0, /* CNT_POLARITY_GEN_EN */
+ DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */
+ DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */
+ 0, /* COUNT UP */
+ 2*div /* COUNT DOWN */
+ );
+
+ /* Setup internal HSYNC waveform */
+ _ipu_di_sync_config(ipu,
+ disp, /* display */
+ 3, /* counter */
+ v_total*2 - 1, /* run count */
+ DI_SYNC_INT_HSYNC, /* run_resolution */
+ 1, /* offset */
+ DI_SYNC_INT_HSYNC, /* offset resolution */
+ 0, /* repeat count */
+ DI_SYNC_NONE, /* CNT_CLR_SEL */
+ 0, /* CNT_POLARITY_GEN_EN */
+ DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */
+ DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */
+ 0, /* COUNT UP */
+ 2*div /* COUNT DOWN */
+ );
+
+ /* Active Field ? */
+ _ipu_di_sync_config(ipu,
+ disp, /* display */
+ 4, /* counter */
+ v_total/2 - 1, /* run count */
+ DI_SYNC_HSYNC, /* run_resolution */
+ v_start_width, /* offset */
+ DI_SYNC_HSYNC, /* offset resolution */
+ 2, /* repeat count */
+ DI_SYNC_VSYNC, /* CNT_CLR_SEL */
+ 0, /* CNT_POLARITY_GEN_EN */
+ DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */
+ DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */
+ 0, /* COUNT UP */
+ 0 /* COUNT DOWN */
+ );
+
+ /* Active Line */
+ _ipu_di_sync_config(ipu,
+ disp, /* display */
+ 5, /* counter */
+ 0, /* run count */
+ DI_SYNC_HSYNC, /* run_resolution */
+ 0, /* offset */
+ DI_SYNC_NONE, /* offset resolution */
+ height/2, /* repeat count */
+ 4, /* CNT_CLR_SEL */
+ 0, /* CNT_POLARITY_GEN_EN */
+ DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */
+ DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */
+ 0, /* COUNT UP */
+ 0 /* COUNT DOWN */
+ );
+
+ /* Field 0 VSYNC waveform */
+ _ipu_di_sync_config(ipu,
+ disp, /* display */
+ 6, /* counter */
+ v_total - 1, /* run count */
+ DI_SYNC_HSYNC, /* run_resolution */
+ 0, /* offset */
+ DI_SYNC_NONE, /* offset resolution */
+ 0, /* repeat count */
+ DI_SYNC_NONE, /* CNT_CLR_SEL */
+ 0, /* CNT_POLARITY_GEN_EN */
+ DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */
+ DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */
+ 0, /* COUNT UP */
+ 0 /* COUNT DOWN */
+ );
+
+ /* DC VSYNC waveform */
+ vsync_cnt = 7;
+ _ipu_di_sync_config(ipu,
+ disp, /* display */
+ 7, /* counter */
+ v_total/2 - 1, /* run count */
+ DI_SYNC_HSYNC, /* run_resolution */
+ 9, /* offset */
+ DI_SYNC_HSYNC, /* offset resolution */
+ 2, /* repeat count */
+ DI_SYNC_VSYNC, /* CNT_CLR_SEL */
+ 0, /* CNT_POLARITY_GEN_EN */
+ DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */
+ DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */
+ 0, /* COUNT UP */
+ 0 /* COUNT DOWN */
+ );
+
+ /* active pixel waveform */
+ _ipu_di_sync_config(ipu,
+ disp, /* display */
+ 8, /* counter */
+ 0, /* run count */
+ DI_SYNC_CLK, /* run_resolution */
+ h_start_width, /* offset */
+ DI_SYNC_CLK, /* offset resolution */
+ width, /* repeat count */
+ 5, /* CNT_CLR_SEL */
+ 0, /* CNT_POLARITY_GEN_EN */
+ DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */
+ DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */
+ 0, /* COUNT UP */
+ 0 /* COUNT DOWN */
+ );
+
+ /* Second VSYNC */
+ _ipu_di_sync_config(ipu,
+ disp, /* display */
+ 9, /* counter */
+ v_total - 1, /* run count */
+ DI_SYNC_INT_HSYNC, /* run_resolution */
+ v_total/2, /* offset */
+ DI_SYNC_INT_HSYNC, /* offset resolution */
+ 0, /* repeat count */
+ DI_SYNC_HSYNC, /* CNT_CLR_SEL */
+ 0, /* CNT_POLARITY_GEN_EN */
+ DI_SYNC_NONE, /* CNT_POLARITY_CLR_SEL */
+ DI_SYNC_NONE, /* CNT_POLARITY_TRIGGER_SEL */
+ 0, /* COUNT UP */
+ 2*div /* COUNT DOWN */
+ );
+
+ /* set gentime select and tag sel */
+ reg = ipu_di_read(ipu, disp, DI_SW_GEN1(9));
+ reg &= 0x1FFFFFFF;
+ reg |= (3-1)<<29 | 0x00008000;
+ ipu_di_write(ipu, disp, reg, DI_SW_GEN1(9));
+
+ ipu_di_write(ipu, disp, v_total / 2 - 1, DI_SCR_CONF);
+
+ /* set y_sel = 1 */
+ di_gen |= 0x10000000;
+ di_gen |= DI_GEN_POLARITY_5;
+ di_gen |= DI_GEN_POLARITY_8;
+ } else {
+ /* Setup internal HSYNC waveform */
+ _ipu_di_sync_config(ipu, disp, 1, h_total - 1, DI_SYNC_CLK,
+ 0, DI_SYNC_NONE, 0, DI_SYNC_NONE, 0, DI_SYNC_NONE,
+ DI_SYNC_NONE, 0, 0);
+
+ field1_offset = v_sync_width + v_start_width + height / 2 +
+ v_end_width;
+ if (sig.odd_field_first) {
+ field0_offset = field1_offset - 1;
+ field1_offset = 0;
+ }
+ v_total += v_start_width + v_end_width;
+
+ /* Field 1 VSYNC waveform */
+ _ipu_di_sync_config(ipu, disp, 2, v_total - 1, 1,
+ field0_offset,
+ field0_offset ? 1 : DI_SYNC_NONE,
+ 0, DI_SYNC_NONE, 0,
+ DI_SYNC_NONE, DI_SYNC_NONE, 0, 4);
+
+ /* Setup internal HSYNC waveform */
+ _ipu_di_sync_config(ipu, disp, 3, h_total - 1, DI_SYNC_CLK,
+ 0, DI_SYNC_NONE, 0, DI_SYNC_NONE, 0,
+ DI_SYNC_NONE, DI_SYNC_NONE, 0, 4);
+
+ /* Active Field ? */
+ _ipu_di_sync_config(ipu, disp, 4,
+ field0_offset ?
+ field0_offset : field1_offset - 2,
+ 1, v_start_width + v_sync_width, 1, 2, 2,
+ 0, DI_SYNC_NONE, DI_SYNC_NONE, 0, 0);
+
+ /* Active Line */
+ _ipu_di_sync_config(ipu, disp, 5, 0, 1,
+ 0, DI_SYNC_NONE,
+ height / 2, 4, 0, DI_SYNC_NONE,
+ DI_SYNC_NONE, 0, 0);
+
+ /* Field 0 VSYNC waveform */
+ _ipu_di_sync_config(ipu, disp, 6, v_total - 1, 1,
+ 0, DI_SYNC_NONE,
+ 0, DI_SYNC_NONE, 0, DI_SYNC_NONE,
+ DI_SYNC_NONE, 0, 0);
+
+ /* DC VSYNC waveform */
+ vsync_cnt = 7;
+ _ipu_di_sync_config(ipu, disp, 7, 0, 1,
+ field1_offset,
+ field1_offset ? 1 : DI_SYNC_NONE,
+ 1, 2, 0, DI_SYNC_NONE, DI_SYNC_NONE, 0, 0);
+
+ /* active pixel waveform */
+ _ipu_di_sync_config(ipu, disp, 8, 0, DI_SYNC_CLK,
+ h_sync_width + h_start_width, DI_SYNC_CLK,
+ width, 5, 0, DI_SYNC_NONE, DI_SYNC_NONE,
+ 0, 0);
+
+ /* ??? */
+ _ipu_di_sync_config(ipu, disp, 9, v_total - 1, 2,
+ 0, DI_SYNC_NONE,
+ 0, DI_SYNC_NONE, 6, DI_SYNC_NONE,
+ DI_SYNC_NONE, 0, 0);
+
+ reg = ipu_di_read(ipu, disp, DI_SW_GEN1(9));
+ reg |= 0x8000;
+ ipu_di_write(ipu, disp, reg, DI_SW_GEN1(9));
+
+ ipu_di_write(ipu, disp, v_sync_width + v_start_width +
+ v_end_width + height / 2 - 1, DI_SCR_CONF);
+ }
+
+ /* Init template microcode */
+ _ipu_dc_write_tmpl(ipu, 0, WROD(0), 0, map, SYNC_WAVE, 0, 8, 1);
+
+ if (sig.Hsync_pol)
+ di_gen |= DI_GEN_POLARITY_3;
+ if (sig.Vsync_pol)
+ di_gen |= DI_GEN_POLARITY_2;
+ } else {
+ /* Setup internal HSYNC waveform */
+ _ipu_di_sync_config(ipu, disp, 1, h_total - 1, DI_SYNC_CLK,
+ 0, DI_SYNC_NONE, 0, DI_SYNC_NONE, 0, DI_SYNC_NONE,
+ DI_SYNC_NONE, 0, 0);
+
+ /* Setup external (delayed) HSYNC waveform */
+ _ipu_di_sync_config(ipu, disp, DI_SYNC_HSYNC, h_total - 1,
+ DI_SYNC_CLK, div * v_to_h_sync, DI_SYNC_CLK,
+ 0, DI_SYNC_NONE, 1, DI_SYNC_NONE,
+ DI_SYNC_CLK, 0, h_sync_width * 2);
+ /* Setup VSYNC waveform */
+ vsync_cnt = DI_SYNC_VSYNC;
+ _ipu_di_sync_config(ipu, disp, DI_SYNC_VSYNC, v_total - 1,
+ DI_SYNC_INT_HSYNC, 0, DI_SYNC_NONE, 0,
+ DI_SYNC_NONE, 1, DI_SYNC_NONE,
+ DI_SYNC_INT_HSYNC, 0, v_sync_width * 2);
+ ipu_di_write(ipu, disp, v_total - 1, DI_SCR_CONF);
+
+ /* Setup active data waveform to sync with DC */
+ _ipu_di_sync_config(ipu, disp, 4, 0, DI_SYNC_HSYNC,
+ v_sync_width + v_start_width, DI_SYNC_HSYNC, height,
+ DI_SYNC_VSYNC, 0, DI_SYNC_NONE,
+ DI_SYNC_NONE, 0, 0);
+ _ipu_di_sync_config(ipu, disp, 5, 0, DI_SYNC_CLK,
+ h_sync_width + h_start_width, DI_SYNC_CLK,
+ width, 4, 0, DI_SYNC_NONE, DI_SYNC_NONE, 0,
+ 0);
+
+ /* set VGA delayed hsync/vsync no matter VGA enabled */
+ if (disp) {
+ /* couter 7 for VGA delay HSYNC */
+ _ipu_di_sync_config(ipu, disp, 7,
+ h_total - 1, DI_SYNC_CLK,
+ 18, DI_SYNC_CLK,
+ 0, DI_SYNC_NONE,
+ 1, DI_SYNC_NONE, DI_SYNC_CLK,
+ 0, h_sync_width * 2);
+
+ /* couter 8 for VGA delay VSYNC */
+ _ipu_di_sync_config(ipu, disp, 8,
+ v_total - 1, DI_SYNC_INT_HSYNC,
+ 1, DI_SYNC_INT_HSYNC,
+ 0, DI_SYNC_NONE,
+ 1, DI_SYNC_NONE, DI_SYNC_INT_HSYNC,
+ 0, v_sync_width * 2);
+ }
+
+ /* reset all unused counters */
+ ipu_di_write(ipu, disp, 0, DI_SW_GEN0(6));
+ ipu_di_write(ipu, disp, 0, DI_SW_GEN1(6));
+ if (!disp) {
+ ipu_di_write(ipu, disp, 0, DI_SW_GEN0(7));
+ ipu_di_write(ipu, disp, 0, DI_SW_GEN1(7));
+ ipu_di_write(ipu, disp, 0, DI_STP_REP(7));
+ ipu_di_write(ipu, disp, 0, DI_SW_GEN0(8));
+ ipu_di_write(ipu, disp, 0, DI_SW_GEN1(8));
+ ipu_di_write(ipu, disp, 0, DI_STP_REP(8));
+ }
+ ipu_di_write(ipu, disp, 0, DI_SW_GEN0(9));
+ ipu_di_write(ipu, disp, 0, DI_SW_GEN1(9));
+ ipu_di_write(ipu, disp, 0, DI_STP_REP(9));
+
+ reg = ipu_di_read(ipu, disp, DI_STP_REP(6));
+ reg &= 0x0000FFFF;
+ ipu_di_write(ipu, disp, reg, DI_STP_REP(6));
+
+ /* Init template microcode */
+ if (disp) {
+ if ((pixel_fmt == IPU_PIX_FMT_YUYV) ||
+ (pixel_fmt == IPU_PIX_FMT_UYVY) ||
+ (pixel_fmt == IPU_PIX_FMT_YVYU) ||
+ (pixel_fmt == IPU_PIX_FMT_VYUY)) {
+ _ipu_dc_write_tmpl(ipu, 8, WROD(0), 0, (map - 1), SYNC_WAVE, 0, 5, 1);
+ _ipu_dc_write_tmpl(ipu, 9, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1);
+ /* configure user events according to DISP NUM */
+ ipu_dc_write(ipu, (width - 1), DC_UGDE_3(disp));
+ }
+ _ipu_dc_write_tmpl(ipu, 2, WROD(0), 0, map, SYNC_WAVE, 8, 5, 1);
+ _ipu_dc_write_tmpl(ipu, 3, WROD(0), 0, map, SYNC_WAVE, 4, 5, 0);
+ _ipu_dc_write_tmpl(ipu, 4, WRG, 0, map, NULL_WAVE, 0, 0, 1);
+ _ipu_dc_write_tmpl(ipu, 1, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1);
+
+ } else {
+ if ((pixel_fmt == IPU_PIX_FMT_YUYV) ||
+ (pixel_fmt == IPU_PIX_FMT_UYVY) ||
+ (pixel_fmt == IPU_PIX_FMT_YVYU) ||
+ (pixel_fmt == IPU_PIX_FMT_VYUY)) {
+ _ipu_dc_write_tmpl(ipu, 10, WROD(0), 0, (map - 1), SYNC_WAVE, 0, 5, 1);
+ _ipu_dc_write_tmpl(ipu, 11, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1);
+ /* configure user events according to DISP NUM */
+ ipu_dc_write(ipu, width - 1, DC_UGDE_3(disp));
+ }
+ _ipu_dc_write_tmpl(ipu, 5, WROD(0), 0, map, SYNC_WAVE, 8, 5, 1);
+ _ipu_dc_write_tmpl(ipu, 6, WROD(0), 0, map, SYNC_WAVE, 4, 5, 0);
+ _ipu_dc_write_tmpl(ipu, 7, WRG, 0, map, NULL_WAVE, 0, 0, 1);
+ _ipu_dc_write_tmpl(ipu, 12, WROD(0), 0, map, SYNC_WAVE, 0, 5, 1);
+ }
+
+ if (sig.Hsync_pol) {
+ di_gen |= DI_GEN_POLARITY_2;
+ if (disp)
+ di_gen |= DI_GEN_POLARITY_7;
+ }
+ if (sig.Vsync_pol) {
+ di_gen |= DI_GEN_POLARITY_3;
+ if (disp)
+ di_gen |= DI_GEN_POLARITY_8;
+ }
+ }
+ /* changinc DISP_CLK polarity: it can be wrong for some applications */
+ if ((pixel_fmt == IPU_PIX_FMT_YUYV) ||
+ (pixel_fmt == IPU_PIX_FMT_UYVY) ||
+ (pixel_fmt == IPU_PIX_FMT_YVYU) ||
+ (pixel_fmt == IPU_PIX_FMT_VYUY))
+ di_gen |= 0x00020000;
+
+ if (!sig.clk_pol)
+ di_gen |= DI_GEN_POLARITY_DISP_CLK;
+ else
+ di_gen &= ~DI_GEN_POLARITY_DISP_CLK;
+
+ ipu_di_write(ipu, disp, di_gen, DI_GENERAL);
+
+ ipu_di_write(ipu, disp, (--vsync_cnt << DI_VSYNC_SEL_OFFSET) |
+ 0x00000002, DI_SYNC_AS_GEN);
+ reg = ipu_di_read(ipu, disp, DI_POL);
+ reg &= ~(DI_POL_DRDY_DATA_POLARITY | DI_POL_DRDY_POLARITY_15);
+ if (sig.enable_pol)
+ reg |= DI_POL_DRDY_POLARITY_15;
+ if (sig.data_pol)
+ reg |= DI_POL_DRDY_DATA_POLARITY;
+ ipu_di_write(ipu, disp, reg, DI_POL);
+
+ ipu_dc_write(ipu, width, DC_DISP_CONF2(DC_DISP_ID_SYNC(disp)));
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_init_sync_panel);
+
+void ipu_uninit_sync_panel(struct ipu_soc *ipu, int disp)
+{
+ uint32_t reg;
+ uint32_t di_gen;
+
+ if (disp != 0 && disp != 1)
+ return;
+
+ mutex_lock(&ipu->mutex_lock);
+
+ di_gen = ipu_di_read(ipu, disp, DI_GENERAL);
+ di_gen |= 0x3ff | DI_GEN_POLARITY_DISP_CLK;
+ ipu_di_write(ipu, disp, di_gen, DI_GENERAL);
+
+ reg = ipu_di_read(ipu, disp, DI_POL);
+ reg |= 0x3ffffff;
+ ipu_di_write(ipu, disp, reg, DI_POL);
+
+ mutex_unlock(&ipu->mutex_lock);
+}
+EXPORT_SYMBOL(ipu_uninit_sync_panel);
+
+int ipu_init_async_panel(struct ipu_soc *ipu, int disp, int type, uint32_t cycle_time,
+ uint32_t pixel_fmt, ipu_adc_sig_cfg_t sig)
+{
+ int map;
+ u32 ser_conf = 0;
+ u32 div;
+ u32 di_clk = clk_get_rate(ipu->ipu_clk);
+
+ if (di_clk == 0) {
+ dev_err(ipu->dev, "di clock rate should not be zero\n");
+ return -EINVAL;
+ }
+
+ /* round up cycle_time, then calcalate the divider using scaled math */
+ cycle_time += (1000000000UL / di_clk) - 1;
+ div = (cycle_time * (di_clk / 256UL)) / (1000000000UL / 256UL);
+
+ map = _ipu_pixfmt_to_map(pixel_fmt);
+ if (map < 0)
+ return -EINVAL;
+
+ mutex_lock(&ipu->mutex_lock);
+
+ if (type == IPU_PANEL_SERIAL) {
+ ipu_di_write(ipu, disp, (div << 24) | ((sig.ifc_width - 1) << 4),
+ DI_DW_GEN(ASYNC_SER_WAVE));
+
+ _ipu_di_data_pin_config(ipu, disp, ASYNC_SER_WAVE, DI_PIN_CS,
+ 0, 0, (div * 2) + 1);
+ _ipu_di_data_pin_config(ipu, disp, ASYNC_SER_WAVE, DI_PIN_SER_CLK,
+ 1, div, div * 2);
+ _ipu_di_data_pin_config(ipu, disp, ASYNC_SER_WAVE, DI_PIN_SER_RS,
+ 2, 0, 0);
+
+ _ipu_dc_write_tmpl(ipu, 0x64, WROD(0), 0, map, ASYNC_SER_WAVE, 0, 0, 1);
+
+ /* Configure DC for serial panel */
+ ipu_dc_write(ipu, 0x14, DC_DISP_CONF1(DC_DISP_ID_SERIAL));
+
+ if (sig.clk_pol)
+ ser_conf |= DI_SER_CONF_SERIAL_CLK_POL;
+ if (sig.data_pol)
+ ser_conf |= DI_SER_CONF_SERIAL_DATA_POL;
+ if (sig.rs_pol)
+ ser_conf |= DI_SER_CONF_SERIAL_RS_POL;
+ if (sig.cs_pol)
+ ser_conf |= DI_SER_CONF_SERIAL_CS_POL;
+ ipu_di_write(ipu, disp, ser_conf, DI_SER_CONF);
+ }
+
+ mutex_unlock(&ipu->mutex_lock);
+ return 0;
+}
+EXPORT_SYMBOL(ipu_init_async_panel);
+
+/*!
+ * This function sets the foreground and background plane global alpha blending
+ * modes. This function also sets the DP graphic plane according to the
+ * parameter of IPUv3 DP channel.
+ *
+ * @param ipu ipu handler
+ * @param channel IPUv3 DP channel
+ *
+ * @param enable Boolean to enable or disable global alpha
+ * blending. If disabled, local blending is used.
+ *
+ * @param alpha Global alpha value.
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int32_t ipu_disp_set_global_alpha(struct ipu_soc *ipu, ipu_channel_t channel,
+ bool enable, uint8_t alpha)
+{
+ uint32_t reg;
+ uint32_t flow;
+ bool bg_chan;
+
+ if (channel == MEM_BG_SYNC || channel == MEM_FG_SYNC)
+ flow = DP_SYNC;
+ else if (channel == MEM_BG_ASYNC0 || channel == MEM_FG_ASYNC0)
+ flow = DP_ASYNC0;
+ else if (channel == MEM_BG_ASYNC1 || channel == MEM_FG_ASYNC1)
+ flow = DP_ASYNC1;
+ else
+ return -EINVAL;
+
+ if (channel == MEM_BG_SYNC || channel == MEM_BG_ASYNC0 ||
+ channel == MEM_BG_ASYNC1)
+ bg_chan = true;
+ else
+ bg_chan = false;
+
+ _ipu_get(ipu);
+
+ mutex_lock(&ipu->mutex_lock);
+
+ if (bg_chan) {
+ reg = ipu_dp_read(ipu, DP_COM_CONF(flow));
+ ipu_dp_write(ipu, reg & ~DP_COM_CONF_GWSEL, DP_COM_CONF(flow));
+ } else {
+ reg = ipu_dp_read(ipu, DP_COM_CONF(flow));
+ ipu_dp_write(ipu, reg | DP_COM_CONF_GWSEL, DP_COM_CONF(flow));
+ }
+
+ if (enable) {
+ reg = ipu_dp_read(ipu, DP_GRAPH_WIND_CTRL(flow)) & 0x00FFFFFFL;
+ ipu_dp_write(ipu, reg | ((uint32_t) alpha << 24),
+ DP_GRAPH_WIND_CTRL(flow));
+
+ reg = ipu_dp_read(ipu, DP_COM_CONF(flow));
+ ipu_dp_write(ipu, reg | DP_COM_CONF_GWAM, DP_COM_CONF(flow));
+ } else {
+ reg = ipu_dp_read(ipu, DP_COM_CONF(flow));
+ ipu_dp_write(ipu, reg & ~DP_COM_CONF_GWAM, DP_COM_CONF(flow));
+ }
+
+ reg = ipu_cm_read(ipu, IPU_SRM_PRI2) | 0x8;
+ ipu_cm_write(ipu, reg, IPU_SRM_PRI2);
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ _ipu_put(ipu);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_disp_set_global_alpha);
+
+/*!
+ * This function sets the transparent color key for SDC graphic plane.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param enable Boolean to enable or disable color key
+ *
+ * @param colorKey 24-bit RGB color for transparent color key.
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int32_t ipu_disp_set_color_key(struct ipu_soc *ipu, ipu_channel_t channel,
+ bool enable, uint32_t color_key)
+{
+ uint32_t reg, flow;
+ int y, u, v;
+ int red, green, blue;
+
+ if (channel == MEM_BG_SYNC || channel == MEM_FG_SYNC)
+ flow = DP_SYNC;
+ else if (channel == MEM_BG_ASYNC0 || channel == MEM_FG_ASYNC0)
+ flow = DP_ASYNC0;
+ else if (channel == MEM_BG_ASYNC1 || channel == MEM_FG_ASYNC1)
+ flow = DP_ASYNC1;
+ else
+ return -EINVAL;
+
+ _ipu_get(ipu);
+
+ mutex_lock(&ipu->mutex_lock);
+
+ ipu->color_key_4rgb = true;
+ /* Transform color key from rgb to yuv if CSC is enabled */
+ if (((ipu->fg_csc_type == RGB2YUV) && (ipu->bg_csc_type == YUV2YUV)) ||
+ ((ipu->fg_csc_type == YUV2YUV) && (ipu->bg_csc_type == RGB2YUV)) ||
+ ((ipu->fg_csc_type == YUV2YUV) && (ipu->bg_csc_type == YUV2YUV)) ||
+ ((ipu->fg_csc_type == YUV2RGB) && (ipu->bg_csc_type == YUV2RGB))) {
+
+ dev_dbg(ipu->dev, "color key 0x%x need change to yuv fmt\n", color_key);
+
+ red = (color_key >> 16) & 0xFF;
+ green = (color_key >> 8) & 0xFF;
+ blue = color_key & 0xFF;
+
+ y = _rgb_to_yuv(0, red, green, blue);
+ u = _rgb_to_yuv(1, red, green, blue);
+ v = _rgb_to_yuv(2, red, green, blue);
+ color_key = (y << 16) | (u << 8) | v;
+
+ ipu->color_key_4rgb = false;
+
+ dev_dbg(ipu->dev, "color key change to yuv fmt 0x%x\n", color_key);
+ }
+
+ if (enable) {
+ reg = ipu_dp_read(ipu, DP_GRAPH_WIND_CTRL(flow)) & 0xFF000000L;
+ ipu_dp_write(ipu, reg | color_key, DP_GRAPH_WIND_CTRL(flow));
+
+ reg = ipu_dp_read(ipu, DP_COM_CONF(flow));
+ ipu_dp_write(ipu, reg | DP_COM_CONF_GWCKE, DP_COM_CONF(flow));
+ } else {
+ reg = ipu_dp_read(ipu, DP_COM_CONF(flow));
+ ipu_dp_write(ipu, reg & ~DP_COM_CONF_GWCKE, DP_COM_CONF(flow));
+ }
+
+ reg = ipu_cm_read(ipu, IPU_SRM_PRI2) | 0x8;
+ ipu_cm_write(ipu, reg, IPU_SRM_PRI2);
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ _ipu_put(ipu);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_disp_set_color_key);
+
+/*!
+ * This function sets the gamma correction for DP output.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param enable Boolean to enable or disable gamma correction.
+ *
+ * @param constk Gamma piecewise linear approximation constk coeff.
+ *
+ * @param slopek Gamma piecewise linear approximation slopek coeff.
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int32_t ipu_disp_set_gamma_correction(struct ipu_soc *ipu, ipu_channel_t channel, bool enable, int constk[], int slopek[])
+{
+ uint32_t reg, flow, i;
+
+ if (channel == MEM_BG_SYNC || channel == MEM_FG_SYNC)
+ flow = DP_SYNC;
+ else if (channel == MEM_BG_ASYNC0 || channel == MEM_FG_ASYNC0)
+ flow = DP_ASYNC0;
+ else if (channel == MEM_BG_ASYNC1 || channel == MEM_FG_ASYNC1)
+ flow = DP_ASYNC1;
+ else
+ return -EINVAL;
+
+ _ipu_get(ipu);
+
+ mutex_lock(&ipu->mutex_lock);
+
+ for (i = 0; i < 8; i++)
+ ipu_dp_write(ipu, (constk[2*i] & 0x1ff) | ((constk[2*i+1] & 0x1ff) << 16), DP_GAMMA_C(flow, i));
+ for (i = 0; i < 4; i++)
+ ipu_dp_write(ipu, (slopek[4*i] & 0xff) | ((slopek[4*i+1] & 0xff) << 8) |
+ ((slopek[4*i+2] & 0xff) << 16) | ((slopek[4*i+3] & 0xff) << 24), DP_GAMMA_S(flow, i));
+
+ reg = ipu_dp_read(ipu, DP_COM_CONF(flow));
+ if (enable) {
+ if ((ipu->bg_csc_type == RGB2YUV) || (ipu->bg_csc_type == YUV2YUV))
+ reg |= DP_COM_CONF_GAMMA_YUV_EN;
+ else
+ reg &= ~DP_COM_CONF_GAMMA_YUV_EN;
+ ipu_dp_write(ipu, reg | DP_COM_CONF_GAMMA_EN, DP_COM_CONF(flow));
+ } else
+ ipu_dp_write(ipu, reg & ~DP_COM_CONF_GAMMA_EN, DP_COM_CONF(flow));
+
+ reg = ipu_cm_read(ipu, IPU_SRM_PRI2) | 0x8;
+ ipu_cm_write(ipu, reg, IPU_SRM_PRI2);
+
+ mutex_unlock(&ipu->mutex_lock);
+
+ _ipu_put(ipu);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_disp_set_gamma_correction);
+
+/*!
+ * This function sets the window position of the foreground or background plane.
+ * modes.
+ *
+ * @param ipu ipu handler
+ * @param channel Input parameter for the logical channel ID.
+ *
+ * @param x_pos The X coordinate position to place window at.
+ * The position is relative to the top left corner.
+ *
+ * @param y_pos The Y coordinate position to place window at.
+ * The position is relative to the top left corner.
+ *
+ * @return Returns 0 on success or negative error code on fail
+ */
+int32_t _ipu_disp_set_window_pos(struct ipu_soc *ipu, ipu_channel_t channel,
+ int16_t x_pos, int16_t y_pos)
+{
+ u32 reg;
+ uint32_t flow = 0;
+ uint32_t dp_srm_shift;
+
+ if ((channel == MEM_FG_SYNC) || (channel == MEM_BG_SYNC)) {
+ flow = DP_SYNC;
+ dp_srm_shift = 3;
+ } else if (channel == MEM_FG_ASYNC0) {
+ flow = DP_ASYNC0;
+ dp_srm_shift = 5;
+ } else if (channel == MEM_FG_ASYNC1) {
+ flow = DP_ASYNC1;
+ dp_srm_shift = 7;
+ } else
+ return -EINVAL;
+
+ ipu_dp_write(ipu, (x_pos << 16) | y_pos, DP_FG_POS(flow));
+
+ if (ipu_is_channel_busy(ipu, channel)) {
+ /* controled by FSU if channel enabled */
+ reg = ipu_cm_read(ipu, IPU_SRM_PRI2) & (~(0x3 << dp_srm_shift));
+ reg |= (0x1 << dp_srm_shift);
+ ipu_cm_write(ipu, reg, IPU_SRM_PRI2);
+ } else {
+ /* disable auto swap, controled by MCU if channel disabled */
+ reg = ipu_cm_read(ipu, IPU_SRM_PRI2) & (~(0x3 << dp_srm_shift));
+ ipu_cm_write(ipu, reg, IPU_SRM_PRI2);
+ }
+
+ return 0;
+}
+
+int32_t ipu_disp_set_window_pos(struct ipu_soc *ipu, ipu_channel_t channel,
+ int16_t x_pos, int16_t y_pos)
+{
+ int ret;
+
+ _ipu_get(ipu);
+ mutex_lock(&ipu->mutex_lock);
+ ret = _ipu_disp_set_window_pos(ipu, channel, x_pos, y_pos);
+ mutex_unlock(&ipu->mutex_lock);
+ _ipu_put(ipu);
+ return ret;
+}
+EXPORT_SYMBOL(ipu_disp_set_window_pos);
+
+int32_t _ipu_disp_get_window_pos(struct ipu_soc *ipu, ipu_channel_t channel,
+ int16_t *x_pos, int16_t *y_pos)
+{
+ u32 reg;
+ uint32_t flow = 0;
+
+ if (channel == MEM_FG_SYNC)
+ flow = DP_SYNC;
+ else if (channel == MEM_FG_ASYNC0)
+ flow = DP_ASYNC0;
+ else if (channel == MEM_FG_ASYNC1)
+ flow = DP_ASYNC1;
+ else
+ return -EINVAL;
+
+ reg = ipu_dp_read(ipu, DP_FG_POS(flow));
+
+ *x_pos = (reg >> 16) & 0x7FF;
+ *y_pos = reg & 0x7FF;
+
+ return 0;
+}
+int32_t ipu_disp_get_window_pos(struct ipu_soc *ipu, ipu_channel_t channel,
+ int16_t *x_pos, int16_t *y_pos)
+{
+ int ret;
+
+ _ipu_get(ipu);
+ mutex_lock(&ipu->mutex_lock);
+ ret = _ipu_disp_get_window_pos(ipu, channel, x_pos, y_pos);
+ mutex_unlock(&ipu->mutex_lock);
+ _ipu_put(ipu);
+ return ret;
+}
+EXPORT_SYMBOL(ipu_disp_get_window_pos);
+
+void ipu_reset_disp_panel(struct ipu_soc *ipu)
+{
+ uint32_t tmp;
+
+ tmp = ipu_di_read(ipu, 1, DI_GENERAL);
+ ipu_di_write(ipu, 1, tmp | 0x08, DI_GENERAL);
+ msleep(10); /* tRES >= 100us */
+ tmp = ipu_di_read(ipu, 1, DI_GENERAL);
+ ipu_di_write(ipu, 1, tmp & ~0x08, DI_GENERAL);
+ msleep(60);
+
+ return;
+}
+EXPORT_SYMBOL(ipu_reset_disp_panel);
+
+void ipu_disp_init(struct ipu_soc *ipu)
+{
+ ipu->fg_csc_type = ipu->bg_csc_type = CSC_NONE;
+ ipu->color_key_4rgb = true;
+ _ipu_init_dc_mappings(ipu);
+ _ipu_dmfc_init(ipu, DMFC_NORMAL, 1);
+}
diff --git a/drivers/mxc/ipu3/ipu_ic.c b/drivers/mxc/ipu3/ipu_ic.c
new file mode 100644
index 000000000000..29519bd00d12
--- /dev/null
+++ b/drivers/mxc/ipu3/ipu_ic.c
@@ -0,0 +1,924 @@
+/*
+ * Copyright 2005-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ * @file ipu_ic.c
+ *
+ * @brief IPU IC functions
+ *
+ * @ingroup IPU
+ */
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/ipu-v3.h>
+#include <linux/spinlock.h>
+#include <linux/types.h>
+#include <linux/videodev2.h>
+
+#include "ipu_param_mem.h"
+#include "ipu_regs.h"
+
+enum {
+ IC_TASK_VIEWFINDER,
+ IC_TASK_ENCODER,
+ IC_TASK_POST_PROCESSOR
+};
+
+static void _init_csc(struct ipu_soc *ipu, uint8_t ic_task, ipu_color_space_t in_format,
+ ipu_color_space_t out_format, int csc_index);
+
+static int _calc_resize_coeffs(struct ipu_soc *ipu,
+ uint32_t inSize, uint32_t outSize,
+ uint32_t *resizeCoeff,
+ uint32_t *downsizeCoeff);
+
+void _ipu_vdi_set_top_field_man(struct ipu_soc *ipu, bool top_field_0)
+{
+ uint32_t reg;
+
+ reg = ipu_vdi_read(ipu, VDI_C);
+ if (top_field_0)
+ reg &= ~VDI_C_TOP_FIELD_MAN_1;
+ else
+ reg |= VDI_C_TOP_FIELD_MAN_1;
+ ipu_vdi_write(ipu, reg, VDI_C);
+}
+
+void _ipu_vdi_set_motion(struct ipu_soc *ipu, ipu_motion_sel motion_sel)
+{
+ uint32_t reg;
+
+ reg = ipu_vdi_read(ipu, VDI_C);
+ reg &= ~(VDI_C_MOT_SEL_FULL | VDI_C_MOT_SEL_MED | VDI_C_MOT_SEL_LOW);
+ if (motion_sel == HIGH_MOTION)
+ reg |= VDI_C_MOT_SEL_FULL;
+ else if (motion_sel == MED_MOTION)
+ reg |= VDI_C_MOT_SEL_MED;
+ else
+ reg |= VDI_C_MOT_SEL_LOW;
+
+ ipu_vdi_write(ipu, reg, VDI_C);
+ dev_dbg(ipu->dev, "VDI_C = \t0x%08X\n", reg);
+}
+
+void ic_dump_register(struct ipu_soc *ipu)
+{
+ printk(KERN_DEBUG "IC_CONF = \t0x%08X\n", ipu_ic_read(ipu, IC_CONF));
+ printk(KERN_DEBUG "IC_PRP_ENC_RSC = \t0x%08X\n",
+ ipu_ic_read(ipu, IC_PRP_ENC_RSC));
+ printk(KERN_DEBUG "IC_PRP_VF_RSC = \t0x%08X\n",
+ ipu_ic_read(ipu, IC_PRP_VF_RSC));
+ printk(KERN_DEBUG "IC_PP_RSC = \t0x%08X\n", ipu_ic_read(ipu, IC_PP_RSC));
+ printk(KERN_DEBUG "IC_IDMAC_1 = \t0x%08X\n", ipu_ic_read(ipu, IC_IDMAC_1));
+ printk(KERN_DEBUG "IC_IDMAC_2 = \t0x%08X\n", ipu_ic_read(ipu, IC_IDMAC_2));
+ printk(KERN_DEBUG "IC_IDMAC_3 = \t0x%08X\n", ipu_ic_read(ipu, IC_IDMAC_3));
+}
+
+void _ipu_ic_enable_task(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ uint32_t ic_conf;
+
+ ic_conf = ipu_ic_read(ipu, IC_CONF);
+ switch (channel) {
+ case CSI_PRP_VF_MEM:
+ case MEM_PRP_VF_MEM:
+ ic_conf |= IC_CONF_PRPVF_EN;
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ ic_conf |= IC_CONF_PRPVF_EN;
+ break;
+ case MEM_VDI_MEM:
+ ic_conf |= IC_CONF_PRPVF_EN | IC_CONF_RWS_EN ;
+ break;
+ case MEM_ROT_VF_MEM:
+ ic_conf |= IC_CONF_PRPVF_ROT_EN;
+ break;
+ case CSI_PRP_ENC_MEM:
+ case MEM_PRP_ENC_MEM:
+ ic_conf |= IC_CONF_PRPENC_EN;
+ break;
+ case MEM_ROT_ENC_MEM:
+ ic_conf |= IC_CONF_PRPENC_ROT_EN;
+ break;
+ case MEM_PP_MEM:
+ ic_conf |= IC_CONF_PP_EN;
+ break;
+ case MEM_ROT_PP_MEM:
+ ic_conf |= IC_CONF_PP_ROT_EN;
+ break;
+ default:
+ break;
+ }
+ ipu_ic_write(ipu, ic_conf, IC_CONF);
+}
+
+void _ipu_ic_disable_task(struct ipu_soc *ipu, ipu_channel_t channel)
+{
+ uint32_t ic_conf;
+
+ ic_conf = ipu_ic_read(ipu, IC_CONF);
+ switch (channel) {
+ case CSI_PRP_VF_MEM:
+ case MEM_PRP_VF_MEM:
+ ic_conf &= ~IC_CONF_PRPVF_EN;
+ break;
+ case MEM_VDI_PRP_VF_MEM:
+ ic_conf &= ~IC_CONF_PRPVF_EN;
+ break;
+ case MEM_VDI_MEM:
+ ic_conf &= ~(IC_CONF_PRPVF_EN | IC_CONF_RWS_EN);
+ break;
+ case MEM_ROT_VF_MEM:
+ ic_conf &= ~IC_CONF_PRPVF_ROT_EN;
+ break;
+ case CSI_PRP_ENC_MEM:
+ case MEM_PRP_ENC_MEM:
+ ic_conf &= ~IC_CONF_PRPENC_EN;
+ break;
+ case MEM_ROT_ENC_MEM:
+ ic_conf &= ~IC_CONF_PRPENC_ROT_EN;
+ break;
+ case MEM_PP_MEM:
+ ic_conf &= ~IC_CONF_PP_EN;
+ break;
+ case MEM_ROT_PP_MEM:
+ ic_conf &= ~IC_CONF_PP_ROT_EN;
+ break;
+ default:
+ break;
+ }
+ ipu_ic_write(ipu, ic_conf, IC_CONF);
+}
+
+void _ipu_vdi_init(struct ipu_soc *ipu, ipu_channel_t channel, ipu_channel_params_t *params)
+{
+ uint32_t reg;
+ uint32_t pixel_fmt;
+ uint32_t pix_per_burst;
+
+ reg = ((params->mem_prp_vf_mem.in_height-1) << 16) |
+ (params->mem_prp_vf_mem.in_width-1);
+ ipu_vdi_write(ipu, reg, VDI_FSIZE);
+
+ /* Full motion, only vertical filter is used
+ Burst size is 4 accesses */
+ if (params->mem_prp_vf_mem.in_pixel_fmt ==
+ IPU_PIX_FMT_UYVY ||
+ params->mem_prp_vf_mem.in_pixel_fmt ==
+ IPU_PIX_FMT_YUYV) {
+ pixel_fmt = VDI_C_CH_422;
+ pix_per_burst = 32;
+ } else {
+ pixel_fmt = VDI_C_CH_420;
+ pix_per_burst = 64;
+ }
+
+ reg = ipu_vdi_read(ipu, VDI_C);
+ reg |= pixel_fmt;
+ switch (channel) {
+ case MEM_VDI_PRP_VF_MEM:
+ reg |= VDI_C_BURST_SIZE2_4;
+ break;
+ case MEM_VDI_PRP_VF_MEM_P:
+ reg |= VDI_C_BURST_SIZE1_4 | VDI_C_VWM1_SET_1 | VDI_C_VWM1_CLR_2;
+ break;
+ case MEM_VDI_PRP_VF_MEM_N:
+ reg |= VDI_C_BURST_SIZE3_4 | VDI_C_VWM3_SET_1 | VDI_C_VWM3_CLR_2;
+ break;
+
+ case MEM_VDI_MEM:
+ reg |= (((pix_per_burst >> 2) - 1) & VDI_C_BURST_SIZE_MASK)
+ << VDI_C_BURST_SIZE2_OFFSET;
+ break;
+ case MEM_VDI_MEM_P:
+ reg |= (((pix_per_burst >> 2) - 1) & VDI_C_BURST_SIZE_MASK)
+ << VDI_C_BURST_SIZE1_OFFSET;
+ reg |= VDI_C_VWM1_SET_2 | VDI_C_VWM1_CLR_2;
+ break;
+ case MEM_VDI_MEM_N:
+ reg |= (((pix_per_burst >> 2) - 1) & VDI_C_BURST_SIZE_MASK)
+ << VDI_C_BURST_SIZE3_OFFSET;
+ reg |= VDI_C_VWM3_SET_2 | VDI_C_VWM3_CLR_2;
+ break;
+ default:
+ break;
+ }
+ ipu_vdi_write(ipu, reg, VDI_C);
+
+ if (params->mem_prp_vf_mem.field_fmt == IPU_DEINTERLACE_FIELD_TOP)
+ _ipu_vdi_set_top_field_man(ipu, true);
+ else if (params->mem_prp_vf_mem.field_fmt == IPU_DEINTERLACE_FIELD_BOTTOM)
+ _ipu_vdi_set_top_field_man(ipu, false);
+
+ _ipu_vdi_set_motion(ipu, params->mem_prp_vf_mem.motion_sel);
+
+ reg = ipu_ic_read(ipu, IC_CONF);
+ reg &= ~IC_CONF_RWS_EN;
+ ipu_ic_write(ipu, reg, IC_CONF);
+}
+
+void _ipu_vdi_uninit(struct ipu_soc *ipu)
+{
+ ipu_vdi_write(ipu, 0, VDI_FSIZE);
+ ipu_vdi_write(ipu, 0, VDI_C);
+}
+
+int _ipu_ic_init_prpvf(struct ipu_soc *ipu, ipu_channel_params_t *params,
+ bool src_is_csi)
+{
+ uint32_t reg, ic_conf;
+ uint32_t downsizeCoeff, resizeCoeff;
+ ipu_color_space_t in_fmt, out_fmt;
+ int ret = 0;
+
+ /* Setup vertical resizing */
+ if (!params->mem_prp_vf_mem.outv_resize_ratio) {
+ ret = _calc_resize_coeffs(ipu, params->mem_prp_vf_mem.in_height,
+ params->mem_prp_vf_mem.out_height,
+ &resizeCoeff, &downsizeCoeff);
+ if (ret < 0) {
+ dev_err(ipu->dev, "failed to calculate prpvf height "
+ "scaling coefficients\n");
+ return ret;
+ }
+
+ reg = (downsizeCoeff << 30) | (resizeCoeff << 16);
+ } else
+ reg = (params->mem_prp_vf_mem.outv_resize_ratio) << 16;
+
+ /* Setup horizontal resizing */
+ if (!params->mem_prp_vf_mem.outh_resize_ratio) {
+ ret = _calc_resize_coeffs(ipu, params->mem_prp_vf_mem.in_width,
+ params->mem_prp_vf_mem.out_width,
+ &resizeCoeff, &downsizeCoeff);
+ if (ret < 0) {
+ dev_err(ipu->dev, "failed to calculate prpvf width "
+ "scaling coefficients\n");
+ return ret;
+ }
+
+ reg |= (downsizeCoeff << 14) | resizeCoeff;
+ } else
+ reg |= params->mem_prp_vf_mem.outh_resize_ratio;
+
+ ipu_ic_write(ipu, reg, IC_PRP_VF_RSC);
+
+ ic_conf = ipu_ic_read(ipu, IC_CONF);
+
+ /* Setup color space conversion */
+ in_fmt = format_to_colorspace(params->mem_prp_vf_mem.in_pixel_fmt);
+ out_fmt = format_to_colorspace(params->mem_prp_vf_mem.out_pixel_fmt);
+ if (in_fmt == RGB) {
+ if ((out_fmt == YCbCr) || (out_fmt == YUV)) {
+ /* Enable RGB->YCBCR CSC1 */
+ _init_csc(ipu, IC_TASK_VIEWFINDER, RGB, out_fmt, 1);
+ ic_conf |= IC_CONF_PRPVF_CSC1;
+ }
+ }
+ if ((in_fmt == YCbCr) || (in_fmt == YUV)) {
+ if (out_fmt == RGB) {
+ /* Enable YCBCR->RGB CSC1 */
+ _init_csc(ipu, IC_TASK_VIEWFINDER, YCbCr, RGB, 1);
+ ic_conf |= IC_CONF_PRPVF_CSC1;
+ } else {
+ /* TODO: Support YUV<->YCbCr conversion? */
+ }
+ }
+
+ if (params->mem_prp_vf_mem.graphics_combine_en) {
+ ic_conf |= IC_CONF_PRPVF_CMB;
+
+ if (!(ic_conf & IC_CONF_PRPVF_CSC1)) {
+ /* need transparent CSC1 conversion */
+ _init_csc(ipu, IC_TASK_VIEWFINDER, RGB, RGB, 1);
+ ic_conf |= IC_CONF_PRPVF_CSC1; /* Enable RGB->RGB CSC */
+ }
+ in_fmt = format_to_colorspace(params->mem_prp_vf_mem.in_g_pixel_fmt);
+ out_fmt = format_to_colorspace(params->mem_prp_vf_mem.out_pixel_fmt);
+ if (in_fmt == RGB) {
+ if ((out_fmt == YCbCr) || (out_fmt == YUV)) {
+ /* Enable RGB->YCBCR CSC2 */
+ _init_csc(ipu, IC_TASK_VIEWFINDER, RGB, out_fmt, 2);
+ ic_conf |= IC_CONF_PRPVF_CSC2;
+ }
+ }
+ if ((in_fmt == YCbCr) || (in_fmt == YUV)) {
+ if (out_fmt == RGB) {
+ /* Enable YCBCR->RGB CSC2 */
+ _init_csc(ipu, IC_TASK_VIEWFINDER, YCbCr, RGB, 2);
+ ic_conf |= IC_CONF_PRPVF_CSC2;
+ } else {
+ /* TODO: Support YUV<->YCbCr conversion? */
+ }
+ }
+
+ if (params->mem_prp_vf_mem.global_alpha_en) {
+ ic_conf |= IC_CONF_IC_GLB_LOC_A;
+ reg = ipu_ic_read(ipu, IC_CMBP_1);
+ reg &= ~(0xff);
+ reg |= params->mem_prp_vf_mem.alpha;
+ ipu_ic_write(ipu, reg, IC_CMBP_1);
+ } else
+ ic_conf &= ~IC_CONF_IC_GLB_LOC_A;
+
+ if (params->mem_prp_vf_mem.key_color_en) {
+ ic_conf |= IC_CONF_KEY_COLOR_EN;
+ ipu_ic_write(ipu, params->mem_prp_vf_mem.key_color,
+ IC_CMBP_2);
+ } else
+ ic_conf &= ~IC_CONF_KEY_COLOR_EN;
+ } else {
+ ic_conf &= ~IC_CONF_PRPVF_CMB;
+ }
+
+ if (src_is_csi)
+ ic_conf &= ~IC_CONF_RWS_EN;
+ else
+ ic_conf |= IC_CONF_RWS_EN;
+
+ ipu_ic_write(ipu, ic_conf, IC_CONF);
+
+ return ret;
+}
+
+void _ipu_ic_uninit_prpvf(struct ipu_soc *ipu)
+{
+ uint32_t reg;
+
+ reg = ipu_ic_read(ipu, IC_CONF);
+ reg &= ~(IC_CONF_PRPVF_EN | IC_CONF_PRPVF_CMB |
+ IC_CONF_PRPVF_CSC2 | IC_CONF_PRPVF_CSC1);
+ ipu_ic_write(ipu, reg, IC_CONF);
+}
+
+void _ipu_ic_init_rotate_vf(struct ipu_soc *ipu, ipu_channel_params_t *params)
+{
+}
+
+void _ipu_ic_uninit_rotate_vf(struct ipu_soc *ipu)
+{
+ uint32_t reg;
+ reg = ipu_ic_read(ipu, IC_CONF);
+ reg &= ~IC_CONF_PRPVF_ROT_EN;
+ ipu_ic_write(ipu, reg, IC_CONF);
+}
+
+int _ipu_ic_init_prpenc(struct ipu_soc *ipu, ipu_channel_params_t *params,
+ bool src_is_csi)
+{
+ uint32_t reg, ic_conf;
+ uint32_t downsizeCoeff, resizeCoeff;
+ ipu_color_space_t in_fmt, out_fmt;
+ int ret = 0;
+
+ /* Setup vertical resizing */
+ if (!params->mem_prp_enc_mem.outv_resize_ratio) {
+ ret = _calc_resize_coeffs(ipu,
+ params->mem_prp_enc_mem.in_height,
+ params->mem_prp_enc_mem.out_height,
+ &resizeCoeff, &downsizeCoeff);
+ if (ret < 0) {
+ dev_err(ipu->dev, "failed to calculate prpenc height "
+ "scaling coefficients\n");
+ return ret;
+ }
+
+ reg = (downsizeCoeff << 30) | (resizeCoeff << 16);
+ } else
+ reg = (params->mem_prp_enc_mem.outv_resize_ratio) << 16;
+
+ /* Setup horizontal resizing */
+ if (!params->mem_prp_enc_mem.outh_resize_ratio) {
+ ret = _calc_resize_coeffs(ipu, params->mem_prp_enc_mem.in_width,
+ params->mem_prp_enc_mem.out_width,
+ &resizeCoeff, &downsizeCoeff);
+ if (ret < 0) {
+ dev_err(ipu->dev, "failed to calculate prpenc width "
+ "scaling coefficients\n");
+ return ret;
+ }
+
+ reg |= (downsizeCoeff << 14) | resizeCoeff;
+ } else
+ reg |= params->mem_prp_enc_mem.outh_resize_ratio;
+
+ ipu_ic_write(ipu, reg, IC_PRP_ENC_RSC);
+
+ ic_conf = ipu_ic_read(ipu, IC_CONF);
+
+ /* Setup color space conversion */
+ in_fmt = format_to_colorspace(params->mem_prp_enc_mem.in_pixel_fmt);
+ out_fmt = format_to_colorspace(params->mem_prp_enc_mem.out_pixel_fmt);
+ if (in_fmt == RGB) {
+ if ((out_fmt == YCbCr) || (out_fmt == YUV)) {
+ /* Enable RGB->YCBCR CSC1 */
+ _init_csc(ipu, IC_TASK_ENCODER, RGB, out_fmt, 1);
+ ic_conf |= IC_CONF_PRPENC_CSC1;
+ }
+ }
+ if ((in_fmt == YCbCr) || (in_fmt == YUV)) {
+ if (out_fmt == RGB) {
+ /* Enable YCBCR->RGB CSC1 */
+ _init_csc(ipu, IC_TASK_ENCODER, YCbCr, RGB, 1);
+ ic_conf |= IC_CONF_PRPENC_CSC1;
+ } else {
+ /* TODO: Support YUV<->YCbCr conversion? */
+ }
+ }
+
+ if (src_is_csi)
+ ic_conf &= ~IC_CONF_RWS_EN;
+ else
+ ic_conf |= IC_CONF_RWS_EN;
+
+ ipu_ic_write(ipu, ic_conf, IC_CONF);
+
+ return ret;
+}
+
+void _ipu_ic_uninit_prpenc(struct ipu_soc *ipu)
+{
+ uint32_t reg;
+
+ reg = ipu_ic_read(ipu, IC_CONF);
+ reg &= ~(IC_CONF_PRPENC_EN | IC_CONF_PRPENC_CSC1);
+ ipu_ic_write(ipu, reg, IC_CONF);
+}
+
+void _ipu_ic_init_rotate_enc(struct ipu_soc *ipu, ipu_channel_params_t *params)
+{
+}
+
+void _ipu_ic_uninit_rotate_enc(struct ipu_soc *ipu)
+{
+ uint32_t reg;
+
+ reg = ipu_ic_read(ipu, IC_CONF);
+ reg &= ~(IC_CONF_PRPENC_ROT_EN);
+ ipu_ic_write(ipu, reg, IC_CONF);
+}
+
+int _ipu_ic_init_pp(struct ipu_soc *ipu, ipu_channel_params_t *params)
+{
+ uint32_t reg, ic_conf;
+ uint32_t downsizeCoeff, resizeCoeff;
+ ipu_color_space_t in_fmt, out_fmt;
+ int ret = 0;
+
+ /* Setup vertical resizing */
+ if (!params->mem_pp_mem.outv_resize_ratio) {
+ ret = _calc_resize_coeffs(ipu, params->mem_pp_mem.in_height,
+ params->mem_pp_mem.out_height,
+ &resizeCoeff, &downsizeCoeff);
+ if (ret < 0) {
+ dev_err(ipu->dev, "failed to calculate pp height "
+ "scaling coefficients\n");
+ return ret;
+ }
+
+ reg = (downsizeCoeff << 30) | (resizeCoeff << 16);
+ } else {
+ reg = (params->mem_pp_mem.outv_resize_ratio) << 16;
+ }
+
+ /* Setup horizontal resizing */
+ if (!params->mem_pp_mem.outh_resize_ratio) {
+ ret = _calc_resize_coeffs(ipu, params->mem_pp_mem.in_width,
+ params->mem_pp_mem.out_width,
+ &resizeCoeff, &downsizeCoeff);
+ if (ret < 0) {
+ dev_err(ipu->dev, "failed to calculate pp width "
+ "scaling coefficients\n");
+ return ret;
+ }
+
+ reg |= (downsizeCoeff << 14) | resizeCoeff;
+ } else {
+ reg |= params->mem_pp_mem.outh_resize_ratio;
+ }
+
+ ipu_ic_write(ipu, reg, IC_PP_RSC);
+
+ ic_conf = ipu_ic_read(ipu, IC_CONF);
+
+ /* Setup color space conversion */
+ in_fmt = format_to_colorspace(params->mem_pp_mem.in_pixel_fmt);
+ out_fmt = format_to_colorspace(params->mem_pp_mem.out_pixel_fmt);
+ if (in_fmt == RGB) {
+ if ((out_fmt == YCbCr) || (out_fmt == YUV)) {
+ /* Enable RGB->YCBCR CSC1 */
+ _init_csc(ipu, IC_TASK_POST_PROCESSOR, RGB, out_fmt, 1);
+ ic_conf |= IC_CONF_PP_CSC1;
+ }
+ }
+ if ((in_fmt == YCbCr) || (in_fmt == YUV)) {
+ if (out_fmt == RGB) {
+ /* Enable YCBCR->RGB CSC1 */
+ _init_csc(ipu, IC_TASK_POST_PROCESSOR, YCbCr, RGB, 1);
+ ic_conf |= IC_CONF_PP_CSC1;
+ } else {
+ /* TODO: Support YUV<->YCbCr conversion? */
+ }
+ }
+
+ if (params->mem_pp_mem.graphics_combine_en) {
+ ic_conf |= IC_CONF_PP_CMB;
+
+ if (!(ic_conf & IC_CONF_PP_CSC1)) {
+ /* need transparent CSC1 conversion */
+ _init_csc(ipu, IC_TASK_POST_PROCESSOR, RGB, RGB, 1);
+ ic_conf |= IC_CONF_PP_CSC1; /* Enable RGB->RGB CSC */
+ }
+
+ in_fmt = format_to_colorspace(params->mem_pp_mem.in_g_pixel_fmt);
+ out_fmt = format_to_colorspace(params->mem_pp_mem.out_pixel_fmt);
+ if (in_fmt == RGB) {
+ if ((out_fmt == YCbCr) || (out_fmt == YUV)) {
+ /* Enable RGB->YCBCR CSC2 */
+ _init_csc(ipu, IC_TASK_POST_PROCESSOR, RGB, out_fmt, 2);
+ ic_conf |= IC_CONF_PP_CSC2;
+ }
+ }
+ if ((in_fmt == YCbCr) || (in_fmt == YUV)) {
+ if (out_fmt == RGB) {
+ /* Enable YCBCR->RGB CSC2 */
+ _init_csc(ipu, IC_TASK_POST_PROCESSOR, YCbCr, RGB, 2);
+ ic_conf |= IC_CONF_PP_CSC2;
+ } else {
+ /* TODO: Support YUV<->YCbCr conversion? */
+ }
+ }
+
+ if (params->mem_pp_mem.global_alpha_en) {
+ ic_conf |= IC_CONF_IC_GLB_LOC_A;
+ reg = ipu_ic_read(ipu, IC_CMBP_1);
+ reg &= ~(0xff00);
+ reg |= (params->mem_pp_mem.alpha << 8);
+ ipu_ic_write(ipu, reg, IC_CMBP_1);
+ } else
+ ic_conf &= ~IC_CONF_IC_GLB_LOC_A;
+
+ if (params->mem_pp_mem.key_color_en) {
+ ic_conf |= IC_CONF_KEY_COLOR_EN;
+ ipu_ic_write(ipu, params->mem_pp_mem.key_color,
+ IC_CMBP_2);
+ } else
+ ic_conf &= ~IC_CONF_KEY_COLOR_EN;
+ } else {
+ ic_conf &= ~IC_CONF_PP_CMB;
+ }
+
+ ipu_ic_write(ipu, ic_conf, IC_CONF);
+
+ return ret;
+}
+
+void _ipu_ic_uninit_pp(struct ipu_soc *ipu)
+{
+ uint32_t reg;
+
+ reg = ipu_ic_read(ipu, IC_CONF);
+ reg &= ~(IC_CONF_PP_EN | IC_CONF_PP_CSC1 | IC_CONF_PP_CSC2 |
+ IC_CONF_PP_CMB);
+ ipu_ic_write(ipu, reg, IC_CONF);
+}
+
+void _ipu_ic_init_rotate_pp(struct ipu_soc *ipu, ipu_channel_params_t *params)
+{
+}
+
+void _ipu_ic_uninit_rotate_pp(struct ipu_soc *ipu)
+{
+ uint32_t reg;
+ reg = ipu_ic_read(ipu, IC_CONF);
+ reg &= ~IC_CONF_PP_ROT_EN;
+ ipu_ic_write(ipu, reg, IC_CONF);
+}
+
+int _ipu_ic_idma_init(struct ipu_soc *ipu, int dma_chan,
+ uint16_t width, uint16_t height,
+ int burst_size, ipu_rotate_mode_t rot)
+{
+ u32 ic_idmac_1, ic_idmac_2, ic_idmac_3;
+ u32 temp_rot = bitrev8(rot) >> 5;
+ bool need_hor_flip = false;
+
+ if ((burst_size != 8) && (burst_size != 16)) {
+ dev_dbg(ipu->dev, "Illegal burst length for IC\n");
+ return -EINVAL;
+ }
+
+ width--;
+ height--;
+
+ if (temp_rot & 0x2) /* Need horizontal flip */
+ need_hor_flip = true;
+
+ ic_idmac_1 = ipu_ic_read(ipu, IC_IDMAC_1);
+ ic_idmac_2 = ipu_ic_read(ipu, IC_IDMAC_2);
+ ic_idmac_3 = ipu_ic_read(ipu, IC_IDMAC_3);
+ if (dma_chan == 22) { /* PP output - CB2 */
+ if (burst_size == 16)
+ ic_idmac_1 |= IC_IDMAC_1_CB2_BURST_16;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_CB2_BURST_16;
+
+ if (need_hor_flip)
+ ic_idmac_1 |= IC_IDMAC_1_PP_FLIP_RS;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_PP_FLIP_RS;
+
+ ic_idmac_2 &= ~IC_IDMAC_2_PP_HEIGHT_MASK;
+ ic_idmac_2 |= height << IC_IDMAC_2_PP_HEIGHT_OFFSET;
+
+ ic_idmac_3 &= ~IC_IDMAC_3_PP_WIDTH_MASK;
+ ic_idmac_3 |= width << IC_IDMAC_3_PP_WIDTH_OFFSET;
+ } else if (dma_chan == 11) { /* PP Input - CB5 */
+ if (burst_size == 16)
+ ic_idmac_1 |= IC_IDMAC_1_CB5_BURST_16;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_CB5_BURST_16;
+ } else if (dma_chan == 47) { /* PP Rot input */
+ ic_idmac_1 &= ~IC_IDMAC_1_PP_ROT_MASK;
+ ic_idmac_1 |= temp_rot << IC_IDMAC_1_PP_ROT_OFFSET;
+ }
+
+ if (dma_chan == 12) { /* PRP Input - CB6 */
+ if (burst_size == 16)
+ ic_idmac_1 |= IC_IDMAC_1_CB6_BURST_16;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_CB6_BURST_16;
+ }
+
+ if (dma_chan == 20) { /* PRP ENC output - CB0 */
+ if (burst_size == 16)
+ ic_idmac_1 |= IC_IDMAC_1_CB0_BURST_16;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_CB0_BURST_16;
+
+ if (need_hor_flip)
+ ic_idmac_1 |= IC_IDMAC_1_PRPENC_FLIP_RS;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_PRPENC_FLIP_RS;
+
+ ic_idmac_2 &= ~IC_IDMAC_2_PRPENC_HEIGHT_MASK;
+ ic_idmac_2 |= height << IC_IDMAC_2_PRPENC_HEIGHT_OFFSET;
+
+ ic_idmac_3 &= ~IC_IDMAC_3_PRPENC_WIDTH_MASK;
+ ic_idmac_3 |= width << IC_IDMAC_3_PRPENC_WIDTH_OFFSET;
+
+ } else if (dma_chan == 45) { /* PRP ENC Rot input */
+ ic_idmac_1 &= ~IC_IDMAC_1_PRPENC_ROT_MASK;
+ ic_idmac_1 |= temp_rot << IC_IDMAC_1_PRPENC_ROT_OFFSET;
+ }
+
+ if (dma_chan == 21) { /* PRP VF output - CB1 */
+ if (burst_size == 16)
+ ic_idmac_1 |= IC_IDMAC_1_CB1_BURST_16;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_CB1_BURST_16;
+
+ if (need_hor_flip)
+ ic_idmac_1 |= IC_IDMAC_1_PRPVF_FLIP_RS;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_PRPVF_FLIP_RS;
+
+ ic_idmac_2 &= ~IC_IDMAC_2_PRPVF_HEIGHT_MASK;
+ ic_idmac_2 |= height << IC_IDMAC_2_PRPVF_HEIGHT_OFFSET;
+
+ ic_idmac_3 &= ~IC_IDMAC_3_PRPVF_WIDTH_MASK;
+ ic_idmac_3 |= width << IC_IDMAC_3_PRPVF_WIDTH_OFFSET;
+
+ } else if (dma_chan == 46) { /* PRP VF Rot input */
+ ic_idmac_1 &= ~IC_IDMAC_1_PRPVF_ROT_MASK;
+ ic_idmac_1 |= temp_rot << IC_IDMAC_1_PRPVF_ROT_OFFSET;
+ }
+
+ if (dma_chan == 14) { /* PRP VF graphics combining input - CB3 */
+ if (burst_size == 16)
+ ic_idmac_1 |= IC_IDMAC_1_CB3_BURST_16;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_CB3_BURST_16;
+ } else if (dma_chan == 15) { /* PP graphics combining input - CB4 */
+ if (burst_size == 16)
+ ic_idmac_1 |= IC_IDMAC_1_CB4_BURST_16;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_CB4_BURST_16;
+ } else if (dma_chan == 5) { /* VDIC OUTPUT - CB7 */
+ if (burst_size == 16)
+ ic_idmac_1 |= IC_IDMAC_1_CB7_BURST_16;
+ else
+ ic_idmac_1 &= ~IC_IDMAC_1_CB7_BURST_16;
+ }
+
+ ipu_ic_write(ipu, ic_idmac_1, IC_IDMAC_1);
+ ipu_ic_write(ipu, ic_idmac_2, IC_IDMAC_2);
+ ipu_ic_write(ipu, ic_idmac_3, IC_IDMAC_3);
+ return 0;
+}
+
+static void _init_csc(struct ipu_soc *ipu, uint8_t ic_task, ipu_color_space_t in_format,
+ ipu_color_space_t out_format, int csc_index)
+{
+ /*
+ * Y = 0.257 * R + 0.504 * G + 0.098 * B + 16;
+ * U = -0.148 * R - 0.291 * G + 0.439 * B + 128;
+ * V = 0.439 * R - 0.368 * G - 0.071 * B + 128;
+ */
+ static const uint32_t rgb2ycbcr_coeff[4][3] = {
+ {0x0042, 0x0081, 0x0019},
+ {0x01DA, 0x01B6, 0x0070},
+ {0x0070, 0x01A2, 0x01EE},
+ {0x0040, 0x0200, 0x0200}, /* A0, A1, A2 */
+ };
+
+ /* transparent RGB->RGB matrix for combining
+ */
+ static const uint32_t rgb2rgb_coeff[4][3] = {
+ {0x0080, 0x0000, 0x0000},
+ {0x0000, 0x0080, 0x0000},
+ {0x0000, 0x0000, 0x0080},
+ {0x0000, 0x0000, 0x0000}, /* A0, A1, A2 */
+ };
+
+/* R = (1.164 * (Y - 16)) + (1.596 * (Cr - 128));
+ G = (1.164 * (Y - 16)) - (0.392 * (Cb - 128)) - (0.813 * (Cr - 128));
+ B = (1.164 * (Y - 16)) + (2.017 * (Cb - 128); */
+ static const uint32_t ycbcr2rgb_coeff[4][3] = {
+ {149, 0, 204},
+ {149, 462, 408},
+ {149, 255, 0},
+ {8192 - 446, 266, 8192 - 554}, /* A0, A1, A2 */
+ };
+
+ uint32_t param;
+ uint32_t *base = NULL;
+
+ if (ic_task == IC_TASK_ENCODER) {
+ base = (uint32_t *)ipu->tpmem_base + 0x2008 / 4;
+ } else if (ic_task == IC_TASK_VIEWFINDER) {
+ if (csc_index == 1)
+ base = (uint32_t *)ipu->tpmem_base + 0x4028 / 4;
+ else
+ base = (uint32_t *)ipu->tpmem_base + 0x4040 / 4;
+ } else if (ic_task == IC_TASK_POST_PROCESSOR) {
+ if (csc_index == 1)
+ base = (uint32_t *)ipu->tpmem_base + 0x6060 / 4;
+ else
+ base = (uint32_t *)ipu->tpmem_base + 0x6078 / 4;
+ } else {
+ BUG();
+ }
+
+ if ((in_format == YCbCr) && (out_format == RGB)) {
+ /* Init CSC (YCbCr->RGB) */
+ param = (ycbcr2rgb_coeff[3][0] << 27) |
+ (ycbcr2rgb_coeff[0][0] << 18) |
+ (ycbcr2rgb_coeff[1][1] << 9) | ycbcr2rgb_coeff[2][2];
+ writel(param, base++);
+ /* scale = 2, sat = 0 */
+ param = (ycbcr2rgb_coeff[3][0] >> 5) | (2L << (40 - 32));
+ writel(param, base++);
+
+ param = (ycbcr2rgb_coeff[3][1] << 27) |
+ (ycbcr2rgb_coeff[0][1] << 18) |
+ (ycbcr2rgb_coeff[1][0] << 9) | ycbcr2rgb_coeff[2][0];
+ writel(param, base++);
+ param = (ycbcr2rgb_coeff[3][1] >> 5);
+ writel(param, base++);
+
+ param = (ycbcr2rgb_coeff[3][2] << 27) |
+ (ycbcr2rgb_coeff[0][2] << 18) |
+ (ycbcr2rgb_coeff[1][2] << 9) | ycbcr2rgb_coeff[2][1];
+ writel(param, base++);
+ param = (ycbcr2rgb_coeff[3][2] >> 5);
+ writel(param, base++);
+ } else if ((in_format == RGB) && (out_format == YCbCr)) {
+ /* Init CSC (RGB->YCbCr) */
+ param = (rgb2ycbcr_coeff[3][0] << 27) |
+ (rgb2ycbcr_coeff[0][0] << 18) |
+ (rgb2ycbcr_coeff[1][1] << 9) | rgb2ycbcr_coeff[2][2];
+ writel(param, base++);
+ /* scale = 1, sat = 0 */
+ param = (rgb2ycbcr_coeff[3][0] >> 5) | (1UL << 8);
+ writel(param, base++);
+
+ param = (rgb2ycbcr_coeff[3][1] << 27) |
+ (rgb2ycbcr_coeff[0][1] << 18) |
+ (rgb2ycbcr_coeff[1][0] << 9) | rgb2ycbcr_coeff[2][0];
+ writel(param, base++);
+ param = (rgb2ycbcr_coeff[3][1] >> 5);
+ writel(param, base++);
+
+ param = (rgb2ycbcr_coeff[3][2] << 27) |
+ (rgb2ycbcr_coeff[0][2] << 18) |
+ (rgb2ycbcr_coeff[1][2] << 9) | rgb2ycbcr_coeff[2][1];
+ writel(param, base++);
+ param = (rgb2ycbcr_coeff[3][2] >> 5);
+ writel(param, base++);
+ } else if ((in_format == RGB) && (out_format == RGB)) {
+ /* Init CSC */
+ param =
+ (rgb2rgb_coeff[3][0] << 27) | (rgb2rgb_coeff[0][0] << 18) |
+ (rgb2rgb_coeff[1][1] << 9) | rgb2rgb_coeff[2][2];
+ writel(param, base++);
+ /* scale = 2, sat = 0 */
+ param = (rgb2rgb_coeff[3][0] >> 5) | (2UL << 8);
+ writel(param, base++);
+
+ param =
+ (rgb2rgb_coeff[3][1] << 27) | (rgb2rgb_coeff[0][1] << 18) |
+ (rgb2rgb_coeff[1][0] << 9) | rgb2rgb_coeff[2][0];
+ writel(param, base++);
+ param = (rgb2rgb_coeff[3][1] >> 5);
+ writel(param, base++);
+
+ param =
+ (rgb2rgb_coeff[3][2] << 27) | (rgb2rgb_coeff[0][2] << 18) |
+ (rgb2rgb_coeff[1][2] << 9) | rgb2rgb_coeff[2][1];
+ writel(param, base++);
+ param = (rgb2rgb_coeff[3][2] >> 5);
+ writel(param, base++);
+ } else {
+ dev_err(ipu->dev, "Unsupported color space conversion\n");
+ }
+}
+
+static int _calc_resize_coeffs(struct ipu_soc *ipu,
+ uint32_t inSize, uint32_t outSize,
+ uint32_t *resizeCoeff,
+ uint32_t *downsizeCoeff)
+{
+ uint32_t tempSize;
+ uint32_t tempDownsize;
+
+ if (inSize > 4096) {
+ dev_err(ipu->dev, "IC input size(%d) cannot exceed 4096\n",
+ inSize);
+ return -EINVAL;
+ }
+
+ if (outSize > 1024) {
+ dev_err(ipu->dev, "IC output size(%d) cannot exceed 1024\n",
+ outSize);
+ return -EINVAL;
+ }
+
+ if ((outSize << 3) < inSize) {
+ dev_err(ipu->dev, "IC cannot downsize more than 8:1\n");
+ return -EINVAL;
+ }
+
+ /* Compute downsizing coefficient */
+ /* Output of downsizing unit cannot be more than 1024 */
+ tempDownsize = 0;
+ tempSize = inSize;
+ while (((tempSize > 1024) || (tempSize >= outSize * 2)) &&
+ (tempDownsize < 2)) {
+ tempSize >>= 1;
+ tempDownsize++;
+ }
+ *downsizeCoeff = tempDownsize;
+
+ /* compute resizing coefficient using the following equation:
+ resizeCoeff = M*(SI -1)/(SO - 1)
+ where M = 2^13, SI - input size, SO - output size */
+ *resizeCoeff = (8192L * (tempSize - 1)) / (outSize - 1);
+ if (*resizeCoeff >= 16384L) {
+ dev_err(ipu->dev, "Overflow on IC resize coefficient.\n");
+ return -EINVAL;
+ }
+
+ dev_dbg(ipu->dev, "resizing from %u -> %u pixels, "
+ "downsize=%u, resize=%u.%lu (reg=%u)\n", inSize, outSize,
+ *downsizeCoeff, (*resizeCoeff >= 8192L) ? 1 : 0,
+ ((*resizeCoeff & 0x1FFF) * 10000L) / 8192L, *resizeCoeff);
+
+ return 0;
+}
+
+void _ipu_vdi_toggle_top_field_man(struct ipu_soc *ipu)
+{
+ uint32_t reg;
+ uint32_t mask_reg;
+
+ reg = ipu_vdi_read(ipu, VDI_C);
+ mask_reg = reg & VDI_C_TOP_FIELD_MAN_1;
+ if (mask_reg == VDI_C_TOP_FIELD_MAN_1)
+ reg &= ~VDI_C_TOP_FIELD_MAN_1;
+ else
+ reg |= VDI_C_TOP_FIELD_MAN_1;
+
+ ipu_vdi_write(ipu, reg, VDI_C);
+}
diff --git a/drivers/mxc/ipu3/ipu_param_mem.h b/drivers/mxc/ipu3/ipu_param_mem.h
new file mode 100644
index 000000000000..020f75ece50e
--- /dev/null
+++ b/drivers/mxc/ipu3/ipu_param_mem.h
@@ -0,0 +1,1002 @@
+/*
+ * Copyright 2005-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#ifndef __INCLUDE_IPU_PARAM_MEM_H__
+#define __INCLUDE_IPU_PARAM_MEM_H__
+
+#include <linux/bitrev.h>
+#include <linux/types.h>
+
+#include "ipu_prv.h"
+
+extern u32 *ipu_cpmem_base;
+
+struct ipu_ch_param_word {
+ uint32_t data[5];
+ uint32_t res[3];
+};
+
+struct ipu_ch_param {
+ struct ipu_ch_param_word word[2];
+};
+
+#define ipu_ch_param_addr(ipu, ch) \
+ (((struct ipu_ch_param *)(ipu)->cpmem_base) + (ch))
+
+#define _param_word(base, w) \
+ (((struct ipu_ch_param *)(base))->word[(w)].data)
+
+#define ipu_ch_param_set_field(base, w, bit, size, v) { \
+ int i = (bit) / 32; \
+ int off = (bit) % 32; \
+ _param_word((base), (w))[i] |= (v) << off; \
+ if (((bit)+(size)-1)/32 > i) { \
+ _param_word((base), (w))[i + 1] |= \
+ (v) >> (off ? (32 - off) : 0); \
+ } \
+}
+
+#define ipu_ch_param_set_field_io(base, w, bit, size, v) { \
+ int i = (bit) / 32; \
+ int off = (bit) % 32; \
+ unsigned reg_offset; \
+ u32 temp; \
+ reg_offset = sizeof(struct ipu_ch_param_word) * (w) / 4; \
+ reg_offset += i; \
+ temp = readl((u32 *)(base) + reg_offset); \
+ temp |= (v) << off; \
+ writel(temp, (u32 *)(base) + reg_offset); \
+ if (((bit)+(size)-1)/32 > i) { \
+ reg_offset++; \
+ temp = readl((u32 *)(base) + reg_offset); \
+ temp |= (v) >> (off ? (32 - off) : 0); \
+ writel(temp, (u32 *)(base) + reg_offset); \
+ } \
+}
+
+#define ipu_ch_param_mod_field(base, w, bit, size, v) { \
+ int i = (bit) / 32; \
+ int off = (bit) % 32; \
+ u32 mask = (1UL << (size)) - 1; \
+ u32 temp = _param_word((base), (w))[i]; \
+ temp &= ~(mask << off); \
+ _param_word((base), (w))[i] = temp | (v) << off; \
+ if (((bit)+(size)-1)/32 > i) { \
+ temp = _param_word((base), (w))[i + 1]; \
+ temp &= ~(mask >> (32 - off)); \
+ _param_word((base), (w))[i + 1] = \
+ temp | ((v) >> (off ? (32 - off) : 0)); \
+ } \
+}
+
+#define ipu_ch_param_mod_field_io(base, w, bit, size, v) { \
+ int i = (bit) / 32; \
+ int off = (bit) % 32; \
+ u32 mask = (1UL << (size)) - 1; \
+ unsigned reg_offset; \
+ u32 temp; \
+ reg_offset = sizeof(struct ipu_ch_param_word) * (w) / 4; \
+ reg_offset += i; \
+ temp = readl((u32 *)(base) + reg_offset); \
+ temp &= ~(mask << off); \
+ temp |= (v) << off; \
+ writel(temp, (u32 *)(base) + reg_offset); \
+ if (((bit)+(size)-1)/32 > i) { \
+ reg_offset++; \
+ temp = readl((u32 *)(base) + reg_offset); \
+ temp &= ~(mask >> (32 - off)); \
+ temp |= ((v) >> (off ? (32 - off) : 0)); \
+ writel(temp, (u32 *)(base) + reg_offset); \
+ } \
+}
+
+#define ipu_ch_param_read_field(base, w, bit, size) ({ \
+ u32 temp2; \
+ int i = (bit) / 32; \
+ int off = (bit) % 32; \
+ u32 mask = (1UL << (size)) - 1; \
+ u32 temp1 = _param_word((base), (w))[i]; \
+ temp1 = mask & (temp1 >> off); \
+ if (((bit)+(size)-1)/32 > i) { \
+ temp2 = _param_word((base), (w))[i + 1]; \
+ temp2 &= mask >> (off ? (32 - off) : 0); \
+ temp1 |= temp2 << (off ? (32 - off) : 0); \
+ } \
+ temp1; \
+})
+
+#define ipu_ch_param_read_field_io(base, w, bit, size) ({ \
+ u32 temp1, temp2; \
+ int i = (bit) / 32; \
+ int off = (bit) % 32; \
+ u32 mask = (1UL << (size)) - 1; \
+ unsigned reg_offset; \
+ reg_offset = sizeof(struct ipu_ch_param_word) * (w) / 4; \
+ reg_offset += i; \
+ temp1 = readl((u32 *)(base) + reg_offset); \
+ temp1 = mask & (temp1 >> off); \
+ if (((bit)+(size)-1)/32 > i) { \
+ reg_offset++; \
+ temp2 = readl((u32 *)(base) + reg_offset); \
+ temp2 &= mask >> (off ? (32 - off) : 0); \
+ temp1 |= temp2 << (off ? (32 - off) : 0); \
+ } \
+ temp1; \
+})
+
+static inline int __ipu_ch_get_third_buf_cpmem_num(int ch)
+{
+ switch (ch) {
+ case 8:
+ return 64;
+ case 9:
+ return 65;
+ case 10:
+ return 66;
+ case 13:
+ return 67;
+ case 21:
+ return 68;
+ case 23:
+ return 69;
+ case 27:
+ return 70;
+ case 28:
+ return 71;
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static inline void _ipu_ch_params_set_packing(struct ipu_ch_param *p,
+ int red_width, int red_offset,
+ int green_width, int green_offset,
+ int blue_width, int blue_offset,
+ int alpha_width, int alpha_offset)
+{
+ /* Setup red width and offset */
+ ipu_ch_param_set_field(p, 1, 116, 3, red_width - 1);
+ ipu_ch_param_set_field(p, 1, 128, 5, red_offset);
+ /* Setup green width and offset */
+ ipu_ch_param_set_field(p, 1, 119, 3, green_width - 1);
+ ipu_ch_param_set_field(p, 1, 133, 5, green_offset);
+ /* Setup blue width and offset */
+ ipu_ch_param_set_field(p, 1, 122, 3, blue_width - 1);
+ ipu_ch_param_set_field(p, 1, 138, 5, blue_offset);
+ /* Setup alpha width and offset */
+ ipu_ch_param_set_field(p, 1, 125, 3, alpha_width - 1);
+ ipu_ch_param_set_field(p, 1, 143, 5, alpha_offset);
+}
+
+static inline void _ipu_ch_param_dump(struct ipu_soc *ipu, int ch)
+{
+ struct ipu_ch_param *p = ipu_ch_param_addr(ipu, ch);
+ dev_dbg(ipu->dev, "ch %d word 0 - %08X %08X %08X %08X %08X\n", ch,
+ p->word[0].data[0], p->word[0].data[1], p->word[0].data[2],
+ p->word[0].data[3], p->word[0].data[4]);
+ dev_dbg(ipu->dev, "ch %d word 1 - %08X %08X %08X %08X %08X\n", ch,
+ p->word[1].data[0], p->word[1].data[1], p->word[1].data[2],
+ p->word[1].data[3], p->word[1].data[4]);
+ dev_dbg(ipu->dev, "PFS 0x%x, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 85, 4));
+ dev_dbg(ipu->dev, "BPP 0x%x, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 0, 107, 3));
+ dev_dbg(ipu->dev, "NPB 0x%x\n",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 78, 7));
+
+ dev_dbg(ipu->dev, "FW %d, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 0, 125, 13));
+ dev_dbg(ipu->dev, "FH %d, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 0, 138, 12));
+ dev_dbg(ipu->dev, "EBA0 0x%x\n",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 0, 29) << 3);
+ dev_dbg(ipu->dev, "EBA1 0x%x\n",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 29, 29) << 3);
+ dev_dbg(ipu->dev, "Stride %d\n",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 102, 14));
+ dev_dbg(ipu->dev, "scan_order %d\n",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 0, 113, 1));
+ dev_dbg(ipu->dev, "uv_stride %d\n",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 128, 14));
+ dev_dbg(ipu->dev, "u_offset 0x%x\n",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 0, 46, 22) << 3);
+ dev_dbg(ipu->dev, "v_offset 0x%x\n",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 0, 68, 22) << 3);
+
+ dev_dbg(ipu->dev, "Width0 %d+1, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 116, 3));
+ dev_dbg(ipu->dev, "Width1 %d+1, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 119, 3));
+ dev_dbg(ipu->dev, "Width2 %d+1, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 122, 3));
+ dev_dbg(ipu->dev, "Width3 %d+1, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 125, 3));
+ dev_dbg(ipu->dev, "Offset0 %d, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 128, 5));
+ dev_dbg(ipu->dev, "Offset1 %d, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 133, 5));
+ dev_dbg(ipu->dev, "Offset2 %d, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 138, 5));
+ dev_dbg(ipu->dev, "Offset3 %d\n",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 143, 5));
+}
+
+static inline void fill_cpmem(struct ipu_soc *ipu, int ch, struct ipu_ch_param *params)
+{
+ int i, w;
+ void *addr = ipu_ch_param_addr(ipu, ch);
+
+ /* 2 words, 5 valid data */
+ for (w = 0; w < 2; w++) {
+ for (i = 0; i < 5; i++) {
+ writel(params->word[w].data[i], addr);
+ addr += 4;
+ }
+ addr += 12;
+ }
+}
+
+static inline void _ipu_ch_param_init(struct ipu_soc *ipu, int ch,
+ uint32_t pixel_fmt, uint32_t width,
+ uint32_t height, uint32_t stride,
+ uint32_t u, uint32_t v,
+ uint32_t uv_stride, dma_addr_t addr0,
+ dma_addr_t addr1, dma_addr_t addr2)
+{
+ uint32_t u_offset = 0;
+ uint32_t v_offset = 0;
+ uint32_t bs = 0;
+ int32_t sub_ch = 0;
+ struct ipu_ch_param params;
+
+ memset(&params, 0, sizeof(params));
+
+ ipu_ch_param_set_field(&params, 0, 125, 13, width - 1);
+
+ if (((ch == 8) || (ch == 9) || (ch == 10)) && !ipu->vdoa_en) {
+ ipu_ch_param_set_field(&params, 0, 138, 12, (height / 2) - 1);
+ ipu_ch_param_set_field(&params, 1, 102, 14, (stride * 2) - 1);
+ } else {
+ /* note: for vdoa+vdi- ch8/9/10, always use band mode */
+ ipu_ch_param_set_field(&params, 0, 138, 12, height - 1);
+ ipu_ch_param_set_field(&params, 1, 102, 14, stride - 1);
+ }
+
+ /* EBA is 8-byte aligned */
+ ipu_ch_param_set_field(&params, 1, 0, 29, addr0 >> 3);
+ ipu_ch_param_set_field(&params, 1, 29, 29, addr1 >> 3);
+ if (addr0%8)
+ dev_warn(ipu->dev,
+ "IDMAC%d's EBA0 is not 8-byte aligned\n", ch);
+ if (addr1%8)
+ dev_warn(ipu->dev,
+ "IDMAC%d's EBA1 is not 8-byte aligned\n", ch);
+
+ switch (pixel_fmt) {
+ case IPU_PIX_FMT_GENERIC:
+ /*Represents 8-bit Generic data */
+ ipu_ch_param_set_field(&params, 0, 107, 3, 5); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 6); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 63); /* burst size */
+
+ break;
+ case IPU_PIX_FMT_GENERIC_16:
+ /* Represents 16-bit generic data */
+ ipu_ch_param_set_field(&params, 0, 107, 3, 3); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 6); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+
+ break;
+ case IPU_PIX_FMT_GENERIC_32:
+ /*Represents 32-bit Generic data */
+ break;
+ case IPU_PIX_FMT_RGB565:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 3); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 7); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+
+ _ipu_ch_params_set_packing(&params, 5, 0, 6, 5, 5, 11, 8, 16);
+ break;
+ case IPU_PIX_FMT_BGRA4444:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 3); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 7); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+
+ _ipu_ch_params_set_packing(&params, 4, 4, 4, 8, 4, 12, 4, 0);
+ break;
+ case IPU_PIX_FMT_BGRA5551:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 3); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 7); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+
+ _ipu_ch_params_set_packing(&params, 5, 1, 5, 6, 5, 11, 1, 0);
+ break;
+ case IPU_PIX_FMT_BGR24:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 1); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 7); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 19); /* burst size */
+
+ _ipu_ch_params_set_packing(&params, 8, 0, 8, 8, 8, 16, 8, 24);
+ break;
+ case IPU_PIX_FMT_RGB24:
+ case IPU_PIX_FMT_YUV444:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 1); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 7); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 19); /* burst size */
+
+ _ipu_ch_params_set_packing(&params, 8, 16, 8, 8, 8, 0, 8, 24);
+ break;
+ case IPU_PIX_FMT_VYU444:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 1); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 7); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 19); /* burst size */
+
+ _ipu_ch_params_set_packing(&params, 8, 8, 8, 0, 8, 16, 8, 24);
+ break;
+ case IPU_PIX_FMT_AYUV:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 0); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 7); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 15); /* burst size */
+
+ _ipu_ch_params_set_packing(&params, 8, 8, 8, 16, 8, 24, 8, 0);
+ break;
+ case IPU_PIX_FMT_BGRA32:
+ case IPU_PIX_FMT_BGR32:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 0); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 7); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 15); /* burst size */
+
+ _ipu_ch_params_set_packing(&params, 8, 8, 8, 16, 8, 24, 8, 0);
+ break;
+ case IPU_PIX_FMT_RGBA32:
+ case IPU_PIX_FMT_RGB32:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 0); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 7); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 15); /* burst size */
+
+ _ipu_ch_params_set_packing(&params, 8, 24, 8, 16, 8, 8, 8, 0);
+ break;
+ case IPU_PIX_FMT_ABGR32:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 0); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 7); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 15); /* burst size */
+
+ _ipu_ch_params_set_packing(&params, 8, 0, 8, 8, 8, 16, 8, 24);
+ break;
+ case IPU_PIX_FMT_UYVY:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 3); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 0xA); /* pix format */
+ if ((ch == 8) || (ch == 9) || (ch == 10)) {
+ ipu_ch_param_set_field(&params, 1, 78, 7, 15); /* burst size */
+ } else {
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+ }
+ break;
+ case IPU_PIX_FMT_YUYV:
+ ipu_ch_param_set_field(&params, 0, 107, 3, 3); /* bits/pixel */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 0x8); /* pix format */
+ if ((ch == 8) || (ch == 9) || (ch == 10)) {
+ if (ipu->vdoa_en) {
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31);
+ } else {
+ ipu_ch_param_set_field(&params, 1, 78, 7, 15);
+ }
+ } else {
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+ }
+ break;
+ case IPU_PIX_FMT_YUV420P2:
+ case IPU_PIX_FMT_YUV420P:
+ ipu_ch_param_set_field(&params, 1, 85, 4, 2); /* pix format */
+
+ if (uv_stride < stride / 2)
+ uv_stride = stride / 2;
+
+ u_offset = stride * height;
+ v_offset = u_offset + (uv_stride * height / 2);
+ if ((ch == 8) || (ch == 9) || (ch == 10)) {
+ ipu_ch_param_set_field(&params, 1, 78, 7, 15); /* burst size */
+ uv_stride = uv_stride*2;
+ } else {
+ if (_ipu_is_smfc_chan(ch) &&
+ ipu->smfc_idmac_12bit_3planar_bs_fixup)
+ bs = 15;
+ else
+ bs = 31;
+ ipu_ch_param_set_field(&params, 1, 78, 7, bs); /* burst size */
+ }
+ break;
+ case IPU_PIX_FMT_YVU420P:
+ ipu_ch_param_set_field(&params, 1, 85, 4, 2); /* pix format */
+
+ if (uv_stride < stride / 2)
+ uv_stride = stride / 2;
+
+ v_offset = stride * height;
+ u_offset = v_offset + (uv_stride * height / 2);
+ if ((ch == 8) || (ch == 9) || (ch == 10)) {
+ ipu_ch_param_set_field(&params, 1, 78, 7, 15); /* burst size */
+ uv_stride = uv_stride*2;
+ } else {
+ if (_ipu_is_smfc_chan(ch) &&
+ ipu->smfc_idmac_12bit_3planar_bs_fixup)
+ bs = 15;
+ else
+ bs = 31;
+ ipu_ch_param_set_field(&params, 1, 78, 7, bs); /* burst size */
+ }
+ break;
+ case IPU_PIX_FMT_YVU422P:
+ /* BPP & pixel format */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 1); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+
+ if (uv_stride < stride / 2)
+ uv_stride = stride / 2;
+
+ v_offset = (v == 0) ? stride * height : v;
+ u_offset = (u == 0) ? v_offset + v_offset / 2 : u;
+ break;
+ case IPU_PIX_FMT_YUV422P:
+ /* BPP & pixel format */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 1); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+
+ if (uv_stride < stride / 2)
+ uv_stride = stride / 2;
+
+ u_offset = (u == 0) ? stride * height : u;
+ v_offset = (v == 0) ? u_offset + u_offset / 2 : v;
+ break;
+ case IPU_PIX_FMT_YUV444P:
+ /* BPP & pixel format */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 0); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+ uv_stride = stride;
+ u_offset = (u == 0) ? stride * height : u;
+ v_offset = (v == 0) ? u_offset * 2 : v;
+ break;
+ case IPU_PIX_FMT_NV16:
+ ipu_ch_param_set_field(&params, 1, 85, 4, 1); /* pix format */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+ uv_stride = stride;
+ u_offset = (u == 0) ? stride * height : u;
+ break;
+ case IPU_PIX_FMT_NV12:
+ /* BPP & pixel format */
+ ipu_ch_param_set_field(&params, 1, 85, 4, 4); /* pix format */
+ uv_stride = stride;
+ u_offset = (u == 0) ? stride * height : u;
+ if ((ch == 8) || (ch == 9) || (ch == 10)) {
+ if (ipu->vdoa_en) {
+ /* one field buffer, memory width 64bits */
+ ipu_ch_param_set_field(&params, 1, 78, 7, 63);
+ } else {
+ ipu_ch_param_set_field(&params, 1, 78, 7, 15);
+ /* top/bottom field in one buffer*/
+ uv_stride = uv_stride*2;
+ }
+ } else {
+ ipu_ch_param_set_field(&params, 1, 78, 7, 31); /* burst size */
+ }
+ break;
+ default:
+ dev_err(ipu->dev, "mxc ipu: unimplemented pixel format\n");
+ break;
+ }
+ /*set burst size to 16*/
+
+
+ if (uv_stride)
+ ipu_ch_param_set_field(&params, 1, 128, 14, uv_stride - 1);
+
+ /* Get the uv offset from user when need cropping */
+ if (u || v) {
+ u_offset = u;
+ v_offset = v;
+ }
+
+ /* UBO and VBO are 22-bit and 8-byte aligned */
+ if (u_offset/8 > 0x3fffff)
+ dev_warn(ipu->dev,
+ "IDMAC%d's U offset exceeds IPU limitation\n", ch);
+ if (v_offset/8 > 0x3fffff)
+ dev_warn(ipu->dev,
+ "IDMAC%d's V offset exceeds IPU limitation\n", ch);
+ if (u_offset%8)
+ dev_warn(ipu->dev,
+ "IDMAC%d's U offset is not 8-byte aligned\n", ch);
+ if (v_offset%8)
+ dev_warn(ipu->dev,
+ "IDMAC%d's V offset is not 8-byte aligned\n", ch);
+
+ ipu_ch_param_set_field(&params, 0, 46, 22, u_offset / 8);
+ ipu_ch_param_set_field(&params, 0, 68, 22, v_offset / 8);
+
+ dev_dbg(ipu->dev, "initializing idma ch %d @ %p\n", ch, ipu_ch_param_addr(ipu, ch));
+ fill_cpmem(ipu, ch, &params);
+ if (addr2) {
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+
+ ipu_ch_param_set_field(&params, 1, 0, 29, addr2 >> 3);
+ ipu_ch_param_set_field(&params, 1, 29, 29, 0);
+ if (addr2%8)
+ dev_warn(ipu->dev,
+ "IDMAC%d's sub-CPMEM entry%d EBA0 is not "
+ "8-byte aligned\n", ch, sub_ch);
+
+ dev_dbg(ipu->dev, "initializing idma ch %d @ %p sub cpmem\n", ch,
+ ipu_ch_param_addr(ipu, sub_ch));
+ fill_cpmem(ipu, sub_ch, &params);
+ }
+};
+
+static inline void _ipu_ch_param_set_burst_size(struct ipu_soc *ipu,
+ uint32_t ch,
+ uint16_t burst_pixels)
+{
+ int32_t sub_ch = 0;
+
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 1, 78, 7,
+ burst_pixels - 1);
+
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 1, 78, 7,
+ burst_pixels - 1);
+};
+
+static inline int _ipu_ch_param_get_burst_size(struct ipu_soc *ipu, uint32_t ch)
+{
+ return ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 78, 7) + 1;
+};
+
+static inline int _ipu_ch_param_get_bpp(struct ipu_soc *ipu, uint32_t ch)
+{
+ return ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 0, 107, 3);
+};
+
+static inline void _ipu_ch_param_set_buffer(struct ipu_soc *ipu, uint32_t ch,
+ int bufNum, dma_addr_t phyaddr)
+{
+ if (bufNum == 2) {
+ ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (ch <= 0)
+ return;
+ bufNum = 0;
+ }
+
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 1, 29 * bufNum, 29,
+ phyaddr / 8);
+};
+
+static inline void _ipu_ch_param_set_rotation(struct ipu_soc *ipu, uint32_t ch,
+ ipu_rotate_mode_t rot)
+{
+ u32 temp_rot = bitrev8(rot) >> 5;
+ int32_t sub_ch = 0;
+
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 0, 119, 3, temp_rot);
+
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 0, 119, 3, temp_rot);
+};
+
+static inline void _ipu_ch_param_set_block_mode(struct ipu_soc *ipu, uint32_t ch)
+{
+ int32_t sub_ch = 0;
+
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 0, 117, 2, 1);
+
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 0, 117, 2, 1);
+};
+
+static inline void _ipu_ch_param_set_alpha_use_separate_channel(struct ipu_soc *ipu,
+ uint32_t ch,
+ bool option)
+{
+ int32_t sub_ch = 0;
+
+ if (option) {
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 1, 89, 1, 1);
+ } else {
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 1, 89, 1, 0);
+ }
+
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+
+ if (option) {
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 1, 89, 1, 1);
+ } else {
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 1, 89, 1, 0);
+ }
+};
+
+static inline void _ipu_ch_param_set_alpha_condition_read(struct ipu_soc *ipu, uint32_t ch)
+{
+ int32_t sub_ch = 0;
+
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 1, 149, 1, 1);
+
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 1, 149, 1, 1);
+};
+
+static inline void _ipu_ch_param_set_alpha_buffer_memory(struct ipu_soc *ipu, uint32_t ch)
+{
+ int alp_mem_idx;
+ int32_t sub_ch = 0;
+
+ switch (ch) {
+ case 14: /* PRP graphic */
+ alp_mem_idx = 0;
+ break;
+ case 15: /* PP graphic */
+ alp_mem_idx = 1;
+ break;
+ case 23: /* DP BG SYNC graphic */
+ alp_mem_idx = 4;
+ break;
+ case 27: /* DP FG SYNC graphic */
+ alp_mem_idx = 2;
+ break;
+ default:
+ dev_err(ipu->dev, "unsupported correlative channel of local "
+ "alpha channel\n");
+ return;
+ }
+
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 1, 90, 3, alp_mem_idx);
+
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 1, 90, 3, alp_mem_idx);
+};
+
+static inline void _ipu_ch_param_set_interlaced_scan(struct ipu_soc *ipu, uint32_t ch)
+{
+ u32 stride;
+ int32_t sub_ch = 0;
+
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+
+ ipu_ch_param_set_field_io(ipu_ch_param_addr(ipu, ch), 0, 113, 1, 1);
+ if (sub_ch > 0)
+ ipu_ch_param_set_field_io(ipu_ch_param_addr(ipu, sub_ch), 0, 113, 1, 1);
+ stride = ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 102, 14) + 1;
+ /* ILO is 20-bit and 8-byte aligned */
+ if (stride/8 > 0xfffff)
+ dev_warn(ipu->dev,
+ "IDMAC%d's ILO exceeds IPU limitation\n", ch);
+ if (stride%8)
+ dev_warn(ipu->dev,
+ "IDMAC%d's ILO is not 8-byte aligned\n", ch);
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 1, 58, 20, stride / 8);
+ if (sub_ch > 0)
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 1, 58, 20,
+ stride / 8);
+ stride *= 2;
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 1, 102, 14, stride - 1);
+ if (sub_ch > 0)
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 1, 102, 14,
+ stride - 1);
+};
+
+static inline void _ipu_ch_param_set_axi_id(struct ipu_soc *ipu, uint32_t ch, uint32_t id)
+{
+ int32_t sub_ch = 0;
+
+ id %= 4;
+
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 1, 93, 2, id);
+
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 1, 93, 2, id);
+};
+
+static inline int _ipu_ch_param_get_axi_id(struct ipu_soc *ipu, uint32_t ch)
+{
+ return ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 1, 93, 2);
+}
+
+static inline int __ipu_ch_offset_calc(uint32_t pixel_fmt,
+ uint32_t width,
+ uint32_t height,
+ uint32_t stride,
+ uint32_t u,
+ uint32_t v,
+ uint32_t uv_stride,
+ uint32_t vertical_offset,
+ uint32_t horizontal_offset,
+ uint32_t *u_offset,
+ uint32_t *v_offset)
+{
+ uint32_t u_fix = 0;
+ uint32_t v_fix = 0;
+
+ switch (pixel_fmt) {
+ case IPU_PIX_FMT_GENERIC:
+ case IPU_PIX_FMT_GENERIC_16:
+ case IPU_PIX_FMT_GENERIC_32:
+ case IPU_PIX_FMT_RGB565:
+ case IPU_PIX_FMT_BGRA4444:
+ case IPU_PIX_FMT_BGRA5551:
+ case IPU_PIX_FMT_BGR24:
+ case IPU_PIX_FMT_RGB24:
+ case IPU_PIX_FMT_YUV444:
+ case IPU_PIX_FMT_AYUV:
+ case IPU_PIX_FMT_BGRA32:
+ case IPU_PIX_FMT_BGR32:
+ case IPU_PIX_FMT_RGBA32:
+ case IPU_PIX_FMT_RGB32:
+ case IPU_PIX_FMT_ABGR32:
+ case IPU_PIX_FMT_UYVY:
+ case IPU_PIX_FMT_YUYV:
+ case IPU_PIX_FMT_GPU32_SB_ST:
+ case IPU_PIX_FMT_GPU32_SB_SRT:
+ case IPU_PIX_FMT_GPU32_ST:
+ case IPU_PIX_FMT_GPU32_SRT:
+ case IPU_PIX_FMT_GPU16_SB_ST:
+ case IPU_PIX_FMT_GPU16_SB_SRT:
+ case IPU_PIX_FMT_GPU16_ST:
+ case IPU_PIX_FMT_GPU16_SRT:
+ *u_offset = 0;
+ *v_offset = 0;
+ break;
+ case IPU_PIX_FMT_YUV420P2:
+ case IPU_PIX_FMT_YUV420P:
+ if (uv_stride < stride / 2)
+ uv_stride = stride / 2;
+
+ *u_offset = stride * (height - vertical_offset - 1) +
+ (stride - horizontal_offset) +
+ (uv_stride * vertical_offset / 2) +
+ horizontal_offset / 2;
+ *v_offset = *u_offset + (uv_stride * height / 2);
+ u_fix = u ? (u + (uv_stride * vertical_offset / 2) +
+ (horizontal_offset / 2) -
+ (stride * vertical_offset) - (horizontal_offset)) :
+ *u_offset;
+ v_fix = v ? (v + (uv_stride * vertical_offset / 2) +
+ (horizontal_offset / 2) -
+ (stride * vertical_offset) - (horizontal_offset)) :
+ *v_offset;
+ break;
+ case IPU_PIX_FMT_YVU420P:
+ if (uv_stride < stride / 2)
+ uv_stride = stride / 2;
+
+ *v_offset = stride * (height - vertical_offset - 1) +
+ (stride - horizontal_offset) +
+ (uv_stride * vertical_offset / 2) +
+ horizontal_offset / 2;
+ *u_offset = *v_offset + (uv_stride * height / 2);
+ u_fix = u ? (u + (uv_stride * vertical_offset / 2) +
+ (horizontal_offset / 2) -
+ (stride * vertical_offset) - (horizontal_offset)) :
+ *u_offset;
+ v_fix = v ? (v + (uv_stride * vertical_offset / 2) +
+ (horizontal_offset / 2) -
+ (stride * vertical_offset) - (horizontal_offset)) :
+ *v_offset;
+ break;
+ case IPU_PIX_FMT_YVU422P:
+ if (uv_stride < stride / 2)
+ uv_stride = stride / 2;
+
+ *v_offset = stride * (height - vertical_offset - 1) +
+ (stride - horizontal_offset) +
+ (uv_stride * vertical_offset) +
+ horizontal_offset / 2;
+ *u_offset = *v_offset + uv_stride * height;
+ u_fix = u ? (u + (uv_stride * vertical_offset) +
+ horizontal_offset / 2 -
+ (stride * vertical_offset) - (horizontal_offset)) :
+ *u_offset;
+ v_fix = v ? (v + (uv_stride * vertical_offset) +
+ horizontal_offset / 2 -
+ (stride * vertical_offset) - (horizontal_offset)) :
+ *v_offset;
+ break;
+ case IPU_PIX_FMT_YUV422P:
+ if (uv_stride < stride / 2)
+ uv_stride = stride / 2;
+
+ *u_offset = stride * (height - vertical_offset - 1) +
+ (stride - horizontal_offset) +
+ (uv_stride * vertical_offset) +
+ horizontal_offset / 2;
+ *v_offset = *u_offset + uv_stride * height;
+ u_fix = u ? (u + (uv_stride * vertical_offset) +
+ horizontal_offset / 2 -
+ (stride * vertical_offset) - (horizontal_offset)) :
+ *u_offset;
+ v_fix = v ? (v + (uv_stride * vertical_offset) +
+ horizontal_offset / 2 -
+ (stride * vertical_offset) - (horizontal_offset)) :
+ *v_offset;
+ break;
+ case IPU_PIX_FMT_YUV444P:
+ uv_stride = stride;
+ *u_offset = stride * (height - vertical_offset - 1) +
+ (stride - horizontal_offset) +
+ (uv_stride * vertical_offset) +
+ horizontal_offset;
+ *v_offset = *u_offset + uv_stride * height;
+ u_fix = u ? (u + (uv_stride * vertical_offset) +
+ horizontal_offset -
+ (stride * vertical_offset) -
+ (horizontal_offset)) :
+ *u_offset;
+ v_fix = v ? (v + (uv_stride * vertical_offset) +
+ horizontal_offset -
+ (stride * vertical_offset) -
+ (horizontal_offset)) :
+ *v_offset;
+ break;
+ case IPU_PIX_FMT_NV12:
+ case IPU_PIX_FMT_NV16:
+ case PRE_PIX_FMT_NV21:
+ case PRE_PIX_FMT_NV61:
+ uv_stride = stride;
+ *u_offset = stride * (height - vertical_offset - 1) +
+ (stride - horizontal_offset) +
+ (uv_stride * vertical_offset / 2) +
+ horizontal_offset;
+ *v_offset = 0;
+ u_fix = u ? (u + (uv_stride * vertical_offset / 2) +
+ horizontal_offset -
+ (stride * vertical_offset) - (horizontal_offset)) :
+ *u_offset;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (u_fix > *u_offset)
+ *u_offset = u_fix;
+
+ if (v_fix > *v_offset)
+ *v_offset = v_fix;
+
+ return 0;
+}
+
+/* IDMAC U/V offset changing support */
+/* U and V input is not affected, */
+/* the update is done by new calculation according to */
+/* vertical_offset and horizontal_offset */
+static inline void _ipu_ch_offset_update(struct ipu_soc *ipu,
+ int ch,
+ uint32_t pixel_fmt,
+ uint32_t width,
+ uint32_t height,
+ uint32_t stride,
+ uint32_t u,
+ uint32_t v,
+ uint32_t uv_stride,
+ uint32_t vertical_offset,
+ uint32_t horizontal_offset)
+{
+ uint32_t u_offset = 0;
+ uint32_t v_offset = 0;
+ uint32_t old_offset = 0;
+ int32_t sub_ch = 0;
+ int ret;
+
+ ret = __ipu_ch_offset_calc(pixel_fmt, width, height, stride,
+ u, v, uv_stride,
+ vertical_offset, horizontal_offset,
+ &u_offset, &v_offset);
+ if (ret) {
+ dev_err(ipu->dev, "mxc ipu: unimplemented pixel format\n");
+ return;
+ }
+
+ /* UBO and VBO are 22-bit and 8-byte aligned */
+ if (u_offset/8 > 0x3fffff)
+ dev_warn(ipu->dev,
+ "IDMAC%d's U offset exceeds IPU limitation\n", ch);
+ if (v_offset/8 > 0x3fffff)
+ dev_warn(ipu->dev,
+ "IDMAC%d's V offset exceeds IPU limitation\n", ch);
+ if (u_offset%8)
+ dev_warn(ipu->dev,
+ "IDMAC%d's U offset is not 8-byte aligned\n", ch);
+ if (v_offset%8)
+ dev_warn(ipu->dev,
+ "IDMAC%d's V offset is not 8-byte aligned\n", ch);
+
+ old_offset = ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 0, 46, 22);
+ if (old_offset != u_offset / 8)
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 0, 46, 22, u_offset / 8);
+ old_offset = ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 0, 68, 22);
+ if (old_offset != v_offset / 8)
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, ch), 0, 68, 22, v_offset / 8);
+
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+ old_offset = ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, sub_ch), 0, 46, 22);
+ if (old_offset != u_offset / 8)
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 0, 46, 22, u_offset / 8);
+ old_offset = ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, sub_ch), 0, 68, 22);
+ if (old_offset != v_offset / 8)
+ ipu_ch_param_mod_field_io(ipu_ch_param_addr(ipu, sub_ch), 0, 68, 22, v_offset / 8);
+};
+
+static inline void _ipu_ch_params_set_alpha_width(struct ipu_soc *ipu, uint32_t ch, int alpha_width)
+{
+ int32_t sub_ch = 0;
+
+ ipu_ch_param_set_field_io(ipu_ch_param_addr(ipu, ch), 1, 125, 3, alpha_width - 1);
+
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+ ipu_ch_param_set_field_io(ipu_ch_param_addr(ipu, sub_ch), 1, 125, 3, alpha_width - 1);
+};
+
+static inline void _ipu_ch_param_set_bandmode(struct ipu_soc *ipu,
+ uint32_t ch, uint32_t band_height)
+{
+ int32_t sub_ch = 0;
+
+ ipu_ch_param_set_field_io(ipu_ch_param_addr(ipu, ch),
+ 0, 114, 3, band_height - 1);
+ sub_ch = __ipu_ch_get_third_buf_cpmem_num(ch);
+ if (sub_ch <= 0)
+ return;
+ ipu_ch_param_set_field_io(ipu_ch_param_addr(ipu, sub_ch),
+ 0, 114, 3, band_height - 1);
+
+ dev_dbg(ipu->dev, "BNDM 0x%x, ",
+ ipu_ch_param_read_field_io(ipu_ch_param_addr(ipu, ch), 0, 114, 3));
+}
+
+/*
+ * The IPUv3 IDMAC has a bug to read 32bpp pixels from a graphics plane
+ * whose alpha component is at the most significant 8 bits. The bug only
+ * impacts on cases in which the relevant separate alpha channel is enabled.
+ *
+ * Return true on bad alpha component position, otherwise, return false.
+ */
+static inline bool _ipu_ch_param_bad_alpha_pos(uint32_t pixel_fmt)
+{
+ switch (pixel_fmt) {
+ case IPU_PIX_FMT_BGRA32:
+ case IPU_PIX_FMT_BGR32:
+ case IPU_PIX_FMT_RGBA32:
+ case IPU_PIX_FMT_RGB32:
+ return true;
+ }
+
+ return false;
+}
+#endif
diff --git a/drivers/mxc/ipu3/ipu_pixel_clk.c b/drivers/mxc/ipu3/ipu_pixel_clk.c
new file mode 100644
index 000000000000..66e73dd6284f
--- /dev/null
+++ b/drivers/mxc/ipu3/ipu_pixel_clk.c
@@ -0,0 +1,317 @@
+/*
+ * Copyright (C) 2013-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file ipu_pixel_clk.c
+ *
+ * @brief IPU pixel clock implementation
+ *
+ * @ingroup IPU
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/ipu-v3.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+
+#include "ipu_prv.h"
+#include "ipu_regs.h"
+
+ /*
+ * muxd clock implementation
+ */
+struct clk_di_mux {
+ struct clk_hw hw;
+ u8 ipu_id;
+ u8 di_id;
+ u8 flags;
+ u8 index;
+};
+#define to_clk_di_mux(_hw) container_of(_hw, struct clk_di_mux, hw)
+
+static int _ipu_pixel_clk_set_parent(struct clk_hw *hw, u8 index)
+{
+ struct clk_di_mux *mux = to_clk_di_mux(hw);
+ struct ipu_soc *ipu = ipu_get_soc(mux->ipu_id);
+ u32 di_gen;
+
+ di_gen = ipu_di_read(ipu, mux->di_id, DI_GENERAL);
+ if (index == 0)
+ /* ipu1_clk or ipu2_clk internal clk */
+ di_gen &= ~DI_GEN_DI_CLK_EXT;
+ else
+ di_gen |= DI_GEN_DI_CLK_EXT;
+
+ ipu_di_write(ipu, mux->di_id, di_gen, DI_GENERAL);
+ mux->index = index;
+ pr_debug("ipu_pixel_clk: di_clk_ext:0x%x, di_gen reg:0x%x.\n",
+ !(di_gen & DI_GEN_DI_CLK_EXT), di_gen);
+ return 0;
+}
+
+static u8 _ipu_pixel_clk_get_parent(struct clk_hw *hw)
+{
+ struct clk_di_mux *mux = to_clk_di_mux(hw);
+
+ return mux->index;
+}
+
+const struct clk_ops clk_mux_di_ops = {
+ .get_parent = _ipu_pixel_clk_get_parent,
+ .set_parent = _ipu_pixel_clk_set_parent,
+};
+
+struct clk *clk_register_mux_pix_clk(struct device *dev, const char *name,
+ const char **parent_names, u8 num_parents, unsigned long flags,
+ u8 ipu_id, u8 di_id, u8 clk_mux_flags)
+{
+ struct clk_di_mux *mux;
+ struct clk *clk;
+ struct clk_init_data init;
+
+ mux = kzalloc(sizeof(struct clk_di_mux), GFP_KERNEL);
+ if (!mux)
+ return ERR_PTR(-ENOMEM);
+
+ init.name = name;
+ init.ops = &clk_mux_di_ops;
+ init.flags = flags;
+ init.parent_names = parent_names;
+ init.num_parents = num_parents;
+
+ mux->ipu_id = ipu_id;
+ mux->di_id = di_id;
+ mux->flags = clk_mux_flags | CLK_SET_RATE_PARENT;
+ mux->hw.init = &init;
+
+ clk = clk_register(dev, &mux->hw);
+ if (IS_ERR(clk))
+ kfree(mux);
+
+ return clk;
+}
+
+/*
+ * Gated clock implementation
+ */
+struct clk_di_div {
+ struct clk_hw hw;
+ u8 ipu_id;
+ u8 di_id;
+ u8 flags;
+};
+#define to_clk_di_div(_hw) container_of(_hw, struct clk_di_div, hw)
+
+static unsigned long _ipu_pixel_clk_div_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct clk_di_div *di_div = to_clk_di_div(hw);
+ struct ipu_soc *ipu = ipu_get_soc(di_div->ipu_id);
+ u32 div;
+ u64 final_rate = (unsigned long long)parent_rate * 16;
+
+ _ipu_get(ipu);
+ div = ipu_di_read(ipu, di_div->di_id, DI_BS_CLKGEN0);
+ _ipu_put(ipu);
+ pr_debug("ipu_di%d read BS_CLKGEN0 div:%d, final_rate:%lld, prate:%ld\n",
+ di_div->di_id, div, final_rate, parent_rate);
+
+ if (div == 0)
+ return 0;
+ do_div(final_rate, div);
+
+ return (unsigned long)final_rate;
+}
+
+static long _ipu_pixel_clk_div_round_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long *parent_clk_rate)
+{
+ u64 div, final_rate;
+ u32 remainder;
+ u64 parent_rate = (unsigned long long)(*parent_clk_rate) * 16;
+
+ /*
+ * Calculate divider
+ * Fractional part is 4 bits,
+ * so simply multiply by 2^4 to get fractional part.
+ */
+ div = parent_rate;
+ remainder = do_div(div, rate);
+ /* Round the divider value */
+ if (remainder > (rate/2))
+ div++;
+ if (div < 0x10) /* Min DI disp clock divider is 1 */
+ div = 0x10;
+ if (div & ~0xFEF)
+ div &= 0xFF8;
+ else {
+ /* Round up divider if it gets us closer to desired pix clk */
+ if ((div & 0xC) == 0xC) {
+ div += 0x10;
+ div &= ~0xF;
+ }
+ }
+ final_rate = parent_rate;
+ do_div(final_rate, div);
+
+ return final_rate;
+}
+
+static int _ipu_pixel_clk_div_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_clk_rate)
+{
+ struct clk_di_div *di_div = to_clk_di_div(hw);
+ struct ipu_soc *ipu = ipu_get_soc(di_div->ipu_id);
+ u64 div, parent_rate;
+ u32 remainder;
+
+ parent_rate = (unsigned long long)parent_clk_rate * 16;
+ div = parent_rate;
+ remainder = do_div(div, rate);
+ /* Round the divider value */
+ if (remainder > (rate/2))
+ div++;
+
+ /* Round up divider if it gets us closer to desired pix clk */
+ if ((div & 0xC) == 0xC) {
+ div += 0x10;
+ div &= ~0xF;
+ }
+ if (div > 0x1000)
+ pr_err("Overflow, di:%d, DI_BS_CLKGEN0 div:0x%x\n",
+ di_div->di_id, (u32)div);
+ _ipu_get(ipu);
+ ipu_di_write(ipu, di_div->di_id, (u32)div, DI_BS_CLKGEN0);
+
+ /* Setup pixel clock timing */
+ /* FIXME: needs to be more flexible */
+ /* Down time is half of period */
+ ipu_di_write(ipu, di_div->di_id, ((u32)div / 16) << 16, DI_BS_CLKGEN1);
+ _ipu_put(ipu);
+
+ return 0;
+}
+
+static struct clk_ops clk_div_ops = {
+ .recalc_rate = _ipu_pixel_clk_div_recalc_rate,
+ .round_rate = _ipu_pixel_clk_div_round_rate,
+ .set_rate = _ipu_pixel_clk_div_set_rate,
+};
+
+struct clk *clk_register_div_pix_clk(struct device *dev, const char *name,
+ const char *parent_name, unsigned long flags,
+ u8 ipu_id, u8 di_id, u8 clk_div_flags)
+{
+ struct clk_di_div *di_div;
+ struct clk *clk;
+ struct clk_init_data init;
+
+ di_div = kzalloc(sizeof(struct clk_di_div), GFP_KERNEL);
+ if (!di_div)
+ return ERR_PTR(-ENOMEM);
+
+ /* struct clk_di_div assignments */
+ di_div->ipu_id = ipu_id;
+ di_div->di_id = di_id;
+ di_div->flags = clk_div_flags;
+
+ init.name = name;
+ init.ops = &clk_div_ops;
+ init.flags = flags | CLK_SET_RATE_PARENT;
+ init.parent_names = parent_name ? &parent_name : NULL;
+ init.num_parents = parent_name ? 1 : 0;
+
+ di_div->hw.init = &init;
+
+ clk = clk_register(dev, &di_div->hw);
+ if (IS_ERR(clk))
+ kfree(di_div);
+
+ return clk;
+}
+
+/*
+ * Gated clock implementation
+ */
+struct clk_di_gate {
+ struct clk_hw hw;
+ u8 ipu_id;
+ u8 di_id;
+ u8 flags;
+};
+#define to_clk_di_gate(_hw) container_of(_hw, struct clk_di_gate, hw)
+
+static int _ipu_pixel_clk_enable(struct clk_hw *hw)
+{
+ struct clk_di_gate *gate = to_clk_di_gate(hw);
+ struct ipu_soc *ipu = ipu_get_soc(gate->ipu_id);
+ u32 disp_gen;
+
+ disp_gen = ipu_cm_read(ipu, IPU_DISP_GEN);
+ disp_gen |= gate->di_id ? DI1_COUNTER_RELEASE : DI0_COUNTER_RELEASE;
+ ipu_cm_write(ipu, disp_gen, IPU_DISP_GEN);
+
+ return 0;
+}
+
+static void _ipu_pixel_clk_disable(struct clk_hw *hw)
+{
+ struct clk_di_gate *gate = to_clk_di_gate(hw);
+ struct ipu_soc *ipu = ipu_get_soc(gate->ipu_id);
+ u32 disp_gen;
+
+ disp_gen = ipu_cm_read(ipu, IPU_DISP_GEN);
+ disp_gen &= gate->di_id ? ~DI1_COUNTER_RELEASE : ~DI0_COUNTER_RELEASE;
+ ipu_cm_write(ipu, disp_gen, IPU_DISP_GEN);
+
+}
+
+
+static struct clk_ops clk_gate_di_ops = {
+ .enable = _ipu_pixel_clk_enable,
+ .disable = _ipu_pixel_clk_disable,
+};
+
+struct clk *clk_register_gate_pix_clk(struct device *dev, const char *name,
+ const char *parent_name, unsigned long flags,
+ u8 ipu_id, u8 di_id, u8 clk_gate_flags)
+{
+ struct clk_di_gate *gate;
+ struct clk *clk;
+ struct clk_init_data init;
+
+ gate = kzalloc(sizeof(struct clk_di_gate), GFP_KERNEL);
+ if (!gate)
+ return ERR_PTR(-ENOMEM);
+
+ gate->ipu_id = ipu_id;
+ gate->di_id = di_id;
+ gate->flags = clk_gate_flags;
+
+ init.name = name;
+ init.ops = &clk_gate_di_ops;
+ init.flags = flags | CLK_SET_RATE_PARENT;
+ init.parent_names = parent_name ? &parent_name : NULL;
+ init.num_parents = parent_name ? 1 : 0;
+
+ gate->hw.init = &init;
+
+ clk = clk_register(dev, &gate->hw);
+ if (IS_ERR(clk))
+ kfree(gate);
+
+ return clk;
+}
diff --git a/drivers/mxc/ipu3/ipu_prv.h b/drivers/mxc/ipu3/ipu_prv.h
new file mode 100644
index 000000000000..0a21d922c127
--- /dev/null
+++ b/drivers/mxc/ipu3/ipu_prv.h
@@ -0,0 +1,369 @@
+/*
+ * Copyright 2005-2016 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#ifndef __INCLUDE_IPU_PRV_H__
+#define __INCLUDE_IPU_PRV_H__
+
+#include <linux/clkdev.h>
+#include <linux/device.h>
+#include <linux/fsl_devices.h>
+#include <linux/interrupt.h>
+#include <linux/ipu-v3.h>
+#include <linux/types.h>
+
+#define MXC_IPU_MAX_NUM 2
+#define MXC_DI_NUM_PER_IPU 2
+
+/* Globals */
+extern int dmfc_type_setup;
+
+#define IDMA_CHAN_INVALID 0xFF
+#define HIGH_RESOLUTION_WIDTH 1024
+
+enum ipuv3_type {
+ IPUv3D, /* i.MX37 */
+ IPUv3EX, /* i.MX51 */
+ IPUv3M, /* i.MX53 */
+ IPUv3H, /* i.MX6Q/SDL */
+};
+
+#define IPU_MAX_VDI_IN_WIDTH(type) ({ (type) >= IPUv3M ? 968 : 720; })
+
+struct ipu_irq_node {
+ irqreturn_t(*handler) (int, void *); /*!< the ISR */
+ const char *name; /*!< device associated with the interrupt */
+ void *dev_id; /*!< some unique information for the ISR */
+ __u32 flags; /*!< not used */
+};
+
+enum csc_type_t {
+ RGB2YUV = 0,
+ YUV2RGB,
+ RGB2RGB,
+ YUV2YUV,
+ CSC_NONE,
+ CSC_NUM
+};
+
+struct ipu_soc {
+ unsigned int id;
+ unsigned int devtype;
+ bool online;
+
+ /*clk*/
+ struct clk *ipu_clk;
+ struct clk *di_clk[2];
+ struct clk *di_clk_sel[2];
+ struct clk *pixel_clk[2];
+ bool pixel_clk_en[2];
+ struct clk *pixel_clk_sel[2];
+ struct clk *csi_clk[2];
+ struct clk *prg_clk;
+
+ /*irq*/
+ int irq_sync;
+ int irq_err;
+ struct ipu_irq_node irq_list[IPU_IRQ_COUNT];
+
+ /*reg*/
+ void __iomem *cm_reg;
+ void __iomem *idmac_reg;
+ void __iomem *dp_reg;
+ void __iomem *ic_reg;
+ void __iomem *dc_reg;
+ void __iomem *dc_tmpl_reg;
+ void __iomem *dmfc_reg;
+ void __iomem *di_reg[2];
+ void __iomem *smfc_reg;
+ void __iomem *csi_reg[2];
+ void __iomem *cpmem_base;
+ void __iomem *tpmem_base;
+ void __iomem *vdi_reg;
+
+ struct device *dev;
+
+ ipu_channel_t csi_channel[2];
+ ipu_channel_t using_ic_dirct_ch;
+ unsigned char dc_di_assignment[10];
+ bool sec_chan_en[IPU_MAX_CH];
+ bool thrd_chan_en[IPU_MAX_CH];
+ bool chan_is_interlaced[52];
+ uint32_t channel_init_mask;
+ uint32_t channel_enable_mask;
+
+ /*use count*/
+ int dc_use_count;
+ int dp_use_count;
+ int dmfc_use_count;
+ int smfc_use_count;
+ int ic_use_count;
+ int rot_use_count;
+ int vdi_use_count;
+ int di_use_count[2];
+ int csi_use_count[2];
+
+ struct mutex mutex_lock;
+ spinlock_t int_reg_spin_lock;
+ spinlock_t rdy_reg_spin_lock;
+
+ int dmfc_size_28;
+ int dmfc_size_29;
+ int dmfc_size_24;
+ int dmfc_size_27;
+ int dmfc_size_23;
+
+ enum csc_type_t fg_csc_type;
+ enum csc_type_t bg_csc_type;
+ bool color_key_4rgb;
+ bool dc_swap;
+ struct completion dc_comp;
+ struct completion csi_comp;
+
+ struct rot_mem {
+ void *vaddr;
+ dma_addr_t paddr;
+ int size;
+ } rot_dma[2];
+
+ int vdoa_en;
+ struct task_struct *thread[2];
+
+ /*
+ * Bypass reset to avoid display channel being
+ * stopped by probe since it may starts to work
+ * in bootloader.
+ */
+ bool bypass_reset;
+
+ unsigned int ch0123_axi;
+ unsigned int ch23_axi;
+ unsigned int ch27_axi;
+ unsigned int ch28_axi;
+ unsigned int normal_axi;
+
+ bool smfc_idmac_12bit_3planar_bs_fixup; /* workaround little stripes */
+};
+
+struct ipu_channel {
+ u8 video_in_dma;
+ u8 alpha_in_dma;
+ u8 graph_in_dma;
+ u8 out_dma;
+};
+
+enum ipu_dmfc_type {
+ DMFC_NORMAL = 0,
+ DMFC_HIGH_RESOLUTION_DC,
+ DMFC_HIGH_RESOLUTION_DP,
+ DMFC_HIGH_RESOLUTION_ONLY_DP,
+};
+
+static inline int _ipu_is_smfc_chan(uint32_t dma_chan)
+{
+ return dma_chan <= 3;
+}
+
+static inline u32 ipu_cm_read(struct ipu_soc *ipu, unsigned offset)
+{
+ return readl(ipu->cm_reg + offset);
+}
+
+static inline void ipu_cm_write(struct ipu_soc *ipu,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->cm_reg + offset);
+}
+
+static inline u32 ipu_idmac_read(struct ipu_soc *ipu, unsigned offset)
+{
+ return readl(ipu->idmac_reg + offset);
+}
+
+static inline void ipu_idmac_write(struct ipu_soc *ipu,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->idmac_reg + offset);
+}
+
+static inline u32 ipu_dc_read(struct ipu_soc *ipu, unsigned offset)
+{
+ return readl(ipu->dc_reg + offset);
+}
+
+static inline void ipu_dc_write(struct ipu_soc *ipu,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->dc_reg + offset);
+}
+
+static inline u32 ipu_dc_tmpl_read(struct ipu_soc *ipu, unsigned offset)
+{
+ return readl(ipu->dc_tmpl_reg + offset);
+}
+
+static inline void ipu_dc_tmpl_write(struct ipu_soc *ipu,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->dc_tmpl_reg + offset);
+}
+
+static inline u32 ipu_dmfc_read(struct ipu_soc *ipu, unsigned offset)
+{
+ return readl(ipu->dmfc_reg + offset);
+}
+
+static inline void ipu_dmfc_write(struct ipu_soc *ipu,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->dmfc_reg + offset);
+}
+
+static inline u32 ipu_dp_read(struct ipu_soc *ipu, unsigned offset)
+{
+ return readl(ipu->dp_reg + offset);
+}
+
+static inline void ipu_dp_write(struct ipu_soc *ipu,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->dp_reg + offset);
+}
+
+static inline u32 ipu_di_read(struct ipu_soc *ipu, int di, unsigned offset)
+{
+ return readl(ipu->di_reg[di] + offset);
+}
+
+static inline void ipu_di_write(struct ipu_soc *ipu, int di,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->di_reg[di] + offset);
+}
+
+static inline u32 ipu_csi_read(struct ipu_soc *ipu, int csi, unsigned offset)
+{
+ return readl(ipu->csi_reg[csi] + offset);
+}
+
+static inline void ipu_csi_write(struct ipu_soc *ipu, int csi,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->csi_reg[csi] + offset);
+}
+
+static inline u32 ipu_smfc_read(struct ipu_soc *ipu, unsigned offset)
+{
+ return readl(ipu->smfc_reg + offset);
+}
+
+static inline void ipu_smfc_write(struct ipu_soc *ipu,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->smfc_reg + offset);
+}
+
+static inline u32 ipu_vdi_read(struct ipu_soc *ipu, unsigned offset)
+{
+ return readl(ipu->vdi_reg + offset);
+}
+
+static inline void ipu_vdi_write(struct ipu_soc *ipu,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->vdi_reg + offset);
+}
+
+static inline u32 ipu_ic_read(struct ipu_soc *ipu, unsigned offset)
+{
+ return readl(ipu->ic_reg + offset);
+}
+
+static inline void ipu_ic_write(struct ipu_soc *ipu,
+ u32 value, unsigned offset)
+{
+ writel(value, ipu->ic_reg + offset);
+}
+
+int register_ipu_device(struct ipu_soc *ipu, int id);
+void unregister_ipu_device(struct ipu_soc *ipu, int id);
+ipu_color_space_t format_to_colorspace(uint32_t fmt);
+bool ipu_pixel_format_has_alpha(uint32_t fmt);
+
+void ipu_dump_registers(struct ipu_soc *ipu);
+
+uint32_t _ipu_channel_status(struct ipu_soc *ipu, ipu_channel_t channel);
+
+void ipu_disp_init(struct ipu_soc *ipu);
+void _ipu_init_dc_mappings(struct ipu_soc *ipu);
+int _ipu_dp_init(struct ipu_soc *ipu, ipu_channel_t channel, uint32_t in_pixel_fmt,
+ uint32_t out_pixel_fmt);
+void _ipu_dp_uninit(struct ipu_soc *ipu, ipu_channel_t channel);
+void _ipu_dc_init(struct ipu_soc *ipu, int dc_chan, int di, bool interlaced, uint32_t pixel_fmt);
+void _ipu_dc_uninit(struct ipu_soc *ipu, int dc_chan);
+void _ipu_dp_dc_enable(struct ipu_soc *ipu, ipu_channel_t channel);
+void _ipu_dp_dc_disable(struct ipu_soc *ipu, ipu_channel_t channel, bool swap);
+void _ipu_dmfc_init(struct ipu_soc *ipu, int dmfc_type, int first);
+void _ipu_dmfc_set_wait4eot(struct ipu_soc *ipu, int dma_chan, int width);
+void _ipu_dmfc_set_burst_size(struct ipu_soc *ipu, int dma_chan, int burst_size);
+int _ipu_disp_chan_is_interlaced(struct ipu_soc *ipu, ipu_channel_t channel);
+
+void _ipu_ic_enable_task(struct ipu_soc *ipu, ipu_channel_t channel);
+void _ipu_ic_disable_task(struct ipu_soc *ipu, ipu_channel_t channel);
+int _ipu_ic_init_prpvf(struct ipu_soc *ipu, ipu_channel_params_t *params,
+ bool src_is_csi);
+void _ipu_vdi_init(struct ipu_soc *ipu, ipu_channel_t channel, ipu_channel_params_t *params);
+void _ipu_vdi_uninit(struct ipu_soc *ipu);
+void _ipu_ic_uninit_prpvf(struct ipu_soc *ipu);
+void _ipu_ic_init_rotate_vf(struct ipu_soc *ipu, ipu_channel_params_t *params);
+void _ipu_ic_uninit_rotate_vf(struct ipu_soc *ipu);
+void _ipu_ic_init_csi(struct ipu_soc *ipu, ipu_channel_params_t *params);
+void _ipu_ic_uninit_csi(struct ipu_soc *ipu);
+int _ipu_ic_init_prpenc(struct ipu_soc *ipu, ipu_channel_params_t *params,
+ bool src_is_csi);
+void _ipu_ic_uninit_prpenc(struct ipu_soc *ipu);
+void _ipu_ic_init_rotate_enc(struct ipu_soc *ipu, ipu_channel_params_t *params);
+void _ipu_ic_uninit_rotate_enc(struct ipu_soc *ipu);
+int _ipu_ic_init_pp(struct ipu_soc *ipu, ipu_channel_params_t *params);
+void _ipu_ic_uninit_pp(struct ipu_soc *ipu);
+void _ipu_ic_init_rotate_pp(struct ipu_soc *ipu, ipu_channel_params_t *params);
+void _ipu_ic_uninit_rotate_pp(struct ipu_soc *ipu);
+int _ipu_ic_idma_init(struct ipu_soc *ipu, int dma_chan, uint16_t width, uint16_t height,
+ int burst_size, ipu_rotate_mode_t rot);
+void _ipu_vdi_toggle_top_field_man(struct ipu_soc *ipu);
+int _ipu_csi_init(struct ipu_soc *ipu, ipu_channel_t channel, uint32_t csi);
+int _ipu_csi_set_mipi_di(struct ipu_soc *ipu, uint32_t num, uint32_t di_val, uint32_t csi);
+void ipu_csi_set_test_generator(struct ipu_soc *ipu, bool active, uint32_t r_value,
+ uint32_t g_value, uint32_t b_value,
+ uint32_t pix_clk, uint32_t csi);
+void _ipu_csi_ccir_err_detection_enable(struct ipu_soc *ipu, uint32_t csi);
+void _ipu_csi_ccir_err_detection_disable(struct ipu_soc *ipu, uint32_t csi);
+void _ipu_csi_wait4eof(struct ipu_soc *ipu, ipu_channel_t channel);
+void _ipu_smfc_init(struct ipu_soc *ipu, ipu_channel_t channel, uint32_t mipi_id, uint32_t csi);
+void _ipu_smfc_set_burst_size(struct ipu_soc *ipu, ipu_channel_t channel, uint32_t bs);
+void _ipu_dp_set_csc_coefficients(struct ipu_soc *ipu, ipu_channel_t channel, int32_t param[][3]);
+int32_t _ipu_disp_set_window_pos(struct ipu_soc *ipu, ipu_channel_t channel,
+ int16_t x_pos, int16_t y_pos);
+int32_t _ipu_disp_get_window_pos(struct ipu_soc *ipu, ipu_channel_t channel,
+ int16_t *x_pos, int16_t *y_pos);
+void _ipu_get(struct ipu_soc *ipu);
+void _ipu_put(struct ipu_soc *ipu);
+
+struct clk *clk_register_mux_pix_clk(struct device *dev, const char *name,
+ const char **parent_names, u8 num_parents, unsigned long flags,
+ u8 ipu_id, u8 di_id, u8 clk_mux_flags);
+struct clk *clk_register_div_pix_clk(struct device *dev, const char *name,
+ const char *parent_name, unsigned long flags,
+ u8 ipu_id, u8 di_id, u8 clk_div_flags);
+struct clk *clk_register_gate_pix_clk(struct device *dev, const char *name,
+ const char *parent_name, unsigned long flags,
+ u8 ipu_id, u8 di_id, u8 clk_gate_flags);
+#endif /* __INCLUDE_IPU_PRV_H__ */
diff --git a/drivers/mxc/ipu3/ipu_regs.h b/drivers/mxc/ipu3/ipu_regs.h
new file mode 100644
index 000000000000..099346da3e1b
--- /dev/null
+++ b/drivers/mxc/ipu3/ipu_regs.h
@@ -0,0 +1,702 @@
+/*
+ * Copyright (C) 2005-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ * @file ipu_regs.h
+ *
+ * @brief IPU Register definitions
+ *
+ * @ingroup IPU
+ */
+#ifndef __IPU_REGS_INCLUDED__
+#define __IPU_REGS_INCLUDED__
+
+#include "ipu_prv.h"
+
+#define IPU_MCU_T_DEFAULT 8
+
+/* Register addresses */
+/* IPU Common registers */
+#define IPU_CM_REG(offset) (offset)
+
+#define IPU_CONF IPU_CM_REG(0)
+#define IPU_SRM_PRI1 IPU_CM_REG(0x00A0)
+#define IPU_SRM_PRI2 IPU_CM_REG(0x00A4)
+#define IPU_FS_PROC_FLOW1 IPU_CM_REG(0x00A8)
+#define IPU_FS_PROC_FLOW2 IPU_CM_REG(0x00AC)
+#define IPU_FS_PROC_FLOW3 IPU_CM_REG(0x00B0)
+#define IPU_FS_DISP_FLOW1 IPU_CM_REG(0x00B4)
+#define IPU_FS_DISP_FLOW2 IPU_CM_REG(0x00B8)
+#define IPU_SKIP IPU_CM_REG(0x00BC)
+#define IPU_DISP_ALT_CONF IPU_CM_REG(0x00C0)
+#define IPU_DISP_GEN IPU_CM_REG(0x00C4)
+#define IPU_DISP_ALT1 IPU_CM_REG(0x00C8)
+#define IPU_DISP_ALT2 IPU_CM_REG(0x00CC)
+#define IPU_DISP_ALT3 IPU_CM_REG(0x00D0)
+#define IPU_DISP_ALT4 IPU_CM_REG(0x00D4)
+#define IPU_SNOOP IPU_CM_REG(0x00D8)
+#define IPU_MEM_RST IPU_CM_REG(0x00DC)
+#define IPU_PM IPU_CM_REG(0x00E0)
+#define IPU_GPR IPU_CM_REG(0x00E4)
+#define IPU_CHA_DB_MODE_SEL(ch) IPU_CM_REG(0x0150 + 4 * ((ch) / 32))
+#define IPU_ALT_CHA_DB_MODE_SEL(ch) IPU_CM_REG(0x0168 + 4 * ((ch) / 32))
+/*
+ * IPUv3D doesn't support triple buffer, so point
+ * IPU_CHA_TRB_MODE_SEL, IPU_CHA_TRIPLE_CUR_BUF and
+ * IPU_CHA_BUF2_RDY to readonly
+ * IPU_ALT_CUR_BUF0 for IPUv3D.
+ */
+#define IPU_CHA_TRB_MODE_SEL(type, ch) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0178 + 4 * ((ch) / 32)) : \
+ (0x012C); })
+#define IPU_CHA_TRIPLE_CUR_BUF(type, ch) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0258 + \
+ 4 * (((ch) * 2) / 32)) : \
+ (0x012C); })
+#define IPU_CHA_BUF2_RDY(type, ch) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0288 + 4 * ((ch) / 32)) : \
+ (0x012C); })
+#define IPU_CHA_CUR_BUF(type, ch) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x023C + 4 * ((ch) / 32)) : \
+ (0x0124 + 4 * ((ch) / 32)); })
+#define IPU_ALT_CUR_BUF0(type) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0244) : \
+ (0x012C); })
+#define IPU_ALT_CUR_BUF1(type) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0248) : \
+ (0x0130); })
+#define IPU_SRM_STAT(type) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x024C) : \
+ (0x0134); })
+#define IPU_PROC_TASK_STAT(type) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0250) : \
+ (0x0138); })
+#define IPU_DISP_TASK_STAT(type) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0254) : \
+ (0x013C); })
+#define IPU_CHA_BUF0_RDY(type, ch) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0268 + 4 * ((ch) / 32)) : \
+ (0x0140 + 4 * ((ch) / 32)); })
+#define IPU_CHA_BUF1_RDY(type, ch) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0270 + 4 * ((ch) / 32)) : \
+ (0x0148 + 4 * ((ch) / 32)); })
+#define IPU_ALT_CHA_BUF0_RDY(type, ch) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0278 + 4 * ((ch) / 32)) : \
+ (0x0158 + 4 * ((ch) / 32)); })
+#define IPU_ALT_CHA_BUF1_RDY(type, ch) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0280 + 4 * ((ch) / 32)) : \
+ (0x0160 + 4 * ((ch) / 32)); })
+
+#define IPU_INT_CTRL(n) IPU_CM_REG(0x003C + 4 * ((n) - 1))
+#define IPU_INT_STAT(type, n) IPU_CM_REG({(type) >= IPUv3EX ? \
+ (0x0200 + 4 * ((n) - 1)) : \
+ (0x00E8 + 4 * ((n) - 1)); })
+
+#define IPUIRQ_2_STATREG(type, irq) IPU_CM_REG(IPU_INT_STAT((type), 1) + 4 \
+ * ((irq) / 32))
+#define IPUIRQ_2_CTRLREG(irq) IPU_CM_REG(IPU_INT_CTRL(1) + 4 * ((irq) / 32))
+#define IPUIRQ_2_MASK(irq) (1UL << ((irq) & 0x1F))
+
+/* IPU VDI registers */
+#define IPU_VDI_REG(offset) (offset)
+
+#define VDI_FSIZE IPU_VDI_REG(0)
+#define VDI_C IPU_VDI_REG(0x0004)
+
+/* IPU CSI Registers */
+#define IPU_CSI_REG(offset) (offset)
+
+#define CSI_SENS_CONF IPU_CSI_REG(0)
+#define CSI_SENS_FRM_SIZE IPU_CSI_REG(0x0004)
+#define CSI_ACT_FRM_SIZE IPU_CSI_REG(0x0008)
+#define CSI_OUT_FRM_CTRL IPU_CSI_REG(0x000C)
+#define CSI_TST_CTRL IPU_CSI_REG(0x0010)
+#define CSI_CCIR_CODE_1 IPU_CSI_REG(0x0014)
+#define CSI_CCIR_CODE_2 IPU_CSI_REG(0x0018)
+#define CSI_CCIR_CODE_3 IPU_CSI_REG(0x001C)
+#define CSI_MIPI_DI IPU_CSI_REG(0x0020)
+#define CSI_SKIP IPU_CSI_REG(0x0024)
+#define CSI_CPD_CTRL IPU_CSI_REG(0x0028)
+#define CSI_CPD_RC(n) IPU_CSI_REG(0x002C + 4 * (n))
+#define CSI_CPD_RS(n) IPU_CSI_REG(0x004C + 4 * (n))
+#define CSI_CPD_GRC(n) IPU_CSI_REG(0x005C + 4 * (n))
+#define CSI_CPD_GRS(n) IPU_CSI_REG(0x007C + 4 * (n))
+#define CSI_CPD_GBC(n) IPU_CSI_REG(0x008C + 4 * (n))
+#define CSI_CPD_GBS(n) IPU_CSI_REG(0x00AC + 4 * (n))
+#define CSI_CPD_BC(n) IPU_CSI_REG(0x00BC + 4 * (n))
+#define CSI_CPD_BS(n) IPU_CSI_REG(0x00DC + 4 * (n))
+#define CSI_CPD_OFFSET1 IPU_CSI_REG(0x00EC)
+#define CSI_CPD_OFFSET2 IPU_CSI_REG(0x00F0)
+
+/* IPU SMFC Registers */
+#define IPU_SMFC_REG(offset) (offset)
+
+#define SMFC_MAP IPU_SMFC_REG(0)
+#define SMFC_WMC IPU_SMFC_REG(0x0004)
+#define SMFC_BS IPU_SMFC_REG(0x0008)
+
+/* IPU IC Registers */
+#define IPU_IC_REG(offset) (offset)
+
+#define IC_CONF IPU_IC_REG(0)
+#define IC_PRP_ENC_RSC IPU_IC_REG(0x0004)
+#define IC_PRP_VF_RSC IPU_IC_REG(0x0008)
+#define IC_PP_RSC IPU_IC_REG(0x000C)
+#define IC_CMBP_1 IPU_IC_REG(0x0010)
+#define IC_CMBP_2 IPU_IC_REG(0x0014)
+#define IC_IDMAC_1 IPU_IC_REG(0x0018)
+#define IC_IDMAC_2 IPU_IC_REG(0x001C)
+#define IC_IDMAC_3 IPU_IC_REG(0x0020)
+#define IC_IDMAC_4 IPU_IC_REG(0x0024)
+
+/* IPU IDMAC Registers */
+#define IPU_IDMAC_REG(offset) (offset)
+
+#define IDMAC_CONF IPU_IDMAC_REG(0x0000)
+#define IDMAC_CHA_EN(ch) IPU_IDMAC_REG(0x0004 + 4 * ((ch) / 32))
+#define IDMAC_SEP_ALPHA IPU_IDMAC_REG(0x000C)
+#define IDMAC_ALT_SEP_ALPHA IPU_IDMAC_REG(0x0010)
+#define IDMAC_CHA_PRI(ch) IPU_IDMAC_REG(0x0014 + 4 * ((ch) / 32))
+#define IDMAC_WM_EN(ch) IPU_IDMAC_REG(0x001C + 4 * ((ch) / 32))
+#define IDMAC_CH_LOCK_EN_1(type) IPU_IDMAC_REG({(type) >= IPUv3EX ? \
+ (0x0024) : 0; })
+#define IDMAC_CH_LOCK_EN_2(type) IPU_IDMAC_REG({(type) >= IPUv3EX ? \
+ (0x0028) : \
+ (0x0024); })
+#define IDMAC_SUB_ADDR_0(type) IPU_IDMAC_REG({(type) >= IPUv3EX ? \
+ (0x002C) : \
+ (0x0028); })
+#define IDMAC_SUB_ADDR_1(type) IPU_IDMAC_REG({(type) >= IPUv3EX ? \
+ (0x0030) : \
+ (0x002C); })
+#define IDMAC_SUB_ADDR_2(type) IPU_IDMAC_REG({(type) >= IPUv3EX ? \
+ (0x0034) : \
+ (0x0030); })
+/*
+ * IPUv3D doesn't support IDMAC_SUB_ADDR_3 and IDMAC_SUB_ADDR_4,
+ * so point them to readonly IDMAC_CHA_BUSY1 for IPUv3D.
+ */
+#define IDMAC_SUB_ADDR_3(type) IPU_IDMAC_REG({(type) >= IPUv3EX ? \
+ (0x0038) : \
+ (0x0040); })
+#define IDMAC_SUB_ADDR_4(type) IPU_IDMAC_REG({(type) >= IPUv3EX ? \
+ (0x003C) : \
+ (0x0040); })
+#define IDMAC_BAND_EN(type, ch) IPU_IDMAC_REG({(type) >= IPUv3EX ? \
+ (0x0040 + 4 * ((ch) / 32)) : \
+ (0x0034 + 4 * ((ch) / 32)); })
+#define IDMAC_CHA_BUSY(type, ch) IPU_IDMAC_REG({(type) >= IPUv3EX ? \
+ (0x0100 + 4 * ((ch) / 32)) : \
+ (0x0040 + 4 * ((ch) / 32)); })
+
+/* IPU DI Registers */
+#define IPU_DI_REG(offset) (offset)
+
+#define DI_GENERAL IPU_DI_REG(0)
+#define DI_BS_CLKGEN0 IPU_DI_REG(0x0004)
+#define DI_BS_CLKGEN1 IPU_DI_REG(0x0008)
+#define DI_SW_GEN0(gen) IPU_DI_REG(0x000C + 4 * ((gen) - 1))
+#define DI_SW_GEN1(gen) IPU_DI_REG(0x0030 + 4 * ((gen) - 1))
+#define DI_STP_REP(gen) IPU_DI_REG(0x0148 + 4 * (((gen) - 1) / 2))
+#define DI_SYNC_AS_GEN IPU_DI_REG(0x0054)
+#define DI_DW_GEN(gen) IPU_DI_REG(0x0058 + 4 * (gen))
+#define DI_DW_SET(gen, set) IPU_DI_REG(0x0088 + 4 * ((gen) + 0xC * (set)))
+#define DI_SER_CONF IPU_DI_REG(0x015C)
+#define DI_SSC IPU_DI_REG(0x0160)
+#define DI_POL IPU_DI_REG(0x0164)
+#define DI_AW0 IPU_DI_REG(0x0168)
+#define DI_AW1 IPU_DI_REG(0x016C)
+#define DI_SCR_CONF IPU_DI_REG(0x0170)
+#define DI_STAT IPU_DI_REG(0x0174)
+
+/* IPU DMFC Registers */
+#define IPU_DMFC_REG(offset) (offset)
+
+#define DMFC_RD_CHAN IPU_DMFC_REG(0)
+#define DMFC_WR_CHAN IPU_DMFC_REG(0x0004)
+#define DMFC_WR_CHAN_DEF IPU_DMFC_REG(0x0008)
+#define DMFC_DP_CHAN IPU_DMFC_REG(0x000C)
+#define DMFC_DP_CHAN_DEF IPU_DMFC_REG(0x0010)
+#define DMFC_GENERAL1 IPU_DMFC_REG(0x0014)
+#define DMFC_GENERAL2 IPU_DMFC_REG(0x0018)
+#define DMFC_IC_CTRL IPU_DMFC_REG(0x001C)
+#define DMFC_STAT IPU_DMFC_REG(0x0020)
+
+/* IPU DC Registers */
+#define IPU_DC_REG(offset) (offset)
+
+#define DC_MAP_CONF_PTR(n) IPU_DC_REG(0x0108 + ((n) & ~0x1) * 2)
+#define DC_MAP_CONF_VAL(n) IPU_DC_REG(0x0144 + ((n) & ~0x1) * 2)
+
+#define _RL_CH_2_OFFSET(ch) (((ch) == 0) ? 8 : ( \
+ ((ch) == 1) ? 0x24 : ( \
+ ((ch) == 2) ? 0x40 : ( \
+ ((ch) == 5) ? 0x64 : ( \
+ ((ch) == 6) ? 0x80 : ( \
+ ((ch) == 8) ? 0x9C : ( \
+ ((ch) == 9) ? 0xBC : (-1))))))))
+#define DC_RL_CH(ch, evt) IPU_DC_REG(_RL_CH_2_OFFSET(ch) + \
+ ((evt) & ~0x1) * 2)
+
+#define DC_EVT_NF 0
+#define DC_EVT_NL 1
+#define DC_EVT_EOF 2
+#define DC_EVT_NFIELD 3
+#define DC_EVT_EOL 4
+#define DC_EVT_EOFIELD 5
+#define DC_EVT_NEW_ADDR 6
+#define DC_EVT_NEW_CHAN 7
+#define DC_EVT_NEW_DATA 8
+
+#define DC_EVT_NEW_ADDR_W_0 0
+#define DC_EVT_NEW_ADDR_W_1 1
+#define DC_EVT_NEW_CHAN_W_0 2
+#define DC_EVT_NEW_CHAN_W_1 3
+#define DC_EVT_NEW_DATA_W_0 4
+#define DC_EVT_NEW_DATA_W_1 5
+#define DC_EVT_NEW_ADDR_R_0 6
+#define DC_EVT_NEW_ADDR_R_1 7
+#define DC_EVT_NEW_CHAN_R_0 8
+#define DC_EVT_NEW_CHAN_R_1 9
+#define DC_EVT_NEW_DATA_R_0 10
+#define DC_EVT_NEW_DATA_R_1 11
+#define DC_EVEN_UGDE0 12
+#define DC_ODD_UGDE0 13
+#define DC_EVEN_UGDE1 14
+#define DC_ODD_UGDE1 15
+#define DC_EVEN_UGDE2 16
+#define DC_ODD_UGDE2 17
+#define DC_EVEN_UGDE3 18
+#define DC_ODD_UGDE3 19
+
+#define dc_ch_offset(ch) \
+({ \
+ const u8 _offset[] = { \
+ 0, 0x1C, 0x38, 0x54, 0x58, 0x5C, 0x78, 0, 0x94, 0xB4}; \
+ _offset[ch]; \
+})
+#define DC_WR_CH_CONF(ch) IPU_DC_REG(dc_ch_offset(ch))
+#define DC_WR_CH_ADDR(ch) IPU_DC_REG(dc_ch_offset(ch) + 4)
+
+#define DC_WR_CH_CONF_1 IPU_DC_REG(0x001C)
+#define DC_WR_CH_ADDR_1 IPU_DC_REG(0x0020)
+#define DC_WR_CH_CONF_5 IPU_DC_REG(0x005C)
+#define DC_WR_CH_ADDR_5 IPU_DC_REG(0x0060)
+#define DC_GEN IPU_DC_REG(0x00D4)
+#define DC_DISP_CONF1(disp) IPU_DC_REG(0x00D8 + 4 * (disp))
+#define DC_DISP_CONF2(disp) IPU_DC_REG(0x00E8 + 4 * (disp))
+#define DC_STAT IPU_DC_REG(0x01C8)
+#define DC_UGDE_0(evt) IPU_DC_REG(0x0174 + 16 * (evt))
+#define DC_UGDE_1(evt) IPU_DC_REG(0x0178 + 16 * (evt))
+#define DC_UGDE_2(evt) IPU_DC_REG(0x017C + 16 * (evt))
+#define DC_UGDE_3(evt) IPU_DC_REG(0x0180 + 16 * (evt))
+
+/* IPU DP Registers */
+#define IPU_DP_REG(offset) (offset)
+
+#define DP_SYNC 0
+#define DP_ASYNC0 0x60
+#define DP_ASYNC1 0xBC
+#define DP_COM_CONF(flow) IPU_DP_REG(flow)
+#define DP_GRAPH_WIND_CTRL(flow) IPU_DP_REG(0x0004 + (flow))
+#define DP_FG_POS(flow) IPU_DP_REG(0x0008 + (flow))
+#define DP_GAMMA_C(flow, i) IPU_DP_REG(0x0014 + (flow) + 4 * (i))
+#define DP_GAMMA_S(flow, i) IPU_DP_REG(0x0034 + (flow) + 4 * (i))
+#define DP_CSC_A_0(flow) IPU_DP_REG(0x0044 + (flow))
+#define DP_CSC_A_1(flow) IPU_DP_REG(0x0048 + (flow))
+#define DP_CSC_A_2(flow) IPU_DP_REG(0x004C + (flow))
+#define DP_CSC_A_3(flow) IPU_DP_REG(0x0050 + (flow))
+#define DP_CSC_0(flow) IPU_DP_REG(0x0054 + (flow))
+#define DP_CSC_1(flow) IPU_DP_REG(0x0058 + (flow))
+
+enum {
+ IPU_CONF_CSI0_EN = 0x00000001,
+ IPU_CONF_CSI1_EN = 0x00000002,
+ IPU_CONF_IC_EN = 0x00000004,
+ IPU_CONF_ROT_EN = 0x00000008,
+ IPU_CONF_ISP_EN = 0x00000010,
+ IPU_CONF_DP_EN = 0x00000020,
+ IPU_CONF_DI0_EN = 0x00000040,
+ IPU_CONF_DI1_EN = 0x00000080,
+ IPU_CONF_DMFC_EN = 0x00000400,
+ IPU_CONF_SMFC_EN = 0x00000100,
+ IPU_CONF_DC_EN = 0x00000200,
+ IPU_CONF_VDI_EN = 0x00001000,
+ IPU_CONF_IDMAC_DIS = 0x00400000,
+ IPU_CONF_IC_DMFC_SEL = 0x02000000,
+ IPU_CONF_IC_DMFC_SYNC = 0x04000000,
+ IPU_CONF_VDI_DMFC_SYNC = 0x08000000,
+ IPU_CONF_CSI0_DATA_SOURCE = 0x10000000,
+ IPU_CONF_CSI0_DATA_SOURCE_OFFSET = 28,
+ IPU_CONF_CSI1_DATA_SOURCE = 0x20000000,
+ IPU_CONF_IC_INPUT = 0x40000000,
+ IPU_CONF_CSI_SEL = 0x80000000,
+
+ DI0_COUNTER_RELEASE = 0x01000000,
+ DI1_COUNTER_RELEASE = 0x02000000,
+
+ FS_PRPVF_ROT_SRC_SEL_MASK = 0x00000F00,
+ FS_PRPVF_ROT_SRC_SEL_OFFSET = 8,
+ FS_PRPENC_ROT_SRC_SEL_MASK = 0x0000000F,
+ FS_PRPENC_ROT_SRC_SEL_OFFSET = 0,
+ FS_PP_ROT_SRC_SEL_MASK = 0x000F0000,
+ FS_PP_ROT_SRC_SEL_OFFSET = 16,
+ FS_PP_SRC_SEL_MASK = 0x0000F000,
+ FS_PP_SRC_SEL_VDOA = 0x00008000,
+ FS_PP_SRC_SEL_OFFSET = 12,
+ FS_PRP_SRC_SEL_MASK = 0x0F000000,
+ FS_PRP_SRC_SEL_OFFSET = 24,
+ FS_VF_IN_VALID = 0x80000000,
+ FS_ENC_IN_VALID = 0x40000000,
+ FS_VDI_SRC_SEL_MASK = 0x30000000,
+ FS_VDI_SRC_SEL_VDOA = 0x20000000,
+ FS_VDOA_DEST_SEL_MASK = 0x00030000,
+ FS_VDOA_DEST_SEL_VDI = 0x00020000,
+ FS_VDOA_DEST_SEL_IC = 0x00010000,
+ FS_VDI_SRC_SEL_OFFSET = 28,
+
+
+ FS_PRPENC_DEST_SEL_MASK = 0x0000000F,
+ FS_PRPENC_DEST_SEL_OFFSET = 0,
+ FS_PRPVF_DEST_SEL_MASK = 0x000000F0,
+ FS_PRPVF_DEST_SEL_OFFSET = 4,
+ FS_PRPVF_ROT_DEST_SEL_MASK = 0x00000F00,
+ FS_PRPVF_ROT_DEST_SEL_OFFSET = 8,
+ FS_PP_DEST_SEL_MASK = 0x0000F000,
+ FS_PP_DEST_SEL_OFFSET = 12,
+ FS_PP_ROT_DEST_SEL_MASK = 0x000F0000,
+ FS_PP_ROT_DEST_SEL_OFFSET = 16,
+ FS_PRPENC_ROT_DEST_SEL_MASK = 0x00F00000,
+ FS_PRPENC_ROT_DEST_SEL_OFFSET = 20,
+
+ FS_SMFC0_DEST_SEL_MASK = 0x0000000F,
+ FS_SMFC0_DEST_SEL_OFFSET = 0,
+ FS_SMFC1_DEST_SEL_MASK = 0x00000070,
+ FS_SMFC1_DEST_SEL_OFFSET = 4,
+ FS_SMFC2_DEST_SEL_MASK = 0x00000780,
+ FS_SMFC2_DEST_SEL_OFFSET = 7,
+ FS_SMFC3_DEST_SEL_MASK = 0x00003800,
+ FS_SMFC3_DEST_SEL_OFFSET = 11,
+
+ FS_DC1_SRC_SEL_MASK = 0x00F00000,
+ FS_DC1_SRC_SEL_OFFSET = 20,
+ FS_DC2_SRC_SEL_MASK = 0x000F0000,
+ FS_DC2_SRC_SEL_OFFSET = 16,
+ FS_DP_SYNC0_SRC_SEL_MASK = 0x0000000F,
+ FS_DP_SYNC0_SRC_SEL_OFFSET = 0,
+ FS_DP_SYNC1_SRC_SEL_MASK = 0x000000F0,
+ FS_DP_SYNC1_SRC_SEL_OFFSET = 4,
+ FS_DP_ASYNC0_SRC_SEL_MASK = 0x00000F00,
+ FS_DP_ASYNC0_SRC_SEL_OFFSET = 8,
+ FS_DP_ASYNC1_SRC_SEL_MASK = 0x0000F000,
+ FS_DP_ASYNC1_SRC_SEL_OFFSET = 12,
+
+ FS_AUTO_REF_PER_MASK = 0,
+ FS_AUTO_REF_PER_OFFSET = 16,
+
+ TSTAT_VF_MASK = 0x0000000C,
+ TSTAT_VF_OFFSET = 2,
+ TSTAT_VF_ROT_MASK = 0x00000300,
+ TSTAT_VF_ROT_OFFSET = 8,
+ TSTAT_ENC_MASK = 0x00000003,
+ TSTAT_ENC_OFFSET = 0,
+ TSTAT_ENC_ROT_MASK = 0x000000C0,
+ TSTAT_ENC_ROT_OFFSET = 6,
+ TSTAT_PP_MASK = 0x00000030,
+ TSTAT_PP_OFFSET = 4,
+ TSTAT_PP_ROT_MASK = 0x00000C00,
+ TSTAT_PP_ROT_OFFSET = 10,
+
+ TASK_STAT_IDLE = 0,
+ TASK_STAT_ACTIVE = 1,
+ TASK_STAT_WAIT4READY = 2,
+
+ /* IDMAC register bits */
+ IDMAC_CONF_USED_BUFS_EN_R = 0x02000000,
+ IDMAC_CONF_USED_BUFS_MAX_R_MASK = 0x01E00000,
+ IDMAC_CONF_USED_BUFS_MAX_R_OFFSET = 21,
+ IDMAC_CONF_USED_BUFS_EN_W = 0x00100000,
+ IDMAC_CONF_USED_BUFS_MAX_W_MASK = 0x000E0000,
+ IDMAC_CONF_USED_BUFS_MAX_W_OFFSET = 17,
+
+ /* Image Converter Register bits */
+ IC_CONF_PRPENC_EN = 0x00000001,
+ IC_CONF_PRPENC_CSC1 = 0x00000002,
+ IC_CONF_PRPENC_ROT_EN = 0x00000004,
+ IC_CONF_PRPVF_EN = 0x00000100,
+ IC_CONF_PRPVF_CSC1 = 0x00000200,
+ IC_CONF_PRPVF_CSC2 = 0x00000400,
+ IC_CONF_PRPVF_CMB = 0x00000800,
+ IC_CONF_PRPVF_ROT_EN = 0x00001000,
+ IC_CONF_PP_EN = 0x00010000,
+ IC_CONF_PP_CSC1 = 0x00020000,
+ IC_CONF_PP_CSC2 = 0x00040000,
+ IC_CONF_PP_CMB = 0x00080000,
+ IC_CONF_PP_ROT_EN = 0x00100000,
+ IC_CONF_IC_GLB_LOC_A = 0x10000000,
+ IC_CONF_KEY_COLOR_EN = 0x20000000,
+ IC_CONF_RWS_EN = 0x40000000,
+ IC_CONF_CSI_MEM_WR_EN = 0x80000000,
+
+ IC_RSZ_MAX_RESIZE_RATIO = 0x00004000,
+
+ IC_IDMAC_1_CB0_BURST_16 = 0x00000001,
+ IC_IDMAC_1_CB1_BURST_16 = 0x00000002,
+ IC_IDMAC_1_CB2_BURST_16 = 0x00000004,
+ IC_IDMAC_1_CB3_BURST_16 = 0x00000008,
+ IC_IDMAC_1_CB4_BURST_16 = 0x00000010,
+ IC_IDMAC_1_CB5_BURST_16 = 0x00000020,
+ IC_IDMAC_1_CB6_BURST_16 = 0x00000040,
+ IC_IDMAC_1_CB7_BURST_16 = 0x00000080,
+ IC_IDMAC_1_PRPENC_ROT_MASK = 0x00003800,
+ IC_IDMAC_1_PRPENC_ROT_OFFSET = 11,
+ IC_IDMAC_1_PRPVF_ROT_MASK = 0x0001C000,
+ IC_IDMAC_1_PRPVF_ROT_OFFSET = 14,
+ IC_IDMAC_1_PP_ROT_MASK = 0x000E0000,
+ IC_IDMAC_1_PP_ROT_OFFSET = 17,
+ IC_IDMAC_1_PP_FLIP_RS = 0x00400000,
+ IC_IDMAC_1_PRPVF_FLIP_RS = 0x00200000,
+ IC_IDMAC_1_PRPENC_FLIP_RS = 0x00100000,
+
+ IC_IDMAC_2_PRPENC_HEIGHT_MASK = 0x000003FF,
+ IC_IDMAC_2_PRPENC_HEIGHT_OFFSET = 0,
+ IC_IDMAC_2_PRPVF_HEIGHT_MASK = 0x000FFC00,
+ IC_IDMAC_2_PRPVF_HEIGHT_OFFSET = 10,
+ IC_IDMAC_2_PP_HEIGHT_MASK = 0x3FF00000,
+ IC_IDMAC_2_PP_HEIGHT_OFFSET = 20,
+
+ IC_IDMAC_3_PRPENC_WIDTH_MASK = 0x000003FF,
+ IC_IDMAC_3_PRPENC_WIDTH_OFFSET = 0,
+ IC_IDMAC_3_PRPVF_WIDTH_MASK = 0x000FFC00,
+ IC_IDMAC_3_PRPVF_WIDTH_OFFSET = 10,
+ IC_IDMAC_3_PP_WIDTH_MASK = 0x3FF00000,
+ IC_IDMAC_3_PP_WIDTH_OFFSET = 20,
+
+ CSI_SENS_CONF_DATA_FMT_SHIFT = 8,
+ CSI_SENS_CONF_DATA_FMT_MASK = 0x00000700,
+ CSI_SENS_CONF_DATA_FMT_RGB_YUV444 = 0L,
+ CSI_SENS_CONF_DATA_FMT_YUV422_YUYV = 1L,
+ CSI_SENS_CONF_DATA_FMT_YUV422_UYVY = 2L,
+ CSI_SENS_CONF_DATA_FMT_BAYER = 3L,
+ CSI_SENS_CONF_DATA_FMT_RGB565 = 4L,
+ CSI_SENS_CONF_DATA_FMT_RGB555 = 5L,
+ CSI_SENS_CONF_DATA_FMT_RGB444 = 6L,
+ CSI_SENS_CONF_DATA_FMT_JPEG = 7L,
+
+ CSI_SENS_CONF_VSYNC_POL_SHIFT = 0,
+ CSI_SENS_CONF_HSYNC_POL_SHIFT = 1,
+ CSI_SENS_CONF_DATA_POL_SHIFT = 2,
+ CSI_SENS_CONF_PIX_CLK_POL_SHIFT = 3,
+ CSI_SENS_CONF_SENS_PRTCL_MASK = 0x00000070L,
+ CSI_SENS_CONF_SENS_PRTCL_SHIFT = 4,
+ CSI_SENS_CONF_PACK_TIGHT_SHIFT = 7,
+ CSI_SENS_CONF_DATA_WIDTH_SHIFT = 11,
+ CSI_SENS_CONF_EXT_VSYNC_SHIFT = 15,
+ CSI_SENS_CONF_DIVRATIO_SHIFT = 16,
+
+ CSI_SENS_CONF_DIVRATIO_MASK = 0x00FF0000L,
+ CSI_SENS_CONF_DATA_DEST_SHIFT = 24,
+ CSI_SENS_CONF_DATA_DEST_MASK = 0x07000000L,
+ CSI_SENS_CONF_JPEG8_EN_SHIFT = 27,
+ CSI_SENS_CONF_JPEG_EN_SHIFT = 28,
+ CSI_SENS_CONF_FORCE_EOF_SHIFT = 29,
+ CSI_SENS_CONF_DATA_EN_POL_SHIFT = 31,
+
+ CSI_DATA_DEST_ISP = 1L,
+ CSI_DATA_DEST_IC = 2L,
+ CSI_DATA_DEST_IDMAC = 4L,
+
+ CSI_CCIR_ERR_DET_EN = 0x01000000L,
+ CSI_HORI_DOWNSIZE_EN = 0x80000000L,
+ CSI_VERT_DOWNSIZE_EN = 0x40000000L,
+ CSI_TEST_GEN_MODE_EN = 0x01000000L,
+
+ CSI_HSC_MASK = 0x1FFF0000,
+ CSI_HSC_SHIFT = 16,
+ CSI_VSC_MASK = 0x00000FFF,
+ CSI_VSC_SHIFT = 0,
+
+ CSI_TEST_GEN_R_MASK = 0x000000FFL,
+ CSI_TEST_GEN_R_SHIFT = 0,
+ CSI_TEST_GEN_G_MASK = 0x0000FF00L,
+ CSI_TEST_GEN_G_SHIFT = 8,
+ CSI_TEST_GEN_B_MASK = 0x00FF0000L,
+ CSI_TEST_GEN_B_SHIFT = 16,
+
+ CSI_MIPI_DI0_MASK = 0x000000FFL,
+ CSI_MIPI_DI0_SHIFT = 0,
+ CSI_MIPI_DI1_MASK = 0x0000FF00L,
+ CSI_MIPI_DI1_SHIFT = 8,
+ CSI_MIPI_DI2_MASK = 0x00FF0000L,
+ CSI_MIPI_DI2_SHIFT = 16,
+ CSI_MIPI_DI3_MASK = 0xFF000000L,
+ CSI_MIPI_DI3_SHIFT = 24,
+
+ CSI_MAX_RATIO_SKIP_ISP_MASK = 0x00070000L,
+ CSI_MAX_RATIO_SKIP_ISP_SHIFT = 16,
+ CSI_SKIP_ISP_MASK = 0x00F80000L,
+ CSI_SKIP_ISP_SHIFT = 19,
+ CSI_MAX_RATIO_SKIP_SMFC_MASK = 0x00000007L,
+ CSI_MAX_RATIO_SKIP_SMFC_SHIFT = 0,
+ CSI_SKIP_SMFC_MASK = 0x000000F8L,
+ CSI_SKIP_SMFC_SHIFT = 3,
+ CSI_ID_2_SKIP_MASK = 0x00000300L,
+ CSI_ID_2_SKIP_SHIFT = 8,
+
+ CSI_COLOR_FIRST_ROW_MASK = 0x00000002L,
+ CSI_COLOR_FIRST_COMP_MASK = 0x00000001L,
+
+ SMFC_MAP_CH0_MASK = 0x00000007L,
+ SMFC_MAP_CH0_SHIFT = 0,
+ SMFC_MAP_CH1_MASK = 0x00000038L,
+ SMFC_MAP_CH1_SHIFT = 3,
+ SMFC_MAP_CH2_MASK = 0x000001C0L,
+ SMFC_MAP_CH2_SHIFT = 6,
+ SMFC_MAP_CH3_MASK = 0x00000E00L,
+ SMFC_MAP_CH3_SHIFT = 9,
+
+ SMFC_WM0_SET_MASK = 0x00000007L,
+ SMFC_WM0_SET_SHIFT = 0,
+ SMFC_WM1_SET_MASK = 0x000001C0L,
+ SMFC_WM1_SET_SHIFT = 6,
+ SMFC_WM2_SET_MASK = 0x00070000L,
+ SMFC_WM2_SET_SHIFT = 16,
+ SMFC_WM3_SET_MASK = 0x01C00000L,
+ SMFC_WM3_SET_SHIFT = 22,
+
+ SMFC_WM0_CLR_MASK = 0x00000038L,
+ SMFC_WM0_CLR_SHIFT = 3,
+ SMFC_WM1_CLR_MASK = 0x00000E00L,
+ SMFC_WM1_CLR_SHIFT = 9,
+ SMFC_WM2_CLR_MASK = 0x00380000L,
+ SMFC_WM2_CLR_SHIFT = 19,
+ SMFC_WM3_CLR_MASK = 0x0E000000L,
+ SMFC_WM3_CLR_SHIFT = 25,
+
+ SMFC_BS0_MASK = 0x0000000FL,
+ SMFC_BS0_SHIFT = 0,
+ SMFC_BS1_MASK = 0x000000F0L,
+ SMFC_BS1_SHIFT = 4,
+ SMFC_BS2_MASK = 0x00000F00L,
+ SMFC_BS2_SHIFT = 8,
+ SMFC_BS3_MASK = 0x0000F000L,
+ SMFC_BS3_SHIFT = 12,
+
+ PF_CONF_TYPE_MASK = 0x00000007,
+ PF_CONF_TYPE_SHIFT = 0,
+ PF_CONF_PAUSE_EN = 0x00000010,
+ PF_CONF_RESET = 0x00008000,
+ PF_CONF_PAUSE_ROW_MASK = 0x00FF0000,
+ PF_CONF_PAUSE_ROW_SHIFT = 16,
+
+ DI_DW_GEN_ACCESS_SIZE_OFFSET = 24,
+ DI_DW_GEN_COMPONENT_SIZE_OFFSET = 16,
+
+ DI_GEN_DI_CLK_EXT = 0x100000,
+ DI_GEN_POLARITY_DISP_CLK = 0x00020000,
+ DI_GEN_POLARITY_1 = 0x00000001,
+ DI_GEN_POLARITY_2 = 0x00000002,
+ DI_GEN_POLARITY_3 = 0x00000004,
+ DI_GEN_POLARITY_4 = 0x00000008,
+ DI_GEN_POLARITY_5 = 0x00000010,
+ DI_GEN_POLARITY_6 = 0x00000020,
+ DI_GEN_POLARITY_7 = 0x00000040,
+ DI_GEN_POLARITY_8 = 0x00000080,
+
+ DI_POL_DRDY_DATA_POLARITY = 0x00000080,
+ DI_POL_DRDY_POLARITY_15 = 0x00000010,
+
+ DI_VSYNC_SEL_OFFSET = 13,
+
+ DC_WR_CH_CONF_FIELD_MODE = 0x00000200,
+ DC_WR_CH_CONF_PROG_TYPE_OFFSET = 5,
+ DC_WR_CH_CONF_PROG_TYPE_MASK = 0x000000E0,
+ DC_WR_CH_CONF_PROG_DI_ID = 0x00000004,
+ DC_WR_CH_CONF_PROG_DISP_ID_OFFSET = 3,
+ DC_WR_CH_CONF_PROG_DISP_ID_MASK = 0x00000018,
+
+ DC_UGDE_0_ODD_EN = 0x02000000,
+ DC_UGDE_0_ID_CODED_MASK = 0x00000007,
+ DC_UGDE_0_ID_CODED_OFFSET = 0,
+ DC_UGDE_0_EV_PRIORITY_MASK = 0x00000078,
+ DC_UGDE_0_EV_PRIORITY_OFFSET = 3,
+
+ DP_COM_CONF_FG_EN = 0x00000001,
+ DP_COM_CONF_GWSEL = 0x00000002,
+ DP_COM_CONF_GWAM = 0x00000004,
+ DP_COM_CONF_GWCKE = 0x00000008,
+ DP_COM_CONF_CSC_DEF_MASK = 0x00000300,
+ DP_COM_CONF_CSC_DEF_OFFSET = 8,
+ DP_COM_CONF_CSC_DEF_FG = 0x00000300,
+ DP_COM_CONF_CSC_DEF_BG = 0x00000200,
+ DP_COM_CONF_CSC_DEF_BOTH = 0x00000100,
+ DP_COM_CONF_GAMMA_EN = 0x00001000,
+ DP_COM_CONF_GAMMA_YUV_EN = 0x00002000,
+
+ DI_SER_CONF_LLA_SER_ACCESS = 0x00000020,
+ DI_SER_CONF_SERIAL_CLK_POL = 0x00000010,
+ DI_SER_CONF_SERIAL_DATA_POL = 0x00000008,
+ DI_SER_CONF_SERIAL_RS_POL = 0x00000004,
+ DI_SER_CONF_SERIAL_CS_POL = 0x00000002,
+ DI_SER_CONF_WAIT4SERIAL = 0x00000001,
+
+ VDI_C_CH_420 = 0x00000000,
+ VDI_C_CH_422 = 0x00000002,
+ VDI_C_MOT_SEL_FULL = 0x00000008,
+ VDI_C_MOT_SEL_LOW = 0x00000004,
+ VDI_C_MOT_SEL_MED = 0x00000000,
+ VDI_C_BURST_SIZE1_4 = 0x00000030,
+ VDI_C_BURST_SIZE2_4 = 0x00000300,
+ VDI_C_BURST_SIZE3_4 = 0x00003000,
+ VDI_C_BURST_SIZE_MASK = 0xF,
+ VDI_C_BURST_SIZE1_OFFSET = 4,
+ VDI_C_BURST_SIZE2_OFFSET = 8,
+ VDI_C_BURST_SIZE3_OFFSET = 12,
+ VDI_C_VWM1_SET_1 = 0x00000000,
+ VDI_C_VWM1_SET_2 = 0x00010000,
+ VDI_C_VWM1_CLR_2 = 0x00080000,
+ VDI_C_VWM3_SET_1 = 0x00000000,
+ VDI_C_VWM3_SET_2 = 0x00400000,
+ VDI_C_VWM3_CLR_2 = 0x02000000,
+ VDI_C_TOP_FIELD_MAN_1 = 0x40000000,
+ VDI_C_TOP_FIELD_AUTO_1 = 0x80000000,
+};
+
+enum di_pins {
+ DI_PIN11 = 0,
+ DI_PIN12 = 1,
+ DI_PIN13 = 2,
+ DI_PIN14 = 3,
+ DI_PIN15 = 4,
+ DI_PIN16 = 5,
+ DI_PIN17 = 6,
+ DI_PIN_CS = 7,
+
+ DI_PIN_SER_CLK = 0,
+ DI_PIN_SER_RS = 1,
+};
+
+enum di_sync_wave {
+ DI_SYNC_NONE = -1,
+ DI_SYNC_CLK = 0,
+ DI_SYNC_INT_HSYNC = 1,
+ DI_SYNC_HSYNC = 2,
+ DI_SYNC_VSYNC = 3,
+ DI_SYNC_DE = 5,
+};
+
+/* DC template opcodes */
+#define WROD(lf) (0x18 | ((lf) << 1))
+#define WRG (0x01)
+
+#endif
diff --git a/drivers/mxc/ipu3/pre-regs.h b/drivers/mxc/ipu3/pre-regs.h
new file mode 100644
index 000000000000..06a9b029ce3e
--- /dev/null
+++ b/drivers/mxc/ipu3/pre-regs.h
@@ -0,0 +1,480 @@
+/*
+ * Freescale PRE Register Definitions
+ *
+ * Copyright 2014-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#ifndef __ARCH_ARM___PRE_H
+#define __ARCH_ARM___PRE_H
+
+
+#define HW_PRE_CTRL (0x00000000)
+#define HW_PRE_CTRL_SET (0x00000004)
+#define HW_PRE_CTRL_CLR (0x00000008)
+#define HW_PRE_CTRL_TOG (0x0000000c)
+
+#define BM_PRE_CTRL_SFTRST 0x80000000
+#define BF_PRE_CTRL_SFTRST(v) \
+ (((v) << 31) & BM_PRE_CTRL_SFTRST)
+#define BM_PRE_CTRL_CLKGATE 0x40000000
+#define BF_PRE_CTRL_CLKGATE(v) \
+ (((v) << 30) & BM_PRE_CTRL_CLKGATE)
+#define BM_PRE_CTRL_TPR_RESET_SEL 0x20000000
+#define BF_PRE_CTRL_TPR_RESET_SEL(v) \
+ (((v) << 29) & BM_PRE_CTRL_TPR_RESET_SEL)
+#define BM_PRE_CTRL_EN_REPEAT 0x10000000
+#define BF_PRE_CTRL_EN_REPEAT(v) \
+ (((v) << 28) & BM_PRE_CTRL_EN_REPEAT)
+#define BP_PRE_CTRL_RSVD2 16
+#define BM_PRE_CTRL_RSVD2 0x0FFF0000
+#define BF_PRE_CTRL_RSVD2(v) \
+ (((v) << 16) & BM_PRE_CTRL_RSVD2)
+#define BP_PRE_CTRL_RSVD1 12
+#define BM_PRE_CTRL_RSVD1 0x0000F000
+#define BF_PRE_CTRL_RSVD1(v) \
+ (((v) << 12) & BM_PRE_CTRL_RSVD1)
+#define BM_PRE_CTRL_HANDSHAKE_ABORT_SKIP_EN 0x00000800
+#define BF_PRE_CTRL_HANDSHAKE_ABORT_SKIP_EN(v) \
+ (((v) << 11) & BM_PRE_CTRL_HANDSHAKE_ABORT_SKIP_EN)
+#define BV_PRE_CTRL_HANDSHAKE_ABORT_SKIP_EN__0 0x0
+#define BV_PRE_CTRL_HANDSHAKE_ABORT_SKIP_EN__1 0x1
+#define BP_PRE_CTRL_HANDSHAKE_LINE_NUM 9
+#define BM_PRE_CTRL_HANDSHAKE_LINE_NUM 0x00000600
+#define BF_PRE_CTRL_HANDSHAKE_LINE_NUM(v) \
+ (((v) << 9) & BM_PRE_CTRL_HANDSHAKE_LINE_NUM)
+#define BV_PRE_CTRL_HANDSHAKE_LINE_NUM__0 0x0
+#define BV_PRE_CTRL_HANDSHAKE_LINE_NUM__1 0x1
+#define BV_PRE_CTRL_HANDSHAKE_LINE_NUM__2 0x2
+#define BM_PRE_CTRL_HANDSHAKE_EN 0x00000100
+#define BF_PRE_CTRL_HANDSHAKE_EN(v) \
+ (((v) << 8) & BM_PRE_CTRL_HANDSHAKE_EN)
+#define BV_PRE_CTRL_HANDSHAKE_EN__0 0x0
+#define BV_PRE_CTRL_HANDSHAKE_EN__1 0x1
+#define BM_PRE_CTRL_INTERLACED_FIELD 0x00000080
+#define BF_PRE_CTRL_INTERLACED_FIELD(v) \
+ (((v) << 7) & BM_PRE_CTRL_INTERLACED_FIELD)
+#define BM_PRE_CTRL_SO 0x00000040
+#define BF_PRE_CTRL_SO(v) \
+ (((v) << 6) & BM_PRE_CTRL_SO)
+#define BM_PRE_CTRL_VFLIP 0x00000020
+#define BF_PRE_CTRL_VFLIP(v) \
+ (((v) << 5) & BM_PRE_CTRL_VFLIP)
+#define BM_PRE_CTRL_SDW_UPDATE 0x00000010
+#define BF_PRE_CTRL_SDW_UPDATE(v) \
+ (((v) << 4) & BM_PRE_CTRL_SDW_UPDATE)
+#define BM_PRE_CTRL_RSVD0 0x00000008
+#define BF_PRE_CTRL_RSVD0(v) \
+ (((v) << 3) & BM_PRE_CTRL_RSVD0)
+#define BM_PRE_CTRL_BLOCK_16 0x00000004
+#define BF_PRE_CTRL_BLOCK_16(v) \
+ (((v) << 2) & BM_PRE_CTRL_BLOCK_16)
+#define BV_PRE_CTRL_BLOCK_16__32x4 0x0
+#define BV_PRE_CTRL_BLOCK_16__16x4 0x1
+#define BM_PRE_CTRL_BLOCK_EN 0x00000002
+#define BF_PRE_CTRL_BLOCK_EN(v) \
+ (((v) << 1) & BM_PRE_CTRL_BLOCK_EN)
+#define BV_PRE_CTRL_BLOCK_EN__0 0x0
+#define BV_PRE_CTRL_BLOCK_EN__1 0x1
+#define BM_PRE_CTRL_ENABLE 0x00000001
+#define BF_PRE_CTRL_ENABLE(v) \
+ (((v) << 0) & BM_PRE_CTRL_ENABLE)
+
+#define HW_PRE_IRQ_MASK (0x00000010)
+#define HW_PRE_IRQ_MASK_SET (0x00000014)
+#define HW_PRE_IRQ_MASK_CLR (0x00000018)
+#define HW_PRE_IRQ_MASK_TOG (0x0000001c)
+
+#define BP_PRE_IRQ_MASK_RSVD1 4
+#define BM_PRE_IRQ_MASK_RSVD1 0xFFFFFFF0
+#define BF_PRE_IRQ_MASK_RSVD1(v) \
+ (((v) << 4) & BM_PRE_IRQ_MASK_RSVD1)
+#define BM_PRE_IRQ_MASK_TPR_RD_NUM_BYTES_OVFL_IRQ_EN 0x00000008
+#define BF_PRE_IRQ_MASK_TPR_RD_NUM_BYTES_OVFL_IRQ_EN(v) \
+ (((v) << 3) & BM_PRE_IRQ_MASK_TPR_RD_NUM_BYTES_OVFL_IRQ_EN)
+#define BM_PRE_IRQ_MASK_HANDSHAKE_ABORT_IRQ_EN 0x00000004
+#define BF_PRE_IRQ_MASK_HANDSHAKE_ABORT_IRQ_EN(v) \
+ (((v) << 2) & BM_PRE_IRQ_MASK_HANDSHAKE_ABORT_IRQ_EN)
+#define BM_PRE_IRQ_MASK_STORE_IRQ_EN 0x00000002
+#define BF_PRE_IRQ_MASK_STORE_IRQ_EN(v) \
+ (((v) << 1) & BM_PRE_IRQ_MASK_STORE_IRQ_EN)
+#define BM_PRE_IRQ_MASK_PREFETCH_IRQ_EN 0x00000001
+#define BF_PRE_IRQ_MASK_PREFETCH_IRQ_EN(v) \
+ (((v) << 0) & BM_PRE_IRQ_MASK_PREFETCH_IRQ_EN)
+
+#define HW_PRE_IRQ (0x00000020)
+#define HW_PRE_IRQ_SET (0x00000024)
+#define HW_PRE_IRQ_CLR (0x00000028)
+#define HW_PRE_IRQ_TOG (0x0000002c)
+
+#define BP_PRE_IRQ_RSVD1 14
+#define BM_PRE_IRQ_RSVD1 0xFFFFC000
+#define BF_PRE_IRQ_RSVD1(v) \
+ (((v) << 14) & BM_PRE_IRQ_RSVD1)
+#define BP_PRE_IRQ_AXI_ERROR_ID 10
+#define BM_PRE_IRQ_AXI_ERROR_ID 0x00003C00
+#define BF_PRE_IRQ_AXI_ERROR_ID(v) \
+ (((v) << 10) & BM_PRE_IRQ_AXI_ERROR_ID)
+#define BM_PRE_IRQ_AXI_READ_ERROR 0x00000200
+#define BF_PRE_IRQ_AXI_READ_ERROR(v) \
+ (((v) << 9) & BM_PRE_IRQ_AXI_READ_ERROR)
+#define BM_PRE_IRQ_AXI_WRITE_ERROR 0x00000100
+#define BF_PRE_IRQ_AXI_WRITE_ERROR(v) \
+ (((v) << 8) & BM_PRE_IRQ_AXI_WRITE_ERROR)
+#define BP_PRE_IRQ_RSVD0 5
+#define BM_PRE_IRQ_RSVD0 0x000000E0
+#define BF_PRE_IRQ_RSVD0(v) \
+ (((v) << 5) & BM_PRE_IRQ_RSVD0)
+#define BM_PRE_IRQ_HANDSHAKE_ERROR_IRQ 0x00000010
+#define BF_PRE_IRQ_HANDSHAKE_ERROR_IRQ(v) \
+ (((v) << 4) & BM_PRE_IRQ_HANDSHAKE_ERROR_IRQ)
+#define BM_PRE_IRQ_TPR_RD_NUM_BYTES_OVFL_IRQ 0x00000008
+#define BF_PRE_IRQ_TPR_RD_NUM_BYTES_OVFL_IRQ(v) \
+ (((v) << 3) & BM_PRE_IRQ_TPR_RD_NUM_BYTES_OVFL_IRQ)
+#define BM_PRE_IRQ_HANDSHAKE_ABORT_IRQ 0x00000004
+#define BF_PRE_IRQ_HANDSHAKE_ABORT_IRQ(v) \
+ (((v) << 2) & BM_PRE_IRQ_HANDSHAKE_ABORT_IRQ)
+#define BM_PRE_IRQ_STORE_IRQ 0x00000002
+#define BF_PRE_IRQ_STORE_IRQ(v) \
+ (((v) << 1) & BM_PRE_IRQ_STORE_IRQ)
+#define BM_PRE_IRQ_PREFETCH_IRQ 0x00000001
+#define BF_PRE_IRQ_PREFETCH_IRQ(v) \
+ (((v) << 0) & BM_PRE_IRQ_PREFETCH_IRQ)
+
+#define HW_PRE_CUR_BUF (0x00000030)
+
+#define BP_PRE_CUR_BUF_ADDR 0
+#define BM_PRE_CUR_BUF_ADDR 0xFFFFFFFF
+#define BF_PRE_CUR_BUF_ADDR(v) (v)
+
+#define HW_PRE_NEXT_BUF (0x00000040)
+
+#define BP_PRE_NEXT_BUF_ADDR 0
+#define BM_PRE_NEXT_BUF_ADDR 0xFFFFFFFF
+#define BF_PRE_NEXT_BUF_ADDR(v) (v)
+
+#define HW_PRE_U_BUF_OFFSET (0x00000050)
+
+#define BP_PRE_U_BUF_OFFSET_RSVD0 25
+#define BM_PRE_U_BUF_OFFSET_RSVD0 0xFE000000
+#define BF_PRE_U_BUF_OFFSET_RSVD0(v) \
+ (((v) << 25) & BM_PRE_U_BUF_OFFSET_RSVD0)
+#define BP_PRE_U_BUF_OFFSET_UBO 0
+#define BM_PRE_U_BUF_OFFSET_UBO 0x01FFFFFF
+#define BF_PRE_U_BUF_OFFSET_UBO(v) \
+ (((v) << 0) & BM_PRE_U_BUF_OFFSET_UBO)
+
+#define HW_PRE_V_BUF_OFFSET (0x00000060)
+
+#define BP_PRE_V_BUF_OFFSET_RSVD0 25
+#define BM_PRE_V_BUF_OFFSET_RSVD0 0xFE000000
+#define BF_PRE_V_BUF_OFFSET_RSVD0(v) \
+ (((v) << 25) & BM_PRE_V_BUF_OFFSET_RSVD0)
+#define BP_PRE_V_BUF_OFFSET_VBO 0
+#define BM_PRE_V_BUF_OFFSET_VBO 0x01FFFFFF
+#define BF_PRE_V_BUF_OFFSET_VBO(v) \
+ (((v) << 0) & BM_PRE_V_BUF_OFFSET_VBO)
+
+#define HW_PRE_TPR_CTRL (0x00000070)
+#define HW_PRE_TPR_CTRL_SET (0x00000074)
+#define HW_PRE_TPR_CTRL_CLR (0x00000078)
+#define HW_PRE_TPR_CTRL_TOG (0x0000007c)
+
+#define BP_PRE_TPR_CTRL_RSVD 8
+#define BM_PRE_TPR_CTRL_RSVD 0xFFFFFF00
+#define BF_PRE_TPR_CTRL_RSVD(v) \
+ (((v) << 8) & BM_PRE_TPR_CTRL_RSVD)
+#define BP_PRE_TPR_CTRL_TILE_FORMAT 0
+#define BM_PRE_TPR_CTRL_TILE_FORMAT 0x000000FF
+#define BF_PRE_TPR_CTRL_TILE_FORMAT(v) \
+ (((v) << 0) & BM_PRE_TPR_CTRL_TILE_FORMAT)
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__BYPASS 0x00
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU32_SB_ST 0x10
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU32_SB_SRT 0x50
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU32_ST 0x20
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU32_SRT 0x60
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU32_MST 0xA0
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU32_MSRT 0xE0
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU16_SB_ST 0x11
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU16_SB_SRT 0x51
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU16_ST 0x21
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU16_SRT 0x61
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU16_MST 0xA1
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__GPU16_MSRT 0xE1
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__VPU8_PRO 0x22
+#define BV_PRE_TPR_CTRL_TILE_FORMAT__VPU8_SB_INT 0x13
+
+#define HW_PRE_PREFETCH_ENGINE_CTRL (0x00000080)
+#define HW_PRE_PREFETCH_ENGINE_CTRL_SET (0x00000084)
+#define HW_PRE_PREFETCH_ENGINE_CTRL_CLR (0x00000088)
+#define HW_PRE_PREFETCH_ENGINE_CTRL_TOG (0x0000008c)
+
+#define BP_PRE_PREFETCH_ENGINE_CTRL_RSVD1 16
+#define BM_PRE_PREFETCH_ENGINE_CTRL_RSVD1 0xFFFF0000
+#define BF_PRE_PREFETCH_ENGINE_CTRL_RSVD1(v) \
+ (((v) << 16) & BM_PRE_PREFETCH_ENGINE_CTRL_RSVD1)
+#define BM_PRE_PREFETCH_ENGINE_CTRL_TPR_COOR_OFFSET_EN 0x00008000
+#define BF_PRE_PREFETCH_ENGINE_CTRL_TPR_COOR_OFFSET_EN(v) \
+ (((v) << 15) & BM_PRE_PREFETCH_ENGINE_CTRL_TPR_COOR_OFFSET_EN)
+#define BM_PRE_PREFETCH_ENGINE_CTRL_PARTIAL_UV_SWAP 0x00004000
+#define BF_PRE_PREFETCH_ENGINE_CTRL_PARTIAL_UV_SWAP(v) \
+ (((v) << 14) & BM_PRE_PREFETCH_ENGINE_CTRL_PARTIAL_UV_SWAP)
+#define BM_PRE_PREFETCH_ENGINE_CTRL_CROP_EN 0x00002000
+#define BF_PRE_PREFETCH_ENGINE_CTRL_CROP_EN(v) \
+ (((v) << 13) & BM_PRE_PREFETCH_ENGINE_CTRL_CROP_EN)
+#define BV_PRE_PREFETCH_ENGINE_CTRL_CROP_EN__0 0x0
+#define BV_PRE_PREFETCH_ENGINE_CTRL_CROP_EN__1 0x1
+#define BM_PRE_PREFETCH_ENGINE_CTRL_FIELD_INVERSE 0x00001000
+#define BF_PRE_PREFETCH_ENGINE_CTRL_FIELD_INVERSE(v) \
+ (((v) << 12) & BM_PRE_PREFETCH_ENGINE_CTRL_FIELD_INVERSE)
+#define BV_PRE_PREFETCH_ENGINE_CTRL_FIELD_INVERSE__0 0x0
+#define BV_PRE_PREFETCH_ENGINE_CTRL_FIELD_INVERSE__1 0x1
+#define BM_PRE_PREFETCH_ENGINE_CTRL_SHIFT_BYPASS 0x00000800
+#define BF_PRE_PREFETCH_ENGINE_CTRL_SHIFT_BYPASS(v) \
+ (((v) << 11) & BM_PRE_PREFETCH_ENGINE_CTRL_SHIFT_BYPASS)
+#define BV_PRE_PREFETCH_ENGINE_CTRL_SHIFT_BYPASS__0 0x0
+#define BV_PRE_PREFETCH_ENGINE_CTRL_SHIFT_BYPASS__1 0x1
+#define BP_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT 8
+#define BM_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT 0x00000700
+#define BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT(v) \
+ (((v) << 8) & BM_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT)
+#define BV_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT__0 0x0
+#define BV_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT__1 0x1
+#define BV_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT__2 0x2
+#define BV_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT__3 0x3
+#define BV_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT__4 0x4
+#define BV_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT__5 0x5
+#define BP_PRE_PREFETCH_ENGINE_CTRL_RSVD0 6
+#define BM_PRE_PREFETCH_ENGINE_CTRL_RSVD0 0x000000C0
+#define BF_PRE_PREFETCH_ENGINE_CTRL_RSVD0(v) \
+ (((v) << 6) & BM_PRE_PREFETCH_ENGINE_CTRL_RSVD0)
+#define BP_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP 4
+#define BM_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP 0x00000030
+#define BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP(v) \
+ (((v) << 4) & BM_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP)
+#define BV_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP__0 0x0
+#define BV_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP__1 0x1
+#define BV_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP__2 0x2
+#define BV_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP__3 0x3
+#define BP_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES 1
+#define BM_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES 0x0000000E
+#define BF_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES(v) \
+ (((v) << 1) & BM_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES)
+#define BV_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES__8_bytes 0x0
+#define BV_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES__16_bytes 0x1
+#define BV_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES__32_bytes 0x2
+#define BV_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES__64_bytes 0x3
+#define BV_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES__128_bytes 0x4
+#define BM_PRE_PREFETCH_ENGINE_CTRL_PREFETCH_EN 0x00000001
+#define BF_PRE_PREFETCH_ENGINE_CTRL_PREFETCH_EN(v) \
+ (((v) << 0) & BM_PRE_PREFETCH_ENGINE_CTRL_PREFETCH_EN)
+#define BV_PRE_PREFETCH_ENGINE_CTRL_PREFETCH_EN__0 0x0
+#define BV_PRE_PREFETCH_ENGINE_CTRL_PREFETCH_EN__1 0x1
+
+#define HW_PRE_PREFETCH_ENGINE_STATUS (0x00000090)
+
+#define BP_PRE_PREFETCH_ENGINE_STATUS_PREFETCH_BLOCK_Y 16
+#define BM_PRE_PREFETCH_ENGINE_STATUS_PREFETCH_BLOCK_Y 0x3FFF0000
+#define BF_PRE_PREFETCH_ENGINE_STATUS_PREFETCH_BLOCK_Y(v) \
+ (((v) << 16) & BM_PRE_PREFETCH_ENGINE_STATUS_PREFETCH_BLOCK_Y)
+#define BP_PRE_PREFETCH_ENGINE_STATUS_PREFETCH_BLOCK_X 0
+#define BM_PRE_PREFETCH_ENGINE_STATUS_PREFETCH_BLOCK_X 0x0000FFFF
+#define BF_PRE_PREFETCH_ENGINE_STATUS_PREFETCH_BLOCK_X(v) \
+ (((v) << 0) & BM_PRE_PREFETCH_ENGINE_STATUS_PREFETCH_BLOCK_X)
+
+#define HW_PRE_PREFETCH_ENGINE_INPUT_SIZE (0x000000a0)
+
+#define BP_PRE_PREFETCH_ENGINE_INPUT_SIZE_INPUT_HEIGHT 16
+#define BM_PRE_PREFETCH_ENGINE_INPUT_SIZE_INPUT_HEIGHT 0xFFFF0000
+#define BF_PRE_PREFETCH_ENGINE_INPUT_SIZE_INPUT_HEIGHT(v) \
+ (((v) << 16) & BM_PRE_PREFETCH_ENGINE_INPUT_SIZE_INPUT_HEIGHT)
+#define BP_PRE_PREFETCH_ENGINE_INPUT_SIZE_INPUT_WIDTH 0
+#define BM_PRE_PREFETCH_ENGINE_INPUT_SIZE_INPUT_WIDTH 0x0000FFFF
+#define BF_PRE_PREFETCH_ENGINE_INPUT_SIZE_INPUT_WIDTH(v) \
+ (((v) << 0) & BM_PRE_PREFETCH_ENGINE_INPUT_SIZE_INPUT_WIDTH)
+
+#define HW_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC (0x000000b0)
+
+#define BP_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_Y 16
+#define BM_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_Y 0xFFFF0000
+#define BF_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_Y(v) \
+ (((v) << 16) & BM_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_Y)
+#define BP_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_X 0
+#define BM_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_X 0x0000FFFF
+#define BF_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_X(v) \
+ (((v) << 0) & BM_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_X)
+
+#define HW_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_LRC (0x000000c0)
+
+#define BP_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_LRC_OUTPUT_SIZE_LRC_Y 16
+#define BM_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_LRC_OUTPUT_SIZE_LRC_Y 0xFFFF0000
+#define BF_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_LRC_OUTPUT_SIZE_LRC_Y(v) \
+ (((v) << 16) & BM_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_LRC_OUTPUT_SIZE_LRC_Y)
+#define BP_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_LRC_OUTPUT_SIZE_LRC_X 0
+#define BM_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_LRC_OUTPUT_SIZE_LRC_X 0x0000FFFF
+#define BF_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_LRC_OUTPUT_SIZE_LRC_X(v) \
+ (((v) << 0) & BM_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_LRC_OUTPUT_SIZE_LRC_X)
+
+#define HW_PRE_PREFETCH_ENGINE_PITCH (0x000000d0)
+
+#define BP_PRE_PREFETCH_ENGINE_PITCH_INPUT_UV_PITCH 16
+#define BM_PRE_PREFETCH_ENGINE_PITCH_INPUT_UV_PITCH 0xFFFF0000
+#define BF_PRE_PREFETCH_ENGINE_PITCH_INPUT_UV_PITCH(v) \
+ (((v) << 16) & BM_PRE_PREFETCH_ENGINE_PITCH_INPUT_UV_PITCH)
+#define BP_PRE_PREFETCH_ENGINE_PITCH_INPUT_Y_PITCH 0
+#define BM_PRE_PREFETCH_ENGINE_PITCH_INPUT_Y_PITCH 0x0000FFFF
+#define BF_PRE_PREFETCH_ENGINE_PITCH_INPUT_Y_PITCH(v) \
+ (((v) << 0) & BM_PRE_PREFETCH_ENGINE_PITCH_INPUT_Y_PITCH)
+
+#define HW_PRE_PREFETCH_ENGINE_SHIFT_OFFSET (0x000000e0)
+#define HW_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_SET (0x000000e4)
+#define HW_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_CLR (0x000000e8)
+#define HW_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_TOG (0x000000ec)
+
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD0 29
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD0 0xE0000000
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD0(v) \
+ (((v) << 29) & BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD0)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET3 24
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET3 0x1F000000
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET3(v) \
+ (((v) << 24) & BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET3)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD1 21
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD1 0x00E00000
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD1(v) \
+ (((v) << 21) & BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD1)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET2 16
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET2 0x001F0000
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET2(v) \
+ (((v) << 16) & BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET2)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD2 13
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD2 0x0000E000
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD2(v) \
+ (((v) << 13) & BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD2)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET1 8
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET1 0x00001F00
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET1(v) \
+ (((v) << 8) & BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET1)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD3 5
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD3 0x000000E0
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD3(v) \
+ (((v) << 5) & BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_RSVD3)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET0 0
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET0 0x0000001F
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET0(v) \
+ (((v) << 0) & BM_PRE_PREFETCH_ENGINE_SHIFT_OFFSET_OFFSET0)
+
+#define HW_PRE_PREFETCH_ENGINE_SHIFT_WIDTH (0x000000f0)
+#define HW_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_SET (0x000000f4)
+#define HW_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_CLR (0x000000f8)
+#define HW_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_TOG (0x000000fc)
+
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_RSVD0 16
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_RSVD0 0xFFFF0000
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_RSVD0(v) \
+ (((v) << 16) & BM_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_RSVD0)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH3 12
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH3 0x0000F000
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH3(v) \
+ (((v) << 12) & BM_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH3)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH2 8
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH2 0x00000F00
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH2(v) \
+ (((v) << 8) & BM_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH2)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH1 4
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH1 0x000000F0
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH1(v) \
+ (((v) << 4) & BM_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH1)
+#define BP_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH0 0
+#define BM_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH0 0x0000000F
+#define BF_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH0(v) \
+ (((v) << 0) & BM_PRE_PREFETCH_ENGINE_SHIFT_WIDTH_WIDTH0)
+
+#define HW_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET (0x00000100)
+
+#define BP_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET_RSVD0 23
+#define BM_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET_RSVD0 0xFF800000
+#define BF_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET_RSVD0(v) \
+ (((v) << 23) & BM_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET_RSVD0)
+#define BP_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET_INTERLACE_OFFSET 0
+#define BM_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET_INTERLACE_OFFSET 0xFFFFFFFF
+#define BF_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET_INTERLACE_OFFSET(v) \
+ (((v) << 0) & BM_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET_INTERLACE_OFFSET)
+
+#define HW_PRE_STORE_ENGINE_CTRL (0x00000110)
+#define HW_PRE_STORE_ENGINE_CTRL_SET (0x00000114)
+#define HW_PRE_STORE_ENGINE_CTRL_CLR (0x00000118)
+#define HW_PRE_STORE_ENGINE_CTRL_TOG (0x0000011c)
+
+#define BP_PRE_STORE_ENGINE_CTRL_RSVD0 6
+#define BM_PRE_STORE_ENGINE_CTRL_RSVD0 0xFFFFFFC0
+#define BF_PRE_STORE_ENGINE_CTRL_RSVD0(v) \
+ (((v) << 6) & BM_PRE_STORE_ENGINE_CTRL_RSVD0)
+#define BP_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP 4
+#define BM_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP 0x00000030
+#define BF_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP(v) \
+ (((v) << 4) & BM_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP)
+#define BV_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP__8_bits 0x0
+#define BV_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP__16_bits 0x1
+#define BV_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP__32_bits 0x2
+#define BV_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP__64_bits 0x3
+#define BP_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES 1
+#define BM_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES 0x0000000E
+#define BF_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES(v) \
+ (((v) << 1) & BM_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES)
+#define BV_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES__8_bytes 0x0
+#define BV_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES__16_bytes 0x1
+#define BV_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES__32_bytes 0x2
+#define BV_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES__64_bytes 0x3
+#define BV_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES__128_bytes 0x4
+#define BM_PRE_STORE_ENGINE_CTRL_STORE_EN 0x00000001
+#define BF_PRE_STORE_ENGINE_CTRL_STORE_EN(v) \
+ (((v) << 0) & BM_PRE_STORE_ENGINE_CTRL_STORE_EN)
+#define BV_PRE_STORE_ENGINE_CTRL_STORE_EN__0 0x0
+#define BV_PRE_STORE_ENGINE_CTRL_STORE_EN__1 0x1
+
+#define HW_PRE_STORE_ENGINE_STATUS (0x00000120)
+
+#define BP_PRE_STORE_ENGINE_STATUS_STORE_BLOCK_Y 16
+#define BM_PRE_STORE_ENGINE_STATUS_STORE_BLOCK_Y 0x3FFF0000
+#define BF_PRE_STORE_ENGINE_STATUS_STORE_BLOCK_Y(v) \
+ (((v) << 16) & BM_PRE_STORE_ENGINE_STATUS_STORE_BLOCK_Y)
+#define BP_PRE_STORE_ENGINE_STATUS_STORE_BLOCK_X 0
+#define BM_PRE_STORE_ENGINE_STATUS_STORE_BLOCK_X 0x0000FFFF
+#define BF_PRE_STORE_ENGINE_STATUS_STORE_BLOCK_X(v) \
+ (((v) << 0) & BM_PRE_STORE_ENGINE_STATUS_STORE_BLOCK_X)
+
+#define HW_PRE_STORE_ENGINE_SIZE (0x00000130)
+
+#define BP_PRE_STORE_ENGINE_SIZE_INPUT_TOTAL_HEIGHT 16
+#define BM_PRE_STORE_ENGINE_SIZE_INPUT_TOTAL_HEIGHT 0xFFFF0000
+#define BF_PRE_STORE_ENGINE_SIZE_INPUT_TOTAL_HEIGHT(v) \
+ (((v) << 16) & BM_PRE_STORE_ENGINE_SIZE_INPUT_TOTAL_HEIGHT)
+#define BP_PRE_STORE_ENGINE_SIZE_INPUT_TOTAL_WIDTH 0
+#define BM_PRE_STORE_ENGINE_SIZE_INPUT_TOTAL_WIDTH 0x0000FFFF
+#define BF_PRE_STORE_ENGINE_SIZE_INPUT_TOTAL_WIDTH(v) \
+ (((v) << 0) & BM_PRE_STORE_ENGINE_SIZE_INPUT_TOTAL_WIDTH)
+
+#define HW_PRE_STORE_ENGINE_PITCH (0x00000140)
+
+#define BP_PRE_STORE_ENGINE_PITCH_RSVD0 16
+#define BM_PRE_STORE_ENGINE_PITCH_RSVD0 0xFFFF0000
+#define BF_PRE_STORE_ENGINE_PITCH_RSVD0(v) \
+ (((v) << 16) & BM_PRE_STORE_ENGINE_PITCH_RSVD0)
+#define BP_PRE_STORE_ENGINE_PITCH_OUT_PITCH 0
+#define BM_PRE_STORE_ENGINE_PITCH_OUT_PITCH 0x0000FFFF
+#define BF_PRE_STORE_ENGINE_PITCH_OUT_PITCH(v) \
+ (((v) << 0) & BM_PRE_STORE_ENGINE_PITCH_OUT_PITCH)
+
+#define HW_PRE_STORE_ENGINE_ADDR (0x00000150)
+
+#define BP_PRE_STORE_ENGINE_ADDR_OUT_BASE_ADDR 0
+#define BM_PRE_STORE_ENGINE_ADDR_OUT_BASE_ADDR 0xFFFFFFFF
+#define BF_PRE_STORE_ENGINE_ADDR_OUT_BASE_ADDR(v) (v)
+#endif /* __ARCH_ARM___PRE_H */
diff --git a/drivers/mxc/ipu3/pre.c b/drivers/mxc/ipu3/pre.c
new file mode 100644
index 000000000000..5dba5f63dec5
--- /dev/null
+++ b/drivers/mxc/ipu3/pre.c
@@ -0,0 +1,1001 @@
+/*
+ * Copyright (C) 2014-2016 Freescale Semiconductor, Inc.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#include <linux/clk.h>
+#include <linux/genalloc.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/ipu-v3.h>
+#include <linux/ipu-v3-pre.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+
+#include "pre-regs.h"
+
+struct ipu_pre_data {
+ unsigned int id;
+ struct device *dev;
+ void __iomem *base;
+ struct clk *clk;
+
+ struct mutex mutex; /* for in_use */
+ spinlock_t lock; /* for register access */
+
+ struct list_head list;
+
+ struct gen_pool *iram_pool;
+ unsigned long double_buffer_size;
+ unsigned long double_buffer_base;
+ unsigned long double_buffer_paddr;
+
+ bool in_use;
+ bool enabled;
+};
+
+static LIST_HEAD(pre_list);
+static DEFINE_SPINLOCK(pre_list_lock);
+
+static inline void pre_write(struct ipu_pre_data *pre,
+ u32 value, unsigned int offset)
+{
+ writel(value, pre->base + offset);
+}
+
+static inline u32 pre_read(struct ipu_pre_data *pre, unsigned offset)
+{
+ return readl(pre->base + offset);
+}
+
+static struct ipu_pre_data *get_pre(unsigned int id)
+{
+ struct ipu_pre_data *pre;
+ unsigned long lock_flags;
+
+ spin_lock_irqsave(&pre_list_lock, lock_flags);
+ list_for_each_entry(pre, &pre_list, list) {
+ if (pre->id == id) {
+ spin_unlock_irqrestore(&pre_list_lock, lock_flags);
+ return pre;
+ }
+ }
+ spin_unlock_irqrestore(&pre_list_lock, lock_flags);
+
+ return NULL;
+}
+
+int ipu_pre_alloc(int ipu_id, ipu_channel_t channel)
+{
+ struct ipu_pre_data *pre;
+ int i, fixed;
+
+ if (channel == MEM_BG_SYNC) {
+ fixed = ipu_id ? 3 : 0;
+ pre = get_pre(fixed);
+ if (pre) {
+ mutex_lock(&pre->mutex);
+ if (!pre->in_use) {
+ pre->in_use = true;
+ mutex_unlock(&pre->mutex);
+ return pre->id;
+ }
+ mutex_unlock(&pre->mutex);
+ }
+ return pre ? -EBUSY : -ENOENT;
+ }
+
+ for (i = 1; i < 3; i++) {
+ pre = get_pre(i);
+ if (!pre)
+ continue;
+ mutex_lock(&pre->mutex);
+ if (!pre->in_use) {
+ pre->in_use = true;
+ mutex_unlock(&pre->mutex);
+ return pre->id;
+ }
+ mutex_unlock(&pre->mutex);
+ }
+
+ return pre ? -EBUSY : -ENOENT;
+}
+EXPORT_SYMBOL(ipu_pre_alloc);
+
+void ipu_pre_free(unsigned int *id)
+{
+ struct ipu_pre_data *pre;
+
+ pre = get_pre(*id);
+ if (!pre)
+ return;
+
+ mutex_lock(&pre->mutex);
+ pre->in_use = false;
+ mutex_unlock(&pre->mutex);
+
+ *id = -1;
+}
+EXPORT_SYMBOL(ipu_pre_free);
+
+unsigned long ipu_pre_alloc_double_buffer(unsigned int id, unsigned int size)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+
+ if (!pre)
+ return -ENOENT;
+
+ if (!size)
+ return -EINVAL;
+
+ pre->double_buffer_base = gen_pool_alloc(pre->iram_pool, size);
+ if (!pre->double_buffer_base) {
+ dev_err(pre->dev, "double buffer allocate failed\n");
+ return -ENOMEM;
+ }
+ pre->double_buffer_size = size;
+
+ pre->double_buffer_paddr = gen_pool_virt_to_phys(pre->iram_pool,
+ pre->double_buffer_base);
+
+ return pre->double_buffer_paddr;
+}
+EXPORT_SYMBOL(ipu_pre_alloc_double_buffer);
+
+void ipu_pre_free_double_buffer(unsigned int id)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+
+ if (!pre)
+ return;
+
+ if (pre->double_buffer_base) {
+ gen_pool_free(pre->iram_pool,
+ pre->double_buffer_base,
+ pre->double_buffer_size);
+ pre->double_buffer_base = 0;
+ pre->double_buffer_size = 0;
+ pre->double_buffer_paddr = 0;
+ }
+}
+EXPORT_SYMBOL(ipu_pre_free_double_buffer);
+
+/* PRE register configurations */
+int ipu_pre_set_ctrl(unsigned int id, struct ipu_pre_context *config)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned long lock_flags;
+ int ret = 0;
+
+ if (!pre)
+ return -EINVAL;
+
+ if (!pre->enabled)
+ clk_prepare_enable(pre->clk);
+
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ pre_write(pre, BF_PRE_CTRL_TPR_RESET_SEL(1), HW_PRE_CTRL_SET);
+
+ if (config->repeat)
+ pre_write(pre, BF_PRE_CTRL_EN_REPEAT(1), HW_PRE_CTRL_SET);
+ else
+ pre_write(pre, BM_PRE_CTRL_EN_REPEAT, HW_PRE_CTRL_CLR);
+
+ if (config->vflip)
+ pre_write(pre, BF_PRE_CTRL_VFLIP(1), HW_PRE_CTRL_SET);
+ else
+ pre_write(pre, BM_PRE_CTRL_VFLIP, HW_PRE_CTRL_CLR);
+
+ if (config->handshake_en) {
+ pre_write(pre, BF_PRE_CTRL_HANDSHAKE_EN(1), HW_PRE_CTRL_SET);
+ if (config->hsk_abort_en)
+ pre_write(pre, BF_PRE_CTRL_HANDSHAKE_ABORT_SKIP_EN(1),
+ HW_PRE_CTRL_SET);
+ else
+ pre_write(pre, BM_PRE_CTRL_HANDSHAKE_ABORT_SKIP_EN,
+ HW_PRE_CTRL_CLR);
+
+ switch (config->hsk_line_num) {
+ case 0 /* 4 lines */:
+ pre_write(pre, BM_PRE_CTRL_HANDSHAKE_LINE_NUM,
+ HW_PRE_CTRL_CLR);
+ break;
+ case 1 /* 8 lines */:
+ pre_write(pre, BM_PRE_CTRL_HANDSHAKE_LINE_NUM,
+ HW_PRE_CTRL_CLR);
+ pre_write(pre, BF_PRE_CTRL_HANDSHAKE_LINE_NUM(1),
+ HW_PRE_CTRL_SET);
+ break;
+ case 2 /* 16 lines */:
+ pre_write(pre, BM_PRE_CTRL_HANDSHAKE_LINE_NUM,
+ HW_PRE_CTRL_CLR);
+ pre_write(pre, BF_PRE_CTRL_HANDSHAKE_LINE_NUM(2),
+ HW_PRE_CTRL_SET);
+ break;
+ default:
+ dev_err(pre->dev, "invalid hanshake line number\n");
+ ret = -EINVAL;
+ goto err;
+ }
+ } else
+ pre_write(pre, BM_PRE_CTRL_HANDSHAKE_EN, HW_PRE_CTRL_CLR);
+
+
+ switch (config->prefetch_mode) {
+ case 0:
+ pre_write(pre, BM_PRE_CTRL_BLOCK_EN, HW_PRE_CTRL_CLR);
+ break;
+ case 1:
+ pre_write(pre, BF_PRE_CTRL_BLOCK_EN(1), HW_PRE_CTRL_SET);
+ switch (config->block_size) {
+ case 0:
+ pre_write(pre, BM_PRE_CTRL_BLOCK_16, HW_PRE_CTRL_CLR);
+ break;
+ case 1:
+ pre_write(pre, BF_PRE_CTRL_BLOCK_16(1), HW_PRE_CTRL_SET);
+ break;
+ default:
+ dev_err(pre->dev, "invalid block size for pre\n");
+ ret = -EINVAL;
+ goto err;
+ }
+ break;
+ default:
+ dev_err(pre->dev, "invalid prefech mode for pre\n");
+ ret = -EINVAL;
+ goto err;
+ }
+
+ switch (config->interlaced) {
+ case 0: /* progressive mode */
+ pre_write(pre, BM_PRE_CTRL_SO, HW_PRE_CTRL_CLR);
+ break;
+ case 2: /* interlaced mode: Pal */
+ pre_write(pre, BF_PRE_CTRL_SO(1), HW_PRE_CTRL_SET);
+ pre_write(pre, BM_PRE_CTRL_INTERLACED_FIELD, HW_PRE_CTRL_CLR);
+ break;
+ case 3: /* interlaced mode: NTSC */
+ pre_write(pre, BF_PRE_CTRL_SO(1), HW_PRE_CTRL_SET);
+ pre_write(pre, BF_PRE_CTRL_INTERLACED_FIELD(1), HW_PRE_CTRL_SET);
+ break;
+ default:
+ dev_err(pre->dev, "invalid interlaced or progressive mode\n");
+ ret = -EINVAL;
+ goto err;
+ }
+
+ if (config->sdw_update)
+ pre_write(pre, BF_PRE_CTRL_SDW_UPDATE(1), HW_PRE_CTRL_SET);
+ else
+ pre_write(pre, BM_PRE_CTRL_SDW_UPDATE, HW_PRE_CTRL_CLR);
+
+err:
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ if (!pre->enabled)
+ clk_disable_unprepare(pre->clk);
+
+ return ret;
+}
+EXPORT_SYMBOL(ipu_pre_set_ctrl);
+
+static void ipu_pre_irq_mask(struct ipu_pre_data *pre,
+ unsigned long mask, bool clear)
+{
+ if (clear) {
+ pre_write(pre, mask & 0x1f, HW_PRE_IRQ_MASK_CLR);
+ return;
+ }
+ pre_write(pre, mask & 0x1f, HW_PRE_IRQ_MASK_SET);
+}
+
+static int ipu_pre_buf_set(unsigned int id, unsigned long cur_buf,
+ unsigned long next_buf)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned long lock_flags;
+
+ if (!pre)
+ return -EINVAL;
+
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ pre_write(pre, cur_buf, HW_PRE_CUR_BUF);
+ pre_write(pre, next_buf, HW_PRE_NEXT_BUF);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ return 0;
+}
+
+static int ipu_pre_plane_buf_off_set(unsigned int id,
+ unsigned long sec_buf_off,
+ unsigned long trd_buf_off)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned long lock_flags;
+
+ if (!pre || sec_buf_off & BM_PRE_U_BUF_OFFSET_RSVD0 ||
+ trd_buf_off & BM_PRE_V_BUF_OFFSET_RSVD0)
+ return -EINVAL;
+
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ pre_write(pre, sec_buf_off, HW_PRE_U_BUF_OFFSET);
+ pre_write(pre, trd_buf_off, HW_PRE_V_BUF_OFFSET);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ return 0;
+}
+
+static int ipu_pre_tpr_set(unsigned int id, unsigned int tile_fmt)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned long lock_flags;
+ unsigned int tpr_ctrl, fmt;
+
+ if (!pre)
+ return -EINVAL;
+
+ switch (tile_fmt) {
+ case 0x0: /* Bypass */
+ fmt = BF_PRE_TPR_CTRL_TILE_FORMAT(0x0);
+ break;
+ case IPU_PIX_FMT_GPU32_SB_ST:
+ fmt = BF_PRE_TPR_CTRL_TILE_FORMAT(0x10);
+ break;
+ case IPU_PIX_FMT_GPU16_SB_ST:
+ fmt = BF_PRE_TPR_CTRL_TILE_FORMAT(0x11);
+ break;
+ case IPU_PIX_FMT_GPU32_ST:
+ fmt = BF_PRE_TPR_CTRL_TILE_FORMAT(0x20);
+ break;
+ case IPU_PIX_FMT_GPU16_ST:
+ fmt = BF_PRE_TPR_CTRL_TILE_FORMAT(0x21);
+ break;
+ case IPU_PIX_FMT_GPU32_SB_SRT:
+ fmt = BF_PRE_TPR_CTRL_TILE_FORMAT(0x50);
+ break;
+ case IPU_PIX_FMT_GPU16_SB_SRT:
+ fmt = BF_PRE_TPR_CTRL_TILE_FORMAT(0x51);
+ break;
+ case IPU_PIX_FMT_GPU32_SRT:
+ fmt = BF_PRE_TPR_CTRL_TILE_FORMAT(0x60);
+ break;
+ case IPU_PIX_FMT_GPU16_SRT:
+ fmt = BF_PRE_TPR_CTRL_TILE_FORMAT(0x61);
+ break;
+ default:
+ dev_err(pre->dev, "invalid tile fmt for pre\n");
+ return -EINVAL;
+ }
+
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ tpr_ctrl = pre_read(pre, HW_PRE_TPR_CTRL);
+ tpr_ctrl &= ~BM_PRE_TPR_CTRL_TILE_FORMAT;
+ tpr_ctrl |= fmt;
+ pre_write(pre, tpr_ctrl, HW_PRE_TPR_CTRL);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ return 0;
+}
+
+static int ipu_pre_set_shift(int id, unsigned int offset, unsigned int width)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned long lock_flags;
+
+ if (!pre)
+ return -EINVAL;
+
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ pre_write(pre, offset, HW_PRE_PREFETCH_ENGINE_SHIFT_OFFSET);
+ pre_write(pre, width, HW_PRE_PREFETCH_ENGINE_SHIFT_WIDTH);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ return 0;
+}
+
+static int ipu_pre_prefetch(unsigned int id,
+ unsigned int read_burst,
+ unsigned int input_bpp,
+ unsigned int input_pixel_fmt,
+ bool shift_bypass,
+ bool field_inverse,
+ bool tpr_coor_offset_en,
+ struct ipu_rect output_size,
+ unsigned int input_width,
+ unsigned int input_height,
+ unsigned int input_active_width,
+ unsigned int interlaced,
+ int interlace_offset)
+{
+ unsigned int prefetch_ctrl = 0;
+ unsigned int input_y_pitch = 0, input_uv_pitch = 0;
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned long lock_flags;
+
+ if (!pre)
+ return -EINVAL;
+
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_PREFETCH_EN(1);
+ switch (read_burst) {
+ case 0x0:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES(0x0);
+ break;
+ case 0x1:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES(0x1);
+ break;
+ case 0x2:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES(0x2);
+ break;
+ case 0x3:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES(0x3);
+ break;
+ case 0x4:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_RD_NUM_BYTES(0x4);
+ break;
+ default:
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+ dev_err(pre->dev, "invalid read burst for prefetch engine\n");
+ return -EINVAL;
+ }
+
+ switch (input_bpp) {
+ case 8:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP(0x0);
+ break;
+ case 16:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP(0x1);
+ break;
+ case 32:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP(0x2);
+ break;
+ case 64:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_ACTIVE_BPP(0x3);
+ break;
+ default:
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+ dev_err(pre->dev, "invalid input bpp for prefetch engine\n");
+ return -EINVAL;
+ }
+
+ switch (input_pixel_fmt) {
+ case 0x1: /* tile */
+ case 0x0: /* generic data */
+ case IPU_PIX_FMT_RGB666:
+ case IPU_PIX_FMT_RGB565:
+ case IPU_PIX_FMT_BGRA4444:
+ case IPU_PIX_FMT_BGRA5551:
+ case IPU_PIX_FMT_BGR24:
+ case IPU_PIX_FMT_RGB24:
+ case IPU_PIX_FMT_GBR24:
+ case IPU_PIX_FMT_BGR32:
+ case IPU_PIX_FMT_BGRA32:
+ case IPU_PIX_FMT_RGB32:
+ case IPU_PIX_FMT_RGBA32:
+ case IPU_PIX_FMT_ABGR32:
+ case IPU_PIX_FMT_YUYV:
+ case IPU_PIX_FMT_UYVY:
+ case IPU_PIX_FMT_YUV444:
+ case IPU_PIX_FMT_AYUV:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT(0x0);
+ input_y_pitch = input_width * (input_bpp >> 3);
+ if (interlaced && input_pixel_fmt != 0x1)
+ input_y_pitch *= 2;
+ break;
+ case IPU_PIX_FMT_YUV444P:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT(0x1);
+ input_y_pitch = input_width;
+ input_uv_pitch = input_width;
+ break;
+ case IPU_PIX_FMT_YUV422P:
+ case IPU_PIX_FMT_YVU422P:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT(0x2);
+ input_y_pitch = input_width;
+ input_uv_pitch = input_width >> 1;
+ break;
+ case IPU_PIX_FMT_YUV420P2:
+ case IPU_PIX_FMT_YUV420P:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT(0x3);
+ input_y_pitch = input_width;
+ input_uv_pitch = input_width >> 1;
+ break;
+ case PRE_PIX_FMT_NV61:
+ prefetch_ctrl |= BM_PRE_PREFETCH_ENGINE_CTRL_PARTIAL_UV_SWAP;
+ /* fall-through */
+ case IPU_PIX_FMT_NV16:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT(0x4);
+ input_y_pitch = input_width;
+ input_uv_pitch = input_width;
+ break;
+ case PRE_PIX_FMT_NV21:
+ prefetch_ctrl |= BM_PRE_PREFETCH_ENGINE_CTRL_PARTIAL_UV_SWAP;
+ /* fall-through */
+ case IPU_PIX_FMT_NV12:
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_INPUT_PIXEL_FORMAT(0x5);
+ input_y_pitch = input_width;
+ input_uv_pitch = input_width;
+ break;
+ default:
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+ dev_err(pre->dev, "invalid input pixel format for prefetch engine\n");
+ return -EINVAL;
+ }
+
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_SHIFT_BYPASS(shift_bypass ? 1 : 0);
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_FIELD_INVERSE(field_inverse ? 1 : 0);
+ prefetch_ctrl |= BF_PRE_PREFETCH_ENGINE_CTRL_TPR_COOR_OFFSET_EN(tpr_coor_offset_en ? 1 : 0);
+
+ pre_write(pre, BF_PRE_PREFETCH_ENGINE_INPUT_SIZE_INPUT_WIDTH(input_active_width) |
+ BF_PRE_PREFETCH_ENGINE_INPUT_SIZE_INPUT_HEIGHT(input_height),
+ HW_PRE_PREFETCH_ENGINE_INPUT_SIZE);
+
+ if (tpr_coor_offset_en)
+ pre_write(pre, BF_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_X(output_size.left) |
+ BF_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_Y(output_size.top),
+ HW_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC);
+
+ pre_write(pre, BF_PRE_PREFETCH_ENGINE_PITCH_INPUT_Y_PITCH(input_y_pitch) |
+ BF_PRE_PREFETCH_ENGINE_PITCH_INPUT_UV_PITCH(input_uv_pitch),
+ HW_PRE_PREFETCH_ENGINE_PITCH);
+
+ pre_write(pre, BF_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET_INTERLACE_OFFSET(interlace_offset), HW_PRE_PREFETCH_ENGINE_INTERLACE_OFFSET);
+
+ pre_write(pre, prefetch_ctrl, HW_PRE_PREFETCH_ENGINE_CTRL);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ return 0;
+}
+
+static int ipu_pre_store(unsigned int id,
+ bool store_en,
+ unsigned int write_burst,
+ unsigned int output_bpp,
+ /* this means the output
+ * width by prefetch
+ */
+ unsigned int input_width,
+ unsigned int input_height,
+ unsigned int out_pitch,
+ unsigned int output_addr)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned int store_ctrl = 0;
+ unsigned long lock_flags;
+
+ if (!pre)
+ return -EINVAL;
+
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ store_ctrl |= BF_PRE_STORE_ENGINE_CTRL_STORE_EN(store_en ? 1 : 0);
+
+ if (store_en) {
+ switch (write_burst) {
+ case 0x0:
+ store_ctrl |= BF_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES(0x0);
+ break;
+ case 0x1:
+ store_ctrl |= BF_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES(0x1);
+ break;
+ case 0x2:
+ store_ctrl |= BF_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES(0x2);
+ break;
+ case 0x3:
+ store_ctrl |= BF_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES(0x3);
+ break;
+ case 0x4:
+ store_ctrl |= BF_PRE_STORE_ENGINE_CTRL_WR_NUM_BYTES(0x4);
+ break;
+ default:
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+ dev_err(pre->dev, "invalid write burst value for store engine\n");
+ return -EINVAL;
+ }
+
+ switch (output_bpp) {
+ case 8:
+ store_ctrl |= BF_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP(0x0);
+ break;
+ case 16:
+ store_ctrl |= BF_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP(0x1);
+ break;
+ case 32:
+ store_ctrl |= BF_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP(0x2);
+ break;
+ case 64:
+ store_ctrl |= BF_PRE_STORE_ENGINE_CTRL_OUTPUT_ACTIVE_BPP(0x3);
+ break;
+ default:
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+ dev_err(pre->dev, "invalid ouput bpp for store engine\n");
+ return -EINVAL;
+ }
+
+ pre_write(pre, BF_PRE_STORE_ENGINE_SIZE_INPUT_TOTAL_WIDTH(input_width) |
+ BF_PRE_STORE_ENGINE_SIZE_INPUT_TOTAL_HEIGHT(input_height),
+ HW_PRE_STORE_ENGINE_SIZE);
+
+ pre_write(pre, BF_PRE_STORE_ENGINE_PITCH_OUT_PITCH(out_pitch),
+ HW_PRE_STORE_ENGINE_PITCH);
+
+ pre_write(pre, BF_PRE_STORE_ENGINE_ADDR_OUT_BASE_ADDR(output_addr),
+ HW_PRE_STORE_ENGINE_ADDR);
+ }
+
+ pre_write(pre, store_ctrl, HW_PRE_STORE_ENGINE_CTRL);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ return 0;
+}
+/* End */
+
+static irqreturn_t ipu_pre_irq_handle(int irq, void *dev_id)
+{
+ struct ipu_pre_data *pre = dev_id;
+ unsigned int irq_stat, axi_id = 0;
+
+ spin_lock(&pre->lock);
+ irq_stat = pre_read(pre, HW_PRE_IRQ);
+
+ if (irq_stat & BM_PRE_IRQ_HANDSHAKE_ABORT_IRQ) {
+ dev_warn(pre->dev, "handshake abort\n");
+ pre_write(pre, BM_PRE_IRQ_HANDSHAKE_ABORT_IRQ, HW_PRE_IRQ_CLR);
+ }
+
+ if (irq_stat & BM_PRE_IRQ_TPR_RD_NUM_BYTES_OVFL_IRQ) {
+ dev_warn(pre->dev, "tpr read num bytes overflow\n");
+ pre_write(pre, BM_PRE_IRQ_TPR_RD_NUM_BYTES_OVFL_IRQ,
+ HW_PRE_IRQ_CLR);
+ }
+
+ if (irq_stat & BM_PRE_IRQ_HANDSHAKE_ERROR_IRQ) {
+ dev_warn(pre->dev, "handshake error\n");
+ pre_write(pre, BM_PRE_IRQ_HANDSHAKE_ERROR_IRQ, HW_PRE_IRQ_CLR);
+ }
+
+ axi_id = (irq_stat & BM_PRE_IRQ_AXI_ERROR_ID) >>
+ BP_PRE_IRQ_AXI_ERROR_ID;
+ if (irq_stat & BM_PRE_IRQ_AXI_WRITE_ERROR) {
+ dev_warn(pre->dev, "AXI%d write error\n", axi_id);
+ pre_write(pre, BM_PRE_IRQ_AXI_WRITE_ERROR, HW_PRE_IRQ_CLR);
+ }
+
+ if (irq_stat & BM_PRE_IRQ_AXI_READ_ERROR) {
+ dev_warn(pre->dev, "AXI%d read error\n", axi_id);
+ pre_write(pre, BM_PRE_IRQ_AXI_READ_ERROR, HW_PRE_IRQ_CLR);
+ }
+ spin_unlock(&pre->lock);
+
+ return IRQ_HANDLED;
+}
+
+static void ipu_pre_out_of_reset(unsigned int id)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned long lock_flags;
+
+ if (!pre)
+ return;
+
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ pre_write(pre, BF_PRE_CTRL_SFTRST(1) | BF_PRE_CTRL_CLKGATE(1),
+ HW_PRE_CTRL_CLR);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+}
+
+int ipu_pre_config(int id, struct ipu_pre_context *config)
+{
+ int ret = 0;
+ struct ipu_pre_data *pre = get_pre(id);
+
+ if (!config || !pre)
+ return -EINVAL;
+
+ config->store_addr = pre->double_buffer_paddr;
+
+ if (!pre->enabled)
+ clk_prepare_enable(pre->clk);
+
+ ipu_pre_out_of_reset(id);
+
+ ret = ipu_pre_plane_buf_off_set(id, config->sec_buf_off,
+ config->trd_buf_off);
+ if (ret < 0)
+ goto out;
+
+ ret = ipu_pre_tpr_set(id, config->tile_fmt);
+ if (ret < 0)
+ goto out;
+
+ ret = ipu_pre_buf_set(id, config->cur_buf, config->next_buf);
+ if (ret < 0)
+ goto out;
+
+ ret = ipu_pre_set_shift(id, config->prefetch_shift_offset,
+ config->prefetch_shift_width);
+ if (ret < 0)
+ goto out;
+
+ ret = ipu_pre_prefetch(id, config->read_burst, config->prefetch_input_bpp,
+ config->prefetch_input_pixel_fmt, config->shift_bypass,
+ config->field_inverse, config->tpr_coor_offset_en,
+ config->prefetch_output_size, config->prefetch_input_width,
+ config->prefetch_input_height,
+ config->prefetch_input_active_width,
+ config->interlaced,
+ config->interlace_offset);
+ if (ret < 0)
+ goto out;
+
+ ret = ipu_pre_store(id, config->store_en,
+ config->write_burst, config->store_output_bpp,
+ config->prefetch_output_size.width, config->prefetch_output_size.height,
+ config->store_pitch,
+ config->store_addr);
+ if (ret < 0)
+ goto out;
+
+ ipu_pre_irq_mask(pre, BM_PRE_IRQ_HANDSHAKE_ABORT_IRQ |
+ BM_PRE_IRQ_TPR_RD_NUM_BYTES_OVFL_IRQ |
+ BM_PRE_IRQ_HANDSHAKE_ERROR_IRQ, false);
+out:
+ if (!pre->enabled)
+ clk_disable_unprepare(pre->clk);
+
+ return ret;
+}
+EXPORT_SYMBOL(ipu_pre_config);
+
+int ipu_pre_enable(int id)
+{
+ int ret = 0;
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned long lock_flags;
+
+ if (!pre)
+ return -EINVAL;
+
+ if (pre->enabled)
+ return 0;
+
+ clk_prepare_enable(pre->clk);
+
+ /* start the pre engine */
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ pre_write(pre, BF_PRE_CTRL_ENABLE(1), HW_PRE_CTRL_SET);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ pre->enabled = true;
+
+ return ret;
+}
+EXPORT_SYMBOL(ipu_pre_enable);
+
+int ipu_pre_sdw_update(int id)
+{
+ int ret = 0;
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned long lock_flags;
+
+ if (!pre)
+ return -EINVAL;
+
+ if (!pre->enabled)
+ clk_prepare_enable(pre->clk);
+
+ /* start the pre engine */
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ pre_write(pre, BF_PRE_CTRL_SDW_UPDATE(1), HW_PRE_CTRL_SET);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ if (!pre->enabled)
+ clk_disable_unprepare(pre->clk);
+
+ return ret;
+}
+EXPORT_SYMBOL(ipu_pre_sdw_update);
+
+void ipu_pre_disable(int id)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned long lock_flags;
+
+ if (!pre)
+ return;
+
+ if (!pre->enabled)
+ return;
+
+ /* stop the pre engine */
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ pre_write(pre, BF_PRE_CTRL_ENABLE(1), HW_PRE_CTRL_CLR);
+ pre_write(pre, BF_PRE_CTRL_SDW_UPDATE(1), HW_PRE_CTRL_SET);
+ pre_write(pre, BF_PRE_CTRL_SFTRST(1), HW_PRE_CTRL_SET);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ clk_disable_unprepare(pre->clk);
+
+ pre->enabled = false;
+}
+EXPORT_SYMBOL(ipu_pre_disable);
+
+int ipu_pre_set_fb_buffer(int id, bool resolve,
+ unsigned long fb_paddr,
+ unsigned int y_res,
+ unsigned int x_crop,
+ unsigned int y_crop,
+ unsigned int sec_buf_off,
+ unsigned int trd_buf_off)
+{
+ struct ipu_pre_data *pre = get_pre(id);
+ unsigned int store_stat, store_block_y;
+ unsigned long lock_flags;
+ bool update = true;
+
+ if (!pre)
+ return -EINVAL;
+
+ spin_lock_irqsave(&pre->lock, lock_flags);
+ pre_write(pre, fb_paddr, HW_PRE_NEXT_BUF);
+ pre_write(pre, sec_buf_off, HW_PRE_U_BUF_OFFSET);
+ pre_write(pre, trd_buf_off, HW_PRE_V_BUF_OFFSET);
+ pre_write(pre, BF_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_X(x_crop) |
+ BF_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC_OUTPUT_SIZE_ULC_Y(y_crop),
+ HW_PRE_PREFETCH_ENGINE_OUTPUT_SIZE_ULC);
+
+ /*
+ * Update shadow only when store engine runs out of the problematic
+ * window to workaround the SoC design bug recorded by errata ERR009624.
+ */
+ if (y_res > IPU_PRE_SMALL_LINE) {
+ unsigned long timeout = jiffies + msecs_to_jiffies(20);
+
+ do {
+ if (time_after(jiffies, timeout)) {
+ update = false;
+ dev_warn(pre->dev, "timeout waiting for PRE "
+ "to run out of problematic window for "
+ "shadow update\n");
+ break;
+ }
+
+ store_stat = pre_read(pre, HW_PRE_STORE_ENGINE_STATUS);
+ store_block_y = (store_stat &
+ BM_PRE_STORE_ENGINE_STATUS_STORE_BLOCK_Y) >>
+ BP_PRE_STORE_ENGINE_STATUS_STORE_BLOCK_Y;
+ } while (store_block_y >=
+ (resolve ? DIV_ROUND_UP(y_res, 4) - 1 : y_res - 2) ||
+ store_block_y == 0);
+ }
+
+ if (update)
+ pre_write(pre, BF_PRE_CTRL_SDW_UPDATE(1), HW_PRE_CTRL_SET);
+ spin_unlock_irqrestore(&pre->lock, lock_flags);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_pre_set_fb_buffer);
+
+static int ipu_pre_probe(struct platform_device *pdev)
+{
+ struct device_node *np = pdev->dev.of_node;
+ struct ipu_pre_data *pre;
+ struct resource *res;
+ unsigned long lock_flags;
+ int id, irq, err;
+
+ pre = devm_kzalloc(&pdev->dev, sizeof(*pre), GFP_KERNEL);
+ if (!pre)
+ return -ENOMEM;
+ pre->dev = &pdev->dev;
+
+ id = of_alias_get_id(np, "pre");
+ if (id < 0) {
+ dev_err(&pdev->dev, "failed to get PRE id\n");
+ return id;
+ }
+ pre->id = id;
+
+ mutex_init(&pre->mutex);
+ spin_lock_init(&pre->lock);
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ pre->base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(pre->base))
+ return PTR_ERR(pre->base);
+
+ pre->clk = devm_clk_get(&pdev->dev, NULL);
+ if (IS_ERR(pre->clk)) {
+ dev_err(&pdev->dev, "failed to get the pre clk\n");
+ return PTR_ERR(pre->clk);
+ }
+
+ irq = platform_get_irq(pdev, 0);
+ err = devm_request_irq(&pdev->dev, irq, ipu_pre_irq_handle,
+ IRQF_TRIGGER_RISING, pdev->name, pre);
+ if (err) {
+ dev_err(&pdev->dev, "failed to request pre irq\n");
+ return err;
+ }
+
+ pre->iram_pool = of_gen_pool_get(pdev->dev.of_node, "ocram", 0);
+ if (!pre->iram_pool) {
+ dev_err(&pdev->dev, "no iram exist for pre\n");
+ return -ENOMEM;
+ }
+
+ spin_lock_irqsave(&pre_list_lock, lock_flags);
+ list_add_tail(&pre->list, &pre_list);
+ spin_unlock_irqrestore(&pre_list_lock, lock_flags);
+
+ ipu_pre_alloc_double_buffer(pre->id, IPU_PRE_MAX_WIDTH * 8 * IPU_PRE_MAX_BPP);
+
+ /* PRE GATE ON */
+ clk_prepare_enable(pre->clk);
+ pre_write(pre, BF_PRE_CTRL_SFTRST(1) | BF_PRE_CTRL_CLKGATE(1),
+ HW_PRE_CTRL_CLR);
+ pre_write(pre, 0xf, HW_PRE_IRQ_MASK);
+ clk_disable_unprepare(pre->clk);
+
+ platform_set_drvdata(pdev, pre);
+
+ dev_info(&pdev->dev, "driver probed\n");
+
+ return 0;
+}
+
+static int ipu_pre_remove(struct platform_device *pdev)
+{
+ struct ipu_pre_data *pre = platform_get_drvdata(pdev);
+ unsigned long lock_flags;
+
+ if (pre->iram_pool && pre->double_buffer_base) {
+ gen_pool_free(pre->iram_pool,
+ pre->double_buffer_base,
+ pre->double_buffer_size);
+ }
+
+ spin_lock_irqsave(&pre_list_lock, lock_flags);
+ list_del(&pre->list);
+ spin_unlock_irqrestore(&pre_list_lock, lock_flags);
+
+ return 0;
+}
+
+static const struct of_device_id imx_ipu_pre_dt_ids[] = {
+ { .compatible = "fsl,imx6q-pre", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, imx_ipu_pre_dt_ids);
+
+static struct platform_driver ipu_pre_driver = {
+ .driver = {
+ .name = "imx-pre",
+ .of_match_table = of_match_ptr(imx_ipu_pre_dt_ids),
+ },
+ .probe = ipu_pre_probe,
+ .remove = ipu_pre_remove,
+};
+
+static int __init ipu_pre_init(void)
+{
+ return platform_driver_register(&ipu_pre_driver);
+}
+subsys_initcall(ipu_pre_init);
+
+static void __exit ipu_pre_exit(void)
+{
+ platform_driver_unregister(&ipu_pre_driver);
+}
+module_exit(ipu_pre_exit);
+
+MODULE_DESCRIPTION("i.MX PRE driver");
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_LICENSE("GPL");
diff --git a/drivers/mxc/ipu3/prg-regs.h b/drivers/mxc/ipu3/prg-regs.h
new file mode 100644
index 000000000000..bca0e560a6f9
--- /dev/null
+++ b/drivers/mxc/ipu3/prg-regs.h
@@ -0,0 +1,70 @@
+/*
+ * Freescale IPU PRG Register Definitions
+ *
+ * Copyright 2014-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#include <linux/bitops.h>
+
+#ifndef __IPU_PRG_H__
+#define __IPU_PRG_H__
+
+#define IPU_PR_CTRL 0x00
+#define IPU_PR_STATUS 0x04
+#define IPU_PR_QOS 0x08
+#define IPU_PR_REG_UPDATE 0x0c
+#define IPU_PR_STRIDE(ch) (0x10 + (ch) * 4)
+#define IPU_PR_CROP_LINE 0x1c
+#define IPU_PR_ADDR_THD 0x20
+#define IPU_PR_CH_BADDR(ch) (0x24 + (ch) * 4)
+#define IPU_PR_CH_OFFSET(ch) (0x30 + (ch) * 4)
+#define IPU_PR_CH_ILO(ch) (0x3c + (ch) * 4)
+#define IPU_PR_CH_HEIGHT(ch) (0x48 + (ch) * 4)
+
+#define IPU_PR_CTRL_CH_BYPASS(ch) (0x1 << (ch))
+#define IPU_PR_CTRL_SOFT_CH_ARID(ch, n) ((n) << ((ch) * 2 + 8))
+#define IPU_PR_CTRL_SOFT_CH_ARID_MASK(ch) (0x3 << ((ch) * 2 + 8))
+#define IPU_PR_CTRL_CH_SO(ch, interlace) ((interlace) << ((ch) + 16))
+#define IPU_PR_CTRL_CH_SO_MASK(ch) (0x1 << ((ch) + 16))
+#define IPU_PR_CTRL_CH_VFLIP(ch, vflip) ((vflip) << ((ch) + 19))
+#define IPU_PR_CTRL_CH_VFLIP_MASK(ch) (0x1 << ((ch) + 19))
+#define IPU_PR_CTRL_CH_BLOCK_MODE(ch, mode) ((mode) << ((ch) + 22))
+#define IPU_PR_CTRL_CH_BLOCK_MODE_MASK(ch) (0x1 << ((ch) + 22))
+#define IPU_PR_CTRL_CH_CNT_LOAD_EN(ch) (0x1 << ((ch) + 25))
+#define IPU_PR_CTRL_CH_CNT_LOAD_EN_MASK (0x7 << 25)
+#define IPU_PR_CTRL_SOFTRST BIT(30)
+#define IPU_PR_CTRL_SHADOW_EN BIT(31)
+
+#define IPU_PR_STATUS_BUF_RDY(ch, buf) (1 << ((ch) * 2 + (buf)))
+
+#define IPU_PR_QOS_PRI(id, qos) ((qos) << ((id) * 4))
+#define IPU_PR_QOS_MASK(id) (0xf << ((id) * 4))
+
+#define IPU_PR_REG_UPDATE_EN BIT(0)
+
+#define IPU_PR_STRIDE_MASK 0x3fff
+
+#define IPU_PR_CROP_LINE_NUM(ch, n) ((n) << ((ch) * 4))
+#define IPU_PR_CROP_LINE_MASK(ch) (0xf << ((ch) * 4))
+
+#define IPU_PR_ADDR_THD_MASK 0xffffffff
+
+#define IPU_PR_CH_BADDR_MASK 0xffffffff
+
+#define IPU_PR_CH_OFFSET_MASK 0xffffffff
+
+#define IPU_PR_CH_ILO_MASK 0x007fffff
+#define IPU_PR_CH_ILO_NUM(ilo) ((ilo) & IPU_PR_CH_ILO_MASK)
+
+#define IPU_PR_CH_HEIGHT_MASK 0x00000fff
+#define IPU_PR_CH_HEIGHT_NUM(fh) (((fh) - 1) & IPU_PR_CH_HEIGHT_MASK)
+#define IPU_PR_CH_IPU_HEIGHT_MASK 0x0fff0000
+#define IPU_PR_CH_IPU_HEIGHT_NUM(fh) ((((fh) - 1) << 16) & IPU_PR_CH_IPU_HEIGHT_MASK)
+
+#endif /* __IPU_PRG_H__ */
diff --git a/drivers/mxc/ipu3/prg.c b/drivers/mxc/ipu3/prg.c
new file mode 100644
index 000000000000..45363a843392
--- /dev/null
+++ b/drivers/mxc/ipu3/prg.c
@@ -0,0 +1,506 @@
+/*
+ * Copyright (C) 2014-2015 Freescale Semiconductor, Inc.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/ipu-v3-prg.h>
+#include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
+#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include "prg-regs.h"
+
+#define PRG_CHAN_NUM 3
+
+struct prg_chan {
+ unsigned int pre_num;
+ struct mutex mutex; /* for in_use */
+ bool in_use;
+};
+
+struct ipu_prg_data {
+ unsigned int id;
+ void __iomem *base;
+ unsigned long memory;
+ struct clk *axi_clk;
+ struct clk *apb_clk;
+ struct list_head list;
+ struct device *dev;
+ struct prg_chan chan[PRG_CHAN_NUM];
+ struct regmap *regmap;
+ struct regmap_field *pre_prg_sel[2];
+ spinlock_t lock;
+};
+
+static LIST_HEAD(prg_list);
+static DEFINE_MUTEX(prg_lock);
+
+static inline void prg_write(struct ipu_prg_data *prg,
+ u32 value, unsigned int offset)
+{
+ writel(value, prg->base + offset);
+}
+
+static inline u32 prg_read(struct ipu_prg_data *prg, unsigned offset)
+{
+ return readl(prg->base + offset);
+}
+
+static struct ipu_prg_data *get_prg(unsigned int ipu_id)
+{
+ struct ipu_prg_data *prg;
+
+ mutex_lock(&prg_lock);
+ list_for_each_entry(prg, &prg_list, list) {
+ if (prg->id == ipu_id) {
+ mutex_unlock(&prg_lock);
+ return prg;
+ }
+ }
+ mutex_unlock(&prg_lock);
+
+ return NULL;
+}
+
+static int assign_prg_chan(struct ipu_prg_data *prg, unsigned int pre_num,
+ ipu_channel_t ipu_ch)
+{
+ int prg_ch;
+
+ if (!prg)
+ return -EINVAL;
+
+ switch (ipu_ch) {
+ case MEM_BG_SYNC:
+ prg_ch = 0;
+ break;
+ case MEM_FG_SYNC:
+ prg_ch = 1;
+ break;
+ case MEM_DC_SYNC:
+ prg_ch = 2;
+ break;
+ default:
+ dev_err(prg->dev, "wrong ipu channel type\n");
+ return -EINVAL;
+ }
+
+ mutex_lock(&prg->chan[prg_ch].mutex);
+ if (!prg->chan[prg_ch].in_use) {
+ prg->chan[prg_ch].in_use = true;
+ prg->chan[prg_ch].pre_num = pre_num;
+
+ if (prg_ch != 0) {
+ unsigned int pmux, psel; /* primary */
+ unsigned int smux, ssel; /* secondary */
+ struct regmap_field *pfield, *sfield;
+
+ psel = pre_num - 1;
+ ssel = psel ? 0 : 1;
+
+ pfield = prg->pre_prg_sel[psel];
+ sfield = prg->pre_prg_sel[ssel];
+ pmux = (prg_ch - 1) + (prg->id << 1);
+
+ mutex_lock(&prg_lock);
+ regmap_field_write(pfield, pmux);
+
+ /*
+ * PRE1 and PRE2 cannot bind with a same channel of
+ * one PRG even if one of the two PREs is disabled.
+ */
+ regmap_field_read(sfield, &smux);
+ if (smux == pmux) {
+ smux = pmux ^ 0x1;
+ regmap_field_write(sfield, smux);
+ }
+ mutex_unlock(&prg_lock);
+ }
+ mutex_unlock(&prg->chan[prg_ch].mutex);
+ dev_dbg(prg->dev, "bind prg%u ch%d with pre%u\n",
+ prg->id, prg_ch, pre_num);
+ return prg_ch;
+ }
+ mutex_unlock(&prg->chan[prg_ch].mutex);
+ return -EBUSY;
+}
+
+static inline int get_prg_chan(struct ipu_prg_data *prg, unsigned int pre_num)
+{
+ int i;
+
+ if (!prg)
+ return -EINVAL;
+
+ for (i = 0; i < PRG_CHAN_NUM; i++) {
+ mutex_lock(&prg->chan[i].mutex);
+ if (prg->chan[i].in_use &&
+ prg->chan[i].pre_num == pre_num) {
+ mutex_unlock(&prg->chan[i].mutex);
+ return i;
+ }
+ mutex_unlock(&prg->chan[i].mutex);
+ }
+ return -ENOENT;
+}
+
+int ipu_prg_config(struct ipu_prg_config *config)
+{
+ struct ipu_prg_data *prg = get_prg(config->id);
+ struct ipu_soc *ipu = ipu_get_soc(config->id);
+ int prg_ch, axi_id;
+ u32 reg;
+
+ if (!prg || config->crop_line > 3 || !ipu)
+ return -EINVAL;
+
+ if (config->height & ~IPU_PR_CH_HEIGHT_MASK)
+ return -EINVAL;
+
+ prg_ch = assign_prg_chan(prg, config->pre_num, config->ipu_ch);
+ if (prg_ch < 0)
+ return prg_ch;
+
+ axi_id = ipu_ch_param_get_axi_id(ipu, config->ipu_ch, IPU_INPUT_BUFFER);
+
+ clk_prepare_enable(prg->axi_clk);
+ clk_prepare_enable(prg->apb_clk);
+
+ spin_lock(&prg->lock);
+ /* clear all load enable to impact other channels */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg &= ~IPU_PR_CTRL_CH_CNT_LOAD_EN_MASK;
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* counter load enable */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg |= IPU_PR_CTRL_CH_CNT_LOAD_EN(prg_ch);
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* AXI ID */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg &= ~IPU_PR_CTRL_SOFT_CH_ARID_MASK(prg_ch);
+ reg |= IPU_PR_CTRL_SOFT_CH_ARID(prg_ch, axi_id);
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* so */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg &= ~IPU_PR_CTRL_CH_SO_MASK(prg_ch);
+ reg |= IPU_PR_CTRL_CH_SO(prg_ch, config->so);
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* vflip */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg &= ~IPU_PR_CTRL_CH_VFLIP_MASK(prg_ch);
+ reg |= IPU_PR_CTRL_CH_VFLIP(prg_ch, config->vflip);
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* block mode */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg &= ~IPU_PR_CTRL_CH_BLOCK_MODE_MASK(prg_ch);
+ reg |= IPU_PR_CTRL_CH_BLOCK_MODE(prg_ch, config->block_mode);
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* disable bypass */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg &= ~IPU_PR_CTRL_CH_BYPASS(prg_ch);
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* stride */
+ reg = prg_read(prg, IPU_PR_STRIDE(prg_ch));
+ reg &= ~IPU_PR_STRIDE_MASK;
+ reg |= config->stride - 1;
+ prg_write(prg, reg, IPU_PR_STRIDE(prg_ch));
+
+ /* ilo */
+ reg = prg_read(prg, IPU_PR_CH_ILO(prg_ch));
+ reg &= ~IPU_PR_CH_ILO_MASK;
+ reg |= IPU_PR_CH_ILO_NUM(config->ilo);
+ prg_write(prg, reg, IPU_PR_CH_ILO(prg_ch));
+
+ /* height */
+ reg = prg_read(prg, IPU_PR_CH_HEIGHT(prg_ch));
+ reg &= ~IPU_PR_CH_HEIGHT_MASK;
+ reg |= IPU_PR_CH_HEIGHT_NUM(config->height);
+ prg_write(prg, reg, IPU_PR_CH_HEIGHT(prg_ch));
+
+ /* ipu height */
+ reg = prg_read(prg, IPU_PR_CH_HEIGHT(prg_ch));
+ reg &= ~IPU_PR_CH_IPU_HEIGHT_MASK;
+ reg |= IPU_PR_CH_IPU_HEIGHT_NUM(config->ipu_height);
+ prg_write(prg, reg, IPU_PR_CH_HEIGHT(prg_ch));
+
+ /* crop */
+ reg = prg_read(prg, IPU_PR_CROP_LINE);
+ reg &= ~IPU_PR_CROP_LINE_MASK(prg_ch);
+ reg |= IPU_PR_CROP_LINE_NUM(prg_ch, config->crop_line);
+ prg_write(prg, reg, IPU_PR_CROP_LINE);
+
+ /* buffer address */
+ reg = prg_read(prg, IPU_PR_CH_BADDR(prg_ch));
+ reg &= ~IPU_PR_CH_BADDR_MASK;
+ reg |= config->baddr;
+ prg_write(prg, reg, IPU_PR_CH_BADDR(prg_ch));
+
+ /* offset */
+ reg = prg_read(prg, IPU_PR_CH_OFFSET(prg_ch));
+ reg &= ~IPU_PR_CH_OFFSET_MASK;
+ reg |= config->offset;
+ prg_write(prg, reg, IPU_PR_CH_OFFSET(prg_ch));
+
+ /* threshold */
+ reg = prg_read(prg, IPU_PR_ADDR_THD);
+ reg &= ~IPU_PR_ADDR_THD_MASK;
+ reg |= prg->memory;
+ prg_write(prg, reg, IPU_PR_ADDR_THD);
+
+ /* shadow enable */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg |= IPU_PR_CTRL_SHADOW_EN;
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* register update */
+ reg = prg_read(prg, IPU_PR_REG_UPDATE);
+ reg |= IPU_PR_REG_UPDATE_EN;
+ prg_write(prg, reg, IPU_PR_REG_UPDATE);
+ spin_unlock(&prg->lock);
+
+ clk_disable_unprepare(prg->apb_clk);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_prg_config);
+
+int ipu_prg_disable(unsigned int ipu_id, unsigned int pre_num)
+{
+ struct ipu_prg_data *prg = get_prg(ipu_id);
+ int prg_ch;
+ u32 reg;
+
+ if (!prg)
+ return -EINVAL;
+
+ prg_ch = get_prg_chan(prg, pre_num);
+ if (prg_ch < 0)
+ return prg_ch;
+
+ clk_prepare_enable(prg->apb_clk);
+
+ spin_lock(&prg->lock);
+ /* clear all load enable to impact other channels */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg &= ~IPU_PR_CTRL_CH_CNT_LOAD_EN_MASK;
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* counter load enable */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg |= IPU_PR_CTRL_CH_CNT_LOAD_EN(prg_ch);
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* enable bypass */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg |= IPU_PR_CTRL_CH_BYPASS(prg_ch);
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* shadow enable */
+ reg = prg_read(prg, IPU_PR_CTRL);
+ reg |= IPU_PR_CTRL_SHADOW_EN;
+ prg_write(prg, reg, IPU_PR_CTRL);
+
+ /* register update */
+ reg = prg_read(prg, IPU_PR_REG_UPDATE);
+ reg |= IPU_PR_REG_UPDATE_EN;
+ prg_write(prg, reg, IPU_PR_REG_UPDATE);
+ spin_unlock(&prg->lock);
+
+ clk_disable_unprepare(prg->apb_clk);
+ clk_disable_unprepare(prg->axi_clk);
+
+ mutex_lock(&prg->chan[prg_ch].mutex);
+ prg->chan[prg_ch].in_use = false;
+ mutex_unlock(&prg->chan[prg_ch].mutex);
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_prg_disable);
+
+int ipu_prg_wait_buf_ready(unsigned int ipu_id, unsigned int pre_num,
+ unsigned int hsk_line_num,
+ int pre_store_out_height)
+{
+ struct ipu_prg_data *prg = get_prg(ipu_id);
+ int prg_ch, timeout = 1000;
+ u32 reg;
+
+ if (!prg)
+ return -EINVAL;
+
+ prg_ch = get_prg_chan(prg, pre_num);
+ if (prg_ch < 0)
+ return prg_ch;
+
+ clk_prepare_enable(prg->apb_clk);
+
+ spin_lock(&prg->lock);
+ if (pre_store_out_height <= (4 << hsk_line_num)) {
+ do {
+ reg = prg_read(prg, IPU_PR_STATUS);
+ udelay(1000);
+ timeout--;
+ } while (!(reg & IPU_PR_STATUS_BUF_RDY(prg_ch, 0)) && timeout);
+ } else {
+ do {
+ reg = prg_read(prg, IPU_PR_STATUS);
+ udelay(1000);
+ timeout--;
+ } while ((!(reg & IPU_PR_STATUS_BUF_RDY(prg_ch, 0)) ||
+ !(reg & IPU_PR_STATUS_BUF_RDY(prg_ch, 1))) && timeout);
+ }
+ spin_unlock(&prg->lock);
+
+ clk_disable_unprepare(prg->apb_clk);
+
+ if (!timeout)
+ dev_err(prg->dev, "wait for buffer ready timeout\n");
+
+ return 0;
+}
+EXPORT_SYMBOL(ipu_prg_wait_buf_ready);
+
+static int ipu_prg_probe(struct platform_device *pdev)
+{
+ struct device_node *np = pdev->dev.of_node, *memory;
+ struct ipu_prg_data *prg;
+ struct resource *res;
+ struct reg_field reg_field0 = REG_FIELD(IOMUXC_GPR5,
+ IMX6Q_GPR5_PRE_PRG_SEL0_LSB,
+ IMX6Q_GPR5_PRE_PRG_SEL0_MSB);
+ struct reg_field reg_field1 = REG_FIELD(IOMUXC_GPR5,
+ IMX6Q_GPR5_PRE_PRG_SEL1_LSB,
+ IMX6Q_GPR5_PRE_PRG_SEL1_MSB);
+ int id, i;
+
+ prg = devm_kzalloc(&pdev->dev, sizeof(*prg), GFP_KERNEL);
+ if (!prg)
+ return -ENOMEM;
+ prg->dev = &pdev->dev;
+
+ for (i = 0; i < PRG_CHAN_NUM; i++)
+ mutex_init(&prg->chan[i].mutex);
+
+ spin_lock_init(&prg->lock);
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ prg->base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(prg->base))
+ return PTR_ERR(prg->base);
+
+ prg->axi_clk = devm_clk_get(&pdev->dev, "axi");
+ if (IS_ERR(prg->axi_clk)) {
+ dev_err(&pdev->dev, "failed to get the axi clk\n");
+ return PTR_ERR(prg->axi_clk);
+ }
+
+ prg->apb_clk = devm_clk_get(&pdev->dev, "apb");
+ if (IS_ERR(prg->apb_clk)) {
+ dev_err(&pdev->dev, "failed to get the apb clk\n");
+ return PTR_ERR(prg->apb_clk);
+ }
+
+ prg->regmap = syscon_regmap_lookup_by_phandle(np, "gpr");
+ if (IS_ERR(prg->regmap)) {
+ dev_err(&pdev->dev, "failed to get regmap\n");
+ return PTR_ERR(prg->regmap);
+ }
+
+ prg->pre_prg_sel[0] = devm_regmap_field_alloc(&pdev->dev, prg->regmap,
+ reg_field0);
+ if (IS_ERR(prg->pre_prg_sel[0]))
+ return PTR_ERR(prg->pre_prg_sel[0]);
+
+ prg->pre_prg_sel[1] = devm_regmap_field_alloc(&pdev->dev, prg->regmap,
+ reg_field1);
+ if (IS_ERR(prg->pre_prg_sel[1]))
+ return PTR_ERR(prg->pre_prg_sel[1]);
+
+ memory = of_parse_phandle(np, "memory-region", 0);
+ if (!memory)
+ return -ENODEV;
+
+ prg->memory = of_translate_address(memory,
+ of_get_address(memory, 0, NULL, NULL));
+
+ id = of_alias_get_id(np, "prg");
+ if (id < 0) {
+ dev_err(&pdev->dev, "failed to get PRG id\n");
+ return id;
+ }
+ prg->id = id;
+
+ mutex_lock(&prg_lock);
+ list_add_tail(&prg->list, &prg_list);
+ mutex_unlock(&prg_lock);
+
+ platform_set_drvdata(pdev, prg);
+
+ dev_info(&pdev->dev, "driver probed\n");
+
+ return 0;
+}
+
+static int ipu_prg_remove(struct platform_device *pdev)
+{
+ struct ipu_prg_data *prg = platform_get_drvdata(pdev);
+
+ mutex_lock(&prg_lock);
+ list_del(&prg->list);
+ mutex_unlock(&prg_lock);
+
+ return 0;
+}
+
+static const struct of_device_id imx_ipu_prg_dt_ids[] = {
+ { .compatible = "fsl,imx6q-prg", },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, imx_ipu_prg_dt_ids);
+
+static struct platform_driver ipu_prg_driver = {
+ .driver = {
+ .name = "imx-prg",
+ .of_match_table = of_match_ptr(imx_ipu_prg_dt_ids),
+ },
+ .probe = ipu_prg_probe,
+ .remove = ipu_prg_remove,
+};
+
+static int __init ipu_prg_init(void)
+{
+ return platform_driver_register(&ipu_prg_driver);
+}
+subsys_initcall(ipu_prg_init);
+
+static void __exit ipu_prg_exit(void)
+{
+ platform_driver_unregister(&ipu_prg_driver);
+}
+module_exit(ipu_prg_exit);
+
+MODULE_DESCRIPTION("i.MX PRG driver");
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_LICENSE("GPL");
diff --git a/drivers/mxc/ipu3/vdoa.c b/drivers/mxc/ipu3/vdoa.c
new file mode 100644
index 000000000000..e0d47ff67b15
--- /dev/null
+++ b/drivers/mxc/ipu3/vdoa.c
@@ -0,0 +1,538 @@
+/*
+ * Copyright (C) 2012-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2018 NXP
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/ipu.h>
+#include <linux/genalloc.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/types.h>
+
+#include "vdoa.h"
+/* 6band(3field* double buffer) * (width*2) * bandline(8)
+ = 6x1024x2x8 = 96k or 72k(1.5byte) */
+#define MAX_VDOA_IRAM_SIZE (1024*96)
+#define VDOA_IRAM_SIZE (1024*72)
+
+#define VDOAC_BAND_HEIGHT_32LINES (32)
+#define VDOAC_BAND_HEIGHT_16LINES (16)
+#define VDOAC_BAND_HEIGHT_8LINES (8)
+#define VDOAC_THREE_FRAMES (0x1 << 2)
+#define VDOAC_SYNC_BAND_MODE (0x1 << 3)
+#define VDOAC_SCAN_ORDER_INTERLACED (0x1 << 4)
+#define VDOAC_PFS_YUYV (0x1 << 5)
+#define VDOAC_IPU_SEL_1 (0x1 << 6)
+#define VDOAFP_FH_MASK (0x1FFF)
+#define VDOAFP_FH_SHIFT (16)
+#define VDOAFP_FW_MASK (0x3FFF)
+#define VDOAFP_FW_SHIFT (0)
+#define VDOASL_VSLY_MASK (0x3FFF)
+#define VDOASL_VSLY_SHIFT (16)
+#define VDOASL_ISLY_MASK (0x7FFF)
+#define VDOASL_ISLY_SHIFT (0)
+#define VDOASRR_START_XFER (0x2)
+#define VDOASRR_SWRST (0x1)
+#define VDOAIEIST_TRANSFER_ERR (0x2)
+#define VDOAIEIST_TRANSFER_END (0x1)
+
+#define VDOAC (0x0) /* Control Register */
+#define VDOASRR (0x4) /* Start and Reset Register */
+#define VDOAIE (0x8) /* Interrupt Enable Register */
+#define VDOAIST (0xc) /* Interrupt Status Register */
+#define VDOAFP (0x10) /* Frame Parameters Register */
+#define VDOAIEBA00 (0x14) /* External Buffer n Frame m Address Register */
+#define VDOAIEBA01 (0x18) /* External Buffer n Frame m Address Register */
+#define VDOAIEBA02 (0x1c) /* External Buffer n Frame m Address Register */
+#define VDOAIEBA10 (0x20) /* External Buffer n Frame m Address Register */
+#define VDOAIEBA11 (0x24) /* External Buffer n Frame m Address Register */
+#define VDOAIEBA12 (0x28) /* External Buffer n Frame m Address Register */
+#define VDOASL (0x2c) /* IPU Stride Line Register */
+#define VDOAIUBO (0x30) /* IPU Chroma Buffer Offset Register */
+#define VDOAVEBA0 (0x34) /* External Buffer m Address Register */
+#define VDOAVEBA1 (0x38) /* External Buffer m Address Register */
+#define VDOAVEBA2 (0x3c) /* External Buffer m Address Register */
+#define VDOAVUBO (0x40) /* VPU Chroma Buffer Offset */
+#define VDOASR (0x44) /* Status Register */
+#define VDOATD (0x48) /* Test Debug Register */
+
+
+enum {
+ VDOA_INIT = 0x1,
+ VDOA_GET = 0x2,
+ VDOA_SETUP = 0x4,
+ VDOA_GET_OBUF = 0x8,
+ VDOA_START = 0x10,
+ VDOA_INIRQ = 0x20,
+ VDOA_STOP = 0x40,
+ VDOA_PUT = VDOA_INIT,
+};
+
+enum {
+ VDOA_NULL = 0,
+ VDOA_FRAME = 1,
+ VDOA_PREV_FIELD = 2,
+ VDOA_CURR_FIELD = 3,
+ VDOA_NEXT_FIELD = 4,
+};
+
+#define CHECK_STATE(expect, retcode) \
+do { \
+ if (!((expect) & vdoa->state)) { \
+ dev_err(vdoa->dev, "ERR: %s state:0x%x, expect:0x%x.\n",\
+ __func__, vdoa->state, (expect)); \
+ retcode; \
+ } \
+} while (0)
+
+#define CHECK_NULL_PTR(ptr) \
+do { \
+ pr_debug("vdoa_ptr:0x%p in %s state:0x%x.\n", \
+ vdoa, __func__, vdoa->state); \
+ if (NULL == (ptr)) { \
+ pr_err("ERR vdoa: %s state:0x%x null ptr.\n", \
+ __func__, vdoa->state); \
+ } \
+} while (0)
+
+struct vdoa_info {
+ int state;
+ struct device *dev;
+ struct clk *vdoa_clk;
+ void __iomem *reg_base;
+ struct gen_pool *iram_pool;
+ unsigned long iram_base;
+ unsigned long iram_paddr;
+ int irq;
+ int field;
+ struct completion comp;
+};
+
+static struct vdoa_info *g_vdoa;
+static unsigned long iram_size;
+static DEFINE_MUTEX(vdoa_lock);
+
+static inline void vdoa_read_register(struct vdoa_info *vdoa,
+ u32 reg, u32 *val)
+{
+ *val = ioread32(vdoa->reg_base + reg);
+ dev_dbg(vdoa->dev, "read_reg:0x%02x, val:0x%08x.\n", reg, *val);
+}
+
+static inline void vdoa_write_register(struct vdoa_info *vdoa,
+ u32 reg, u32 val)
+{
+ iowrite32(val, vdoa->reg_base + reg);
+ dev_dbg(vdoa->dev, "\t\twrite_reg:0x%02x, val:0x%08x.\n", reg, val);
+}
+
+static void dump_registers(struct vdoa_info *vdoa)
+{
+ int i;
+ u32 data;
+
+ for (i = VDOAC; i < VDOATD; i += 4)
+ vdoa_read_register(vdoa, i, &data);
+}
+
+int vdoa_setup(vdoa_handle_t handle, struct vdoa_params *params)
+{
+ int band_size;
+ int total_band_size = 0;
+ int ipu_stride;
+ u32 data;
+ struct vdoa_info *vdoa = (struct vdoa_info *)handle;
+
+ CHECK_NULL_PTR(vdoa);
+ CHECK_STATE(VDOA_GET | VDOA_GET_OBUF | VDOA_STOP, return -EINVAL);
+ if (VDOA_GET == vdoa->state) {
+ dev_dbg(vdoa->dev, "w:%d, h:%d.\n",
+ params->width, params->height);
+ data = (params->band_lines == VDOAC_BAND_HEIGHT_32LINES) ? 2 :
+ ((params->band_lines == VDOAC_BAND_HEIGHT_16LINES) ?
+ 1 : 0);
+ data |= params->scan_order ? VDOAC_SCAN_ORDER_INTERLACED : 0;
+ data |= params->band_mode ? VDOAC_SYNC_BAND_MODE : 0;
+ data |= params->pfs ? VDOAC_PFS_YUYV : 0;
+ data |= params->ipu_num ? VDOAC_IPU_SEL_1 : 0;
+ vdoa_write_register(vdoa, VDOAC, data);
+
+ data = ((params->width & VDOAFP_FW_MASK) << VDOAFP_FW_SHIFT) |
+ ((params->height & VDOAFP_FH_MASK) << VDOAFP_FH_SHIFT);
+ vdoa_write_register(vdoa, VDOAFP, data);
+
+ ipu_stride = params->pfs ? params->width << 1 : params->width;
+ data = ((params->vpu_stride & VDOASL_VSLY_MASK) <<
+ VDOASL_VSLY_SHIFT) |
+ ((ipu_stride & VDOASL_ISLY_MASK) << VDOASL_ISLY_SHIFT);
+ vdoa_write_register(vdoa, VDOASL, data);
+
+ dev_dbg(vdoa->dev, "band_mode:%d, band_line:%d, base:0x%lx.\n",
+ params->band_mode, params->band_lines, vdoa->iram_paddr);
+ }
+ /*
+ * band size = (luma_per_line + chroma_per_line) * bandLines
+ * = width * (3/2 or 2) * bandLines
+ * double buffer mode used.
+ */
+ if (params->pfs)
+ band_size = (params->width << 1) * params->band_lines;
+ else
+ band_size = ((params->width * 3) >> 1) *
+ params->band_lines;
+ if (params->interlaced) {
+ total_band_size = 6 * band_size; /* 3 frames*double buffer */
+ if (iram_size < total_band_size) {
+ dev_err(vdoa->dev, "iram_size:0x%lx is smaller than "
+ "request:0x%x!\n", iram_size, total_band_size);
+ return -EINVAL;
+ }
+ if (params->vfield_buf.prev_veba) {
+ if (params->band_mode) {
+ vdoa_write_register(vdoa, VDOAIEBA00,
+ vdoa->iram_paddr);
+ vdoa_write_register(vdoa, VDOAIEBA10,
+ vdoa->iram_paddr + band_size);
+ } else
+ vdoa_write_register(vdoa, VDOAIEBA00,
+ params->ieba0);
+ vdoa_write_register(vdoa, VDOAVEBA0,
+ params->vfield_buf.prev_veba);
+ vdoa->field = VDOA_PREV_FIELD;
+ }
+ if (params->vfield_buf.cur_veba) {
+ if (params->band_mode) {
+ vdoa_write_register(vdoa, VDOAIEBA01,
+ vdoa->iram_paddr + band_size * 2);
+ vdoa_write_register(vdoa, VDOAIEBA11,
+ vdoa->iram_paddr + band_size * 3);
+ } else
+ vdoa_write_register(vdoa, VDOAIEBA01,
+ params->ieba1);
+ vdoa_write_register(vdoa, VDOAVEBA1,
+ params->vfield_buf.cur_veba);
+ vdoa->field = VDOA_CURR_FIELD;
+ }
+ if (params->vfield_buf.next_veba) {
+ if (params->band_mode) {
+ vdoa_write_register(vdoa, VDOAIEBA02,
+ vdoa->iram_paddr + band_size * 4);
+ vdoa_write_register(vdoa, VDOAIEBA12,
+ vdoa->iram_paddr + band_size * 5);
+ } else
+ vdoa_write_register(vdoa, VDOAIEBA02,
+ params->ieba2);
+ vdoa_write_register(vdoa, VDOAVEBA2,
+ params->vfield_buf.next_veba);
+ vdoa->field = VDOA_NEXT_FIELD;
+ vdoa_read_register(vdoa, VDOAC, &data);
+ data |= VDOAC_THREE_FRAMES;
+ vdoa_write_register(vdoa, VDOAC, data);
+ }
+
+ if (!params->pfs)
+ vdoa_write_register(vdoa, VDOAIUBO,
+ params->width * params->band_lines);
+ vdoa_write_register(vdoa, VDOAVUBO,
+ params->vfield_buf.vubo);
+ dev_dbg(vdoa->dev, "total band_size:0x%x.\n", band_size*6);
+ } else if (params->band_mode) {
+ /* used for progressive frame resize on PrP channel */
+ BUG(); /* currently not support */
+ /* progressvie frame: band mode */
+ vdoa_write_register(vdoa, VDOAIEBA00, vdoa->iram_paddr);
+ vdoa_write_register(vdoa, VDOAIEBA10,
+ vdoa->iram_paddr + band_size);
+ if (!params->pfs)
+ vdoa_write_register(vdoa, VDOAIUBO,
+ params->width * params->band_lines);
+ dev_dbg(vdoa->dev, "total band_size:0x%x\n", band_size*2);
+ } else {
+ /* progressive frame: mem->mem, non-band mode */
+ vdoa->field = VDOA_FRAME;
+ vdoa_write_register(vdoa, VDOAVEBA0, params->vframe_buf.veba);
+ vdoa_write_register(vdoa, VDOAVUBO, params->vframe_buf.vubo);
+ vdoa_write_register(vdoa, VDOAIEBA00, params->ieba0);
+ if (!params->pfs)
+ /* note: iubo is relative value, based on ieba0 */
+ vdoa_write_register(vdoa, VDOAIUBO,
+ params->width * params->height);
+ }
+ vdoa->state = VDOA_SETUP;
+ return 0;
+}
+
+void vdoa_get_output_buf(vdoa_handle_t handle, struct vdoa_ipu_buf *buf)
+{
+ u32 data;
+ struct vdoa_info *vdoa = (struct vdoa_info *)handle;
+
+ CHECK_NULL_PTR(vdoa);
+ CHECK_STATE(VDOA_SETUP, return);
+ vdoa->state = VDOA_GET_OBUF;
+ memset(buf, 0, sizeof(*buf));
+
+ vdoa_read_register(vdoa, VDOAC, &data);
+ switch (vdoa->field) {
+ case VDOA_FRAME:
+ case VDOA_PREV_FIELD:
+ vdoa_read_register(vdoa, VDOAIEBA00, &buf->ieba0);
+ if (data & VDOAC_SYNC_BAND_MODE)
+ vdoa_read_register(vdoa, VDOAIEBA10, &buf->ieba1);
+ break;
+ case VDOA_CURR_FIELD:
+ vdoa_read_register(vdoa, VDOAIEBA01, &buf->ieba0);
+ vdoa_read_register(vdoa, VDOAIEBA11, &buf->ieba1);
+ break;
+ case VDOA_NEXT_FIELD:
+ vdoa_read_register(vdoa, VDOAIEBA02, &buf->ieba0);
+ vdoa_read_register(vdoa, VDOAIEBA12, &buf->ieba1);
+ break;
+ default:
+ BUG();
+ break;
+ }
+ if (!(data & VDOAC_PFS_YUYV))
+ vdoa_read_register(vdoa, VDOAIUBO, &buf->iubo);
+}
+
+int vdoa_start(vdoa_handle_t handle, int timeout_ms)
+{
+ int ret;
+ struct vdoa_info *vdoa = (struct vdoa_info *)handle;
+
+ CHECK_NULL_PTR(vdoa);
+ CHECK_STATE(VDOA_GET_OBUF, return -EINVAL);
+ vdoa->state = VDOA_START;
+ init_completion(&vdoa->comp);
+ vdoa_write_register(vdoa, VDOAIST,
+ VDOAIEIST_TRANSFER_ERR | VDOAIEIST_TRANSFER_END);
+ vdoa_write_register(vdoa, VDOAIE,
+ VDOAIEIST_TRANSFER_ERR | VDOAIEIST_TRANSFER_END);
+
+ enable_irq(vdoa->irq);
+ vdoa_write_register(vdoa, VDOASRR, VDOASRR_START_XFER);
+ dump_registers(vdoa);
+
+ ret = wait_for_completion_timeout(&vdoa->comp,
+ msecs_to_jiffies(timeout_ms));
+
+ return ret > 0 ? 0 : -ETIMEDOUT;
+}
+
+void vdoa_stop(vdoa_handle_t handle)
+{
+ struct vdoa_info *vdoa = (struct vdoa_info *)handle;
+
+ CHECK_NULL_PTR(vdoa);
+ CHECK_STATE(VDOA_GET | VDOA_START | VDOA_INIRQ, return);
+ vdoa->state = VDOA_STOP;
+
+ disable_irq(vdoa->irq);
+
+ vdoa_write_register(vdoa, VDOASRR, VDOASRR_SWRST);
+}
+
+void vdoa_get_handle(vdoa_handle_t *handle)
+{
+ struct vdoa_info *vdoa = g_vdoa;
+
+ CHECK_NULL_PTR(handle);
+ *handle = (vdoa_handle_t *)NULL;
+ CHECK_STATE(VDOA_INIT, return);
+ mutex_lock(&vdoa_lock);
+ clk_prepare_enable(vdoa->vdoa_clk);
+ vdoa->state = VDOA_GET;
+ vdoa->field = VDOA_NULL;
+ vdoa_write_register(vdoa, VDOASRR, VDOASRR_SWRST);
+
+ *handle = (vdoa_handle_t *)vdoa;
+}
+
+void vdoa_put_handle(vdoa_handle_t *handle)
+{
+ struct vdoa_info *vdoa = (struct vdoa_info *)(*handle);
+
+ CHECK_NULL_PTR(vdoa);
+ CHECK_STATE(VDOA_STOP, return);
+ if (vdoa != g_vdoa)
+ BUG();
+
+ clk_disable_unprepare(vdoa->vdoa_clk);
+ vdoa->state = VDOA_PUT;
+ *handle = (vdoa_handle_t *)NULL;
+ mutex_unlock(&vdoa_lock);
+}
+
+static irqreturn_t vdoa_irq_handler(int irq, void *data)
+{
+ u32 status, mask, val;
+ struct vdoa_info *vdoa = data;
+
+ CHECK_NULL_PTR(vdoa);
+ CHECK_STATE(VDOA_START, return IRQ_HANDLED);
+ vdoa->state = VDOA_INIRQ;
+ vdoa_read_register(vdoa, VDOAIST, &status);
+ vdoa_read_register(vdoa, VDOAIE, &mask);
+ val = status & mask;
+ vdoa_write_register(vdoa, VDOAIST, val);
+ if (VDOAIEIST_TRANSFER_ERR & val)
+ dev_err(vdoa->dev, "vdoa Transfer err irq!\n");
+ if (VDOAIEIST_TRANSFER_END & val)
+ dev_dbg(vdoa->dev, "vdoa Transfer end irq!\n");
+ if (0 == val) {
+ dev_err(vdoa->dev, "vdoa unknown irq!\n");
+ BUG();
+ }
+
+ complete(&vdoa->comp);
+ return IRQ_HANDLED;
+}
+
+/* IRAM Size in Kbytes, example:vdoa_iram_size=64, 64KBytes */
+static int __init vdoa_iram_size_setup(char *options)
+{
+ int ret;
+
+ ret = kstrtoul(options, 0, &iram_size);
+ if (ret)
+ iram_size = 0;
+ else
+ iram_size *= SZ_1K;
+
+ return 1;
+}
+__setup("vdoa_iram_size=", vdoa_iram_size_setup);
+
+static const struct of_device_id imx_vdoa_dt_ids[] = {
+ { .compatible = "fsl,imx6q-vdoa", },
+ { /* sentinel */ }
+};
+
+static int vdoa_probe(struct platform_device *pdev)
+{
+ int ret;
+ struct vdoa_info *vdoa;
+ struct resource *res;
+ struct resource *res_irq;
+ struct device *dev = &pdev->dev;
+ struct device_node *np = pdev->dev.of_node;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(dev, "can't get device resources\n");
+ return -ENOENT;
+ }
+
+ res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+ if (!res_irq) {
+ dev_err(dev, "failed to get irq resource\n");
+ return -ENOENT;
+ }
+
+ vdoa = devm_kzalloc(dev, sizeof(struct vdoa_info), GFP_KERNEL);
+ if (!vdoa)
+ return -ENOMEM;
+ vdoa->dev = dev;
+
+ vdoa->reg_base = devm_ioremap_resource(&pdev->dev, res);
+ if (!vdoa->reg_base)
+ return -EBUSY;
+
+ vdoa->irq = res_irq->start;
+ ret = devm_request_irq(dev, vdoa->irq, vdoa_irq_handler, 0,
+ "vdoa", vdoa);
+ if (ret) {
+ dev_err(dev, "can't claim irq %d\n", vdoa->irq);
+ return ret;
+ }
+ disable_irq(vdoa->irq);
+
+ vdoa->vdoa_clk = devm_clk_get(dev, NULL);
+ if (IS_ERR(vdoa->vdoa_clk)) {
+ dev_err(dev, "failed to get vdoa_clk\n");
+ return PTR_ERR(vdoa->vdoa_clk);
+ }
+
+ vdoa->iram_pool = of_gen_pool_get(np, "iram", 0);
+ if (!vdoa->iram_pool) {
+ dev_err(&pdev->dev, "iram pool not available\n");
+ return -ENOMEM;
+ }
+
+ if ((iram_size == 0) || (iram_size > MAX_VDOA_IRAM_SIZE))
+ iram_size = VDOA_IRAM_SIZE;
+
+ vdoa->iram_base = gen_pool_alloc(vdoa->iram_pool, iram_size);
+ if (!vdoa->iram_base) {
+ dev_err(&pdev->dev, "unable to alloc iram\n");
+ return -ENOMEM;
+ }
+
+ vdoa->iram_paddr = gen_pool_virt_to_phys(vdoa->iram_pool,
+ vdoa->iram_base);
+
+ dev_dbg(dev, "iram_base:0x%lx,iram_paddr:0x%lx,size:0x%lx\n",
+ vdoa->iram_base, vdoa->iram_paddr, iram_size);
+
+ vdoa->state = VDOA_INIT;
+ dev_set_drvdata(dev, vdoa);
+ g_vdoa = vdoa;
+ dev_info(dev, "i.MX Video Data Order Adapter(VDOA) driver probed\n");
+ return 0;
+}
+
+static int vdoa_remove(struct platform_device *pdev)
+{
+ struct vdoa_info *vdoa = dev_get_drvdata(&pdev->dev);
+
+ gen_pool_free(vdoa->iram_pool, vdoa->iram_base, iram_size);
+ kfree(vdoa);
+ dev_set_drvdata(&pdev->dev, NULL);
+
+ return 0;
+}
+
+static struct platform_driver vdoa_driver = {
+ .driver = {
+ .name = "mxc_vdoa",
+ .of_match_table = imx_vdoa_dt_ids,
+ },
+ .probe = vdoa_probe,
+ .remove = vdoa_remove,
+};
+
+static int __init vdoa_init(void)
+{
+ int err;
+
+ err = platform_driver_register(&vdoa_driver);
+ if (err) {
+ pr_err("vdoa_driver register failed\n");
+ return -ENODEV;
+ }
+ return 0;
+}
+
+static void __exit vdoa_cleanup(void)
+{
+ platform_driver_unregister(&vdoa_driver);
+}
+
+subsys_initcall(vdoa_init);
+module_exit(vdoa_cleanup);
+
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_DESCRIPTION("i.MX Video Data Order Adapter(VDOA) driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/mxc/ipu3/vdoa.h b/drivers/mxc/ipu3/vdoa.h
new file mode 100644
index 000000000000..3e4c7356cb26
--- /dev/null
+++ b/drivers/mxc/ipu3/vdoa.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#ifndef __VDOA_H__
+#define __VDOA_H__
+
+#define VDOA_PFS_YUYV (1)
+#define VDOA_PFS_NV12 (0)
+
+
+struct vfield_buf {
+ u32 prev_veba;
+ u32 cur_veba;
+ u32 next_veba;
+ u32 vubo;
+};
+
+struct vframe_buf {
+ u32 veba;
+ u32 vubo;
+};
+
+struct vdoa_params {
+ u32 width;
+ u32 height;
+ int vpu_stride;
+ int interlaced;
+ int scan_order;
+ int ipu_num;
+ int band_lines;
+ int band_mode;
+ int pfs;
+ u32 ieba0;
+ u32 ieba1;
+ u32 ieba2;
+ struct vframe_buf vframe_buf;
+ struct vfield_buf vfield_buf;
+};
+struct vdoa_ipu_buf {
+ u32 ieba0;
+ u32 ieba1;
+ u32 iubo;
+};
+
+struct vdoa_info;
+typedef void *vdoa_handle_t;
+
+int vdoa_setup(vdoa_handle_t handle, struct vdoa_params *params);
+void vdoa_get_output_buf(vdoa_handle_t handle, struct vdoa_ipu_buf *buf);
+int vdoa_start(vdoa_handle_t handle, int timeout_ms);
+void vdoa_stop(vdoa_handle_t handle);
+void vdoa_get_handle(vdoa_handle_t *handle);
+void vdoa_put_handle(vdoa_handle_t *handle);
+#endif
diff --git a/drivers/mxc/mlb/Kconfig b/drivers/mxc/mlb/Kconfig
new file mode 100644
index 000000000000..861812c66328
--- /dev/null
+++ b/drivers/mxc/mlb/Kconfig
@@ -0,0 +1,17 @@
+#
+# MLB150 configuration
+#
+
+menu "MXC Media Local Bus Driver"
+
+config MXC_MLB
+ bool
+
+config MXC_MLB150
+ tristate "MLB150 support"
+ depends on ARCH_MXC || COMPILE_TEST
+ select MXC_MLB
+ help
+ Say Y to get the MLB150 support.
+
+endmenu
diff --git a/drivers/mxc/mlb/Makefile b/drivers/mxc/mlb/Makefile
new file mode 100644
index 000000000000..e71005a3788f
--- /dev/null
+++ b/drivers/mxc/mlb/Makefile
@@ -0,0 +1,5 @@
+#
+# Makefile for the i.MX6Q/DL MLB150 driver
+#
+
+obj-$(CONFIG_MXC_MLB150) += mxc_mlb.o
diff --git a/drivers/mxc/mlb/mxc_mlb.c b/drivers/mxc/mlb/mxc_mlb.c
new file mode 100755
index 000000000000..e97cf8892bb0
--- /dev/null
+++ b/drivers/mxc/mlb/mxc_mlb.c
@@ -0,0 +1,2828 @@
+/*
+ * Copyright (C) 2011-2014 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * 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.
+ */
+
+#include <linux/cdev.h>
+#include <linux/circ_buf.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/dma-mapping.h>
+#include <linux/errno.h>
+#include <linux/fs.h>
+#include <linux/genalloc.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mxc_mlb.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/poll.h>
+#include <linux/regulator/consumer.h>
+#include <linux/sched/signal.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/uaccess.h>
+
+#define DRIVER_NAME "mxc_mlb150"
+
+/*
+ * MLB module memory map registers define
+ */
+#define REG_MLBC0 0x0
+#define MLBC0_MLBEN (0x1)
+#define MLBC0_MLBCLK_MASK (0x7 << 2)
+#define MLBC0_MLBCLK_SHIFT (2)
+#define MLBC0_MLBPEN (0x1 << 5)
+#define MLBC0_MLBLK (0x1 << 7)
+#define MLBC0_ASYRETRY (0x1 << 12)
+#define MLBC0_CTLRETRY (0x1 << 12)
+#define MLBC0_FCNT_MASK (0x7 << 15)
+#define MLBC0_FCNT_SHIFT (15)
+
+#define REG_MLBPC0 0x8
+#define MLBPC0_MCLKHYS (0x1 << 11)
+
+#define REG_MS0 0xC
+#define REG_MS1 0x14
+
+#define REG_MSS 0x20
+#define MSS_RSTSYSCMD (0x1)
+#define MSS_LKSYSCMD (0x1 << 1)
+#define MSS_ULKSYSCMD (0x1 << 2)
+#define MSS_CSSYSCMD (0x1 << 3)
+#define MSS_SWSYSCMD (0x1 << 4)
+#define MSS_SERVREQ (0x1 << 5)
+
+#define REG_MSD 0x24
+
+#define REG_MIEN 0x2C
+#define MIEN_ISOC_PE (0x1)
+#define MIEN_ISOC_BUFO (0x1 << 1)
+#define MIEN_SYNC_PE (0x1 << 16)
+#define MIEN_ARX_DONE (0x1 << 17)
+#define MIEN_ARX_PE (0x1 << 18)
+#define MIEN_ARX_BREAK (0x1 << 19)
+#define MIEN_ATX_DONE (0x1 << 20)
+#define MIEN_ATX_PE (0x1 << 21)
+#define MIEN_ATX_BREAK (0x1 << 22)
+#define MIEN_CRX_DONE (0x1 << 24)
+#define MIEN_CRX_PE (0x1 << 25)
+#define MIEN_CRX_BREAK (0x1 << 26)
+#define MIEN_CTX_DONE (0x1 << 27)
+#define MIEN_CTX_PE (0x1 << 28)
+#define MIEN_CTX_BREAK (0x1 << 29)
+
+#define REG_MLBPC2 0x34
+#define REG_MLBPC1 0x38
+#define MLBPC1_VAL (0x00000888)
+
+#define REG_MLBC1 0x3C
+#define MLBC1_LOCK (0x1 << 6)
+#define MLBC1_CLKM (0x1 << 7)
+#define MLBC1_NDA_MASK (0xFF << 8)
+#define MLBC1_NDA_SHIFT (8)
+
+#define REG_HCTL 0x80
+#define HCTL_RST0 (0x1)
+#define HCTL_RST1 (0x1 << 1)
+#define HCTL_EN (0x1 << 15)
+
+#define REG_HCMR0 0x88
+#define REG_HCMR1 0x8C
+#define REG_HCER0 0x90
+#define REG_HCER1 0x94
+#define REG_HCBR0 0x98
+#define REG_HCBR1 0x9C
+
+#define REG_MDAT0 0xC0
+#define REG_MDAT1 0xC4
+#define REG_MDAT2 0xC8
+#define REG_MDAT3 0xCC
+
+#define REG_MDWE0 0xD0
+#define REG_MDWE1 0xD4
+#define REG_MDWE2 0xD8
+#define REG_MDWE3 0xDC
+
+#define REG_MCTL 0xE0
+#define MCTL_XCMP (0x1)
+
+#define REG_MADR 0xE4
+#define MADR_WNR (0x1 << 31)
+#define MADR_TB (0x1 << 30)
+#define MADR_ADDR_MASK (0x7f << 8)
+#define MADR_ADDR_SHIFT (0)
+
+#define REG_ACTL 0x3C0
+#define ACTL_MPB (0x1 << 4)
+#define ACTL_DMAMODE (0x1 << 2)
+#define ACTL_SMX (0x1 << 1)
+#define ACTL_SCE (0x1)
+
+#define REG_ACSR0 0x3D0
+#define REG_ACSR1 0x3D4
+#define REG_ACMR0 0x3D8
+#define REG_ACMR1 0x3DC
+
+#define REG_CAT_MDATn(ch) (REG_MDAT0 + ((ch % 8) >> 1) * 4)
+#define REG_CAT_MDWEn(ch) (REG_MDWE0 + ((ch % 8) >> 1) * 4)
+
+#define INT_AHB0_CH_START (0)
+#define INT_AHB1_CH_START (32)
+
+#define LOGIC_CH_NUM (64)
+#define BUF_CDT_OFFSET (0x0)
+#define BUF_ADT_OFFSET (0x40)
+#define BUF_CAT_MLB_OFFSET (0x80)
+#define BUF_CAT_HBI_OFFSET (0x88)
+#define BUF_CTR_END_OFFSET (0x8F)
+
+#define CAT_MODE_RX (0x1 << 0)
+#define CAT_MODE_TX (0x1 << 1)
+#define CAT_MODE_INBOUND_DMA (0x1 << 8)
+#define CAT_MODE_OUTBOUND_DMA (0x1 << 9)
+
+#define CH_SYNC_DEFAULT_QUAD (1)
+#define CH_SYNC_MAX_QUAD (15)
+#define CH_SYNC_CDT_BUF_DEP (CH_SYNC_DEFAULT_QUAD * 4 * 4)
+#define CH_SYNC_ADT_BUF_MULTI (4)
+#define CH_SYNC_ADT_BUF_DEP (CH_SYNC_CDT_BUF_DEP * CH_SYNC_ADT_BUF_MULTI)
+#define CH_SYNC_BUF_SZ (CH_SYNC_MAX_QUAD * 4 * 4 * \
+ CH_SYNC_ADT_BUF_MULTI)
+#define CH_CTRL_CDT_BUF_DEP (64)
+#define CH_CTRL_ADT_BUF_DEP (CH_CTRL_CDT_BUF_DEP)
+#define CH_CTRL_BUF_SZ (CH_CTRL_ADT_BUF_DEP)
+#define CH_ASYNC_MDP_PACKET_LEN (1024)
+#define CH_ASYNC_MEP_PACKET_LEN (1536)
+#define CH_ASYNC_CDT_BUF_DEP (CH_ASYNC_MEP_PACKET_LEN)
+#define CH_ASYNC_ADT_BUF_DEP (CH_ASYNC_CDT_BUF_DEP)
+#define CH_ASYNC_BUF_SZ (CH_ASYNC_ADT_BUF_DEP)
+#define CH_ISOC_BLK_SIZE_188 (188)
+#define CH_ISOC_BLK_SIZE_196 (196)
+#define CH_ISOC_BLK_SIZE (CH_ISOC_BLK_SIZE_188)
+#define CH_ISOC_BLK_NUM (1)
+#define CH_ISOC_CDT_BUF_DEP (CH_ISOC_BLK_SIZE * CH_ISOC_BLK_NUM)
+#define CH_ISOC_ADT_BUF_DEP (CH_ISOC_CDT_BUF_DEP)
+#define CH_ISOC_BUF_SZ (1024)
+
+#define CH_SYNC_DBR_BUF_OFFSET (0x0)
+#define CH_CTRL_DBR_BUF_OFFSET (CH_SYNC_DBR_BUF_OFFSET + \
+ 2 * (CH_SYNC_MAX_QUAD * 4 * 4))
+#define CH_ASYNC_DBR_BUF_OFFSET (CH_CTRL_DBR_BUF_OFFSET + \
+ 2 * CH_CTRL_CDT_BUF_DEP)
+#define CH_ISOC_DBR_BUF_OFFSET (CH_ASYNC_DBR_BUF_OFFSET + \
+ 2 * CH_ASYNC_CDT_BUF_DEP)
+
+#define DBR_BUF_START 0x00000
+
+#define CDT_LEN (16)
+#define ADT_LEN (16)
+#define CAT_LEN (2)
+
+#define CDT_SZ (CDT_LEN * LOGIC_CH_NUM)
+#define ADT_SZ (ADT_LEN * LOGIC_CH_NUM)
+#define CAT_SZ (CAT_LEN * LOGIC_CH_NUM * 2)
+
+#define CDT_BASE(base) (base + BUF_CDT_OFFSET)
+#define ADT_BASE(base) (base + BUF_ADT_OFFSET)
+#define CAT_MLB_BASE(base) (base + BUF_CAT_MLB_OFFSET)
+#define CAT_HBI_BASE(base) (base + BUF_CAT_HBI_OFFSET)
+
+#define CDTn_ADDR(base, n) (base + BUF_CDT_OFFSET + n * CDT_LEN)
+#define ADTn_ADDR(base, n) (base + BUF_ADT_OFFSET + n * ADT_LEN)
+#define CATn_MLB_ADDR(base, n) (base + BUF_CAT_MLB_OFFSET + n * CAT_LEN)
+#define CATn_HBI_ADDR(base, n) (base + BUF_CAT_HBI_OFFSET + n * CAT_LEN)
+
+#define CAT_CL_SHIFT (0x0)
+#define CAT_CT_SHIFT (8)
+#define CAT_CE (0x1 << 11)
+#define CAT_RNW (0x1 << 12)
+#define CAT_MT (0x1 << 13)
+#define CAT_FCE (0x1 << 14)
+#define CAT_MFE (0x1 << 14)
+
+#define CDT_WSBC_SHIFT (14)
+#define CDT_WPC_SHIFT (11)
+#define CDT_RSBC_SHIFT (30)
+#define CDT_RPC_SHIFT (27)
+#define CDT_WPC_1_SHIFT (12)
+#define CDT_RPC_1_SHIFT (28)
+#define CDT_WPTR_SHIFT (0)
+#define CDT_SYNC_WSTS_MASK (0x0000f000)
+#define CDT_SYNC_WSTS_SHIFT (12)
+#define CDT_CTRL_ASYNC_WSTS_MASK (0x0000f000)
+#define CDT_CTRL_ASYNC_WSTS_SHIFT (12)
+#define CDT_ISOC_WSTS_MASK (0x0000e000)
+#define CDT_ISOC_WSTS_SHIFT (13)
+#define CDT_RPTR_SHIFT (16)
+#define CDT_SYNC_RSTS_MASK (0xf0000000)
+#define CDT_SYNC_RSTS_SHIFT (28)
+#define CDT_CTRL_ASYNC_RSTS_MASK (0xf0000000)
+#define CDT_CTRL_ASYNC_RSTS_SHIFT (28)
+#define CDT_ISOC_RSTS_MASK (0xe0000000)
+#define CDT_ISOC_RSTS_SHIFT (29)
+#define CDT_CTRL_ASYNC_WSTS_1 (0x1 << 14)
+#define CDT_CTRL_ASYNC_RSTS_1 (0x1 << 15)
+#define CDT_BD_SHIFT (0)
+#define CDT_BA_SHIFT (16)
+#define CDT_BS_SHIFT (0)
+#define CDT_BF_SHIFT (31)
+
+#define ADT_PG (0x1 << 13)
+#define ADT_LE (0x1 << 14)
+#define ADT_CE (0x1 << 15)
+#define ADT_BD1_SHIFT (0)
+#define ADT_ERR1 (0x1 << 13)
+#define ADT_DNE1 (0x1 << 14)
+#define ADT_RDY1 (0x1 << 15)
+#define ADT_BD2_SHIFT (16)
+#define ADT_ERR2 (0x1 << 29)
+#define ADT_DNE2 (0x1 << 30)
+#define ADT_RDY2 (0x1 << 31)
+#define ADT_BA1_SHIFT (0x0)
+#define ADT_BA2_SHIFT (0x0)
+#define ADT_PS1 (0x1 << 12)
+#define ADT_PS2 (0x1 << 28)
+#define ADT_MEP1 (0x1 << 11)
+#define ADT_MEP2 (0x1 << 27)
+
+#define MLB_MINOR_DEVICES 4
+#define MLB_CONTROL_DEV_NAME "ctrl"
+#define MLB_ASYNC_DEV_NAME "async"
+#define MLB_SYNC_DEV_NAME "sync"
+#define MLB_ISOC_DEV_NAME "isoc"
+
+#define TX_CHANNEL 0
+#define RX_CHANNEL 1
+
+#define TRANS_RING_NODES (1 << 3)
+#define MLB_QUIRK_MLB150 (1 << 0)
+
+enum MLB_CTYPE {
+ MLB_CTYPE_SYNC,
+ MLB_CTYPE_CTRL,
+ MLB_CTYPE_ASYNC,
+ MLB_CTYPE_ISOC,
+};
+
+enum CLK_SPEED {
+ CLK_256FS,
+ CLK_512FS,
+ CLK_1024FS,
+ CLK_2048FS,
+ CLK_3072FS,
+ CLK_4096FS,
+ CLK_6144FS,
+ CLK_8192FS,
+};
+
+enum MLB_INDEX {
+ IMX6Q_MLB = 0,
+ IMX6SX_MLB,
+ IMX8QXP_MLB,
+};
+
+struct imx_mlb_hwdata {
+ enum MLB_INDEX devtype;
+ u32 quirk_flag;
+};
+
+struct mlb_ringbuf {
+ s8 *virt_bufs[TRANS_RING_NODES];
+ u32 phy_addrs[TRANS_RING_NODES];
+ s32 head;
+ s32 tail;
+ s32 unit_size;
+ s32 total_size;
+ rwlock_t rb_lock ____cacheline_aligned; /* ring index lock */
+};
+
+struct mlb_channel_info {
+ /* Input MLB channel address */
+ u32 address;
+ /* Internal AHB channel label */
+ u32 cl;
+ /* DBR buf head */
+ u32 dbr_buf_head;
+};
+
+struct mlb_dev_info {
+ /* device node name */
+ const char dev_name[20];
+ /* channel type */
+ const unsigned int channel_type;
+ /* ch fps */
+ enum CLK_SPEED fps;
+ /* channel info for tx/rx */
+ struct mlb_channel_info channels[2];
+ /* ring buffer */
+ u8 *rbuf_base_virt;
+ u32 rbuf_base_phy;
+ struct mlb_ringbuf rx_rbuf;
+ struct mlb_ringbuf tx_rbuf;
+ /* exception event */
+ unsigned long ex_event;
+ /* tx busy indicator */
+ unsigned long tx_busy;
+ /* channel started up or not */
+ atomic_t on;
+ /* device open count */
+ atomic_t opencnt;
+ /* wait queue head for channel */
+ wait_queue_head_t rx_wq;
+ wait_queue_head_t tx_wq;
+ /* TX OK */
+ s32 tx_ok;
+ /* spinlock for event access */
+ spinlock_t event_lock;
+ /*
+ * Block size for isoc mode
+ * This variable can be configured in ioctl
+ */
+ u32 isoc_blksz;
+ /*
+ * Quads number for sync mode
+ * This variable can be confifured in ioctl
+ */
+ u32 sync_quad;
+ /* Buffer depth in cdt */
+ u32 cdt_buf_dep;
+ /* Buffer depth in adt */
+ u32 adt_buf_dep;
+ /* Buffer size to hold data */
+ u32 buf_size;
+};
+
+struct mlb_data {
+ struct device *dev;
+ struct mlb_dev_info *devinfo;
+ const struct imx_mlb_hwdata *hwdata;
+ struct clk *ipg;
+ struct clk *hclk;
+ struct clk *mlb;
+ struct cdev cdev;
+ struct class *class; /* device class */
+ dev_t firstdev;
+#ifdef CONFIG_REGULATOR
+ struct regulator *nvcc;
+#endif
+ void __iomem *membase; /* mlb module base address */
+ struct gen_pool *iram_pool;
+ u32 iram_size;
+ int irq_ahb0;
+ int irq_ahb1;
+ int irq_mlb;
+ bool use_iram;
+};
+
+/*
+ * For optimization, we use fixed channel label for
+ * input channels of each mode
+ * SYNC: CL = 0 for RX, CL = 64 for TX
+ * CTRL: CL = 1 for RX, CL = 65 for TX
+ * ASYNC: CL = 2 for RX, CL = 66 for TX
+ * ISOC: CL = 3 for RX, CL = 67 for TX
+ */
+#define SYNC_RX_CL_AHB0 0
+#define CTRL_RX_CL_AHB0 1
+#define ASYNC_RX_CL_AHB0 2
+#define ISOC_RX_CL_AHB0 3
+#define SYNC_TX_CL_AHB0 4
+#define CTRL_TX_CL_AHB0 5
+#define ASYNC_TX_CL_AHB0 6
+#define ISOC_TX_CL_AHB0 7
+
+#define SYNC_RX_CL_AHB1 32
+#define CTRL_RX_CL_AHB1 33
+#define ASYNC_RX_CL_AHB1 34
+#define ISOC_RX_CL_AHB1 35
+#define SYNC_TX_CL_AHB1 36
+#define CTRL_TX_CL_AHB1 37
+#define ASYNC_TX_CL_AHB1 38
+#define ISOC_TX_CL_AHB1 39
+
+#define SYNC_RX_CL SYNC_RX_CL_AHB0
+#define CTRL_RX_CL CTRL_RX_CL_AHB0
+#define ASYNC_RX_CL ASYNC_RX_CL_AHB0
+#define ISOC_RX_CL ISOC_RX_CL_AHB0
+
+#define SYNC_TX_CL SYNC_TX_CL_AHB0
+#define CTRL_TX_CL CTRL_TX_CL_AHB0
+#define ASYNC_TX_CL ASYNC_TX_CL_AHB0
+#define ISOC_TX_CL ISOC_TX_CL_AHB0
+
+static struct mlb_dev_info mlb_devinfo[MLB_MINOR_DEVICES] = {
+ {
+ .dev_name = MLB_SYNC_DEV_NAME,
+ .channel_type = MLB_CTYPE_SYNC,
+ .channels = {
+ [0] = {
+ .cl = SYNC_TX_CL,
+ .dbr_buf_head = CH_SYNC_DBR_BUF_OFFSET,
+ },
+ [1] = {
+ .cl = SYNC_RX_CL,
+ .dbr_buf_head = CH_SYNC_DBR_BUF_OFFSET
+ + CH_SYNC_BUF_SZ,
+ },
+ },
+ .rx_rbuf = {
+ .unit_size = CH_SYNC_BUF_SZ,
+ .rb_lock =
+ __RW_LOCK_UNLOCKED(mlb_devinfo[0].rx_rbuf.rb_lock),
+ },
+ .tx_rbuf = {
+ .unit_size = CH_SYNC_BUF_SZ,
+ .rb_lock =
+ __RW_LOCK_UNLOCKED(mlb_devinfo[0].tx_rbuf.rb_lock),
+ },
+ .cdt_buf_dep = CH_SYNC_CDT_BUF_DEP,
+ .adt_buf_dep = CH_SYNC_ADT_BUF_DEP,
+ .buf_size = CH_SYNC_BUF_SZ,
+ .on = ATOMIC_INIT(0),
+ .opencnt = ATOMIC_INIT(0),
+ .event_lock = __SPIN_LOCK_UNLOCKED(mlb_devinfo[0].event_lock),
+ },
+ {
+ .dev_name = MLB_CONTROL_DEV_NAME,
+ .channel_type = MLB_CTYPE_CTRL,
+ .channels = {
+ [0] = {
+ .cl = CTRL_TX_CL,
+ .dbr_buf_head = CH_CTRL_DBR_BUF_OFFSET,
+ },
+ [1] = {
+ .cl = CTRL_RX_CL,
+ .dbr_buf_head = CH_CTRL_DBR_BUF_OFFSET
+ + CH_CTRL_BUF_SZ,
+ },
+ },
+ .rx_rbuf = {
+ .unit_size = CH_CTRL_BUF_SZ,
+ .rb_lock =
+ __RW_LOCK_UNLOCKED(mlb_devinfo[1].rx_rbuf.rb_lock),
+ },
+ .tx_rbuf = {
+ .unit_size = CH_CTRL_BUF_SZ,
+ .rb_lock =
+ __RW_LOCK_UNLOCKED(mlb_devinfo[1].tx_rbuf.rb_lock),
+ },
+ .cdt_buf_dep = CH_CTRL_CDT_BUF_DEP,
+ .adt_buf_dep = CH_CTRL_ADT_BUF_DEP,
+ .buf_size = CH_CTRL_BUF_SZ,
+ .on = ATOMIC_INIT(0),
+ .opencnt = ATOMIC_INIT(0),
+ .event_lock = __SPIN_LOCK_UNLOCKED(mlb_devinfo[1].event_lock),
+ },
+ {
+ .dev_name = MLB_ASYNC_DEV_NAME,
+ .channel_type = MLB_CTYPE_ASYNC,
+ .channels = {
+ [0] = {
+ .cl = ASYNC_TX_CL,
+ .dbr_buf_head = CH_ASYNC_DBR_BUF_OFFSET,
+ },
+ [1] = {
+ .cl = ASYNC_RX_CL,
+ .dbr_buf_head = CH_ASYNC_DBR_BUF_OFFSET
+ + CH_ASYNC_BUF_SZ,
+ },
+ },
+ .rx_rbuf = {
+ .unit_size = CH_ASYNC_BUF_SZ,
+ .rb_lock =
+ __RW_LOCK_UNLOCKED(mlb_devinfo[2].rx_rbuf.rb_lock),
+ },
+ .tx_rbuf = {
+ .unit_size = CH_ASYNC_BUF_SZ,
+ .rb_lock =
+ __RW_LOCK_UNLOCKED(mlb_devinfo[2].tx_rbuf.rb_lock),
+ },
+ .cdt_buf_dep = CH_ASYNC_CDT_BUF_DEP,
+ .adt_buf_dep = CH_ASYNC_ADT_BUF_DEP,
+ .buf_size = CH_ASYNC_BUF_SZ,
+ .on = ATOMIC_INIT(0),
+ .opencnt = ATOMIC_INIT(0),
+ .event_lock = __SPIN_LOCK_UNLOCKED(mlb_devinfo[2].event_lock),
+ },
+ {
+ .dev_name = MLB_ISOC_DEV_NAME,
+ .channel_type = MLB_CTYPE_ISOC,
+ .channels = {
+ [0] = {
+ .cl = ISOC_TX_CL,
+ .dbr_buf_head = CH_ISOC_DBR_BUF_OFFSET,
+ },
+ [1] = {
+ .cl = ISOC_RX_CL,
+ .dbr_buf_head = CH_ISOC_DBR_BUF_OFFSET
+ + CH_ISOC_BUF_SZ,
+ },
+ },
+ .rx_rbuf = {
+ .unit_size = CH_ISOC_BUF_SZ,
+ .rb_lock =
+ __RW_LOCK_UNLOCKED(mlb_devinfo[3].rx_rbuf.rb_lock),
+ },
+ .tx_rbuf = {
+ .unit_size = CH_ISOC_BUF_SZ,
+ .rb_lock =
+ __RW_LOCK_UNLOCKED(mlb_devinfo[3].tx_rbuf.rb_lock),
+ },
+ .cdt_buf_dep = CH_ISOC_CDT_BUF_DEP,
+ .adt_buf_dep = CH_ISOC_ADT_BUF_DEP,
+ .buf_size = CH_ISOC_BUF_SZ,
+ .on = ATOMIC_INIT(0),
+ .opencnt = ATOMIC_INIT(0),
+ .event_lock = __SPIN_LOCK_UNLOCKED(mlb_devinfo[3].event_lock),
+ .isoc_blksz = CH_ISOC_BLK_SIZE_188,
+ },
+};
+
+static void __iomem *mlb_base;
+
+DEFINE_SPINLOCK(ctr_lock);
+
+#ifdef DEBUG
+#define DUMP_REG(reg) pr_debug(#reg": 0x%08x\n", __raw_readl(mlb_base + reg))
+
+static void mlb150_dev_dump_reg(void)
+{
+ pr_debug("mxc_mlb150: Dump registers:\n");
+ DUMP_REG(REG_MLBC0);
+ DUMP_REG(REG_MLBPC0);
+ DUMP_REG(REG_MS0);
+ DUMP_REG(REG_MS1);
+ DUMP_REG(REG_MSS);
+ DUMP_REG(REG_MSD);
+ DUMP_REG(REG_MIEN);
+ DUMP_REG(REG_MLBPC2);
+ DUMP_REG(REG_MLBPC1);
+ DUMP_REG(REG_MLBC1);
+ DUMP_REG(REG_HCTL);
+ DUMP_REG(REG_HCMR0);
+ DUMP_REG(REG_HCMR1);
+ DUMP_REG(REG_HCER0);
+ DUMP_REG(REG_HCER1);
+ DUMP_REG(REG_HCBR0);
+ DUMP_REG(REG_HCBR1);
+ DUMP_REG(REG_MDAT0);
+ DUMP_REG(REG_MDAT1);
+ DUMP_REG(REG_MDAT2);
+ DUMP_REG(REG_MDAT3);
+ DUMP_REG(REG_MDWE0);
+ DUMP_REG(REG_MDWE1);
+ DUMP_REG(REG_MDWE2);
+ DUMP_REG(REG_MDWE3);
+ DUMP_REG(REG_MCTL);
+ DUMP_REG(REG_MADR);
+ DUMP_REG(REG_ACTL);
+ DUMP_REG(REG_ACSR0);
+ DUMP_REG(REG_ACSR1);
+ DUMP_REG(REG_ACMR0);
+ DUMP_REG(REG_ACMR1);
+}
+
+static void mlb150_dev_dump_hex(const u8 *buf, u32 len)
+{
+ print_hex_dump(KERN_DEBUG, "CTR DUMP:",
+ DUMP_PREFIX_OFFSET, 8, 1, buf, len, 0);
+}
+#endif
+
+static inline int mlb150_is_imx8qxp_mlb(struct mlb_data *drvdata)
+{
+ return drvdata->hwdata->devtype == IMX8QXP_MLB;
+}
+
+static inline void mlb150_dev_enable_ctr_write(u32 mdat0_bits_en,
+ u32 mdat1_bits_en, u32 mdat2_bits_en, u32 mdat3_bits_en)
+{
+ __raw_writel(mdat0_bits_en, mlb_base + REG_MDWE0);
+ __raw_writel(mdat1_bits_en, mlb_base + REG_MDWE1);
+ __raw_writel(mdat2_bits_en, mlb_base + REG_MDWE2);
+ __raw_writel(mdat3_bits_en, mlb_base + REG_MDWE3);
+}
+
+#ifdef DEBUG
+static inline u8 mlb150_dev_dbr_read(u32 dbr_addr)
+{
+ s32 timeout = 1000;
+ u8 dbr_val = 0;
+ unsigned long flags;
+
+ spin_lock_irqsave(&ctr_lock, flags);
+ __raw_writel(MADR_TB | dbr_addr,
+ mlb_base + REG_MADR);
+
+ while ((!(__raw_readl(mlb_base + REG_MCTL)
+ & MCTL_XCMP)) &&
+ timeout--)
+ ;
+
+ if (0 == timeout) {
+ spin_unlock_irqrestore(&ctr_lock, flags);
+ return -ETIME;
+ }
+
+ dbr_val = __raw_readl(mlb_base + REG_MDAT0) & 0x000000ff;
+
+ __raw_writel(0, mlb_base + REG_MCTL);
+ spin_unlock_irqrestore(&ctr_lock, flags);
+
+ return dbr_val;
+}
+
+static inline s32 mlb150_dev_dbr_write(u32 dbr_addr, u8 dbr_val)
+{
+ s32 timeout = 1000;
+ u32 mdat0 = dbr_val & 0x000000ff;
+ unsigned long flags;
+
+ spin_lock_irqsave(&ctr_lock, flags);
+ __raw_writel(mdat0, mlb_base + REG_MDAT0);
+
+ __raw_writel(MADR_WNR | MADR_TB | dbr_addr,
+ mlb_base + REG_MADR);
+
+ while ((!(__raw_readl(mlb_base + REG_MCTL)
+ & MCTL_XCMP)) &&
+ timeout--)
+ ;
+
+ if (timeout <= 0) {
+ spin_unlock_irqrestore(&ctr_lock, flags);
+ return -ETIME;
+ }
+
+ __raw_writel(0, mlb_base + REG_MCTL);
+ spin_unlock_irqrestore(&ctr_lock, flags);
+
+ return 0;
+}
+
+static inline s32 mlb150_dev_dbr_dump(u32 addr, u32 size)
+{
+ u8 *dump_buf = NULL;
+ u8 *buf_ptr = NULL;
+ s32 i;
+
+ dump_buf = kzalloc(size, GFP_KERNEL);
+ if (!dump_buf) {
+ pr_err("can't allocate enough memory\n");
+ return -ENOMEM;
+ }
+
+ for (i = 0, buf_ptr = dump_buf;
+ i < size; ++i, ++buf_ptr)
+ *buf_ptr = mlb150_dev_dbr_read(addr + i);
+
+ mlb150_dev_dump_hex(dump_buf, size);
+
+ kfree(dump_buf);
+
+ return 0;
+}
+#endif
+
+static s32 mlb150_dev_ctr_read(u32 ctr_offset, u32 *ctr_val)
+{
+ s32 timeout = 1000;
+ unsigned long flags;
+
+ spin_lock_irqsave(&ctr_lock, flags);
+ __raw_writel(ctr_offset, mlb_base + REG_MADR);
+
+ while ((!(__raw_readl(mlb_base + REG_MCTL)
+ & MCTL_XCMP)) &&
+ timeout--)
+ ;
+
+ if (timeout <= 0) {
+ spin_unlock_irqrestore(&ctr_lock, flags);
+ pr_debug("mxc_mlb150: Read CTR timeout\n");
+ return -ETIME;
+ }
+
+ ctr_val[0] = __raw_readl(mlb_base + REG_MDAT0);
+ ctr_val[1] = __raw_readl(mlb_base + REG_MDAT1);
+ ctr_val[2] = __raw_readl(mlb_base + REG_MDAT2);
+ ctr_val[3] = __raw_readl(mlb_base + REG_MDAT3);
+
+ __raw_writel(0, mlb_base + REG_MCTL);
+
+ spin_unlock_irqrestore(&ctr_lock, flags);
+
+ return 0;
+}
+
+static s32 mlb150_dev_ctr_write(u32 ctr_offset, const u32 *ctr_val)
+{
+ s32 timeout = 1000;
+ unsigned long flags;
+
+ spin_lock_irqsave(&ctr_lock, flags);
+
+ __raw_writel(ctr_val[0], mlb_base + REG_MDAT0);
+ __raw_writel(ctr_val[1], mlb_base + REG_MDAT1);
+ __raw_writel(ctr_val[2], mlb_base + REG_MDAT2);
+ __raw_writel(ctr_val[3], mlb_base + REG_MDAT3);
+
+ __raw_writel(MADR_WNR | ctr_offset,
+ mlb_base + REG_MADR);
+
+ while ((!(__raw_readl(mlb_base + REG_MCTL)
+ & MCTL_XCMP)) &&
+ timeout--)
+ ;
+
+ if (timeout <= 0) {
+ spin_unlock_irqrestore(&ctr_lock, flags);
+ pr_debug("mxc_mlb150: Write CTR timeout\n");
+ return -ETIME;
+ }
+
+ __raw_writel(0, mlb_base + REG_MCTL);
+
+ spin_unlock_irqrestore(&ctr_lock, flags);
+
+#ifdef DEBUG_CTR
+ {
+ u32 ctr_rd[4] = { 0 };
+
+ if (!mlb150_dev_ctr_read(ctr_offset, ctr_rd)) {
+ if (ctr_val[0] == ctr_rd[0] &&
+ ctr_val[1] == ctr_rd[1] &&
+ ctr_val[2] == ctr_rd[2] &&
+ ctr_val[3] == ctr_rd[3])
+ return 0;
+ else {
+ pr_debug("mxc_mlb150: ctr write failed\n");
+ pr_debug("offset: 0x%x\n", ctr_offset);
+ pr_debug("Write: 0x%x 0x%x 0x%x 0x%x\n",
+ ctr_val[3], ctr_val[2],
+ ctr_val[1], ctr_val[0]);
+ pr_debug("Read: 0x%x 0x%x 0x%x 0x%x\n",
+ ctr_rd[3], ctr_rd[2],
+ ctr_rd[1], ctr_rd[0]);
+ return -EBADE;
+ }
+ } else {
+ pr_debug("mxc_mlb150: ctr read failed\n");
+ return -EBADE;
+ }
+ }
+#endif
+
+ return 0;
+}
+
+#ifdef DEBUG
+static s32 mlb150_dev_cat_read(u32 ctr_offset, u32 ch, u16 *cat_val)
+{
+ u16 ctr_val[8] = { 0 };
+
+ if (mlb150_dev_ctr_read(ctr_offset, (u32 *)ctr_val))
+ return -ETIME;
+
+ /*
+ * Use u16 array to get u32 array value,
+ * need to convert
+ */
+ cat_val = ctr_val[ch % 8];
+
+ return 0;
+}
+#endif
+
+static s32 mlb150_dev_cat_write(u32 ctr_offset, u32 ch, const u16 cat_val)
+{
+ u16 ctr_val[8] = { 0 };
+
+ if (mlb150_dev_ctr_read(ctr_offset, (u32 *)ctr_val))
+ return -ETIME;
+
+ ctr_val[ch % 8] = cat_val;
+ if (mlb150_dev_ctr_write(ctr_offset, (u32 *)ctr_val))
+ return -ETIME;
+
+ return 0;
+}
+
+#define mlb150_dev_cat_mlb_read(ch, cat_val) \
+ mlb150_dev_cat_read(BUF_CAT_MLB_OFFSET + (ch >> 3), ch, cat_val)
+#define mlb150_dev_cat_mlb_write(ch, cat_val) \
+ mlb150_dev_cat_write(BUF_CAT_MLB_OFFSET + (ch >> 3), ch, cat_val)
+#define mlb150_dev_cat_hbi_read(ch, cat_val) \
+ mlb150_dev_cat_read(BUF_CAT_HBI_OFFSET + (ch >> 3), ch, cat_val)
+#define mlb150_dev_cat_hbi_write(ch, cat_val) \
+ mlb150_dev_cat_write(BUF_CAT_HBI_OFFSET + (ch >> 3), ch, cat_val)
+
+#define mlb150_dev_cdt_read(ch, cdt_val) \
+ mlb150_dev_ctr_read(BUF_CDT_OFFSET + ch, cdt_val)
+#define mlb150_dev_cdt_write(ch, cdt_val) \
+ mlb150_dev_ctr_write(BUF_CDT_OFFSET + ch, cdt_val)
+#define mlb150_dev_adt_read(ch, adt_val) \
+ mlb150_dev_ctr_read(BUF_ADT_OFFSET + ch, adt_val)
+#define mlb150_dev_adt_write(ch, adt_val) \
+ mlb150_dev_ctr_write(BUF_ADT_OFFSET + ch, adt_val)
+
+static s32 mlb150_dev_get_adt_sts(u32 ch)
+{
+ s32 timeout = 1000;
+ unsigned long flags;
+ u32 reg;
+
+ spin_lock_irqsave(&ctr_lock, flags);
+ __raw_writel(BUF_ADT_OFFSET + ch,
+ mlb_base + REG_MADR);
+
+ while ((!(__raw_readl(mlb_base + REG_MCTL)
+ & MCTL_XCMP)) &&
+ timeout--)
+ ;
+
+ if (timeout <= 0) {
+ spin_unlock_irqrestore(&ctr_lock, flags);
+ pr_debug("mxc_mlb150: Read CTR timeout\n");
+ return -ETIME;
+ }
+
+ reg = __raw_readl(mlb_base + REG_MDAT1);
+
+ __raw_writel(0, mlb_base + REG_MCTL);
+ spin_unlock_irqrestore(&ctr_lock, flags);
+
+#ifdef DEBUG_ADT
+ pr_debug("mxc_mlb150: Get ch %d adt sts: 0x%08x\n", ch, reg);
+#endif
+
+ return reg;
+}
+
+#ifdef DEBUG
+static void mlb150_dev_dump_ctr_tbl(u32 ch_start, u32 ch_end)
+{
+ u32 i = 0;
+ u32 ctr_val[4] = { 0 };
+
+ pr_debug("mxc_mlb150: CDT Table");
+ for (i = BUF_CDT_OFFSET + ch_start;
+ i < BUF_CDT_OFFSET + ch_end;
+ ++i) {
+ mlb150_dev_ctr_read(i, ctr_val);
+ pr_debug("CTR 0x%02x: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
+ i, ctr_val[3], ctr_val[2], ctr_val[1], ctr_val[0]);
+ }
+
+ pr_debug("mxc_mlb150: ADT Table");
+ for (i = BUF_ADT_OFFSET + ch_start;
+ i < BUF_ADT_OFFSET + ch_end;
+ ++i) {
+ mlb150_dev_ctr_read(i, ctr_val);
+ pr_debug("CTR 0x%02x: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
+ i, ctr_val[3], ctr_val[2], ctr_val[1], ctr_val[0]);
+ }
+
+ pr_debug("mxc_mlb150: CAT MLB Table");
+ for (i = BUF_CAT_MLB_OFFSET + (ch_start >> 3);
+ i <= BUF_CAT_MLB_OFFSET + ((ch_end + 8) >> 3);
+ ++i) {
+ mlb150_dev_ctr_read(i, ctr_val);
+ pr_debug("CTR 0x%02x: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
+ i, ctr_val[3], ctr_val[2], ctr_val[1], ctr_val[0]);
+ }
+
+ pr_debug("mxc_mlb150: CAT HBI Table");
+ for (i = BUF_CAT_HBI_OFFSET + (ch_start >> 3);
+ i <= BUF_CAT_HBI_OFFSET + ((ch_end + 8) >> 3);
+ ++i) {
+ mlb150_dev_ctr_read(i, ctr_val);
+ pr_debug("CTR 0x%02x: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
+ i, ctr_val[3], ctr_val[2], ctr_val[1], ctr_val[0]);
+ }
+}
+#endif
+
+/*
+ * Initial the MLB module device
+ */
+static inline void mlb150_dev_enable_dma_irq(u32 enable)
+{
+ u32 ch_rx_mask = (1 << SYNC_RX_CL_AHB0) | (1 << CTRL_RX_CL_AHB0)
+ | (1 << ASYNC_RX_CL_AHB0) | (1 << ISOC_RX_CL_AHB0)
+ | (1 << SYNC_TX_CL_AHB0) | (1 << CTRL_TX_CL_AHB0)
+ | (1 << ASYNC_TX_CL_AHB0) | (1 << ISOC_TX_CL_AHB0);
+ u32 ch_tx_mask = (1 << (SYNC_RX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (CTRL_RX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (ASYNC_RX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (ISOC_RX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (SYNC_TX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (CTRL_TX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (ASYNC_TX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (ISOC_TX_CL_AHB1 - INT_AHB1_CH_START));
+
+ if (enable) {
+ __raw_writel(ch_rx_mask, mlb_base + REG_ACMR0);
+ __raw_writel(ch_tx_mask, mlb_base + REG_ACMR1);
+ } else {
+ __raw_writel(0x0, mlb_base + REG_ACMR0);
+ __raw_writel(0x0, mlb_base + REG_ACMR1);
+ }
+}
+
+
+static void mlb150_dev_init_ir_amba_ahb(void)
+{
+ u32 reg = 0;
+
+ /*
+ * Step 1. Program the ACMRn registers to enable interrupts from all
+ * active DMA channels
+ */
+ mlb150_dev_enable_dma_irq(1);
+
+ /*
+ * Step 2. Select the status clear method:
+ * ACTL.SCE = 0, hardware clears on read
+ * ACTL.SCE = 1, software writes a '1' to clear
+ * We only support DMA MODE 1
+ */
+ reg = __raw_readl(mlb_base + REG_ACTL);
+ reg |= ACTL_DMAMODE;
+#ifdef MULTIPLE_PACKAGE_MODE
+ reg |= REG_ACTL_MPB;
+#endif
+
+ /*
+ * Step 3. Select 1 or 2 interrupt signals:
+ * ACTL.SMX = 0: one interrupt for channels 0 - 31 on ahb_init[0]
+ * and another interrupt for channels 32 - 63 on ahb_init[1]
+ * ACTL.SMX = 1: singel interrupt all channels on ahb_init[0]
+ */
+ reg &= ~ACTL_SMX;
+
+ __raw_writel(reg, mlb_base + REG_ACTL);
+}
+
+static inline void mlb150_dev_enable_ir_mlb(u32 enable)
+{
+ /*
+ * Step 1, Select the MSn to be cleared by software,
+ * writing a '0' to the appropriate bits
+ */
+ __raw_writel(0, mlb_base + REG_MS0);
+ __raw_writel(0, mlb_base + REG_MS1);
+
+ /*
+ * Step 1, Program MIEN to enable protocol error
+ * interrupts for all active MLB channels
+ */
+ if (enable)
+ __raw_writel(MIEN_CTX_PE |
+ MIEN_CRX_PE | MIEN_ATX_PE |
+ MIEN_ARX_PE | MIEN_SYNC_PE |
+ MIEN_ISOC_PE,
+ mlb_base + REG_MIEN);
+ else
+ __raw_writel(0, mlb_base + REG_MIEN);
+}
+
+static inline void mlb150_enable_pll(struct mlb_data *drvdata)
+{
+ u32 c0_val;
+
+ __raw_writel(MLBPC1_VAL,
+ drvdata->membase + REG_MLBPC1);
+
+ c0_val = __raw_readl(drvdata->membase + REG_MLBC0);
+ if (c0_val & MLBC0_MLBPEN) {
+ c0_val &= ~MLBC0_MLBPEN;
+ __raw_writel(c0_val,
+ drvdata->membase + REG_MLBC0);
+ }
+
+ c0_val |= (MLBC0_MLBPEN);
+ __raw_writel(c0_val, drvdata->membase + REG_MLBC0);
+}
+
+static inline void mlb150_disable_pll(struct mlb_data *drvdata)
+{
+ u32 c0_val;
+
+ c0_val = __raw_readl(drvdata->membase + REG_MLBC0);
+
+ __raw_writel(0x0, drvdata->membase + REG_MLBPC1);
+
+ c0_val &= ~MLBC0_MLBPEN;
+ __raw_writel(c0_val, drvdata->membase + REG_MLBC0);
+}
+
+static void mlb150_dev_reset_cdt(void)
+{
+ int i = 0;
+ u32 ctr_val[4] = { 0 };
+
+ mlb150_dev_enable_ctr_write(0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff);
+
+ for (i = 0; i < (LOGIC_CH_NUM); ++i)
+ mlb150_dev_ctr_write(BUF_CDT_OFFSET + i, ctr_val);
+}
+
+static s32 mlb150_dev_init_ch_cdt(struct mlb_dev_info *pdevinfo, u32 ch,
+ enum MLB_CTYPE ctype, u32 ch_func)
+{
+ u32 cdt_val[4] = { 0 };
+
+ /* a. Set the 14-bit base address (BA) */
+ pr_debug("mxc_mlb150: ctype: %d, ch: %d, dbr_buf_head: 0x%08x",
+ ctype, ch, pdevinfo->channels[ch_func].dbr_buf_head);
+ cdt_val[3] = (pdevinfo->channels[ch_func].dbr_buf_head)
+ << CDT_BA_SHIFT;
+ /*
+ * b. Set the 12-bit or 13-bit buffer depth (BD)
+ * BD = buffer depth in bytes - 1
+ * For synchronous channels: (BD + 1) = 4 * m * bpf
+ * For control channels: (BD + 1) >= max packet length (64)
+ * For asynchronous channels: (BD + 1) >= max packet length
+ * 1024 for a MOST Data packet (MDP);
+ * 1536 for a MOST Ethernet Packet (MEP)
+ * For isochronous channels: (BD + 1) mod (BS + 1) = 0
+ * BS
+ */
+ if (MLB_CTYPE_ISOC == ctype)
+ cdt_val[1] |= (pdevinfo->isoc_blksz - 1);
+ /* BD */
+ cdt_val[3] |= (pdevinfo->cdt_buf_dep - 1) << CDT_BD_SHIFT;
+
+ pr_debug("mxc_mlb150: Set CDT val of channel %d, type: %d: "
+ "0x%08x 0x%08x 0x%08x 0x%08x\n",
+ ch, ctype, cdt_val[3], cdt_val[2], cdt_val[1], cdt_val[0]);
+
+ if (mlb150_dev_cdt_write(ch, cdt_val))
+ return -ETIME;
+
+#ifdef DEBUG_CTR
+ {
+ u32 cdt_rd[4] = { 0 };
+ if (!mlb150_dev_cdt_read(ch, cdt_rd)) {
+ pr_debug("mxc_mlb150: CDT val of channel %d: "
+ "0x%08x 0x%08x 0x%08x 0x%08x\n",
+ ch, cdt_rd[3], cdt_rd[2], cdt_rd[1], cdt_rd[0]);
+ if (cdt_rd[3] == cdt_val[3] &&
+ cdt_rd[2] == cdt_val[2] &&
+ cdt_rd[1] == cdt_val[1] &&
+ cdt_rd[0] == cdt_val[0]) {
+ pr_debug("mxc_mlb150: set cdt succeed!\n");
+ return 0;
+ } else {
+ pr_debug("mxc_mlb150: set cdt failed!\n");
+ return -EBADE;
+ }
+ } else {
+ pr_debug("mxc_mlb150: Read CDT val of channel %d failed\n",
+ ch);
+ return -EBADE;
+ }
+ }
+#endif
+
+ return 0;
+}
+
+static s32 mlb150_dev_init_ch_cat(u32 ch, u32 cl,
+ u32 cat_mode, enum MLB_CTYPE ctype)
+{
+ u16 cat_val = 0;
+#ifdef DEBUG_CTR
+ u16 cat_rd = 0;
+#endif
+
+ cat_val = CAT_CE | (ctype << CAT_CT_SHIFT) | cl;
+
+ if (cat_mode & CAT_MODE_OUTBOUND_DMA)
+ cat_val |= CAT_RNW;
+
+ if (MLB_CTYPE_SYNC == ctype)
+ cat_val |= CAT_MT;
+
+ switch (cat_mode) {
+ case CAT_MODE_RX | CAT_MODE_INBOUND_DMA:
+ case CAT_MODE_TX | CAT_MODE_OUTBOUND_DMA:
+ pr_debug("mxc_mlb150: set CAT val of channel %d, type: %d: 0x%04x\n",
+ ch, ctype, cat_val);
+
+ if (mlb150_dev_cat_mlb_write(ch, cat_val))
+ return -ETIME;
+#ifdef DEBUG_CTR
+ if (!mlb150_dev_cat_mlb_read(ch, &cat_rd))
+ pr_debug("mxc_mlb150: CAT val of mlb channel %d: 0x%04x",
+ ch, cat_rd);
+ else {
+ pr_debug("mxc_mlb150: Read CAT of mlb channel %d failed\n",
+ ch);
+ return -EBADE;
+ }
+#endif
+ break;
+ case CAT_MODE_TX | CAT_MODE_INBOUND_DMA:
+ case CAT_MODE_RX | CAT_MODE_OUTBOUND_DMA:
+ pr_debug("mxc_mlb150: set CAT val of channel %d, type: %d: 0x%04x\n",
+ cl, ctype, cat_val);
+
+ if (mlb150_dev_cat_hbi_write(cl, cat_val))
+ return -ETIME;
+#ifdef DEBUG_CTR
+ if (!mlb150_dev_cat_hbi_read(cl, &cat_rd))
+ pr_debug("mxc_mlb150: CAT val of hbi channel %d: 0x%04x",
+ cl, cat_rd);
+ else {
+ pr_debug("mxc_mlb150: Read CAT of hbi channel %d failed\n",
+ cl);
+ return -EBADE;
+ }
+#endif
+ break;
+ default:
+ return EBADRQC;
+ }
+
+#ifdef DEBUG_CTR
+ {
+ if (cat_val == cat_rd) {
+ pr_debug("mxc_mlb150: set cat succeed!\n");
+ return 0;
+ } else {
+ pr_debug("mxc_mlb150: set cat failed!\n");
+ return -EBADE;
+ }
+ }
+#endif
+ return 0;
+}
+
+static void mlb150_dev_reset_cat(void)
+{
+ int i = 0;
+ u32 ctr_val[4] = { 0 };
+
+ mlb150_dev_enable_ctr_write(0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff);
+
+ for (i = 0; i < (LOGIC_CH_NUM >> 3); ++i) {
+ mlb150_dev_ctr_write(BUF_CAT_MLB_OFFSET + i, ctr_val);
+ mlb150_dev_ctr_write(BUF_CAT_HBI_OFFSET + i, ctr_val);
+ }
+}
+
+static void mlb150_dev_init_rfb(struct mlb_dev_info *pdevinfo, u32 rx_ch,
+ u32 tx_ch, enum MLB_CTYPE ctype)
+{
+ u32 rx_cl = pdevinfo->channels[RX_CHANNEL].cl;
+ u32 tx_cl = pdevinfo->channels[TX_CHANNEL].cl;
+ /* Step 1, Initialize all bits of CAT to '0' */
+ mlb150_dev_reset_cat();
+ mlb150_dev_reset_cdt();
+ /*
+ * Step 2, Initialize logical channel
+ * Step 3, Program the CDT for channel N
+ */
+ mlb150_dev_init_ch_cdt(pdevinfo, rx_cl, ctype, RX_CHANNEL);
+ mlb150_dev_init_ch_cdt(pdevinfo, tx_cl, ctype, TX_CHANNEL);
+
+ /* Step 4&5, Program the CAT for the inbound and outbound DMA */
+ mlb150_dev_init_ch_cat(rx_ch, rx_cl,
+ CAT_MODE_RX | CAT_MODE_INBOUND_DMA,
+ ctype);
+ mlb150_dev_init_ch_cat(rx_ch, rx_cl,
+ CAT_MODE_RX | CAT_MODE_OUTBOUND_DMA,
+ ctype);
+ mlb150_dev_init_ch_cat(tx_ch, tx_cl,
+ CAT_MODE_TX | CAT_MODE_INBOUND_DMA,
+ ctype);
+ mlb150_dev_init_ch_cat(tx_ch, tx_cl,
+ CAT_MODE_TX | CAT_MODE_OUTBOUND_DMA,
+ ctype);
+}
+
+static void mlb150_dev_reset_adt(void)
+{
+ int i = 0;
+ u32 ctr_val[4] = { 0 };
+
+ mlb150_dev_enable_ctr_write(0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff);
+
+ for (i = 0; i < (LOGIC_CH_NUM); ++i)
+ mlb150_dev_ctr_write(BUF_ADT_OFFSET + i, ctr_val);
+}
+
+static void mlb150_dev_reset_whole_ctr(void)
+{
+ mlb150_dev_enable_ctr_write(0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff);
+ mlb150_dev_reset_cdt();
+ mlb150_dev_reset_adt();
+ mlb150_dev_reset_cat();
+}
+
+#define CLR_REG(reg) __raw_writel(0x0, mlb_base + reg)
+
+static void mlb150_dev_reset_all_regs(void)
+{
+ CLR_REG(REG_MLBC0);
+ CLR_REG(REG_MLBPC0);
+ CLR_REG(REG_MS0);
+ CLR_REG(REG_MS1);
+ CLR_REG(REG_MSS);
+ CLR_REG(REG_MSD);
+ CLR_REG(REG_MIEN);
+ CLR_REG(REG_MLBPC2);
+ CLR_REG(REG_MLBPC1);
+ CLR_REG(REG_MLBC1);
+ CLR_REG(REG_HCTL);
+ CLR_REG(REG_HCMR0);
+ CLR_REG(REG_HCMR1);
+ CLR_REG(REG_HCER0);
+ CLR_REG(REG_HCER1);
+ CLR_REG(REG_HCBR0);
+ CLR_REG(REG_HCBR1);
+ CLR_REG(REG_MDAT0);
+ CLR_REG(REG_MDAT1);
+ CLR_REG(REG_MDAT2);
+ CLR_REG(REG_MDAT3);
+ CLR_REG(REG_MDWE0);
+ CLR_REG(REG_MDWE1);
+ CLR_REG(REG_MDWE2);
+ CLR_REG(REG_MDWE3);
+ CLR_REG(REG_MCTL);
+ CLR_REG(REG_MADR);
+ CLR_REG(REG_ACTL);
+ CLR_REG(REG_ACSR0);
+ CLR_REG(REG_ACSR1);
+ CLR_REG(REG_ACMR0);
+ CLR_REG(REG_ACMR1);
+}
+
+static inline s32 mlb150_dev_pipo_start(struct mlb_ringbuf *rbuf,
+ u32 ahb_ch, u32 buf_addr)
+{
+ u32 ctr_val[4] = { 0 };
+
+ ctr_val[1] |= ADT_RDY1;
+ ctr_val[2] = buf_addr;
+
+ if (mlb150_dev_adt_write(ahb_ch, ctr_val))
+ return -ETIME;
+
+ return 0;
+}
+
+static inline s32 mlb150_dev_pipo_next(u32 ahb_ch, enum MLB_CTYPE ctype,
+ u32 dne_sts, u32 buf_addr)
+{
+ u32 ctr_val[4] = { 0 };
+
+ if (MLB_CTYPE_ASYNC == ctype ||
+ MLB_CTYPE_CTRL == ctype) {
+ ctr_val[1] |= ADT_PS1;
+ ctr_val[1] |= ADT_PS2;
+ }
+
+ /*
+ * Clear DNE1 and ERR1
+ * Set the page ready bit (RDY1)
+ */
+ if (dne_sts & ADT_DNE1) {
+ ctr_val[1] |= ADT_RDY2;
+ ctr_val[3] = buf_addr;
+ } else {
+ ctr_val[1] |= ADT_RDY1;
+ ctr_val[2] = buf_addr;
+ }
+
+ if (mlb150_dev_adt_write(ahb_ch, ctr_val))
+ return -ETIME;
+
+ return 0;
+}
+
+static inline s32 mlb150_dev_pipo_stop(struct mlb_ringbuf *rbuf, u32 ahb_ch)
+{
+ u32 ctr_val[4] = { 0 };
+ unsigned long flags;
+
+ write_lock_irqsave(&rbuf->rb_lock, flags);
+ rbuf->head = rbuf->tail = 0;
+ write_unlock_irqrestore(&rbuf->rb_lock, flags);
+
+ if (mlb150_dev_adt_write(ahb_ch, ctr_val))
+ return -ETIME;
+
+ return 0;
+}
+
+static s32 mlb150_dev_init_ch_amba_ahb(struct mlb_dev_info *pdevinfo,
+ struct mlb_channel_info *chinfo,
+ enum MLB_CTYPE ctype)
+{
+ u32 ctr_val[4] = { 0 };
+
+ /* a. Set the 32-bit base address (BA1) */
+ ctr_val[3] = 0;
+ ctr_val[2] = 0;
+ ctr_val[1] = (pdevinfo->adt_buf_dep - 1) << ADT_BD1_SHIFT;
+ ctr_val[1] |= (pdevinfo->adt_buf_dep - 1) << ADT_BD2_SHIFT;
+ if (MLB_CTYPE_ASYNC == ctype ||
+ MLB_CTYPE_CTRL == ctype) {
+ ctr_val[1] |= ADT_PS1;
+ ctr_val[1] |= ADT_PS2;
+ }
+
+ ctr_val[0] |= (ADT_LE | ADT_CE);
+
+ pr_debug("mxc_mlb150: Set ADT val of channel %d, ctype: %d: "
+ "0x%08x 0x%08x 0x%08x 0x%08x\n",
+ chinfo->cl, ctype, ctr_val[3], ctr_val[2],
+ ctr_val[1], ctr_val[0]);
+
+ if (mlb150_dev_adt_write(chinfo->cl, ctr_val))
+ return -ETIME;
+
+#ifdef DEBUG_CTR
+ {
+ u32 ctr_rd[4] = { 0 };
+ if (!mlb150_dev_adt_read(chinfo->cl, ctr_rd)) {
+ pr_debug("mxc_mlb150: ADT val of channel %d: "
+ "0x%08x 0x%08x 0x%08x 0x%08x\n",
+ chinfo->cl, ctr_rd[3], ctr_rd[2],
+ ctr_rd[1], ctr_rd[0]);
+ if (ctr_rd[3] == ctr_val[3] &&
+ ctr_rd[2] == ctr_val[2] &&
+ ctr_rd[1] == ctr_val[1] &&
+ ctr_rd[0] == ctr_val[0]) {
+ pr_debug("mxc_mlb150: set adt succeed!\n");
+ return 0;
+ } else {
+ pr_debug("mxc_mlb150: set adt failed!\n");
+ return -EBADE;
+ }
+ } else {
+ pr_debug("mxc_mlb150: Read ADT val of channel %d failed\n",
+ chinfo->cl);
+ return -EBADE;
+ }
+ }
+#endif
+
+ return 0;
+}
+
+static void mlb150_dev_init_amba_ahb(struct mlb_dev_info *pdevinfo,
+ enum MLB_CTYPE ctype)
+{
+ struct mlb_channel_info *tx_chinfo = &pdevinfo->channels[TX_CHANNEL];
+ struct mlb_channel_info *rx_chinfo = &pdevinfo->channels[RX_CHANNEL];
+
+ /* Step 1, Initialize all bits of the ADT to '0' */
+ mlb150_dev_reset_adt();
+
+ /*
+ * Step 2, Select a logic channel
+ * Step 3, Program the AMBA AHB block ping page for channel N
+ * Step 4, Program the AMBA AHB block pong page for channel N
+ */
+ mlb150_dev_init_ch_amba_ahb(pdevinfo, rx_chinfo, ctype);
+ mlb150_dev_init_ch_amba_ahb(pdevinfo, tx_chinfo, ctype);
+}
+
+static void mlb150_dev_exit(void)
+{
+ u32 c0_val, hctl_val;
+
+ /* Disable EN bits */
+ c0_val = __raw_readl(mlb_base + REG_MLBC0);
+ c0_val &= ~(MLBC0_MLBEN | MLBC0_MLBPEN);
+ __raw_writel(c0_val, mlb_base + REG_MLBC0);
+
+ hctl_val = __raw_readl(mlb_base + REG_HCTL);
+ hctl_val &= ~HCTL_EN;
+ __raw_writel(hctl_val, mlb_base + REG_HCTL);
+
+ __raw_writel(0x0, mlb_base + REG_HCMR0);
+ __raw_writel(0x0, mlb_base + REG_HCMR1);
+
+ mlb150_dev_enable_dma_irq(0);
+ mlb150_dev_enable_ir_mlb(0);
+}
+
+static void mlb150_dev_init(void)
+{
+ u32 c0_val;
+ u32 ch_rx_mask = (1 << SYNC_RX_CL_AHB0) | (1 << CTRL_RX_CL_AHB0)
+ | (1 << ASYNC_RX_CL_AHB0) | (1 << ISOC_RX_CL_AHB0)
+ | (1 << SYNC_TX_CL_AHB0) | (1 << CTRL_TX_CL_AHB0)
+ | (1 << ASYNC_TX_CL_AHB0) | (1 << ISOC_TX_CL_AHB0);
+ u32 ch_tx_mask = (1 << (SYNC_RX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (CTRL_RX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (ASYNC_RX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (ISOC_RX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (SYNC_TX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (CTRL_TX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (ASYNC_TX_CL_AHB1 - INT_AHB1_CH_START)) |
+ (1 << (ISOC_TX_CL_AHB1 - INT_AHB1_CH_START));
+
+ /* Disable EN bits */
+ mlb150_dev_exit();
+
+ /*
+ * Step 1. Initialize CTR and registers
+ * a. Set all bit of the CTR (CAT, CDT, and ADT) to 0.
+ */
+ mlb150_dev_reset_whole_ctr();
+
+ /* a. Set all bit of the CTR (CAT, CDT, and ADT) to 0. */
+ mlb150_dev_reset_all_regs();
+
+ /*
+ * Step 2, Configure the MediaLB interface
+ * Select pin mode and clock, 3-pin and 256fs
+ */
+ c0_val = __raw_readl(mlb_base + REG_MLBC0);
+ c0_val &= ~(MLBC0_MLBPEN | MLBC0_MLBCLK_MASK);
+ __raw_writel(c0_val, mlb_base + REG_MLBC0);
+
+ c0_val |= MLBC0_MLBEN;
+ __raw_writel(c0_val, mlb_base + REG_MLBC0);
+
+ /* Step 3, Configure the HBI interface */
+ __raw_writel(ch_rx_mask, mlb_base + REG_HCMR0);
+ __raw_writel(ch_tx_mask, mlb_base + REG_HCMR1);
+ __raw_writel(HCTL_EN, mlb_base + REG_HCTL);
+
+ mlb150_dev_init_ir_amba_ahb();
+
+ mlb150_dev_enable_ir_mlb(1);
+}
+
+static s32 mlb150_dev_unmute_syn_ch(u32 rx_ch, u32 rx_cl, u32 tx_ch, u32 tx_cl)
+{
+ u32 timeout = 10000;
+
+ /*
+ * Check that MediaLB clock is running (MLBC1.CLKM = 0)
+ * If MLBC1.CLKM = 1, clear the register bit, wait one
+ * APB or I/O clock cycle and repeat the check
+ */
+ while ((__raw_readl(mlb_base + REG_MLBC1) & MLBC1_CLKM)
+ && --timeout)
+ __raw_writel(~MLBC1_CLKM, mlb_base + REG_MLBC1);
+
+ if (0 == timeout)
+ return -ETIME;
+
+ timeout = 10000;
+ /* Poll for MLB lock (MLBC0.MLBLK = 1) */
+ while (!(__raw_readl(mlb_base + REG_MLBC0) & MLBC0_MLBLK)
+ && --timeout)
+ ;
+
+ if (0 == timeout)
+ return -ETIME;
+
+ /* Unmute synchronous channel(s) */
+ mlb150_dev_cat_mlb_write(rx_ch, CAT_CE | rx_cl);
+ mlb150_dev_cat_mlb_write(tx_ch,
+ CAT_CE | tx_cl | CAT_RNW);
+ mlb150_dev_cat_hbi_write(rx_cl,
+ CAT_CE | rx_cl | CAT_RNW);
+ mlb150_dev_cat_hbi_write(tx_cl, CAT_CE | tx_cl);
+
+ return 0;
+}
+
+/* In case the user calls channel shutdown, but rx or tx is not completed yet */
+static s32 mlb150_trans_complete_check(struct mlb_dev_info *pdevinfo)
+{
+ struct mlb_ringbuf *rx_rbuf = &pdevinfo->rx_rbuf;
+ struct mlb_ringbuf *tx_rbuf = &pdevinfo->tx_rbuf;
+ s32 timeout = 1024;
+ unsigned long flags;
+
+ while (timeout--) {
+ read_lock_irqsave(&tx_rbuf->rb_lock, flags);
+ if (!CIRC_CNT(tx_rbuf->head, tx_rbuf->tail, TRANS_RING_NODES)) {
+ read_unlock_irqrestore(&tx_rbuf->rb_lock, flags);
+ break;
+ } else
+ read_unlock_irqrestore(&tx_rbuf->rb_lock, flags);
+ }
+
+ if (timeout <= 0) {
+ pr_debug("TX complete check timeout!\n");
+ return -ETIME;
+ }
+
+ timeout = 1024;
+ while (timeout--) {
+ read_lock_irqsave(&rx_rbuf->rb_lock, flags);
+ if (!CIRC_CNT(rx_rbuf->head, rx_rbuf->tail, TRANS_RING_NODES)) {
+ read_unlock_irqrestore(&rx_rbuf->rb_lock, flags);
+ break;
+ } else
+ read_unlock_irqrestore(&rx_rbuf->rb_lock, flags);
+ }
+
+ if (timeout <= 0) {
+ pr_debug("RX complete check timeout!\n");
+ return -ETIME;
+ }
+
+ /*
+ * Interrupt from TX can only inform that the data is sent
+ * to AHB bus, not mean that it is sent to MITB. Thus we add
+ * a delay here for data to be completed sent.
+ */
+ udelay(1000);
+
+ return 0;
+}
+
+/*
+ * Enable/Disable the MLB IRQ
+ */
+static void mxc_mlb150_irq_enable(struct mlb_data *drvdata, u8 enable)
+{
+ if (enable) {
+ enable_irq(drvdata->irq_ahb0);
+ enable_irq(drvdata->irq_mlb);
+ if (drvdata->irq_ahb1 > 0)
+ enable_irq(drvdata->irq_ahb1);
+ } else {
+ disable_irq(drvdata->irq_ahb0);
+ disable_irq(drvdata->irq_mlb);
+ if (drvdata->irq_ahb1 > 0)
+ disable_irq(drvdata->irq_ahb1);
+ }
+}
+
+/*
+ * Enable the MLB channel
+ */
+static s32 mlb_channel_enable(struct mlb_data *drvdata,
+ int chan_dev_id, int on)
+{
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
+ struct mlb_channel_info *tx_chinfo = &pdevinfo->channels[TX_CHANNEL];
+ struct mlb_channel_info *rx_chinfo = &pdevinfo->channels[RX_CHANNEL];
+ u32 tx_ch = tx_chinfo->address;
+ u32 rx_ch = rx_chinfo->address;
+ u32 tx_cl = tx_chinfo->cl;
+ u32 rx_cl = rx_chinfo->cl;
+ s32 ret = 0;
+
+ /*
+ * setup the direction, enable, channel type,
+ * mode select, channel address and mask buf start
+ */
+ if (on) {
+ u32 ctype = pdevinfo->channel_type;
+
+ mlb150_dev_enable_ctr_write(0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff);
+ mlb150_dev_init_rfb(pdevinfo, rx_ch, tx_ch, ctype);
+
+ mlb150_dev_init_amba_ahb(pdevinfo, ctype);
+
+#ifdef DEBUG
+ mlb150_dev_dump_ctr_tbl(0, tx_chinfo->cl + 1);
+#endif
+ /* Synchronize and unmute synchrouous channel */
+ if (MLB_CTYPE_SYNC == ctype) {
+ ret = mlb150_dev_unmute_syn_ch(rx_ch, rx_cl,
+ tx_ch, tx_cl);
+ if (ret)
+ return ret;
+ }
+
+ mlb150_dev_enable_ctr_write(0x0, ADT_RDY1 | ADT_DNE1 |
+ ADT_ERR1 | ADT_PS1 |
+ ADT_RDY2 | ADT_DNE2 | ADT_ERR2 | ADT_PS2,
+ 0xffffffff, 0xffffffff);
+
+ if (pdevinfo->fps >= CLK_2048FS)
+ mlb150_enable_pll(drvdata);
+
+ atomic_set(&pdevinfo->on, 1);
+
+#ifdef DEBUG
+ mlb150_dev_dump_reg();
+ mlb150_dev_dump_ctr_tbl(0, tx_chinfo->cl + 1);
+#endif
+ /* Init RX ADT */
+ mlb150_dev_pipo_start(&pdevinfo->rx_rbuf, rx_cl,
+ pdevinfo->rx_rbuf.phy_addrs[0]);
+ } else {
+ mlb150_dev_pipo_stop(&pdevinfo->rx_rbuf, rx_cl);
+
+ mlb150_dev_enable_dma_irq(0);
+ mlb150_dev_enable_ir_mlb(0);
+
+ mlb150_dev_reset_cat();
+
+ atomic_set(&pdevinfo->on, 0);
+
+ if (pdevinfo->fps >= CLK_2048FS)
+ mlb150_disable_pll(drvdata);
+ }
+
+ return 0;
+}
+
+/*
+ * MLB interrupt handler
+ */
+static void mlb_rx_isr(s32 ctype, u32 ahb_ch, struct mlb_dev_info *pdevinfo)
+{
+ struct mlb_ringbuf *rx_rbuf = &pdevinfo->rx_rbuf;
+ s32 head, tail, adt_sts;
+ u32 rx_buf_ptr;
+
+#ifdef DEBUG_RX
+ pr_debug("mxc_mlb150: mlb_rx_isr\n");
+#endif
+
+ read_lock(&rx_rbuf->rb_lock);
+
+ head = (rx_rbuf->head + 1) & (TRANS_RING_NODES - 1);
+ tail = READ_ONCE(rx_rbuf->tail);
+ read_unlock(&rx_rbuf->rb_lock);
+
+ if (CIRC_SPACE(head, tail, TRANS_RING_NODES) >= 1) {
+ rx_buf_ptr = rx_rbuf->phy_addrs[head];
+
+ /* commit the item before incrementing the head */
+ smp_wmb();
+
+ write_lock(&rx_rbuf->rb_lock);
+ rx_rbuf->head = head;
+ write_unlock(&rx_rbuf->rb_lock);
+
+ /* wake up the reader */
+ wake_up_interruptible(&pdevinfo->rx_wq);
+ } else {
+ rx_buf_ptr = rx_rbuf->phy_addrs[head];
+ pr_debug("drop RX package, due to no space, (%d,%d)\n",
+ head, tail);
+ }
+
+ adt_sts = mlb150_dev_get_adt_sts(ahb_ch);
+ /* Set ADT for RX */
+ mlb150_dev_pipo_next(ahb_ch, ctype, adt_sts, rx_buf_ptr);
+}
+
+static void mlb_tx_isr(s32 ctype, u32 ahb_ch, struct mlb_dev_info *pdevinfo)
+{
+ struct mlb_ringbuf *tx_rbuf = &pdevinfo->tx_rbuf;
+ s32 head, tail, adt_sts;
+ u32 tx_buf_ptr;
+
+ read_lock(&tx_rbuf->rb_lock);
+
+ head = READ_ONCE(tx_rbuf->head);
+ tail = (tx_rbuf->tail + 1) & (TRANS_RING_NODES - 1);
+ read_unlock(&tx_rbuf->rb_lock);
+
+ smp_mb();
+ write_lock(&tx_rbuf->rb_lock);
+ tx_rbuf->tail = tail;
+ write_unlock(&tx_rbuf->rb_lock);
+
+ /* check the current tx buffer is available or not */
+ if (CIRC_CNT(head, tail, TRANS_RING_NODES) >= 1) {
+ /* read index before reading contents at that index */
+ smp_read_barrier_depends();
+
+ tx_buf_ptr = tx_rbuf->phy_addrs[tail];
+
+ wake_up_interruptible(&pdevinfo->tx_wq);
+
+ adt_sts = mlb150_dev_get_adt_sts(ahb_ch);
+ /* Set ADT for TX */
+ mlb150_dev_pipo_next(ahb_ch, ctype, adt_sts, tx_buf_ptr);
+ }
+}
+
+static irqreturn_t mlb_ahb_isr(int irq, void *dev_id)
+{
+ u32 acsr0, hcer0;
+ u32 ch_mask = (1 << SYNC_RX_CL) | (1 << CTRL_RX_CL)
+ | (1 << ASYNC_RX_CL) | (1 << ISOC_RX_CL)
+ | (1 << SYNC_TX_CL) | (1 << CTRL_TX_CL)
+ | (1 << ASYNC_TX_CL) | (1 << ISOC_TX_CL);
+
+ /*
+ * Step 5, Read the ACSRn registers to determine which channel or
+ * channels are causing the interrupt
+ */
+ acsr0 = __raw_readl(mlb_base + REG_ACSR0);
+
+ hcer0 = __raw_readl(mlb_base + REG_HCER0);
+
+ /*
+ * Step 6, If ACTL.SCE = 1, write the result of step 5 back to ACSR0
+ * and ACSR1 to clear the interrupt
+ * We'll not set ACTL_SCE
+ */
+
+ if (ch_mask & hcer0)
+ pr_err("CH encounters an AHB error: 0x%x\n", hcer0);
+
+ if ((1 << SYNC_RX_CL) & acsr0)
+ mlb_rx_isr(MLB_CTYPE_SYNC, SYNC_RX_CL,
+ &mlb_devinfo[MLB_CTYPE_SYNC]);
+
+ if ((1 << CTRL_RX_CL) & acsr0)
+ mlb_rx_isr(MLB_CTYPE_CTRL, CTRL_RX_CL,
+ &mlb_devinfo[MLB_CTYPE_CTRL]);
+
+ if ((1 << ASYNC_RX_CL) & acsr0)
+ mlb_rx_isr(MLB_CTYPE_ASYNC, ASYNC_RX_CL,
+ &mlb_devinfo[MLB_CTYPE_ASYNC]);
+
+ if ((1 << ISOC_RX_CL) & acsr0)
+ mlb_rx_isr(MLB_CTYPE_ISOC, ISOC_RX_CL,
+ &mlb_devinfo[MLB_CTYPE_ISOC]);
+
+ if ((1 << SYNC_TX_CL) & acsr0)
+ mlb_tx_isr(MLB_CTYPE_SYNC, SYNC_TX_CL,
+ &mlb_devinfo[MLB_CTYPE_SYNC]);
+
+ if ((1 << CTRL_TX_CL) & acsr0)
+ mlb_tx_isr(MLB_CTYPE_CTRL, CTRL_TX_CL,
+ &mlb_devinfo[MLB_CTYPE_CTRL]);
+
+ if ((1 << ASYNC_TX_CL) & acsr0)
+ mlb_tx_isr(MLB_CTYPE_ASYNC, ASYNC_TX_CL,
+ &mlb_devinfo[MLB_CTYPE_ASYNC]);
+
+ if ((1 << ISOC_TX_CL) & acsr0)
+ mlb_tx_isr(MLB_CTYPE_ASYNC, ISOC_TX_CL,
+ &mlb_devinfo[MLB_CTYPE_ISOC]);
+
+ return IRQ_HANDLED;
+}
+
+static irqreturn_t mlb_isr(int irq, void *dev_id)
+{
+ u32 rx_int_sts, tx_int_sts, ms0,
+ ms1, tx_cis, rx_cis, ctype;
+ int minor;
+ u32 cdt_val[4] = { 0 };
+
+ /*
+ * Step 4, Read the MSn register to determine which channel(s)
+ * are causing the interrupt
+ */
+ ms0 = __raw_readl(mlb_base + REG_MS0);
+ ms1 = __raw_readl(mlb_base + REG_MS1);
+
+ /*
+ * The MLB150_MS0, MLB150_MS1 registers need to be cleared. In
+ * the spec description, the registers should be cleared when
+ * enabling interrupt. In fact, we also should clear it in ISR.
+ */
+ __raw_writel(0, mlb_base + REG_MS0);
+ __raw_writel(0, mlb_base + REG_MS1);
+
+ pr_debug("mxc_mlb150: mlb interrupt:0x%08x 0x%08x\n",
+ (u32)ms0, (u32)ms1);
+
+ for (minor = 0; minor < MLB_MINOR_DEVICES; minor++) {
+ struct mlb_dev_info *pdevinfo = &mlb_devinfo[minor];
+ u32 rx_mlb_ch = pdevinfo->channels[RX_CHANNEL].address;
+ u32 tx_mlb_ch = pdevinfo->channels[TX_CHANNEL].address;
+ u32 rx_mlb_cl = pdevinfo->channels[RX_CHANNEL].cl;
+ u32 tx_mlb_cl = pdevinfo->channels[TX_CHANNEL].cl;
+
+ tx_cis = rx_cis = 0;
+
+ ctype = pdevinfo->channel_type;
+ rx_int_sts = (rx_mlb_ch < 31) ? ms0 : ms1;
+ tx_int_sts = (tx_mlb_ch < 31) ? ms0 : ms1;
+
+ pr_debug("mxc_mlb150: channel interrupt: "
+ "tx %d: 0x%08x, rx %d: 0x%08x\n",
+ tx_mlb_ch, (u32)tx_int_sts, rx_mlb_ch, (u32)rx_int_sts);
+
+ /* Get tx channel interrupt status */
+ if (tx_int_sts & (1 << (tx_mlb_ch % 32))) {
+ mlb150_dev_cdt_read(tx_mlb_cl, cdt_val);
+ pr_debug("mxc_mlb150: TX_CH: %d, cdt_val[3]: 0x%08x, "
+ "cdt_val[2]: 0x%08x, "
+ "cdt_val[1]: 0x%08x, "
+ "cdt_val[0]: 0x%08x\n",
+ tx_mlb_ch, cdt_val[3], cdt_val[2],
+ cdt_val[1], cdt_val[0]);
+ switch (ctype) {
+ case MLB_CTYPE_SYNC:
+ tx_cis = (cdt_val[2] & CDT_SYNC_WSTS_MASK)
+ >> CDT_SYNC_WSTS_SHIFT;
+ /*
+ * Clear RSTS/WSTS errors to resume
+ * channel operation
+ * a. For synchronous channels: WSTS[3] = 0
+ */
+ cdt_val[2] &= ~(0x8 << CDT_SYNC_WSTS_SHIFT);
+ break;
+ case MLB_CTYPE_CTRL:
+ case MLB_CTYPE_ASYNC:
+ tx_cis = (cdt_val[2] &
+ CDT_CTRL_ASYNC_WSTS_MASK)
+ >> CDT_CTRL_ASYNC_WSTS_SHIFT;
+ tx_cis = (cdt_val[3] & CDT_CTRL_ASYNC_WSTS_1) ?
+ (tx_cis | (0x1 << 4)) : tx_cis;
+ /*
+ * b. For async and ctrl channels:
+ * RSTS[4]/WSTS[4] = 0
+ * and RSTS[2]/WSTS[2] = 0
+ */
+ cdt_val[3] &= ~CDT_CTRL_ASYNC_WSTS_1;
+ cdt_val[2] &=
+ ~(0x4 << CDT_CTRL_ASYNC_WSTS_SHIFT);
+ break;
+ case MLB_CTYPE_ISOC:
+ tx_cis = (cdt_val[2] & CDT_ISOC_WSTS_MASK)
+ >> CDT_ISOC_WSTS_SHIFT;
+ /* c. For isoc channels: WSTS[2:1] = 0x00 */
+ cdt_val[2] &= ~(0x6 << CDT_ISOC_WSTS_SHIFT);
+ break;
+ default:
+ break;
+ }
+ mlb150_dev_cdt_write(tx_mlb_ch, cdt_val);
+ }
+
+ /* Get rx channel interrupt status */
+ if (rx_int_sts & (1 << (rx_mlb_ch % 32))) {
+ mlb150_dev_cdt_read(rx_mlb_cl, cdt_val);
+ pr_debug("mxc_mlb150: RX_CH: %d, cdt_val[3]: 0x%08x, "
+ "cdt_val[2]: 0x%08x, "
+ "cdt_val[1]: 0x%08x, "
+ "cdt_val[0]: 0x%08x\n",
+ rx_mlb_ch, cdt_val[3], cdt_val[2],
+ cdt_val[1], cdt_val[0]);
+ switch (ctype) {
+ case MLB_CTYPE_SYNC:
+ rx_cis = (cdt_val[2] & CDT_SYNC_RSTS_MASK)
+ >> CDT_SYNC_RSTS_SHIFT;
+ cdt_val[2] &= ~(0x8 << CDT_SYNC_WSTS_SHIFT);
+ break;
+ case MLB_CTYPE_CTRL:
+ case MLB_CTYPE_ASYNC:
+ rx_cis =
+ (cdt_val[2] & CDT_CTRL_ASYNC_RSTS_MASK)
+ >> CDT_CTRL_ASYNC_RSTS_SHIFT;
+ rx_cis = (cdt_val[3] & CDT_CTRL_ASYNC_RSTS_1) ?
+ (rx_cis | (0x1 << 4)) : rx_cis;
+ cdt_val[3] &= ~CDT_CTRL_ASYNC_RSTS_1;
+ cdt_val[2] &=
+ ~(0x4 << CDT_CTRL_ASYNC_RSTS_SHIFT);
+ break;
+ case MLB_CTYPE_ISOC:
+ rx_cis = (cdt_val[2] & CDT_ISOC_RSTS_MASK)
+ >> CDT_ISOC_RSTS_SHIFT;
+ cdt_val[2] &= ~(0x6 << CDT_ISOC_WSTS_SHIFT);
+ break;
+ default:
+ break;
+ }
+ mlb150_dev_cdt_write(rx_mlb_ch, cdt_val);
+ }
+
+ if (!tx_cis && !rx_cis)
+ continue;
+
+ /* fill exception event */
+ spin_lock(&pdevinfo->event_lock);
+ pdevinfo->ex_event |= (rx_cis << 16) | tx_cis;
+ spin_unlock(&pdevinfo->event_lock);
+ }
+
+ return IRQ_HANDLED;
+}
+
+static int mxc_mlb150_open(struct inode *inode, struct file *filp)
+{
+ int minor, ring_buf_size, buf_size, j, ret;
+ void *buf_addr;
+ dma_addr_t phy_addr;
+ struct mlb_dev_info *pdevinfo = NULL;
+ struct mlb_channel_info *pchinfo = NULL;
+ struct mlb_data *drvdata;
+
+ minor = MINOR(inode->i_rdev);
+ drvdata = container_of(inode->i_cdev, struct mlb_data, cdev);
+ drvdata->use_iram = true;
+
+ if (minor < 0 || minor >= MLB_MINOR_DEVICES) {
+ pr_err("no device\n");
+ return -ENODEV;
+ }
+
+ /* open for each channel device */
+ if (atomic_cmpxchg(&mlb_devinfo[minor].opencnt, 0, 1) != 0) {
+ pr_err("busy\n");
+ return -EBUSY;
+ }
+
+ if (mlb150_is_imx8qxp_mlb(drvdata)) {
+ clk_prepare_enable(drvdata->ipg);
+ clk_prepare_enable(drvdata->hclk);
+ }
+ clk_prepare_enable(drvdata->mlb);
+
+ /* initial MLB module */
+ mlb150_dev_init();
+
+ pdevinfo = &mlb_devinfo[minor];
+ pchinfo = &pdevinfo->channels[TX_CHANNEL];
+
+ ring_buf_size = pdevinfo->buf_size;
+ buf_size = ring_buf_size * (TRANS_RING_NODES * 2);
+
+ if (drvdata->iram_pool)
+ buf_addr = gen_pool_dma_alloc(drvdata->iram_pool, buf_size, &phy_addr);
+ else
+ buf_addr = NULL;
+ if (!buf_addr) {
+ drvdata->use_iram = false;
+ buf_addr = dma_alloc_coherent(drvdata->dev, buf_size, &phy_addr, GFP_KERNEL);
+ if (!buf_addr) {
+ ret = -ENOMEM;
+ pr_err("can not alloc rx/tx buffers: %d\n", buf_size);
+ return ret;
+ }
+ }
+
+ pr_debug("IRAM Range: Virt 0x%p - 0x%p, Phys 0x%x - 0x%x, size: 0x%x\n",
+ buf_addr, (buf_addr + buf_size - 1), (u32)phy_addr,
+ (u32)(phy_addr + buf_size - 1), buf_size);
+ pdevinfo->rbuf_base_virt = buf_addr;
+ pdevinfo->rbuf_base_phy = phy_addr;
+ drvdata->iram_size = drvdata->use_iram ? buf_size : 0;
+
+ memset(buf_addr, 0, buf_size);
+
+ for (j = 0; j < (TRANS_RING_NODES);
+ ++j, buf_addr += ring_buf_size, phy_addr += ring_buf_size) {
+ pdevinfo->rx_rbuf.virt_bufs[j] = buf_addr;
+ pdevinfo->rx_rbuf.phy_addrs[j] = phy_addr;
+ pr_debug("RX Ringbuf[%d]: 0x%p 0x%x\n",
+ j, buf_addr, (u32)phy_addr);
+ }
+ pdevinfo->rx_rbuf.unit_size = ring_buf_size;
+ pdevinfo->rx_rbuf.total_size = buf_size;
+ for (j = 0; j < (TRANS_RING_NODES);
+ ++j, buf_addr += ring_buf_size, phy_addr += ring_buf_size) {
+ pdevinfo->tx_rbuf.virt_bufs[j] = buf_addr;
+ pdevinfo->tx_rbuf.phy_addrs[j] = phy_addr;
+ pr_debug("TX Ringbuf[%d]: 0x%p 0x%x\n",
+ j, buf_addr, (u32)phy_addr);
+ }
+
+ pdevinfo->tx_rbuf.unit_size = ring_buf_size;
+ pdevinfo->tx_rbuf.total_size = buf_size;
+
+ /* reset the buffer read/write ptr */
+ pdevinfo->rx_rbuf.head = pdevinfo->rx_rbuf.tail = 0;
+ pdevinfo->tx_rbuf.head = pdevinfo->tx_rbuf.tail = 0;
+ pdevinfo->ex_event = 0;
+ pdevinfo->tx_ok = 0;
+
+ init_waitqueue_head(&pdevinfo->rx_wq);
+ init_waitqueue_head(&pdevinfo->tx_wq);
+
+ drvdata = container_of(inode->i_cdev, struct mlb_data, cdev);
+ drvdata->devinfo = pdevinfo;
+ mxc_mlb150_irq_enable(drvdata, 1);
+ filp->private_data = drvdata;
+
+ return 0;
+}
+
+static int mxc_mlb150_release(struct inode *inode, struct file *filp)
+{
+ int minor;
+ struct mlb_data *drvdata = filp->private_data;
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
+
+ minor = MINOR(inode->i_rdev);
+ mxc_mlb150_irq_enable(drvdata, 0);
+
+#ifdef DEBUG
+ mlb150_dev_dump_reg();
+ mlb150_dev_dump_ctr_tbl(0, pdevinfo->channels[TX_CHANNEL].cl + 1);
+#endif
+
+ if (drvdata->use_iram)
+ gen_pool_free(drvdata->iram_pool,
+ (ulong)pdevinfo->rbuf_base_virt, drvdata->iram_size);
+
+ mlb150_dev_exit();
+
+ atomic_set(&pdevinfo->on, 0);
+
+ clk_disable_unprepare(drvdata->mlb);
+ if (mlb150_is_imx8qxp_mlb(drvdata)) {
+ clk_disable_unprepare(drvdata->hclk);
+ clk_disable_unprepare(drvdata->ipg);
+ }
+ /* decrease the open count */
+ atomic_set(&pdevinfo->opencnt, 0);
+
+ drvdata->devinfo = NULL;
+
+ return 0;
+}
+
+static long mxc_mlb150_ioctl(struct file *filp,
+ unsigned int cmd, unsigned long arg)
+{
+ //struct inode *inode = filp->f_dentry->d_inode;
+ struct inode *inode = file_inode(filp);
+ struct mlb_data *drvdata = filp->private_data;
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
+ void __user *argp = (void __user *)arg;
+ unsigned long flags, event;
+ int minor;
+
+ minor = MINOR(inode->i_rdev);
+
+ switch (cmd) {
+ case MLB_CHAN_SETADDR:
+ {
+ unsigned int caddr;
+ /* get channel address from user space */
+ if (copy_from_user(&caddr, argp, sizeof(caddr))) {
+ pr_err("mxc_mlb150: copy from user failed\n");
+ return -EFAULT;
+ }
+ pdevinfo->channels[TX_CHANNEL].address =
+ (caddr >> 16) & 0xFFFF;
+ pdevinfo->channels[RX_CHANNEL].address = caddr & 0xFFFF;
+ pr_debug("mxc_mlb150: set ch addr, tx: %d, rx: %d\n",
+ pdevinfo->channels[TX_CHANNEL].address,
+ pdevinfo->channels[RX_CHANNEL].address);
+ break;
+ }
+
+ case MLB_CHAN_STARTUP:
+ if (atomic_read(&pdevinfo->on)) {
+ pr_debug("mxc_mlb150: channel alreadly startup\n");
+ break;
+ }
+ if (mlb_channel_enable(drvdata, minor, 1))
+ return -EFAULT;
+ break;
+ case MLB_CHAN_SHUTDOWN:
+ if (atomic_read(&pdevinfo->on) == 0) {
+ pr_debug("mxc_mlb150: channel areadly shutdown\n");
+ break;
+ }
+ mlb150_trans_complete_check(pdevinfo);
+ mlb_channel_enable(drvdata, minor, 0);
+ break;
+ case MLB_CHAN_GETEVENT:
+ /* get and clear the ex_event */
+ spin_lock_irqsave(&pdevinfo->event_lock, flags);
+ event = pdevinfo->ex_event;
+ pdevinfo->ex_event = 0;
+ spin_unlock_irqrestore(&pdevinfo->event_lock, flags);
+
+ if (event) {
+ if (copy_to_user(argp, &event, sizeof(event))) {
+ pr_err("mxc_mlb150: copy to user failed\n");
+ return -EFAULT;
+ }
+ } else
+ return -EAGAIN;
+ break;
+ case MLB_SET_ISOC_BLKSIZE_188:
+ pdevinfo->isoc_blksz = 188;
+ pdevinfo->cdt_buf_dep = pdevinfo->adt_buf_dep =
+ pdevinfo->isoc_blksz * CH_ISOC_BLK_NUM;
+ break;
+ case MLB_SET_ISOC_BLKSIZE_196:
+ pdevinfo->isoc_blksz = 196;
+ pdevinfo->cdt_buf_dep = pdevinfo->adt_buf_dep =
+ pdevinfo->isoc_blksz * CH_ISOC_BLK_NUM;
+ break;
+ case MLB_SET_SYNC_QUAD:
+ {
+ u32 quad;
+
+ if (copy_from_user(&quad, argp, sizeof(quad))) {
+ pr_err("mxc_mlb150: get quad number "
+ "from user failed\n");
+ return -EFAULT;
+ }
+ if (quad <= 0 || quad > 3) {
+ pr_err("mxc_mlb150: Invalid Quadlets!"
+ "Quadlets in Sync mode can "
+ "only be 1, 2, 3\n");
+ return -EINVAL;
+ }
+ pdevinfo->sync_quad = quad;
+ /* Each quadlets is 4 bytes */
+ pdevinfo->cdt_buf_dep = quad * 4 * 4;
+ pdevinfo->adt_buf_dep =
+ pdevinfo->cdt_buf_dep * CH_SYNC_ADT_BUF_MULTI;
+ }
+ break;
+ case MLB_SET_FPS:
+ {
+ u32 fps, c0_val;
+
+ /* get fps from user space */
+ if (copy_from_user(&fps, argp, sizeof(fps))) {
+ pr_err("mxc_mlb150: copy from user failed\n");
+ return -EFAULT;
+ }
+
+ if ((fps > 1024) &&
+ !(drvdata->hwdata->quirk_flag &
+ MLB_QUIRK_MLB150)) {
+ pr_err("mxc_mlb150: not support fps %d\n", fps);
+ return -EINVAL;
+ }
+
+ c0_val = __raw_readl(mlb_base + REG_MLBC0);
+ c0_val &= ~MLBC0_MLBCLK_MASK;
+
+ /* check fps value */
+ switch (fps) {
+ case 256:
+ case 512:
+ case 1024:
+ pdevinfo->fps = fps >> 9;
+ c0_val &= ~MLBC0_MLBPEN;
+ c0_val |= (fps >> 9)
+ << MLBC0_MLBCLK_SHIFT;
+
+ if (1024 == fps) {
+ /*
+ * Invert output clock phase
+ * in 1024 fps
+ */
+ __raw_writel(0x1,
+ mlb_base + REG_MLBPC2);
+ }
+ break;
+ case 2048:
+ case 3072:
+ case 4096:
+ pdevinfo->fps = (fps >> 10) + 1;
+ c0_val |= ((fps >> 10) + 1)
+ << MLBC0_MLBCLK_SHIFT;
+ break;
+ case 6144:
+ pdevinfo->fps = fps >> 10;
+ c0_val |= ((fps >> 10) + 1)
+ << MLBC0_MLBCLK_SHIFT;
+ break;
+ case 8192:
+ pdevinfo->fps = (fps >> 10) - 1;
+ c0_val |= ((fps >> 10) - 1)
+ << MLBC0_MLBCLK_SHIFT;
+ break;
+ default:
+ pr_debug("mxc_mlb150: invalid fps argument: %d\n",
+ fps);
+ return -EINVAL;
+ }
+
+ __raw_writel(c0_val, mlb_base + REG_MLBC0);
+
+ pr_debug("mxc_mlb150: set fps to %d, MLBC0: 0x%08x\n",
+ fps,
+ (u32)__raw_readl(mlb_base + REG_MLBC0));
+
+ break;
+ }
+
+ case MLB_GET_VER:
+ {
+ u32 version;
+
+ /* get MLB device module version */
+ version = 0x03030003;
+
+ pr_debug("mxc_mlb150: get version: 0x%08x\n",
+ version);
+
+ if (copy_to_user(argp, &version, sizeof(version))) {
+ pr_err("mxc_mlb150: copy to user failed\n");
+ return -EFAULT;
+ }
+ break;
+ }
+
+ case MLB_SET_DEVADDR:
+ {
+ u32 c1_val;
+ u8 devaddr;
+
+ /* get MLB device address from user space */
+ if (copy_from_user
+ (&devaddr, argp, sizeof(unsigned char))) {
+ pr_err("mxc_mlb150: copy from user failed\n");
+ return -EFAULT;
+ }
+
+ c1_val = __raw_readl(mlb_base + REG_MLBC1);
+ c1_val &= ~MLBC1_NDA_MASK;
+ c1_val |= devaddr << MLBC1_NDA_SHIFT;
+ __raw_writel(c1_val, mlb_base + REG_MLBC1);
+ pr_debug("mxc_mlb150: set dev addr, dev addr: %d, "
+ "MLBC1: 0x%08x\n", devaddr,
+ (u32)__raw_readl(mlb_base + REG_MLBC1));
+
+ break;
+ }
+
+ case MLB_IRQ_DISABLE:
+ {
+ disable_irq(drvdata->irq_mlb);
+ break;
+ }
+
+ case MLB_IRQ_ENABLE:
+ {
+ enable_irq(drvdata->irq_mlb);
+ break;
+ }
+ default:
+ pr_info("mxc_mlb150: Invalid ioctl command\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/*
+ * MLB read routine
+ * Read the current received data from queued buffer,
+ * and free this buffer for hw to fill ingress data.
+ */
+static ssize_t mxc_mlb150_read(struct file *filp, char __user *buf,
+ size_t count, loff_t *f_pos)
+{
+ int size;
+ struct mlb_data *drvdata = filp->private_data;
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
+ struct mlb_ringbuf *rx_rbuf = &pdevinfo->rx_rbuf;
+ int head, tail;
+ unsigned long flags;
+
+ read_lock_irqsave(&rx_rbuf->rb_lock, flags);
+
+ head = READ_ONCE(rx_rbuf->head);
+ tail = rx_rbuf->tail;
+
+ read_unlock_irqrestore(&rx_rbuf->rb_lock, flags);
+
+ /* check the current rx buffer is available or not */
+ if (0 == CIRC_CNT(head, tail, TRANS_RING_NODES)) {
+
+ if (filp->f_flags & O_NONBLOCK)
+ return -EAGAIN;
+
+ do {
+ DEFINE_WAIT(__wait);
+
+ for (;;) {
+ prepare_to_wait(&pdevinfo->rx_wq,
+ &__wait, TASK_INTERRUPTIBLE);
+
+ read_lock_irqsave(&rx_rbuf->rb_lock, flags);
+ if (CIRC_CNT(rx_rbuf->head, rx_rbuf->tail,
+ TRANS_RING_NODES) > 0) {
+ read_unlock_irqrestore(&rx_rbuf->rb_lock,
+ flags);
+ break;
+ }
+ read_unlock_irqrestore(&rx_rbuf->rb_lock,
+ flags);
+
+ if (!signal_pending(current)) {
+ schedule();
+ continue;
+ }
+ return -ERESTARTSYS;
+ }
+ finish_wait(&pdevinfo->rx_wq, &__wait);
+ } while (0);
+ }
+
+ /* read index before reading contents at that index */
+ smp_read_barrier_depends();
+
+ size = pdevinfo->adt_buf_dep;
+ if (size > count) {
+ /* the user buffer is too small */
+ pr_warn("mxc_mlb150: received data size is biggerthan size:"
+ "%d, count: %d\n", size, (int)count);
+ return -EINVAL;
+ }
+
+ /* extract one item from the buffer */
+ if (copy_to_user(buf, rx_rbuf->virt_bufs[tail], size)) {
+ pr_err("mxc_mlb150: copy from user failed\n");
+ return -EFAULT;
+ }
+
+ /* finish reading descriptor before incrementing tail */
+ smp_mb();
+
+ write_lock_irqsave(&rx_rbuf->rb_lock, flags);
+ rx_rbuf->tail = (tail + 1) & (TRANS_RING_NODES - 1);
+ write_unlock_irqrestore(&rx_rbuf->rb_lock, flags);
+
+ *f_pos = 0;
+
+ return size;
+}
+
+/*
+ * MLB write routine
+ * Copy the user data to tx channel buffer,
+ * and prepare the channel current/next buffer ptr.
+ */
+static ssize_t mxc_mlb150_write(struct file *filp, const char __user *buf,
+ size_t count, loff_t *f_pos)
+{
+ s32 ret = 0;
+ struct mlb_channel_info *pchinfo = NULL;
+ struct mlb_data *drvdata = filp->private_data;
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
+ struct mlb_ringbuf *tx_rbuf = &pdevinfo->tx_rbuf;
+ int head, tail;
+ unsigned long flags;
+
+ /*
+ * minor = MINOR(filp->f_dentry->d_inode->i_rdev);
+ */
+ pchinfo = &pdevinfo->channels[TX_CHANNEL];
+
+ if (count > pdevinfo->buf_size) {
+ /* too many data to write */
+ pr_warning("mxc_mlb150: overflow write data\n");
+ return -EFBIG;
+ }
+
+ *f_pos = 0;
+
+ read_lock_irqsave(&tx_rbuf->rb_lock, flags);
+
+ head = tx_rbuf->head;
+ tail = READ_ONCE(tx_rbuf->tail);
+ read_unlock_irqrestore(&tx_rbuf->rb_lock, flags);
+
+ if (0 == CIRC_SPACE(head, tail, TRANS_RING_NODES)) {
+ if (filp->f_flags & O_NONBLOCK)
+ return -EAGAIN;
+ do {
+ DEFINE_WAIT(__wait);
+
+ for (;;) {
+ prepare_to_wait(&pdevinfo->tx_wq,
+ &__wait, TASK_INTERRUPTIBLE);
+
+ read_lock_irqsave(&tx_rbuf->rb_lock, flags);
+ if (CIRC_SPACE(tx_rbuf->head, tx_rbuf->tail,
+ TRANS_RING_NODES) > 0) {
+ read_unlock_irqrestore(&tx_rbuf->rb_lock,
+ flags);
+ break;
+ }
+ read_unlock_irqrestore(&tx_rbuf->rb_lock,
+ flags);
+
+ if (!signal_pending(current)) {
+ schedule();
+ continue;
+ }
+ return -ERESTARTSYS;
+ }
+ finish_wait(&pdevinfo->tx_wq, &__wait);
+ } while (0);
+ }
+
+ if (copy_from_user((void *)tx_rbuf->virt_bufs[head], buf, count)) {
+ read_unlock_irqrestore(&tx_rbuf->rb_lock, flags);
+ pr_err("mxc_mlb: copy from user failed\n");
+ ret = -EFAULT;
+ goto out;
+ }
+
+ write_lock_irqsave(&tx_rbuf->rb_lock, flags);
+ smp_wmb();
+ tx_rbuf->head = (head + 1) & (TRANS_RING_NODES - 1);
+ write_unlock_irqrestore(&tx_rbuf->rb_lock, flags);
+
+ if (0 == CIRC_CNT(head, tail, TRANS_RING_NODES)) {
+ u32 tx_buf_ptr, ahb_ch;
+ s32 adt_sts;
+ u32 ctype = pdevinfo->channel_type;
+
+ /* read index before reading contents at that index */
+ smp_read_barrier_depends();
+
+ tx_buf_ptr = tx_rbuf->phy_addrs[tail];
+
+ ahb_ch = pdevinfo->channels[TX_CHANNEL].cl;
+ adt_sts = mlb150_dev_get_adt_sts(ahb_ch);
+
+ /* Set ADT for TX */
+ mlb150_dev_pipo_next(ahb_ch, ctype, adt_sts, tx_buf_ptr);
+ }
+
+ ret = count;
+out:
+ return ret;
+}
+
+static unsigned int mxc_mlb150_poll(struct file *filp,
+ struct poll_table_struct *wait)
+{
+ int minor;
+ unsigned int ret = 0;
+ struct mlb_data *drvdata = filp->private_data;
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
+ struct mlb_ringbuf *tx_rbuf = &pdevinfo->tx_rbuf;
+ struct mlb_ringbuf *rx_rbuf = &pdevinfo->rx_rbuf;
+ int head, tail;
+ unsigned long flags;
+
+
+ minor = MINOR(file_inode(filp)->i_rdev);
+
+ poll_wait(filp, &pdevinfo->rx_wq, wait);
+ poll_wait(filp, &pdevinfo->tx_wq, wait);
+
+ read_lock_irqsave(&tx_rbuf->rb_lock, flags);
+ head = tx_rbuf->head;
+ tail = tx_rbuf->tail;
+ read_unlock_irqrestore(&tx_rbuf->rb_lock, flags);
+
+ /* check the tx buffer is avaiable or not */
+ if (CIRC_SPACE(head, tail, TRANS_RING_NODES) >= 1)
+ ret |= POLLOUT | POLLWRNORM;
+
+ read_lock_irqsave(&rx_rbuf->rb_lock, flags);
+ head = rx_rbuf->head;
+ tail = rx_rbuf->tail;
+ read_unlock_irqrestore(&rx_rbuf->rb_lock, flags);
+
+ /* check the rx buffer filled or not */
+ if (CIRC_CNT(head, tail, TRANS_RING_NODES) >= 1)
+ ret |= POLLIN | POLLRDNORM;
+
+
+ /* check the exception event */
+ if (pdevinfo->ex_event)
+ ret |= POLLIN | POLLRDNORM;
+
+ return ret;
+}
+
+/*
+ * char dev file operations structure
+ */
+static const struct file_operations mxc_mlb150_fops = {
+
+ .owner = THIS_MODULE,
+ .open = mxc_mlb150_open,
+ .release = mxc_mlb150_release,
+ .unlocked_ioctl = mxc_mlb150_ioctl,
+ .poll = mxc_mlb150_poll,
+ .read = mxc_mlb150_read,
+ .write = mxc_mlb150_write,
+};
+
+static const struct imx_mlb_hwdata imx6q_mlb_hwdata = {
+ .devtype = IMX6Q_MLB,
+ .quirk_flag = MLB_QUIRK_MLB150,
+};
+
+static const struct imx_mlb_hwdata imx6sx_mlb_hwdata = {
+ .devtype = IMX6SX_MLB,
+ .quirk_flag = 0,
+};
+
+static const struct imx_mlb_hwdata imx8qxp_mlb_hwdata = {
+ .devtype = IMX8QXP_MLB,
+ .quirk_flag = MLB_QUIRK_MLB150,
+};
+
+static const struct of_device_id mlb150_imx_dt_ids[] = {
+ { .compatible = "fsl,imx6q-mlb150",
+ .data = &imx6q_mlb_hwdata, },
+ { .compatible = "fsl,imx6sx-mlb50",
+ .data = &imx6sx_mlb_hwdata, },
+ { .compatible = "fsl,imx8qxp-mlb150",
+ .data = &imx8qxp_mlb_hwdata, },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, mlb150_imx_dt_ids);
+
+/*
+ * This function is called whenever the MLB device is detected.
+ */
+static int mxc_mlb150_probe(struct platform_device *pdev)
+{
+ int ret, mlb_major, i;
+ struct mlb_data *drvdata;
+ struct resource *res;
+ struct device_node *np = pdev->dev.of_node;
+ const struct of_device_id *of_id;
+
+ drvdata = devm_kzalloc(&pdev->dev, sizeof(struct mlb_data),
+ GFP_KERNEL);
+ if (!drvdata) {
+ dev_err(&pdev->dev, "can't allocate enough memory\n");
+ return -ENOMEM;
+ }
+
+ drvdata->dev = &pdev->dev;
+ of_id = of_match_device(mlb150_imx_dt_ids, &pdev->dev);
+ if (of_id)
+ drvdata->hwdata = of_id->data;
+ else
+ return -EINVAL;
+ /*
+ * Register MLB lld as four character devices
+ */
+ ret = alloc_chrdev_region(&drvdata->firstdev, 0,
+ MLB_MINOR_DEVICES, "mxc_mlb150");
+ if (ret < 0) {
+ dev_err(&pdev->dev, "alloc region error\n");
+ goto err_reg;
+ }
+ mlb_major = MAJOR(drvdata->firstdev);
+ dev_dbg(&pdev->dev, "MLB device major: %d\n", mlb_major);
+
+ cdev_init(&drvdata->cdev, &mxc_mlb150_fops);
+ drvdata->cdev.owner = THIS_MODULE;
+
+ ret = cdev_add(&drvdata->cdev, drvdata->firstdev, MLB_MINOR_DEVICES);
+ if (ret) {
+ dev_err(&pdev->dev, "can't add cdev\n");
+ goto err_reg;
+ }
+
+ /* create class and device for udev information */
+ drvdata->class = class_create(THIS_MODULE, "mlb150");
+ if (IS_ERR(drvdata->class)) {
+ dev_err(&pdev->dev, "failed to create device class\n");
+ ret = -ENOMEM;
+ goto err_class;
+ }
+
+ for (i = 0; i < MLB_MINOR_DEVICES; i++) {
+ struct device *class_dev;
+
+ class_dev = device_create(drvdata->class, NULL,
+ MKDEV(mlb_major, i),
+ NULL, mlb_devinfo[i].dev_name);
+ if (IS_ERR(class_dev)) {
+ dev_err(&pdev->dev, "failed to create mlb150 %s"
+ " class device\n", mlb_devinfo[i].dev_name);
+ ret = -ENOMEM;
+ goto err_dev;
+ }
+ }
+
+ /* ahb0 irq */
+ drvdata->irq_ahb0 = platform_get_irq(pdev, 1);
+ if (drvdata->irq_ahb0 < 0) {
+ dev_err(&pdev->dev, "No ahb0 irq line provided\n");
+ goto err_dev;
+ }
+ dev_dbg(&pdev->dev, "ahb0_irq: %d\n", drvdata->irq_ahb0);
+ if (devm_request_irq(&pdev->dev, drvdata->irq_ahb0, mlb_ahb_isr,
+ 0, "mlb_ahb0", NULL)) {
+ dev_err(&pdev->dev, "can't claim irq %d\n", drvdata->irq_ahb0);
+ goto err_dev;
+ }
+
+ /* ahb1 irq */
+ drvdata->irq_ahb1 = platform_get_irq(pdev, 2);
+ dev_dbg(&pdev->dev, "ahb1_irq: %d\n", drvdata->irq_ahb1);
+ if (drvdata->irq_ahb1 > 0) {
+ if (devm_request_irq(&pdev->dev, drvdata->irq_ahb1, mlb_ahb_isr,
+ 0, "mlb_ahb1", NULL)) {
+ dev_err(&pdev->dev, "can't claim irq %d\n", drvdata->irq_ahb1);
+ goto err_dev;
+ }
+ }
+
+ /* mlb irq */
+ drvdata->irq_mlb = platform_get_irq(pdev, 0);
+ if (drvdata->irq_mlb < 0) {
+ dev_err(&pdev->dev, "No mlb irq line provided\n");
+ goto err_dev;
+ }
+ dev_dbg(&pdev->dev, "mlb_irq: %d\n", drvdata->irq_mlb);
+ if (devm_request_irq(&pdev->dev, drvdata->irq_mlb, mlb_isr,
+ 0, "mlb", NULL)) {
+ dev_err(&pdev->dev, "can't claim irq %d\n", drvdata->irq_mlb);
+ goto err_dev;
+ }
+
+ /* ioremap from phy mlb to kernel space */
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res) {
+ dev_err(&pdev->dev, "can't get device resources\n");
+ ret = -ENOENT;
+ goto err_dev;
+ }
+ mlb_base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(mlb_base)) {
+ dev_err(&pdev->dev,
+ "failed to get ioremap base\n");
+ ret = PTR_ERR(mlb_base);
+ goto err_dev;
+ }
+ drvdata->membase = mlb_base;
+
+#ifdef CONFIG_REGULATOR
+ drvdata->nvcc = devm_regulator_get(&pdev->dev, "reg_nvcc");
+ if (!IS_ERR(drvdata->nvcc)) {
+ regulator_set_voltage(drvdata->nvcc, 2500000, 2500000);
+ dev_err(&pdev->dev, "enalbe regulator\n");
+ ret = regulator_enable(drvdata->nvcc);
+ if (ret) {
+ dev_err(&pdev->dev, "vdd set voltage error\n");
+ goto err_dev;
+ }
+ }
+#endif
+
+ if (mlb150_is_imx8qxp_mlb(drvdata)) {
+ drvdata->ipg = devm_clk_get(&pdev->dev, "ipg");
+ if (IS_ERR(drvdata->ipg)) {
+ dev_err(&pdev->dev, "unable to get mlb ipg clock\n");
+ ret = PTR_ERR(drvdata->ipg);
+ goto err_dev;
+ }
+
+ drvdata->hclk = devm_clk_get(&pdev->dev, "hclk");
+ if (IS_ERR(drvdata->hclk)) {
+ dev_err(&pdev->dev, "unable to get mlb hclk clock\n");
+ ret = PTR_ERR(drvdata->hclk);
+ goto err_dev;
+ }
+ }
+
+ drvdata->mlb = devm_clk_get(&pdev->dev, "mlb");
+ if (IS_ERR(drvdata->mlb)) {
+ dev_err(&pdev->dev, "unable to get mlb clock\n");
+ ret = PTR_ERR(drvdata->mlb);
+ goto err_dev;
+ }
+
+ drvdata->iram_pool = of_gen_pool_get(np, "iram", 0);
+ if (!drvdata->iram_pool)
+ dev_warn(&pdev->dev, "no iram assigned, using external mem\n");
+
+ drvdata->devinfo = NULL;
+ mxc_mlb150_irq_enable(drvdata, 0);
+ platform_set_drvdata(pdev, drvdata);
+ return 0;
+
+err_dev:
+ for (--i; i >= 0; i--)
+ device_destroy(drvdata->class, MKDEV(mlb_major, i));
+
+ class_destroy(drvdata->class);
+err_class:
+ cdev_del(&drvdata->cdev);
+err_reg:
+ unregister_chrdev_region(drvdata->firstdev, MLB_MINOR_DEVICES);
+
+ return ret;
+}
+
+static int mxc_mlb150_remove(struct platform_device *pdev)
+{
+ int i;
+ struct mlb_data *drvdata = platform_get_drvdata(pdev);
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
+
+ if (pdevinfo && atomic_read(&pdevinfo->opencnt))
+ clk_disable_unprepare(drvdata->mlb);
+
+ /* disable mlb power */
+#ifdef CONFIG_REGULATOR
+ if (!IS_ERR(drvdata->nvcc))
+ regulator_disable(drvdata->nvcc);
+#endif
+
+ /* destroy mlb device class */
+ for (i = MLB_MINOR_DEVICES - 1; i >= 0; i--)
+ device_destroy(drvdata->class,
+ MKDEV(MAJOR(drvdata->firstdev), i));
+ class_destroy(drvdata->class);
+
+ cdev_del(&drvdata->cdev);
+
+ /* Unregister the two MLB devices */
+ unregister_chrdev_region(drvdata->firstdev, MLB_MINOR_DEVICES);
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int mxc_mlb150_suspend(struct platform_device *pdev, pm_message_t state)
+{
+ struct mlb_data *drvdata = platform_get_drvdata(pdev);
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
+
+ if (pdevinfo && atomic_read(&pdevinfo->opencnt)) {
+ mlb150_dev_exit();
+ clk_disable_unprepare(drvdata->mlb);
+ }
+
+ return 0;
+}
+
+static int mxc_mlb150_resume(struct platform_device *pdev)
+{
+ struct mlb_data *drvdata = platform_get_drvdata(pdev);
+ struct mlb_dev_info *pdevinfo = drvdata->devinfo;
+
+ if (pdevinfo && atomic_read(&pdevinfo->opencnt)) {
+ clk_prepare_enable(drvdata->mlb);
+ mlb150_dev_init();
+ }
+
+ return 0;
+}
+#else
+#define mxc_mlb150_suspend NULL
+#define mxc_mlb150_resume NULL
+#endif
+
+/*
+ * platform driver structure for MLB
+ */
+static struct platform_driver mxc_mlb150_driver = {
+ .driver = {
+ .name = DRIVER_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = mlb150_imx_dt_ids,
+ },
+ .probe = mxc_mlb150_probe,
+ .remove = mxc_mlb150_remove,
+ .suspend = mxc_mlb150_suspend,
+ .resume = mxc_mlb150_resume,
+};
+
+static int __init mxc_mlb150_init(void)
+{
+ return platform_driver_register(&mxc_mlb150_driver);
+}
+
+static void __exit mxc_mlb150_exit(void)
+{
+ platform_driver_unregister(&mxc_mlb150_driver);
+}
+
+module_init(mxc_mlb150_init);
+module_exit(mxc_mlb150_exit);
+
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_DESCRIPTION("MLB150 low level driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/mxc/sim/Kconfig b/drivers/mxc/sim/Kconfig
new file mode 100644
index 000000000000..142ae2e87fa8
--- /dev/null
+++ b/drivers/mxc/sim/Kconfig
@@ -0,0 +1,27 @@
+#
+# SIM configuration
+#
+
+menu "MXC SIM Support"
+
+config MXC_SIMv2
+ tristate "MXC SIMv2 support"
+ depends on ARCH_MXC && MXC_SIM
+ default n
+ ---help---
+ Say Y if you want to use the SIMv2 on NXP i.MX6/7 processors.
+
+ This driver can also be built as a module. If so, the module
+ will be called imx_sim.
+
+config MXC_EMVSIM
+ tristate "MXC EMVSIM support"
+ depends on ARCH_MXC && MXC_SIM
+ default n
+ ---help---
+ Say Y here if you want to use the EMVSIM on NXP i.MX8 processors.
+
+ This driver can also be built as a module. If so, the module
+ will be called imx_emvsim.
+
+endmenu
diff --git a/drivers/mxc/sim/Makefile b/drivers/mxc/sim/Makefile
new file mode 100644
index 000000000000..7b1ca96b6b28
--- /dev/null
+++ b/drivers/mxc/sim/Makefile
@@ -0,0 +1,6 @@
+#
+# Makefile for the i.MX SIM driver
+#
+
+obj-$(CONFIG_MXC_SIMv2) += imx_sim.o
+obj-$(CONFIG_MXC_EMVSIM) += imx_emvsim.o
diff --git a/drivers/mxc/sim/imx_emvsim.c b/drivers/mxc/sim/imx_emvsim.c
new file mode 100644
index 000000000000..7c2ba73dc94a
--- /dev/null
+++ b/drivers/mxc/sim/imx_emvsim.c
@@ -0,0 +1,1726 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * 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.
+ */
+
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <linux/kernel.h>
+#include <linux/miscdevice.h>
+#include <linux/module.h>
+#include <linux/mxc_sim_interface.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/poll.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include <linux/time.h>
+#include <linux/types.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/pm_domain.h>
+
+#define DRIVER_NAME "mxc_emvsim"
+
+/* Definitions of the offset of the SIM hardware registers */
+#define EMV_SIM_VER_ID 0X00
+#define EMV_SIM_PARAM 0X04
+#define EMV_SIM_CLKCFG 0X08
+#define EMV_SIM_DIVISOR 0X0C
+#define EMV_SIM_CTRL 0X10
+#define EMV_SIM_INT_MASK 0X14
+#define EMV_SIM_RX_THD 0X18
+#define EMV_SIM_TX_THD 0X1C
+#define EMV_SIM_RX_STATUS 0X20
+#define EMV_SIM_TX_STATUS 0X24
+#define EMV_SIM_PCSR 0X28
+#define EMV_SIM_RX_BUF 0X2C
+#define EMV_SIM_TX_BUF 0X30
+#define EMV_SIM_TX_GETU 0X34
+#define EMV_SIM_CWT_VAL 0X38
+#define EMV_SIM_BWT_VAL 0X3C
+#define EMV_SIM_BGT_VAL 0X40
+#define EMV_SIM_GPCNT0_VAL 0X44
+#define EMV_SIM_GPCNT1_VAL 0X48
+
+#define SIM_XMT_BUFFER_SIZE 300
+#define SIM_RCV_BUFFER_SIZE 400
+
+#define SIM_TX_FIFO_DEPTH 16
+#define SIM_RX_FIFO_DEPTH 16
+#define TX_FIFO_THRESHOLD 4
+
+#define SIM_STATE_REMOVED 0
+#define SIM_STATE_DETECTED 1
+#define SIM_STATE_ATR_RECEIVING 2
+#define SIM_STATE_ATR_RECEIVED 3
+#define SIM_STATE_XMTING 4
+#define SIM_STATE_XMT_DONE 5
+#define SIM_STATE_XMT_ERROR 6
+#define SIM_STATE_RECEIVING 7
+#define SIM_STATE_RECEIVE_DONE 8
+#define SIM_STATE_RECEIVE_ERROR 9
+#define SIM_STATE_RESET_SEQUENCY 10
+
+#define SIM_CNTL_GPCNT_RESET 0
+#define SIM_CNTL_GPCNT_CARD_CLK 1
+#define SIM_CNTL_GPCNT_RCV_CLK 2
+#define SIM_CNTL_GPCNT_ETU_CLK 3
+#define SIM_EMV_NACK_THRESHOLD 5
+#define EMV_T0_BGT 16
+#define EMV_T1_BGT 22
+#define ATR_THRESHOLD_MAX 100
+#define ATR_MAX_CWT 10080
+#define ATR_MAX_DURATION 20160
+#define FCLK_FREQ 4000000
+
+#define ATR_TIMEOUT 5
+#define TX_TIMEOUT 10
+#define RX_TIMEOUT 100
+#define RESET_RETRY_TIMES 5
+#define EMV_RESET_LOW_CYCLES 40000
+#define ATR_MAX_DELAY_CLK 46400
+#define DIVISOR_VALUE 372
+#define CWT_ADJUSTMENT 2
+#define BGT_BWT_ADJUSTMENT 2
+
+#define SIM_CNTL_GPCNT0_CLK_SEL_MASK (3 << 10)
+#define SIM_CNTL_GPCNT0_CLK_SEL(x) ((x & 3) << 10)
+#define SIM_CNTL_GPCNT1_CLK_SEL_MASK (3 << 8)
+#define SIM_CNTL_GPCNT1_CLK_SEL(x) ((x & 3) << 8)
+
+/* EMV_SIM_CTRL */
+#define IC (1 << 0)
+#define ICM (1 << 1)
+#define ANACK (1 << 2)
+#define ONACK (1 << 3)
+#define FLSH_RX (1 << 8)
+#define FLSH_TX (1 << 9)
+#define SW_RST (1 << 10)
+#define KILL_CLOCKS (1 << 11)
+#define RCV_EN (1 << 16)
+#define XMT_EN (1 << 17)
+#define RCVR_11 (1 << 18)
+#define CWT_EN (1 << 27)
+#define BWT_EN (1 << 31)
+
+/* EMV_SIM_INT_MASK */
+#define RDT_IM (1 << 0)
+#define TC_IM (1 << 1)
+#define ETC_IM (1 << 3)
+#define TNACK_IM (1 << 5)
+#define TDT_IM (1 << 7)
+#define GPCNT0_IM (1 << 8)
+#define CWT_ERR_IM (1 << 9)
+#define RNACK_IM (1 << 10)
+#define BWT_ERR_IM (1 << 11)
+#define GPCNT1_IM (1 << 13)
+#define RX_DATA_IM (1 << 14)
+
+/* EMV_SIM_RX_THD */
+#define SIM_RCV_THRESHOLD_RDT_MASK (0x0f << 0)
+#define SIM_RCV_THRESHOLD_RDT(x) ((x & 0x0f) << 0)
+#define SIM_RCV_THRESHOLD_RTH_MASK (0x0f << 8)
+#define SIM_RCV_THRESHOLD_RTH(x) ((x & 0x0f) << 8)
+
+/* EMV_SIM_TX_THD */
+#define SIM_XMT_THRESHOLD_TDT_MASK (0x0f << 0)
+#define SIM_XMT_THRESHOLD_TDT(x) ((x & 0x0f) << 0)
+#define SIM_XMT_THRESHOLD_XTH_MASK (0x0f << 8)
+#define SIM_XMT_THRESHOLD_XTH(x) ((x & 0x0f) << 8)
+
+/* EMV_SIM_RX_STATUS */
+#define RX_DATA (1 << 4)
+#define RDTF (1 << 5)
+#define CWT_ERR (1 << 8)
+#define RTE (1 << 9)
+#define BWT_ERR (1 << 10)
+#define BGT_ERR (1 << 11)
+#define PEF (1 << 12)
+#define FEF (1 << 13)
+
+/* EMV_SIM_TX_STATUS */
+#define TNTE (1 << 0)
+#define ETCF (1 << 4)
+#define TCF (1 << 5)
+#define TDTF (1 << 7)
+#define GPCNT0_TO (1 << 8)
+#define GPCNT1_TO (1 << 9)
+
+/* EMV_SIM_PCSR */
+#define SAPD (1 << 0)
+#define SVCC_EN (1 << 1)
+#define VCCENP (1 << 2)
+#define SRST (1 << 3)
+#define SCEN (1 << 4)
+#define SPD (1 << 7)
+#define SPDIM (1 << 24)
+#define SPDIF (1 << 25)
+#define SPDP (1 << 26)
+#define SPDES (1 << 27)
+
+struct emvsim_t {
+ s32 present;
+ u8 open_cnt;
+ int state;
+ struct clk *clk;
+ struct clk *ipg;
+ struct resource *res;
+ void __iomem *ioaddr;
+ int irq;
+
+ int errval;
+ int protocol_type;
+ sim_timing_t timing_data;
+ sim_baud_t baud_rate;
+ int timeout;
+ u8 nack_threshold;
+ u8 nack_enable;
+ u32 expected_rcv_cnt;
+ u8 is_fixed_len_rec;
+ u32 xmt_remaining;
+ u32 xmt_pos;
+ u32 rcv_count;
+ u8 rcv_buffer[SIM_RCV_BUFFER_SIZE];
+ u8 xmt_buffer[SIM_XMT_BUFFER_SIZE];
+ struct completion xfer_done;
+ u16 rcv_head;
+ spinlock_t lock;
+ u32 clk_rate;
+ u8 checking_ts_timing;
+ u8 tx_last_character;
+
+ /* multiple power domain for emvsim */
+ struct device *sim_pd;
+ struct device *sim_aux_pd;
+};
+
+static struct miscdevice emvsim_dev;
+
+static void emvsim_data_reset(struct emvsim_t *emvsim)
+{
+ emvsim->errval = SIM_OK;
+ emvsim->protocol_type = 0;
+ emvsim->timeout = 0;
+ emvsim->nack_threshold = SIM_EMV_NACK_THRESHOLD;
+ emvsim->nack_enable = 0;
+ memset(&emvsim->timing_data, 0, sizeof(emvsim->timing_data));
+ memset(&emvsim->baud_rate, 0, sizeof(emvsim->baud_rate));
+
+ emvsim->xmt_remaining = 0;
+ emvsim->xmt_pos = 0;
+ emvsim->rcv_count = 0;
+ emvsim->rcv_head = 0;
+ memset(emvsim->rcv_buffer, 0, SIM_RCV_BUFFER_SIZE);
+ memset(emvsim->xmt_buffer, 0, SIM_XMT_BUFFER_SIZE);
+
+ reinit_completion(&emvsim->xfer_done);
+};
+
+static void emvsim_set_nack(struct emvsim_t *emvsim, u8 enable)
+{
+ u32 reg_val;
+
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ /*Disable overrun NACK setting for now*/
+ reg_val &= ~ONACK;
+
+ if (enable) {
+ reg_val |= ANACK;
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_CTRL);
+
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_TX_THD);
+ reg_val &= ~(SIM_XMT_THRESHOLD_XTH_MASK);
+ reg_val |= SIM_XMT_THRESHOLD_XTH(emvsim->nack_threshold);
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_TX_THD);
+ } else {
+ reg_val &= ~ANACK;
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_CTRL);
+ }
+
+ emvsim->nack_enable = enable;
+}
+
+static void emvsim_set_tx(struct emvsim_t *emvsim, u8 enable)
+{
+ u32 reg_data;
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ if (enable) {
+ reg_data |= XMT_EN;
+ reg_data &= ~RCV_EN;
+ } else {
+ reg_data &= ~XMT_EN;
+ }
+
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_CTRL);
+}
+
+static void emvsim_set_rx(struct emvsim_t *emvsim, u8 enable)
+{
+ u32 reg_data;
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ if (enable) {
+ reg_data |= RCV_EN;
+ reg_data &= ~XMT_EN;
+ } else {
+ reg_data &= ~RCV_EN;
+ }
+
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_CTRL);
+}
+
+static void emvsim_mask_timer0_int(struct emvsim_t *emvsim)
+{
+ u32 reg_data;
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_data |= GPCNT0_IM;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_INT_MASK);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_TX_STATUS);
+ reg_data |= GPCNT0_TO;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_TX_STATUS);
+}
+
+static void emvsim_mask_timer1_int(struct emvsim_t *emvsim)
+{
+ u32 reg_data;
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_data |= GPCNT1_IM;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_INT_MASK);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_TX_STATUS);
+ reg_data |= GPCNT1_TO;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_TX_STATUS);
+}
+
+static void emvsim_set_gpctimer0_clk(struct emvsim_t *emvsim, u8 clk_source)
+{
+ u32 reg_data;
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_CLKCFG);
+ reg_data &= ~SIM_CNTL_GPCNT0_CLK_SEL_MASK;
+ reg_data |= SIM_CNTL_GPCNT0_CLK_SEL(clk_source);
+ writel(reg_data, emvsim->ioaddr + EMV_SIM_CLKCFG);
+}
+
+static void emvsim_set_gpctimer1_clk(struct emvsim_t *emvsim, u8 clk_source)
+{
+ u32 reg_data;
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_CLKCFG);
+ reg_data &= ~SIM_CNTL_GPCNT1_CLK_SEL_MASK;
+ reg_data |= SIM_CNTL_GPCNT1_CLK_SEL(clk_source);
+ writel(reg_data, emvsim->ioaddr + EMV_SIM_CLKCFG);
+}
+
+static void emvsim_reset_gpctimer(struct emvsim_t *emvsim)
+{
+ emvsim_set_gpctimer0_clk(emvsim, SIM_CNTL_GPCNT_RESET);
+ emvsim_set_gpctimer1_clk(emvsim, SIM_CNTL_GPCNT_RESET);
+
+ /* need a tx_en posedge to update gpctimer0 clk */
+ emvsim_set_tx(emvsim, 0);
+ emvsim_set_tx(emvsim, 1);
+ emvsim_set_tx(emvsim, 0);
+}
+
+static int emvsim_reset_low_timing(struct emvsim_t *emvsim, u32 clock_cycle)
+{
+ int errval = 0;
+ int timeout = 0;
+ u32 fclk_in_khz, delay_in_us, reg_data;
+
+ fclk_in_khz = emvsim->clk_rate / MSEC_PER_SEC;
+ delay_in_us = EMV_RESET_LOW_CYCLES * USEC_PER_MSEC / fclk_in_khz;
+
+ emvsim_mask_timer0_int(emvsim);
+ __raw_writel(clock_cycle, emvsim->ioaddr + EMV_SIM_GPCNT0_VAL);
+ emvsim_set_gpctimer0_clk(emvsim, SIM_CNTL_GPCNT_CARD_CLK);
+ emvsim_set_tx(emvsim, 1);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_data &= ~GPCNT0_IM;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_INT_MASK);
+
+ timeout = wait_for_completion_timeout(
+ &emvsim->xfer_done,
+ msecs_to_jiffies(delay_in_us / 1000 * 2));
+ if (timeout == 0) {
+ dev_err(emvsim_dev.parent, "Reset low GPC timout\n");
+ errval = -SIM_E_TIMEOUT;
+ }
+
+ return errval;
+}
+
+static void emvsim_set_cwt(struct emvsim_t *emvsim, u8 enable)
+{
+ u32 reg_val;
+
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ if (enable && emvsim->timing_data.cwt)
+ reg_val |= CWT_EN;
+ else
+ reg_val &= ~CWT_EN;
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_CTRL);
+}
+
+static void emvsim_set_bwt(struct emvsim_t *emvsim, u8 enable)
+{
+ u32 reg_val;
+
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ if (enable && (emvsim->timing_data.bwt || emvsim->timing_data.bgt))
+ reg_val |= BWT_EN;
+ else
+ reg_val &= ~BWT_EN;
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_CTRL);
+}
+
+static int emvsim_reset_module(struct emvsim_t *emvsim)
+{
+ u32 reg_val;
+
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ reg_val |= SW_RST;
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_CTRL);
+
+ /* Software should allow a minimum of 4 Protocol clock cycles(4MHz)*/
+ usleep_range(1, 3);
+
+ return 0;
+}
+
+static void emvsim_receive_atr_set(struct emvsim_t *emvsim)
+{
+ u32 reg_data;
+
+ /* GPCNT0 with Card clock is for ATR maximum delay
+ * GPCNT1 with ETU clock is for ART maximum duration
+ */
+ emvsim_mask_timer1_int(emvsim);
+ __raw_writel(0x0, emvsim->ioaddr + EMV_SIM_GPCNT1_VAL);
+ emvsim_set_gpctimer1_clk(emvsim, SIM_CNTL_GPCNT_ETU_CLK);
+ emvsim_set_rx(emvsim, 1);
+
+ /*Set the cwt timer.Refer the setting of ATR on EMV4.3 book*/
+ __raw_writel(ATR_MAX_CWT + CWT_ADJUSTMENT, emvsim->ioaddr + EMV_SIM_CWT_VAL);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ reg_data |= ICM;
+ reg_data |= CWT_EN;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_CTRL);
+
+ emvsim_set_nack(emvsim, 0);
+ emvsim->errval = 0;
+ emvsim->rcv_count = 0;
+ emvsim->checking_ts_timing = 1;
+ emvsim->state = SIM_STATE_ATR_RECEIVING;
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_data |= CWT_ERR_IM;
+ reg_data &= ~(RX_DATA_IM | GPCNT0_IM);
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_INT_MASK);
+}
+
+static int32_t emvsim_check_rec_data(u32 *reg_data)
+{
+ s32 err = 0;
+
+ if (*reg_data & FEF)
+ err |= SIM_ERROR_FRAME;
+
+ if (*reg_data & PEF)
+ err |= SIM_ERROR_PARITY;
+
+ return err;
+}
+
+static void emvsim_enable_guardtime(struct emvsim_t *emvsim, int enable)
+{
+ /* transmitter: set Guard Time Value in ETU */
+ if (enable) {
+ if (emvsim->protocol_type == SIM_PROTOCOL_T0) {
+ /*
+ * From EMV4.3, TotalETU = 12 + CGT.
+ * If cgt equals 0xFF, TotalETU = 12.
+ */
+ if (emvsim->timing_data.cgt == 0xFF)
+ __raw_writel(0, emvsim->ioaddr + EMV_SIM_TX_GETU);
+ else
+ __raw_writel(emvsim->timing_data.cgt,
+ emvsim->ioaddr + EMV_SIM_TX_GETU);
+ } else if (emvsim->protocol_type == SIM_PROTOCOL_T1) {
+ /*
+ * From EMV4.3, TotalETU = 12 + CGT.
+ * If cgt equals 0xFF, TotalETU = 11.
+ */
+ __raw_writel(emvsim->timing_data.cgt,
+ emvsim->ioaddr + EMV_SIM_TX_GETU);
+ }
+ } else {
+ __raw_writel(0, emvsim->ioaddr + EMV_SIM_TX_GETU);
+ }
+}
+
+static void emvsim_xmt_fill_fifo(struct emvsim_t *emvsim)
+{
+ u32 reg_data;
+ u32 bytesleft, i;
+
+ if (!emvsim->tx_last_character) {
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_TX_STATUS);
+ bytesleft = SIM_TX_FIFO_DEPTH - ((reg_data >> 24) & 0x1F);
+
+ if (bytesleft > emvsim->xmt_remaining)
+ bytesleft = emvsim->xmt_remaining;
+
+ for (i = 0; i < bytesleft; i++) {
+ __raw_writel(emvsim->xmt_buffer[emvsim->xmt_pos],
+ emvsim->ioaddr + EMV_SIM_TX_BUF);
+ emvsim->xmt_pos++;
+ };
+ emvsim->xmt_remaining -= bytesleft;
+ } else {
+ /* clear guard time before sending last character */
+ emvsim_enable_guardtime(emvsim, 0);
+
+ __raw_writel(emvsim->xmt_buffer[emvsim->xmt_pos],
+ emvsim->ioaddr + EMV_SIM_TX_BUF);
+ }
+};
+
+static void emvsim_rcv_read_fifo(struct emvsim_t *emvsim)
+{
+ u16 i, count;
+ u32 reg_data;
+ u8 data;
+
+ count = __raw_readl(emvsim->ioaddr + EMV_SIM_RX_STATUS) >> 24;
+
+ spin_lock(&emvsim->lock);
+ for (i = 0; i < count; i++) {
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_RX_STATUS);
+ emvsim->errval |= emvsim_check_rec_data(&reg_data);
+
+ /* T1 mode and t0 mode no parity error, T1 mode SIM module
+ * will not produce NACK be NACK is disabled. T0 mode to
+ * ensure there is no parity error for the current byte
+ */
+ if (!(emvsim->nack_enable && (reg_data & PEF))) {
+ data = __raw_readb(emvsim->ioaddr + EMV_SIM_RX_BUF);
+ emvsim->rcv_buffer[emvsim->rcv_head + emvsim->rcv_count] = data;
+ emvsim->rcv_count++;
+ }
+
+ if (emvsim->rcv_head + emvsim->rcv_count >=
+ SIM_RCV_BUFFER_SIZE) {
+ dev_err(emvsim_dev.parent,
+ "The software fifo is full,head %d, cnt%d\n",
+ emvsim->rcv_head, emvsim->rcv_count);
+ break;
+ }
+ }
+ spin_unlock(&emvsim->lock);
+}
+
+static void emvsim_tx_irq_enable(struct emvsim_t *emvsim)
+{
+ u32 reg_val;
+
+ /*Clear the TX&RX status, W1C */
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_TX_STATUS);
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_TX_STATUS);
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_RX_STATUS);
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_RX_STATUS);
+
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_val |= CWT_ERR_IM | BWT_ERR_IM | RX_DATA_IM | RNACK_IM;
+
+ if (emvsim->xmt_remaining != 0) {
+ reg_val &= ~TDT_IM;
+ } else {
+ reg_val &= ~TC_IM;
+ reg_val &= ~ETC_IM;
+ }
+
+ /* NACK interrupt is enabled only when T0 mode*/
+ if (emvsim->protocol_type == SIM_PROTOCOL_T0 ||
+ emvsim->nack_enable != 0)
+ reg_val &= ~TNACK_IM;
+ else
+ reg_val |= TNACK_IM;
+
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_INT_MASK);
+}
+
+static void emvsim_tx_irq_disable(struct emvsim_t *emvsim)
+{
+ u32 reg_val;
+
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_val |= (TDT_IM | TC_IM | TNACK_IM | ETC_IM);
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_INT_MASK);
+}
+
+static void emvsim_rx_irq_enable(struct emvsim_t *emvsim)
+{
+ u32 reg_data;
+
+ /*Clear the TX&RX status, W1C */
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_TX_STATUS);
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_TX_STATUS);
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_RX_STATUS);
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_RX_STATUS);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_data |= (TC_IM | TDT_IM | TNACK_IM | ETC_IM);
+ reg_data &= ~(RX_DATA_IM | CWT_ERR_IM | BWT_ERR_IM);
+
+ if (emvsim->protocol_type == SIM_PROTOCOL_T0 ||
+ emvsim->nack_enable != 0)
+ reg_data &= ~RNACK_IM;
+ else
+ reg_data |= RNACK_IM;
+
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_INT_MASK);
+}
+
+static void emvsim_rx_irq_disable(struct emvsim_t *emvsim)
+{
+ u32 reg_val;
+
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_val |= (RX_DATA_IM | CWT_ERR_IM | BWT_ERR_IM | RNACK_IM);
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_INT_MASK);
+}
+
+static irqreturn_t emvsim_irq_handler(int irq, void *dev_id)
+{
+ u32 reg_data, tx_status, rx_status;
+ struct emvsim_t *emvsim = (struct emvsim_t *)dev_id;
+
+ /* clear TX/RX interrupt status, W1C*/
+ tx_status = __raw_readl(emvsim->ioaddr + EMV_SIM_TX_STATUS);
+ rx_status = __raw_readl(emvsim->ioaddr + EMV_SIM_RX_STATUS) & ~(PEF | FEF);
+ __raw_writel(tx_status, emvsim->ioaddr + EMV_SIM_TX_STATUS);
+ __raw_writel(rx_status, emvsim->ioaddr + EMV_SIM_RX_STATUS);
+
+ if (emvsim->state == SIM_STATE_ATR_RECEIVING &&
+ emvsim->checking_ts_timing == 1) {
+ if ((tx_status & GPCNT0_TO) && !(rx_status & RX_DATA)) {
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ reg_data &= ~CWT_EN;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_CTRL);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_data |= (GPCNT0_IM | CWT_ERR_IM | RX_DATA_IM);
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_INT_MASK);
+
+ emvsim->errval = SIM_ERROR_ATR_DELAY;
+ complete(&emvsim->xfer_done);
+ emvsim->checking_ts_timing = 0;
+ } else if (rx_status & RX_DATA) {
+ u8 rdt = 1;
+
+ emvsim_mask_timer0_int(emvsim);
+
+ emvsim_rcv_read_fifo(emvsim);
+
+ /* ATR each received byte will cost 12 ETU */
+ reg_data = ATR_MAX_DURATION - emvsim->rcv_count * 12;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_GPCNT1_VAL);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_data &= ~(GPCNT1_IM | CWT_ERR_IM | RX_DATA_IM);
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_INT_MASK);
+
+ reg_data = SIM_RCV_THRESHOLD_RTH(0) | SIM_RCV_THRESHOLD_RDT(rdt);
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_RX_THD);
+
+ /* ATR has arrived as EMV demands */
+ emvsim->checking_ts_timing = 0;
+ } else {
+ dev_err(emvsim_dev.parent,
+ "Unexpected irq when delay checking\n");
+ }
+ }
+
+ else if (emvsim->state == SIM_STATE_ATR_RECEIVING) {
+ /*CWT ERROR OR ATR_MAX_DURATION TIMEOUT */
+ if ((rx_status & CWT_ERR) ||
+ ((tx_status & GPCNT1_TO) && (emvsim->rcv_count != 0))) {
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ reg_data &= ~CWT_EN;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_CTRL);
+
+ reg_data = __raw_readl(emvsim->ioaddr +
+ EMV_SIM_INT_MASK);
+ reg_data |= (GPCNT1_IM | CWT_ERR_IM | RX_DATA_IM | GPCNT0_IM);
+ __raw_writel(reg_data, emvsim->ioaddr +
+ EMV_SIM_INT_MASK);
+
+ if (tx_status & GPCNT1_TO)
+ emvsim->errval |= SIM_ERROR_ATR_TIMEROUT;
+
+ if (rx_status & CWT_ERR)
+ emvsim->errval |= SIM_ERROR_CWT;
+
+ emvsim_rcv_read_fifo(emvsim);
+ emvsim->state = SIM_STATE_ATR_RECEIVED;
+
+ complete(&emvsim->xfer_done);
+ } else if (rx_status & RX_DATA) {
+ emvsim_rcv_read_fifo(emvsim);
+ }
+ }
+
+ else if (emvsim->state == SIM_STATE_XMTING) {
+ /* need to enable CWT timer */
+ if (tx_status & ETCF)
+ emvsim_set_cwt(emvsim, 1);
+
+ if (tx_status & TNTE) {
+ emvsim_set_tx(emvsim, 0);
+
+ /*Disalbe the timers*/
+ emvsim_set_cwt(emvsim, 0);
+ emvsim_set_bwt(emvsim, 0);
+
+ /*Disable the NACK interruptand TX related interrupt*/
+ emvsim_tx_irq_disable(emvsim);
+
+ /*Update the state and status*/
+ emvsim->errval |= SIM_ERROR_NACK_THRESHOLD;
+ emvsim->state = SIM_STATE_XMT_ERROR;
+
+ complete(&emvsim->xfer_done);
+ } else if (tx_status & TDTF && emvsim->xmt_remaining != 0) {
+ emvsim_xmt_fill_fifo(emvsim);
+ if (emvsim->xmt_remaining == 0) {
+ reg_data = __raw_readl(emvsim->ioaddr +
+ EMV_SIM_INT_MASK);
+ reg_data |= TDT_IM;
+ reg_data &= ~(TC_IM | ETC_IM);
+ __raw_writel(reg_data, emvsim->ioaddr +
+ EMV_SIM_INT_MASK);
+ }
+ } else if ((tx_status & TCF) && !emvsim->xmt_remaining &&
+ !emvsim->tx_last_character) {
+ emvsim->tx_last_character = 1;
+ emvsim_xmt_fill_fifo(emvsim);
+ } else if ((tx_status & TCF) && !emvsim->xmt_remaining &&
+ emvsim->tx_last_character) {
+ emvsim_tx_irq_disable(emvsim);
+ emvsim_set_rx(emvsim, 1);
+ emvsim->state = SIM_STATE_XMT_DONE;
+ complete(&emvsim->xfer_done);
+ }
+ }
+
+ /*
+ * It takes some time to change from SIM_STATE_XMT_DONE to
+ * SIM_STATE_RECEIVING RX would only be enabled after state
+ * becomes SIM_STATE_RECEIVING
+ */
+ else if (emvsim->state == SIM_STATE_RECEIVING) {
+ if (rx_status & RTE) {
+ emvsim_set_rx(emvsim, 0);
+
+ /* Disable the BWT timer and CWT timer right now */
+ emvsim_set_cwt(emvsim, 0);
+ emvsim_set_bwt(emvsim, 0);
+
+ /* Disable the interrupt right now */
+ emvsim_rx_irq_disable(emvsim);
+
+ /* Should we read the fifo or just flush the fifo? */
+ emvsim_rcv_read_fifo(emvsim);
+ emvsim->errval = SIM_ERROR_NACK_THRESHOLD;
+ emvsim->state = SIM_STATE_RECEIVE_ERROR;
+ complete(&emvsim->xfer_done);
+ }
+
+ if (rx_status & RX_DATA) {
+ emvsim_rcv_read_fifo(emvsim);
+ if (emvsim->is_fixed_len_rec &&
+ emvsim->rcv_count >= emvsim->expected_rcv_cnt) {
+ emvsim_rx_irq_disable(emvsim);
+
+ if (emvsim->state == SIM_STATE_RECEIVING) {
+ emvsim->state = SIM_STATE_RECEIVE_DONE;
+ complete(&emvsim->xfer_done);
+ }
+ }
+ }
+
+ if (rx_status & (CWT_ERR | BWT_ERR | BGT_ERR)) {
+ emvsim_set_cwt(emvsim, 0);
+ emvsim_set_bwt(emvsim, 0);
+ emvsim_rx_irq_disable(emvsim);
+
+ if (rx_status & BWT_ERR)
+ emvsim->errval |= SIM_ERROR_BWT;
+ if (rx_status & CWT_ERR)
+ emvsim->errval |= SIM_ERROR_CWT;
+ if (rx_status & BGT_ERR)
+ emvsim->errval |= SIM_ERROR_BGT;
+
+ emvsim_rcv_read_fifo(emvsim);
+
+ if (emvsim->state == SIM_STATE_RECEIVING) {
+ emvsim->state = SIM_STATE_RECEIVE_DONE;
+ complete(&emvsim->xfer_done);
+ }
+ }
+ }
+
+ else if ((emvsim->state == SIM_STATE_RESET_SEQUENCY) &&
+ (tx_status & GPCNT0_TO)) {
+ complete(&emvsim->xfer_done);
+ emvsim_mask_timer0_int(emvsim);
+ } else if (rx_status & RX_DATA) {
+ dev_err(emvsim_dev.parent,
+ "unexpected status %d\n", emvsim->state);
+ emvsim_rcv_read_fifo(emvsim);
+ }
+
+ return IRQ_HANDLED;
+};
+
+static void emvsim_start(struct emvsim_t *emvsim)
+{
+ u32 reg_data, clk_rate, clk_div = 0;
+
+ clk_rate = clk_get_rate(emvsim->clk);
+ clk_div = (clk_rate + emvsim->clk_rate - 1) / emvsim->clk_rate;
+ __raw_writel(clk_div, emvsim->ioaddr + EMV_SIM_CLKCFG);
+
+ usleep_range(90, 100);
+ /* SPDP=0: SIM Presence Detect pin is low, default PRESENT status */
+ if (__raw_readl(emvsim->ioaddr + EMV_SIM_PCSR) & SPDP) {
+ emvsim->present = SIM_PRESENT_REMOVED;
+ emvsim->state = SIM_STATE_REMOVED;
+ } else {
+ emvsim->present = SIM_PRESENT_DETECTED;
+ emvsim->state = SIM_STATE_DETECTED;
+ };
+
+ /* disabled card interrupt. clear interrupt status*/
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_PCSR);
+ reg_data |= SPDIM | SPDIF;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_PCSR);
+};
+
+static void emvsim_cold_reset_sequency(struct emvsim_t *emvsim)
+{
+ u32 reg_data;
+
+ emvsim->state = SIM_STATE_RESET_SEQUENCY;
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_PCSR);
+ reg_data &= ~VCCENP;
+ reg_data |= SVCC_EN;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_PCSR);
+
+ msleep(20);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_PCSR);
+ reg_data |= SCEN;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_PCSR);
+
+ emvsim_reset_low_timing(emvsim, EMV_RESET_LOW_CYCLES);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_PCSR);
+ reg_data |= SRST;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_PCSR);
+
+ emvsim_mask_timer0_int(emvsim);
+ __raw_writel(ATR_MAX_DELAY_CLK, emvsim->ioaddr +
+ EMV_SIM_GPCNT0_VAL);
+};
+
+static void emvsim_deactivate(struct emvsim_t *emvsim)
+{
+ u32 reg_data;
+
+ /* Auto powdown to implement the deactivate sequence */
+ if (emvsim->present != SIM_PRESENT_REMOVED) {
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_PCSR);
+ reg_data |= SAPD | SPD;
+ writel(reg_data, emvsim->ioaddr + EMV_SIM_PCSR);
+ } else {
+ dev_err(emvsim_dev.parent, ">>>No card%s\n", __func__);
+ }
+};
+
+static void emvsim_cold_reset(struct emvsim_t *emvsim)
+{
+ if (emvsim->present != SIM_PRESENT_REMOVED) {
+ emvsim->state = SIM_STATE_DETECTED;
+ emvsim->present = SIM_PRESENT_DETECTED;
+ emvsim_cold_reset_sequency(emvsim);
+ emvsim_receive_atr_set(emvsim);
+ } else {
+ dev_err(emvsim_dev.parent, "No card%s\n", __func__);
+ }
+};
+
+static void emvsim_warm_reset_sequency(struct emvsim_t *emvsim)
+{
+ u32 reg_data;
+
+ /*enable power/clk, deassert rst*/
+ emvsim->state = SIM_STATE_RESET_SEQUENCY;
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_PCSR);
+ reg_data |= (SRST | SCEN);
+ reg_data &= ~VCCENP;
+ reg_data |= SVCC_EN;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_PCSR);
+
+ usleep_range(20, 25);
+
+ /* assert rst */
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_PCSR);
+ reg_data &= ~SRST;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_PCSR);
+
+ /* rst keep low */
+ emvsim_reset_low_timing(emvsim, EMV_RESET_LOW_CYCLES);
+
+ /* deassert rst */
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_PCSR);
+ reg_data |= SRST;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_PCSR);
+
+ emvsim_mask_timer0_int(emvsim);
+ __raw_writel(ATR_MAX_DELAY_CLK, emvsim->ioaddr + EMV_SIM_GPCNT0_VAL);
+}
+
+static void emvsim_warm_reset(struct emvsim_t *emvsim)
+{
+ if (emvsim->present != SIM_PRESENT_REMOVED) {
+ emvsim_data_reset(emvsim);
+ emvsim_reset_gpctimer(emvsim);
+ emvsim_warm_reset_sequency(emvsim);
+ emvsim_receive_atr_set(emvsim);
+ } else {
+ dev_err(emvsim_dev.parent, "No card%s\n", __func__);
+ }
+};
+
+static int emvsim_card_lock(struct emvsim_t *emvsim)
+{
+ int errval;
+
+ /* place holder for true physcial locking */
+ if (emvsim->present != SIM_PRESENT_REMOVED)
+ errval = SIM_OK;
+ else
+ errval = -SIM_E_NOCARD;
+
+ return errval;
+};
+
+static int emvsim_card_eject(struct emvsim_t *emvsim)
+{
+ int errval;
+
+ /* place holder for true physcial locking */
+ if (emvsim->present != SIM_PRESENT_REMOVED)
+ errval = SIM_OK;
+ else
+ errval = -SIM_E_NOCARD;
+
+ return errval;
+};
+
+static int emvsim_check_baud_rate(sim_baud_t *baud_rate)
+{
+ /* The valid value is decribed in the 8.3.3.1 in EMV 4.3 */
+ if (baud_rate->fi == 1 && (baud_rate->di == 1 ||
+ baud_rate->di == 2 || baud_rate->di == 3))
+ return 0;
+
+ return -EINVAL;
+}
+
+static int emvsim_set_baud_rate(struct emvsim_t *emvsim)
+{
+ u32 reg_data;
+
+ switch (emvsim->baud_rate.di) {
+ case 1:
+ reg_data = 372;
+ break;
+ case 2:
+ reg_data = 372 >> 1;
+ break;
+ case 3:
+ reg_data = 372 >> 2;
+ break;
+ default:
+ dev_err(emvsim_dev.parent,
+ "Invalid baud Di, Using default 372 / 1\n");
+ reg_data = 372;
+ break;
+ }
+
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_DIVISOR);
+
+ return 0;
+}
+
+static int emvsim_check_timing_data(sim_timing_t *timing_data)
+{
+ if (timing_data->wwt > 0xFFFF || timing_data->cwt > 0xFFFF ||
+ timing_data->bgt > 0xFFFF || timing_data->cgt > 0xFF) {
+ dev_err(emvsim_dev.parent,
+ "The timing value is out of scope of IP\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static void emvsim_set_timer_counter(struct emvsim_t *emvsim)
+{
+ u32 reg;
+
+ if (emvsim->timing_data.wwt != 0 &&
+ emvsim->protocol_type == SIM_PROTOCOL_T0) {
+ emvsim->timing_data.cwt = emvsim->timing_data.wwt;
+ emvsim->timing_data.bwt = emvsim->timing_data.wwt;
+ }
+
+ if (emvsim->timing_data.bgt != 0)
+ __raw_writel(emvsim->timing_data.bgt - BGT_BWT_ADJUSTMENT,
+ emvsim->ioaddr + EMV_SIM_BGT_VAL);
+
+ if (emvsim->timing_data.cwt != 0)
+ __raw_writel(emvsim->timing_data.cwt + CWT_ADJUSTMENT,
+ emvsim->ioaddr + EMV_SIM_CWT_VAL);
+
+ if (emvsim->timing_data.bwt != 0)
+ __raw_writel(emvsim->timing_data.bwt + BGT_BWT_ADJUSTMENT,
+ emvsim->ioaddr + EMV_SIM_BWT_VAL);
+
+ /* receiver: 12 etu and 11 etu, T0: 12ETU; T1: 11ETU */
+ if (emvsim->protocol_type == SIM_PROTOCOL_T0) {
+ reg = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ reg &= ~RCVR_11;
+ __raw_writel(reg, emvsim->ioaddr + EMV_SIM_CTRL);
+ } else if (emvsim->protocol_type == SIM_PROTOCOL_T1) {
+ reg = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ reg |= RCVR_11;
+ __raw_writel(reg, emvsim->ioaddr + EMV_SIM_CTRL);
+ }
+}
+
+static int emvsim_xmt_start(struct emvsim_t *emvsim)
+{
+ u32 reg_val;
+
+ emvsim_set_baud_rate(emvsim);
+ if (emvsim->protocol_type == SIM_PROTOCOL_T0) {
+ emvsim_set_nack(emvsim, 1);
+ } else if (emvsim->protocol_type == SIM_PROTOCOL_T1) {
+ emvsim_set_nack(emvsim, 0);
+ } else {
+ dev_err(emvsim_dev.parent, "Invalid protocol not T0 or T1\n");
+ return -EINVAL;
+ }
+
+ emvsim_set_timer_counter(emvsim);
+ emvsim_enable_guardtime(emvsim, 1);
+
+ if (emvsim->xmt_remaining != 0) {
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_TX_THD);
+ reg_val &= ~SIM_XMT_THRESHOLD_TDT_MASK;
+ reg_val |= SIM_XMT_THRESHOLD_TDT(TX_FIFO_THRESHOLD);
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_TX_THD);
+ }
+
+ emvsim_set_bwt(emvsim, 1);
+ emvsim_set_cwt(emvsim, 0);
+
+ emvsim_set_tx(emvsim, 1);
+ emvsim_xmt_fill_fifo(emvsim);
+ emvsim_tx_irq_enable(emvsim);
+ emvsim->state = SIM_STATE_XMTING;
+
+ return 0;
+}
+
+static void emvsim_flush_fifo(struct emvsim_t *emvsim, u8 flush_tx, u8 flush_rx)
+{
+ u32 reg_val;
+
+ reg_val = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+
+ if (flush_tx)
+ reg_val |= FLSH_TX;
+ if (flush_rx)
+ reg_val |= FLSH_RX;
+ __raw_writel(reg_val, emvsim->ioaddr + EMV_SIM_CTRL);
+}
+
+static void emvsim_start_rcv(struct emvsim_t *emvsim)
+{
+ int rdt = 1;
+
+ emvsim->state = SIM_STATE_RECEIVING;
+
+ emvsim_set_rx(emvsim, 1);
+ emvsim_set_baud_rate(emvsim);
+ emvsim_set_timer_counter(emvsim);
+ emvsim_enable_guardtime(emvsim, 0);
+ emvsim_set_cwt(emvsim, 1);
+ emvsim_set_bwt(emvsim, 1);
+
+ if (emvsim->protocol_type == SIM_PROTOCOL_T0)
+ emvsim_set_nack(emvsim, 1);
+ else if (emvsim->protocol_type == SIM_PROTOCOL_T1)
+ emvsim_set_nack(emvsim, 0);
+
+ /*Set RX threshold*/
+ if (emvsim->protocol_type == SIM_PROTOCOL_T0)
+ __raw_writel(SIM_RCV_THRESHOLD_RTH(emvsim->nack_threshold) |
+ SIM_RCV_THRESHOLD_RDT(rdt),
+ emvsim->ioaddr + EMV_SIM_RX_THD);
+ else
+ __raw_writel(SIM_RCV_THRESHOLD_RDT(rdt),
+ emvsim->ioaddr + EMV_SIM_RX_THD);
+
+ /*Clear status and enable interrupt*/
+ emvsim_rx_irq_enable(emvsim);
+}
+
+static void emvsim_polling_delay(struct emvsim_t *emvsim, u32 delay)
+{
+ u32 reg_data;
+ unsigned long orig_jiffies = jiffies;
+
+ emvsim_mask_timer1_int(emvsim);
+
+ __raw_writel(delay, emvsim->ioaddr + EMV_SIM_GPCNT0_VAL);
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_data &= ~GPCNT1_IM;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_INT_MASK);
+
+ /* Loop for timeout, add timeout mechanism to avoid dead loop */
+ while (!(__raw_readl(emvsim->ioaddr + EMV_SIM_TX_STATUS) & GPCNT0_TO)) {
+ if (time_after(jiffies, orig_jiffies + msecs_to_jiffies(500))) {
+ dev_err(emvsim_dev.parent, "polling delay timeout\n");
+ break;
+ }
+
+ usleep_range(10, 20);
+ }
+
+ emvsim_mask_timer1_int(emvsim);
+}
+
+void emvsim_clear_rx_buf(struct emvsim_t *emvsim)
+{
+ unsigned int i;
+
+ for (i = 0; i < SIM_RCV_BUFFER_SIZE; i++)
+ emvsim->rcv_buffer[i] = 0;
+ emvsim->rcv_count = 0;
+ emvsim->rcv_head = 0;
+}
+
+static long emvsim_ioctl(struct file *file,
+ unsigned int cmd, unsigned long arg)
+{
+ int ret, errval = SIM_OK;
+ unsigned long timeout;
+ u32 reg_data;
+ u32 delay;
+ u32 copy_cnt, val;
+ unsigned long flags;
+ unsigned char __user *atr_buffer;
+ unsigned char __user *xmt_buffer;
+ unsigned char __user *rcv_buffer;
+
+ struct emvsim_t *emvsim = (struct emvsim_t *)file->private_data;
+
+ switch (cmd) {
+ case SIM_IOCTL_GET_ATR:
+ if (emvsim->present != SIM_PRESENT_DETECTED) {
+ dev_err(emvsim_dev.parent, "NO card ...\n");
+ errval = -SIM_E_NOCARD;
+ break;
+ }
+
+ emvsim->timeout = ATR_TIMEOUT * HZ;
+ val = 0;
+ ret = copy_to_user(&(((sim_atr_t *)arg)->size), &val,
+ sizeof((((sim_atr_t *)arg)->size)));
+
+ timeout = wait_for_completion_interruptible_timeout(
+ &emvsim->xfer_done, emvsim->timeout);
+
+ emvsim_set_rx(emvsim, 0);
+ emvsim_set_tx(emvsim, 0);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_CTRL);
+ reg_data &= ~CWT_EN;
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_CTRL);
+
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_INT_MASK);
+ reg_data |= (GPCNT0_IM | GPCNT1_IM | CWT_ERR_IM | RX_DATA_IM);
+ __raw_writel(reg_data, emvsim->ioaddr + EMV_SIM_INT_MASK);
+
+ if (timeout == 0) {
+ dev_err(emvsim_dev.parent, "ATR timeout\n");
+ errval = -SIM_E_TIMEOUT;
+ break;
+ }
+
+ ret = copy_to_user(&(((sim_atr_t *)arg)->size),
+ &emvsim->rcv_count,
+ sizeof(emvsim->rcv_count));
+ if (ret) {
+ dev_err(emvsim_dev.parent,
+ "ATR ACCESS rcv_count Error, %d\n", ret);
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+
+ __get_user(atr_buffer, &((sim_atr_t __user *)arg)->atr_buffer);
+ ret = copy_to_user(atr_buffer,
+ emvsim->rcv_buffer, emvsim->rcv_count);
+ if (ret) {
+ dev_err(emvsim_dev.parent,
+ "ATR ACCESS buffer Error %d %d\n",
+ emvsim->rcv_count, ret);
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+
+ ret = copy_to_user(&(((sim_atr_t *)arg)->errval),
+ &emvsim->errval, sizeof(emvsim->errval));
+ if (ret) {
+ dev_err(emvsim_dev.parent, "ATR ACCESS Error\n");
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+ emvsim->rcv_count = 0;
+ emvsim->rcv_head = 0;
+ emvsim->errval = 0;
+
+ break;
+
+ case SIM_IOCTL_DEACTIVATE:
+ emvsim_deactivate(emvsim);
+ break;
+
+ case SIM_IOCTL_COLD_RESET:
+ emvsim->present = SIM_PRESENT_REMOVED;
+ emvsim->state = SIM_STATE_REMOVED;
+ emvsim_reset_module(emvsim);
+ emvsim_data_reset(emvsim);
+ emvsim_start(emvsim);
+ emvsim_cold_reset(emvsim);
+ break;
+
+ case SIM_IOCTL_WARM_RESET:
+ emvsim_warm_reset(emvsim);
+ break;
+
+ case SIM_IOCTL_XMT:
+ ret = copy_from_user(&emvsim->xmt_remaining,
+ &(((sim_xmt_t *)arg)->xmt_length),
+ sizeof(uint32_t));
+ if (ret || emvsim->xmt_remaining > SIM_XMT_BUFFER_SIZE) {
+ dev_err(emvsim_dev.parent,
+ "copy error or to big buffer\n");
+ errval = -EINVAL;
+ break;
+ }
+
+ __get_user(xmt_buffer, &((sim_xmt_t *)arg)->xmt_buffer);
+ ret = copy_from_user(emvsim->xmt_buffer, xmt_buffer,
+ emvsim->xmt_remaining);
+ if (ret) {
+ dev_err(emvsim_dev.parent, "Copy Error\n");
+ errval = ret;
+ break;
+ }
+
+ /* last character must be transmitted separately due to it
+ * can't has guard time.
+ */
+ emvsim->xmt_remaining -= 1;
+ if (!emvsim->xmt_remaining)
+ emvsim->tx_last_character = 1;
+ else
+ emvsim->tx_last_character = 0;
+
+ emvsim_clear_rx_buf(emvsim);
+ emvsim_set_cwt(emvsim, 0);
+ emvsim_set_bwt(emvsim, 0);
+ /*Flush the tx rx fifo*/
+ emvsim_flush_fifo(emvsim, 1, 1);
+ emvsim->xmt_pos = 0;
+ emvsim->errval = 0;
+
+ errval = emvsim_xmt_start(emvsim);
+ if (errval)
+ break;
+
+ emvsim->timeout = TX_TIMEOUT * HZ;
+ timeout = wait_for_completion_interruptible_timeout(
+ &emvsim->xfer_done, emvsim->timeout);
+ if (timeout == 0) {
+ /*Disable the NACK interruptand TX related interrupt*/
+ emvsim_tx_irq_disable(emvsim);
+ dev_err(emvsim_dev.parent, "tx timeout\n");
+ }
+
+ if (timeout == 0 || emvsim->state == SIM_STATE_XMT_ERROR) {
+ dev_err(emvsim_dev.parent, "TX error\n");
+ /*Disable timers*/
+ emvsim_set_cwt(emvsim, 0);
+ emvsim_set_bwt(emvsim, 0);
+ /*Disable TX*/
+ emvsim_set_tx(emvsim, 0);
+ /*Flush the tx fifos*/
+ emvsim_flush_fifo(emvsim, 1, 0);
+ if (timeout == 0)
+ errval = -SIM_E_TIMEOUT;
+ else
+ errval = -SIM_E_NACK;
+
+ ret = copy_to_user(&(((sim_atr_t *)arg)->errval),
+ &emvsim->errval,
+ sizeof(emvsim->errval));
+ emvsim->errval = 0;
+ break;
+ }
+
+ /*Copy the error status to user space*/
+ ret = copy_to_user(&(((sim_atr_t *)arg)->errval),
+ &emvsim->errval, sizeof(emvsim->errval));
+ emvsim->errval = 0;
+
+ emvsim_start_rcv(emvsim);
+
+ break;
+
+ case SIM_IOCTL_RCV:
+ if (emvsim->present != SIM_PRESENT_DETECTED) {
+ errval = -SIM_E_NOCARD;
+ break;
+ }
+
+ val = 0;
+ emvsim->is_fixed_len_rec = 0;
+ ret = copy_from_user(&emvsim->expected_rcv_cnt,
+ &(((sim_rcv_t *)arg)->rcv_length),
+ sizeof(emvsim->expected_rcv_cnt));
+
+ /*Set the length to be 0 at first*/
+ ret = copy_to_user(&(((sim_rcv_t *)arg)->rcv_length), &val,
+ sizeof(val));
+
+ /*Set error value to be 0 at first*/
+ ret = copy_to_user(&(((sim_rcv_t *)arg)->errval), &val,
+ sizeof(val));
+
+ if (emvsim->expected_rcv_cnt != 0)
+ emvsim->is_fixed_len_rec = 1;
+
+ if (emvsim->is_fixed_len_rec &&
+ emvsim->rcv_count >= emvsim->expected_rcv_cnt)
+ goto copy_data;
+
+ if (emvsim->state != SIM_STATE_RECEIVING)
+ emvsim_start_rcv(emvsim);
+
+ emvsim->timeout = RX_TIMEOUT * HZ;
+ timeout = wait_for_completion_interruptible_timeout(
+ &emvsim->xfer_done, emvsim->timeout);
+ if (timeout == 0) {
+ dev_err(emvsim_dev.parent, "Receiving timeout\n");
+ emvsim_set_cwt(emvsim, 0);
+ emvsim_set_bwt(emvsim, 0);
+ emvsim_rx_irq_disable(emvsim);
+ errval = -SIM_E_TIMEOUT;
+ break;
+ }
+copy_data:
+ if (emvsim->is_fixed_len_rec)
+ copy_cnt = emvsim->rcv_count > emvsim->expected_rcv_cnt
+ ? emvsim->expected_rcv_cnt
+ : emvsim->rcv_count;
+ else
+ copy_cnt = emvsim->rcv_count;
+
+ ret = copy_to_user(&(((sim_rcv_t *)arg)->rcv_length),
+ &copy_cnt, sizeof(copy_cnt));
+ if (ret) {
+ dev_err(emvsim_dev.parent, "ATR ACCESS Error\n");
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+
+ __get_user(rcv_buffer, &((sim_rcv_t *)arg)->rcv_buffer);
+ ret = copy_to_user(rcv_buffer,
+ &emvsim->rcv_buffer[emvsim->rcv_head],
+ copy_cnt);
+ if (ret) {
+ dev_err(emvsim_dev.parent, "ATR ACCESS Error\n");
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+
+ ret = copy_to_user(&(((sim_rcv_t *)arg)->errval),
+ &emvsim->errval, sizeof(emvsim->errval));
+ if (ret) {
+ dev_err(emvsim_dev.parent, "ATR ACCESS Error\n");
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+ /*Reset the receiving count and errval*/
+ spin_lock_irqsave(&emvsim->lock, flags);
+ emvsim->rcv_head += copy_cnt;
+ emvsim->rcv_count -= copy_cnt;
+ emvsim->errval = 0;
+ spin_unlock_irqrestore(&emvsim->lock, flags);
+
+ break;
+
+ case SIM_IOCTL_SET_PROTOCOL:
+ ret = copy_from_user(&emvsim->protocol_type, (int *)arg,
+ sizeof(int));
+ if (ret)
+ errval = -SIM_E_ACCESS;
+ break;
+
+ case SIM_IOCTL_SET_TIMING:
+ ret = copy_from_user(&emvsim->timing_data, (sim_timing_t *)arg,
+ sizeof(sim_timing_t));
+ if (ret) {
+ dev_err(emvsim_dev.parent, "Copy Error\n");
+ errval = ret;
+ break;
+ }
+
+ ret = emvsim_check_timing_data(&emvsim->timing_data);
+ if (ret)
+ errval = ret;
+
+ break;
+
+ case SIM_IOCTL_SET_BAUD:
+ ret = copy_from_user(&emvsim->baud_rate, (sim_baud_t *)arg,
+ sizeof(sim_baud_t));
+ if (ret) {
+ dev_err(emvsim_dev.parent, "Copy Error\n");
+ errval = ret;
+ break;
+ }
+
+ emvsim_check_baud_rate(&emvsim->baud_rate);
+
+ break;
+ case SIM_IOCTL_WAIT:
+ ret = copy_from_user(&delay, (unsigned int *)arg,
+ sizeof(unsigned int));
+ if (ret) {
+ dev_err(emvsim_dev.parent, "\nWait Copy Error\n");
+ errval = ret;
+ break;
+ }
+
+ emvsim_polling_delay(emvsim, delay);
+ break;
+
+ case SIM_IOCTL_GET_PRESENSE:
+ if (put_user(emvsim->present, (int *)arg))
+ errval = -SIM_E_ACCESS;
+ break;
+
+ case SIM_IOCTL_CARD_LOCK:
+ errval = emvsim_card_lock(emvsim);
+ break;
+
+ case SIM_IOCTL_CARD_EJECT:
+ errval = emvsim_card_eject(emvsim);
+ break;
+ };
+
+ return errval;
+};
+
+static int emvsim_open(struct inode *inode, struct file *file)
+{
+ int errval = SIM_OK;
+ struct emvsim_t *emvsim = dev_get_drvdata(emvsim_dev.parent);
+
+ file->private_data = emvsim;
+ spin_lock_init(&emvsim->lock);
+
+ if (!emvsim->ioaddr) {
+ errval = -ENOMEM;
+ return errval;
+ }
+
+ if (!emvsim->open_cnt) {
+ clk_prepare_enable(emvsim->ipg);
+ clk_prepare_enable(emvsim->clk);
+ }
+
+ emvsim->open_cnt = 1;
+ init_completion(&emvsim->xfer_done);
+ errval = emvsim_reset_module(emvsim);
+ emvsim_data_reset(emvsim);
+
+ return errval;
+};
+
+static int emvsim_release(struct inode *inode, struct file *file)
+{
+ u32 reg_data;
+ struct emvsim_t *emvsim = (struct emvsim_t *)file->private_data;
+
+ /* disable presense detection interrupt */
+ reg_data = __raw_readl(emvsim->ioaddr + EMV_SIM_PCSR);
+ __raw_writel(reg_data | SPDIM, emvsim->ioaddr + EMV_SIM_PCSR);
+
+ if (emvsim->present != SIM_PRESENT_REMOVED)
+ emvsim_deactivate(emvsim);
+
+ if (emvsim->open_cnt) {
+ clk_disable_unprepare(emvsim->clk);
+ clk_disable_unprepare(emvsim->ipg);
+ }
+
+ emvsim->open_cnt = 0;
+
+ return 0;
+};
+
+static const struct file_operations emvsim_fops = {
+ .owner = THIS_MODULE,
+ .open = emvsim_open,
+ .release = emvsim_release,
+ .unlocked_ioctl = emvsim_ioctl,
+};
+
+static struct miscdevice emvsim_dev = {
+ MISC_DYNAMIC_MINOR,
+ "mxc_sim",
+ &emvsim_fops
+};
+
+static const struct of_device_id emvsim_imx_dt_ids[] = {
+ { .compatible = "fsl,imx8-emvsim" },
+ { /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, emvsim_imx_dt_ids);
+
+static int emvsim_attach_multi_pd(struct device *dev, struct emvsim_t *emvsim)
+{
+ struct device_link *link;
+
+ /* Do nothing when in a signal power domain */
+ if (dev->pm_domain)
+ return 0;
+
+ emvsim->sim_pd = dev_pm_domain_attach_by_name(dev, "sim_pd");
+ if (IS_ERR(emvsim->sim_pd))
+ return PTR_ERR(emvsim->sim_pd);
+ link = device_link_add(dev, emvsim->sim_pd,
+ DL_FLAG_STATELESS |
+ DL_FLAG_PM_RUNTIME |
+ DL_FLAG_RPM_ACTIVE);
+ if (IS_ERR(link)) {
+ dev_err(dev, "Failed to add device_link to EMVSIM pd: %ld\n", PTR_ERR(link));
+ return PTR_ERR(link);
+ }
+
+ emvsim->sim_aux_pd = dev_pm_domain_attach_by_name(dev, "sim_aux_pd");
+ if (IS_ERR(emvsim->sim_aux_pd))
+ return PTR_ERR(emvsim->sim_aux_pd);
+ link = device_link_add(dev, emvsim->sim_aux_pd,
+ DL_FLAG_STATELESS |
+ DL_FLAG_PM_RUNTIME |
+ DL_FLAG_RPM_ACTIVE);
+ if (IS_ERR(link)) {
+ dev_err(dev, "Failed to add device_link to EMVSIM pd: %ld\n", PTR_ERR(link));
+ return PTR_ERR(link);
+ }
+
+ return 0;
+}
+
+static int emvsim_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ const struct of_device_id *of_id;
+ struct emvsim_t *emvsim = NULL;
+
+ emvsim = devm_kzalloc(&pdev->dev, sizeof(struct emvsim_t),
+ GFP_KERNEL);
+ if (!emvsim)
+ return -ENOMEM;
+
+ of_id = of_match_device(emvsim_imx_dt_ids, &pdev->dev);
+ if (of_id)
+ pdev->id_entry = of_id->data;
+ else
+ return -EINVAL;
+
+ emvsim->clk_rate = FCLK_FREQ;
+ emvsim->open_cnt = 0;
+
+ emvsim->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!emvsim->res) {
+ dev_err(emvsim_dev.parent, "Can't get the MEMORY\n");
+ return -ENOMEM;
+ }
+ emvsim->ioaddr = devm_ioremap_resource(&pdev->dev, emvsim->res);
+ if (IS_ERR(emvsim->ioaddr)) {
+ dev_err(&pdev->dev,
+ "failed to get ioremap base\n");
+ ret = PTR_ERR(emvsim->ioaddr);
+ return ret;
+ }
+
+ /* request the emvsim per clk and ipg clk */
+ emvsim->clk = devm_clk_get(&pdev->dev, "sim");
+ if (IS_ERR(emvsim->clk)) {
+ ret = PTR_ERR(emvsim->clk);
+ dev_err(emvsim_dev.parent, "Get PER CLK ERROR !\n");
+ return ret;
+ }
+
+ emvsim->ipg = devm_clk_get(&pdev->dev, "ipg");
+ if (IS_ERR(emvsim->ipg)) {
+ ret = PTR_ERR(emvsim->ipg);
+ dev_err(emvsim_dev.parent, "Get IPG CLK ERROR !\n");
+ return ret;
+ }
+
+ emvsim->irq = platform_get_irq(pdev, 0);
+ if (emvsim->irq < 0) {
+ dev_err(&pdev->dev, "No irq line provided\n");
+ return -ENOENT;
+ }
+
+ if (devm_request_irq(&pdev->dev, emvsim->irq, emvsim_irq_handler,
+ 0, "mxc_emvsim_irq", emvsim)) {
+ dev_err(&pdev->dev, "can't claim irq %d\n", emvsim->irq);
+ return -ENOENT;
+ }
+
+ platform_set_drvdata(pdev, emvsim);
+ emvsim_dev.parent = &pdev->dev;
+
+ ret = emvsim_attach_multi_pd(&pdev->dev, emvsim);
+ if (ret)
+ return ret;
+
+ ret = misc_register(&emvsim_dev);
+ dev_info(&pdev->dev, "emvsim register %s\n", ret ? "fail" : "success");
+
+ return ret;
+}
+
+static int emvsim_remove(struct platform_device *pdev)
+{
+ struct emvsim_t *emvsim = platform_get_drvdata(pdev);
+
+ if (emvsim->open_cnt) {
+ clk_disable_unprepare(emvsim->clk);
+ clk_disable_unprepare(emvsim->ipg);
+ }
+
+ misc_deregister(&emvsim_dev);
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int emvsim_suspend(struct platform_device *pdev, pm_message_t state)
+{
+ struct emvsim_t *emvsim = platform_get_drvdata(pdev);
+
+ if (emvsim->open_cnt) {
+ clk_disable_unprepare(emvsim->clk);
+ clk_disable_unprepare(emvsim->ipg);
+ }
+
+ pinctrl_pm_select_sleep_state(&pdev->dev);
+
+ return 0;
+}
+
+static int emvsim_resume(struct platform_device *pdev)
+{
+ struct emvsim_t *emvsim = platform_get_drvdata(pdev);
+
+ if (!emvsim->open_cnt) {
+ clk_prepare_enable(emvsim->ipg);
+ clk_prepare_enable(emvsim->clk);
+ }
+
+ pinctrl_pm_select_default_state(&pdev->dev);
+
+ return 0;
+}
+
+#else
+#define emvsim_suspend NULL
+#define emvsim_resume NULL
+#endif
+
+static struct platform_driver emvsim_driver = {
+ .driver = {
+ .name = DRIVER_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = emvsim_imx_dt_ids,
+ },
+ .probe = emvsim_probe,
+ .remove = emvsim_remove,
+ .suspend = emvsim_suspend,
+ .resume = emvsim_resume,
+};
+
+static int __init emvsim_drv_init(void)
+{
+ return platform_driver_register(&emvsim_driver);
+}
+
+static void __exit emvsim_drv_exit(void)
+{
+ platform_driver_unregister(&emvsim_driver);
+}
+
+module_init(emvsim_drv_init);
+module_exit(emvsim_drv_exit);
+
+MODULE_AUTHOR("Gao Pan <pandy.gao@nxp.com>");
+MODULE_DESCRIPTION("NXP EMVSIM Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/mxc/sim/imx_sim.c b/drivers/mxc/sim/imx_sim.c
new file mode 100755
index 000000000000..14dd12ac6d7d
--- /dev/null
+++ b/drivers/mxc/sim/imx_sim.c
@@ -0,0 +1,1866 @@
+/*
+ * Copyright (C) 2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * 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.
+ */
+
+#include <linux/module.h>
+#include <linux/ioport.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/sched.h>
+#include <linux/io.h>
+#include <linux/interrupt.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/poll.h>
+#include <linux/miscdevice.h>
+#include <linux/clk.h>
+#include <linux/types.h>
+#include <linux/platform_device.h>
+#include <linux/mxc_sim_interface.h>
+#include <linux/spinlock.h>
+#include <linux/time.h>
+#include <linux/pinctrl/consumer.h>
+
+#include <linux/io.h>
+
+#define DRIVER_NAME "mxc_sim"
+#define SIM_INTERNAL_CLK (0)
+#define SIM_RFU (-1)
+
+/* Transmit and receive buffer sizes */
+#define SIM_XMT_BUFFER_SIZE (300)
+#define SIM_RCV_BUFFER_SIZE (400)
+
+#define SIM_TX_FIFO_DEPTH (16)
+#define SIM_RX_FIFO_DEPTH (285)
+
+#define TX_FIFO_THRESHOLD (0x04)
+#define RX_FIFO_THRESHOLD (250)
+
+/* Interface character references */
+#define SIM_IFC_TXI(letter, number) (letter + number * 4)
+#define SIM_IFC_TA1 SIM_IFC_TXI(0, 0)
+#define SIM_IFC_TB1 SIM_IFC_TXI(0, 1)
+#define SIM_IFC_TC1 SIM_IFC_TXI(0, 2)
+#define SIM_IFC_TD1 SIM_IFC_TXI(0, 3)
+#define SIM_IFC_TA2 SIM_IFC_TXI(1, 0)
+#define SIM_IFC_TB2 SIM_IFC_TXI(1, 1)
+#define SIM_IFC_TC2 SIM_IFC_TXI(1, 2)
+#define SIM_IFC_TD2 SIM_IFC_TXI(1, 3)
+#define SIM_IFC_TA3 SIM_IFC_TXI(2, 0)
+#define SIM_IFC_TB3 SIM_IFC_TXI(2, 1)
+#define SIM_IFC_TC3 SIM_IFC_TXI(2, 2)
+#define SIM_IFC_TD3 SIM_IFC_TXI(2, 3)
+#define SIM_IFC_TA4 SIM_IFC_TXI(3, 0)
+#define SIM_IFC_TB4 SIM_IFC_TXI(3, 1)
+#define SIM_IFC_TC4 SIM_IFC_TXI(3, 2)
+#define SIM_IFC_TD4 SIM_IFC_TXI(3, 3)
+
+/* ATR and OPS states */
+#define SIM_STATE_REMOVED (0)
+#define SIM_STATE_DETECTED (1)
+#define SIM_STATE_ATR_RECEIVING (2)
+#define SIM_STATE_ATR_RECEIVED (3)
+#define SIM_STATE_XMTING (4)
+#define SIM_STATE_XMT_DONE (5)
+#define SIM_STATE_XMT_ERROR (6)
+#define SIM_STATE_RECEIVING (7)
+#define SIM_STATE_RECEIVE_DONE (8)
+#define SIM_STATE_RECEIVE_ERROR (9)
+#define SIM_STATE_RESET_SEQUENCY (10)
+
+/* Definitions of the offset of the SIM hardware registers */
+#define PORT1_CNTL (0x00)
+#define SETUP (0x04)
+#define PORT1_DETECT (0x08)
+#define PORT1_XMT_BUF (0x0C)
+#define PORT1_RCV_BUF (0x10)
+#define PORT0_CNTL (0x14)
+#define CNTL (0x18)
+#define CLK_PRESCALER (0x1C)
+#define RCV_THRESHOLD (0x20)
+#define ENABLE (0x24)
+#define XMT_STATUS (0x28)
+#define RCV_STATUS (0x2C)
+#define INT_MASK (0x30)
+#define PORTO_XMT_BUF (0x34)
+#define PORT0_RCV_BUF (0x38)
+#define PORT0_DETECT (0x3C)
+#define DATA_FORMAT (0x40)
+#define XMT_THRESHOLD (0x44)
+#define GUARD_CNTL (0x48)
+#define OD_CONFIG (0x4C)
+#define RESET_CNTL (0x50)
+#define CHAR_WAIT (0x54)
+#define GPCNT (0x58)
+#define DIVISOR (0x5C)
+#define BWT (0x60)
+#define BGT (0x64)
+#define BWT_H (0x68)
+#define XMT_FIFO_STAT (0x6C)
+#define RCV_FIFO_CNT (0x70)
+#define RCV_FIFO_WPTR (0x74)
+#define RCV_FIFO_RPTR (0x78)
+
+/* SIM SETUP register bits */
+#define SIM_SETUP_SPS_PORT0 (0 << 1)
+#define SIM_SETUP_SPS_PORT1 (1 << 1)
+
+/* SIM port[0|1]_cntl register bits */
+#define SIM_PORT_CNTL_SFPD (1 << 7)
+#define SIM_PORT_CNTL_3VOLT (1 << 6)
+#define SIM_PORT_CNTL_SCSP (1 << 5)
+#define SIM_PORT_CNTL_SCEN (1 << 4)
+#define SIM_PORT_CNTL_SRST (1 << 3)
+#define SIM_PORT_CNTL_STEN (1 << 2)
+#define SIM_PORT_CNTL_SVEN (1 << 1)
+#define SIM_PORT_CNTL_SAPD (1 << 0)
+
+/* SIM od_config register bits */
+#define SIM_OD_CONFIG_OD_P1 (1 << 1)
+#define SIM_OD_CONFIG_OD_P0 (1 << 0)
+
+/* SIM enable register bits */
+#define SIM_ENABLE_XMTEN (1 << 1)
+#define SIM_ENABLE_RCVEN (1 << 0)
+#define SIM_ESTOP_EN (1 << 5)
+#define SIM_ESTOP_EXE (1 << 6)
+
+/* SIM int_mask register bits */
+#define SIM_INT_MASK_RFEM (1 << 13)
+#define SIM_INT_MASK_BGTM (1 << 12)
+#define SIM_INT_MASK_BWTM (1 << 11)
+#define SIM_INT_MASK_RTM (1 << 10)
+#define SIM_INT_MASK_CWTM (1 << 9)
+#define SIM_INT_MASK_GPCM (1 << 8)
+#define SIM_INT_MASK_TDTFM (1 << 7)
+#define SIM_INT_MASK_TFOM (1 << 6)
+#define SIM_INT_MASK_XTM (1 << 5)
+#define SIM_INT_MASK_TFEIM (1 << 4)
+#define SIM_INT_MASK_ETCIM (1 << 3)
+#define SIM_INT_MASK_OIM (1 << 2)
+#define SIM_INT_MASK_TCIM (1 << 1)
+#define SIM_INT_MASK_RIM (1 << 0)
+
+/* SIM xmt_status register bits */
+#define SIM_XMT_STATUS_GPCNT (1 << 8)
+#define SIM_XMT_STATUS_TDTF (1 << 7)
+#define SIM_XMT_STATUS_TFO (1 << 6)
+#define SIM_XMT_STATUS_TC (1 << 5)
+#define SIM_XMT_STATUS_ETC (1 << 4)
+#define SIM_XMT_STATUS_TFE (1 << 3)
+#define SIM_XMT_STATUS_XTE (1 << 0)
+
+/* SIM rcv_status register bits */
+#define SIM_RCV_STATUS_BGT (1 << 11)
+#define SIM_RCV_STATUS_BWT (1 << 10)
+#define SIM_RCV_STATUS_RTE (1 << 9)
+#define SIM_RCV_STATUS_CWT (1 << 8)
+#define SIM_RCV_STATUS_CRCOK (1 << 7)
+#define SIM_RCV_STATUS_LRCOK (1 << 6)
+#define SIM_RCV_STATUS_RDRF (1 << 5)
+#define SIM_RCV_STATUS_RFD (1 << 4)
+#define SIM_RCV_STATUS_RFE (1 << 1)
+#define SIM_RCV_STATUS_OEF (1 << 0)
+
+/* SIM cntl register bits */
+#define SIM_CNTL_BWTEN (1 << 15)
+#define SIM_CNTL_XMT_CRC_LRC (1 << 14)
+#define SIM_CNTL_CRCEN (1 << 13)
+#define SIM_CNTL_LRCEN (1 << 12)
+#define SIM_CNTL_CWTEN (1 << 11)
+#define SIM_CNTL_SAMPLE12 (1 << 4)
+#define SIM_CNTL_ONACK (1 << 3)
+#define SIM_CNTL_ANACK (1 << 2)
+#define SIM_CNTL_ICM (1 << 1)
+#define SIM_CNTL_GPCNT_CLK_SEL(x) ((x&0x03) << 9)
+#define SIM_CNTL_GPCNT_CLK_SEL_MASK (0x03 << 9)
+#define SIM_CNTL_BAUD_SEL(x) ((x&0x07) << 6)
+#define SIM_CNTL_BAUD_SEL_MASK (0x07 << 6)
+#define SIM_CNTL_GPCNT_CARD_CLK 1
+#define SIM_CNTL_GPCNT_RCV_CLK 2
+#define SIM_CNTL_GPCNT_ETU_CLK 3
+
+/* SIM rcv_threshold register bits */
+#define SIM_RCV_THRESHOLD_RTH(x) ((x&0x0f) << 9)
+#define SIM_RCV_THRESHOLD_RTH_MASK (0x0f << 9)
+#define SIM_RCV_THRESHOLD_RDT(x) ((x&0x1ff) << 0)
+#define SIM_RCV_THRESHOLD_RDT_MASK (0x1ff << 0)
+
+/* SIM xmt_threshold register bits */
+#define SIM_XMT_THRESHOLD_XTH(x) ((x&0x0f) << 4)
+#define SIM_XMT_THRESHOLD_XTH_MASK (0x0f << 4)
+#define SIM_XMT_THRESHOLD_TDT(x) ((x&0x0f) << 0)
+#define SIM_XMT_THRESHOLD_TDT_MASK (0x0f << 0)
+
+/* SIM guard_cntl register bits */
+#define SIM_GUARD_CNTL_RCVR11 (1 << 8)
+#define SIM_GIARD_CNTL_GETU(x) (x&0xff)
+#define SIM_GIARD_CNTL_GETU_MASK (0xff)
+
+/* SIM port[0|]_detect register bits */
+#define SIM_PORT_DETECT_SPDS (1 << 3)
+#define SIM_PORT_DETECT_SPDP (1 << 2)
+#define SIM_PORT_DETECT_SDI (1 << 1)
+#define SIM_PORT_DETECT_SDIM (1 << 0)
+
+/* SIM RESET_CNTL register bits*/
+#define SIM_RESET_CNTL_FLUSH_RCV (1 << 0)
+#define SIM_RESET_CNTL_FLUSH_XMT (1 << 1)
+#define SIM_RESET_CNTL_SOFT_RESET (1 << 2)
+#define SIM_RESET_CNTL_KILL_CLOCK (1 << 3)
+#define SIM_RESET_CNTL_DOZE (1 << 4)
+#define SIM_RESET_CNTL_STOP (1 << 5)
+#define SIM_RESET_CNTL_DEBUG (1 << 6)
+
+
+/*SIM receive buffer register error status*/
+#define SIM_REC_CWT_ERROR (1 << 10)
+#define SIM_REC_FRAME_ERROR (1 << 9)
+#define SIM_REC_PARITY_ERROR (1 << 8)
+
+#define SIM_EMV_NACK_THRESHOLD (5)
+#define EMV_T0_BGT (16)
+#define EMV_T1_BGT (22)
+#define ATR_THRESHOLD_MAX (100)
+#define ATR_MAX_CWT (10080)
+#define ATR_MAX_DURATION (20160)
+#define FCLK_FREQ (4000000)
+
+#define ATR_TIMEOUT (5)
+#define TX_TIMEOUT (10)
+#define RX_TIMEOUT (100)
+#define RESET_RETRY_TIMES (5)
+#define SIM_QUIRK_TKT259347 (1 << 0)
+#define EMV_RESET_LOW_CYCLES 40000
+#define ATR_MAX_DELAY_CLK 46400
+
+/* Main SIM driver structure */
+struct sim_t{
+ s32 present;
+ u8 open_cnt;
+ int state;
+ struct clk *clk;
+ struct resource *res;
+ void __iomem *ioaddr;
+ int ipb_irq;
+ int dat_irq;
+
+ /* error code occured during transfer */
+ int errval;
+ int protocol_type;
+ sim_timing_t timing_data;
+ sim_baud_t baud_rate;
+ int timeout;
+ u8 nack_threshold;
+ u8 nack_enable;
+ u32 expected_rcv_cnt;
+ u8 is_fixed_len_rec;
+
+ /* remaining bytes to transmit for the current transfer */
+ u32 xmt_remaining;
+ /* transmit position */
+ u32 xmt_pos;
+ /* receive position / number of bytes received */
+ u32 rcv_count;
+ u8 rcv_buffer[SIM_RCV_BUFFER_SIZE];
+ u8 xmt_buffer[SIM_XMT_BUFFER_SIZE];
+ /* transfer completion notifier */
+ struct completion xfer_done;
+ /* async notifier for card and ATR detection */
+ struct fasync_struct *fasync;
+ /* Platform specific data */
+ struct mxc_sim_platform_data *plat_data;
+ bool last_is_tx;
+ u16 rcv_head;
+ spinlock_t lock;
+ bool sven_low_active;
+ u32 port_index;
+ u32 port_detect_reg;
+ u32 port_ctrl_reg;
+ u32 clk_rate;
+ u32 quirks;
+ u8 checking_ts_timing;
+};
+
+static struct miscdevice sim_dev;
+
+static void sim_data_reset(struct sim_t *sim)
+{
+ sim->errval = SIM_OK;
+ sim->protocol_type = 0;
+ sim->timeout = 0;
+ sim->nack_threshold = SIM_EMV_NACK_THRESHOLD;
+ sim->nack_enable = 0;
+ memset(&sim->timing_data, 0, sizeof(sim->timing_data));
+ memset(&sim->baud_rate, 0, sizeof(sim->baud_rate));
+
+ sim->xmt_remaining = 0;
+ sim->xmt_pos = 0;
+ sim->rcv_count = 0;
+ sim->rcv_head = 0;
+ sim->last_is_tx = false;
+ memset(sim->rcv_buffer, 0, SIM_RCV_BUFFER_SIZE);
+ memset(sim->xmt_buffer, 0, SIM_XMT_BUFFER_SIZE);
+
+ init_completion(&sim->xfer_done);
+};
+
+static void sim_set_nack(struct sim_t *sim, u8 enable)
+{
+ u32 reg_val;
+
+ reg_val = __raw_readl(sim->ioaddr + CNTL);
+ /*Disable overrun NACK setting for now*/
+ reg_val &= ~(SIM_CNTL_ONACK);
+
+ if (enable) {
+ reg_val |= SIM_CNTL_ANACK;
+ __raw_writel(reg_val, sim->ioaddr + CNTL);
+ reg_val = __raw_readl(sim->ioaddr + XMT_THRESHOLD);
+ reg_val &= ~(SIM_XMT_THRESHOLD_XTH_MASK);
+ reg_val |= SIM_XMT_THRESHOLD_XTH(sim->nack_threshold);
+ __raw_writel(reg_val, sim->ioaddr + XMT_THRESHOLD);
+ } else {
+ reg_val &= ~SIM_CNTL_ANACK;
+ __raw_writel(reg_val, sim->ioaddr + CNTL);
+ }
+
+ sim->nack_enable = enable;
+}
+
+static void sim_set_tx(struct sim_t *sim, u8 enable)
+{
+ u32 reg_data;
+
+ reg_data = __raw_readl(sim->ioaddr + ENABLE);
+ if (enable) {
+ reg_data |= SIM_ENABLE_XMTEN | SIM_ENABLE_RCVEN;
+ if (sim->quirks & SIM_QUIRK_TKT259347)
+ reg_data &= ~(SIM_ESTOP_EN | SIM_ESTOP_EXE);
+ } else
+ reg_data &= ~SIM_ENABLE_XMTEN;
+
+ __raw_writel(reg_data, sim->ioaddr + ENABLE);
+}
+
+static void sim_set_rx(struct sim_t *sim, u8 enable)
+{
+ u32 reg_data;
+ reg_data = __raw_readl(sim->ioaddr + ENABLE);
+ if (enable) {
+ reg_data |= SIM_ENABLE_RCVEN;
+ reg_data &= ~SIM_ENABLE_XMTEN;
+ if (sim->quirks & SIM_QUIRK_TKT259347)
+ reg_data |= (SIM_ESTOP_EN | SIM_ESTOP_EXE);
+ } else {
+ reg_data &= ~SIM_ENABLE_RCVEN;
+ if (sim->quirks & SIM_QUIRK_TKT259347)
+ reg_data &= ~(SIM_ESTOP_EN | SIM_ESTOP_EXE);
+ }
+
+ __raw_writel(reg_data, sim->ioaddr + ENABLE);
+}
+
+static void sim_reset_timer(struct sim_t *sim)
+{
+ u32 reg_data;
+
+ reg_data = __raw_readl(sim->ioaddr + CNTL);
+ reg_data &= ~SIM_CNTL_GPCNT_CLK_SEL_MASK;
+ __raw_writel(reg_data, sim->ioaddr + CNTL);
+}
+
+static void sim_start_timer(struct sim_t *sim, u8 clk_source)
+{
+ u32 reg_data;
+
+ reg_data = __raw_readl(sim->ioaddr + CNTL);
+ reg_data &= ~SIM_CNTL_GPCNT_CLK_SEL_MASK;
+ reg_data |= SIM_CNTL_GPCNT_CLK_SEL(clk_source);
+ writel(reg_data, sim->ioaddr + CNTL);
+}
+
+static void sim_set_gpc_timer(struct sim_t *sim, u32 val)
+{
+ uint32_t reg_data;
+
+ /*Clear the interrupt status*/
+ reg_data = __raw_readl(sim->ioaddr + XMT_STATUS);
+ reg_data |= SIM_XMT_STATUS_GPCNT;
+ __raw_writel(reg_data, sim->ioaddr + XMT_STATUS);
+
+ /*Set the timer counter*/
+ __raw_writel(val, sim->ioaddr + GPCNT);
+
+ /*First reset the counter*/
+ sim_reset_timer(sim);
+
+ /*Enable GPC timer interrupt*/
+ reg_data = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_data &= ~SIM_INT_MASK_GPCM;
+ __raw_writel(reg_data, sim->ioaddr + INT_MASK);
+
+ /*Set the GPCNT clock source to be Fclk*/
+ sim_start_timer(sim, SIM_CNTL_GPCNT_CARD_CLK);
+}
+
+static int sim_reset_low_timing(struct sim_t *sim, u32 clock_cycle)
+{
+ int errval = 0;
+ int timeout = 0;
+ u32 fclk_in_khz, delay_in_us, reg_data;
+
+ fclk_in_khz = sim->clk_rate / MSEC_PER_SEC;
+ delay_in_us = EMV_RESET_LOW_CYCLES * USEC_PER_MSEC / fclk_in_khz;
+
+ sim_set_gpc_timer(sim, clock_cycle);
+
+ timeout = wait_for_completion_timeout(&sim->xfer_done,
+ msecs_to_jiffies(delay_in_us / 1000 * 2));
+ if (timeout == 0) {
+ pr_err("Reset low GPC timout\n");
+ errval = -SIM_E_TIMEOUT;
+ }
+
+ sim_reset_timer(sim);
+ /*Disable GPC timer interrupt*/
+ reg_data = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_data |= SIM_INT_MASK_GPCM;
+ __raw_writel(reg_data, sim->ioaddr + INT_MASK);
+
+ return errval;
+}
+
+static void sim_set_cwt(struct sim_t *sim, u8 enable)
+{
+ u32 reg_val;
+ reg_val = __raw_readl(sim->ioaddr + CNTL);
+ if (enable && sim->timing_data.cwt)
+ reg_val |= SIM_CNTL_CWTEN;
+ else
+ reg_val &= ~SIM_CNTL_CWTEN;
+ __raw_writel(reg_val, sim->ioaddr + CNTL);
+}
+
+static void sim_set_bwt(struct sim_t *sim, u8 enable)
+{
+ u32 reg_val;
+ reg_val = __raw_readl(sim->ioaddr + CNTL);
+ if (enable && (sim->timing_data.bwt || sim->timing_data.bgt))
+ reg_val |= SIM_CNTL_BWTEN;
+ else
+ reg_val &= ~SIM_CNTL_BWTEN;
+ __raw_writel(reg_val, sim->ioaddr + CNTL);
+}
+
+static int sim_reset_module(struct sim_t *sim)
+{
+ u32 reg_val;
+ s8 timeout = RESET_RETRY_TIMES;
+
+ reg_val = __raw_readl(sim->ioaddr + RESET_CNTL);
+ reg_val |= (SIM_RESET_CNTL_SOFT_RESET);
+ __raw_writel(reg_val, sim->ioaddr + RESET_CNTL);
+
+ while (__raw_readl(sim->ioaddr + RESET_CNTL) & SIM_RESET_CNTL_SOFT_RESET) {
+ usleep_range(1, 3);
+ if (timeout-- <= 0) {
+ pr_err("SIM module reset timeout\n");
+ return -EINVAL;
+ }
+ }
+ return 0;
+}
+
+static void sim_receive_atr_set(struct sim_t *sim)
+{
+ u32 reg_data;
+
+ /*Enable RX*/
+ sim_set_rx(sim, 1);
+
+ /*Receive fifo threshold = 1*/
+ reg_data = SIM_RCV_THRESHOLD_RTH(0) | SIM_RCV_THRESHOLD_RDT(1);
+ __raw_writel(reg_data, sim->ioaddr + RCV_THRESHOLD);
+
+ /* Clear the interrupt status*/
+ reg_data = __raw_readl(sim->ioaddr + RCV_STATUS);
+ reg_data |= (SIM_RCV_STATUS_CWT | SIM_RCV_STATUS_RDRF);
+ __raw_writel(reg_data, sim->ioaddr + RCV_STATUS);
+
+ /*Set the cwt timer.Refer the setting of ATR on EMV4.3 book*/
+ __raw_writel(ATR_MAX_CWT, sim->ioaddr + CHAR_WAIT);
+
+ /*Set the baud rate to be 1/372. Refer the setting of ATR on EMV4.3 book
+ *Enable the CWT timer during receiving ATR process.
+ */
+ reg_data = __raw_readl(sim->ioaddr + CNTL);
+ reg_data &= ~SIM_CNTL_BAUD_SEL_MASK;
+ reg_data |= SIM_CNTL_BAUD_SEL(0) | SIM_CNTL_CWTEN;
+
+ /*Enable ICM mode*/
+ reg_data |= SIM_CNTL_ICM;
+
+ /*Enable Sample12*/
+ reg_data |= SIM_CNTL_SAMPLE12;
+ __raw_writel(reg_data, sim->ioaddr + CNTL);
+
+ /*Disable NACK*/
+ sim_set_nack(sim, 0);
+
+ /*Set 12 ETUS*/
+ __raw_writel(0, sim->ioaddr + GUARD_CNTL);
+
+ sim->errval = 0;
+ sim->rcv_count = 0;
+ sim->checking_ts_timing = 1;
+ sim->state = SIM_STATE_ATR_RECEIVING;
+
+ /*Enable the RIM and GPC interrupt, disalbe the CWT interrupt*/
+ reg_data = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_data |= SIM_INT_MASK_CWTM;
+ reg_data &= ~(SIM_INT_MASK_RIM | SIM_INT_MASK_GPCM);
+ __raw_writel(reg_data, sim->ioaddr + INT_MASK);
+}
+
+static int32_t sim_check_rec_data(u32 *reg_data)
+{
+ s32 err = 0;
+
+ if (*reg_data & SIM_REC_CWT_ERROR)
+ err |= SIM_ERROR_CWT;
+
+ if (*reg_data & SIM_REC_FRAME_ERROR)
+ err |= SIM_ERROR_FRAME;
+
+ if (*reg_data & SIM_REC_PARITY_ERROR)
+ err |= SIM_ERROR_PARITY;
+
+ return err;
+}
+
+static void sim_xmt_fill_fifo(struct sim_t *sim)
+{
+ u32 reg_data;
+ u32 bytesleft, i;
+
+ reg_data = __raw_readl(sim->ioaddr + XMT_FIFO_STAT);
+ bytesleft = SIM_TX_FIFO_DEPTH - ((reg_data >> 8) & 0x0F);
+
+ if (bytesleft > sim->xmt_remaining)
+ bytesleft = sim->xmt_remaining;
+
+ for (i = 0; i < bytesleft; i++) {
+ __raw_writel(sim->xmt_buffer[sim->xmt_pos],
+ sim->ioaddr + PORT1_XMT_BUF);
+ sim->xmt_pos++;
+ };
+ sim->xmt_remaining -= bytesleft;
+};
+
+static void sim_rcv_read_fifo(struct sim_t *sim)
+{
+ u16 i, count;
+ u32 reg_data;
+
+ count = __raw_readl(sim->ioaddr + RCV_FIFO_CNT);
+
+ spin_lock(&sim->lock);
+ for (i = 0; i < count; i++) {
+ reg_data = __raw_readl(sim->ioaddr + PORT1_RCV_BUF);
+ sim->errval |= sim_check_rec_data(&reg_data);
+
+ /* T1 mode and t0 mode no parity error, T1 mode SIM module will not produce NACK be
+ * NACK is disabled. T0 mode to ensure there is no parity error for the current byte
+ */
+ if (!(sim->nack_enable && (reg_data & SIM_REC_PARITY_ERROR))) {
+ sim->rcv_buffer[sim->rcv_head + sim->rcv_count] = (u8)reg_data;
+ sim->rcv_count++;
+ }
+ if (sim->rcv_head + sim->rcv_count >= SIM_RCV_BUFFER_SIZE) {
+ pr_err("The software fifo is full,head %d, cnt%d\n", sim->rcv_head, sim->rcv_count);
+ break;
+ }
+ }
+ spin_unlock(&sim->lock);
+}
+
+static void sim_tx_irq_enable(struct sim_t *sim)
+{
+ u32 reg_val;
+ /*Clear the status and enable the related interrupt*/
+ reg_val = __raw_readl(sim->ioaddr + XMT_STATUS);
+ __raw_writel(reg_val, sim->ioaddr + XMT_STATUS);
+ reg_val = __raw_readl(sim->ioaddr + RCV_STATUS);
+ __raw_writel(reg_val, sim->ioaddr + RCV_STATUS);
+
+ reg_val = __raw_readl(sim->ioaddr + INT_MASK);
+ /*
+ *Disable CWT , BWT interrupt when transmitting, it would
+ *be enabled when rx is enabled just after tx completes
+ *The timer will be enabled.
+ */
+ reg_val |= SIM_INT_MASK_CWTM | SIM_INT_MASK_BWTM;
+ reg_val |= SIM_INT_MASK_RIM | SIM_INT_MASK_RTM;
+
+ if (sim->xmt_remaining != 0)
+ reg_val &= ~SIM_INT_MASK_TDTFM;
+ else{
+ reg_val &= ~SIM_INT_MASK_TCIM;
+ /*Enable transmit early complete interrupt.*/
+ reg_val &= ~SIM_INT_MASK_ETCIM;
+ }
+
+ /*NACK interrupt is enabled only when T0 mode*/
+ if (sim->protocol_type == SIM_PROTOCOL_T0 || sim->nack_enable != 0)
+ reg_val &= ~SIM_INT_MASK_XTM;
+ else
+ reg_val |= SIM_INT_MASK_XTM;
+ __raw_writel(reg_val, sim->ioaddr + INT_MASK);
+}
+
+static void sim_tx_irq_disable(struct sim_t *sim)
+{
+ u32 reg_val;
+ /*Disable the NACK interruptand TX related interrupt*/
+ reg_val = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_val |= (SIM_INT_MASK_TDTFM | SIM_INT_MASK_TCIM | SIM_INT_MASK_XTM | SIM_INT_MASK_ETCIM);
+ __raw_writel(reg_val, sim->ioaddr + INT_MASK);
+}
+
+static void sim_rx_irq_enable(struct sim_t *sim)
+{
+ u32 reg_data;
+ /*
+ * Ensure the CWT timer is enabled.
+ */
+ sim_set_cwt(sim, 1);
+ reg_data = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_data |= (SIM_INT_MASK_TCIM | SIM_INT_MASK_TDTFM | SIM_INT_MASK_XTM);
+ reg_data &= ~(SIM_INT_MASK_RIM | SIM_INT_MASK_CWTM | SIM_INT_MASK_BWTM);
+
+ if (sim->protocol_type == SIM_PROTOCOL_T0 || sim->nack_enable != 0)
+ reg_data &= ~SIM_INT_MASK_RTM;
+ else
+ reg_data |= SIM_INT_MASK_RTM;
+
+ __raw_writel(reg_data, sim->ioaddr + INT_MASK);
+}
+
+static void sim_rx_irq_disable(struct sim_t *sim)
+{
+ u32 reg_val;
+ reg_val = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_val |= (SIM_INT_MASK_RIM | SIM_INT_MASK_CWTM | SIM_INT_MASK_BWTM | SIM_INT_MASK_RTM);
+ __raw_writel(reg_val, sim->ioaddr + INT_MASK);
+}
+
+static irqreturn_t sim_irq_handler(int irq, void *dev_id)
+{
+ u32 reg_data, tx_status, rx_status;
+
+ struct sim_t *sim = (struct sim_t *) dev_id;
+
+ tx_status = __raw_readl(sim->ioaddr + XMT_STATUS);
+ rx_status = __raw_readl(sim->ioaddr + RCV_STATUS);
+ __raw_writel(tx_status, sim->ioaddr + XMT_STATUS);
+ __raw_writel(rx_status, sim->ioaddr + RCV_STATUS);
+
+ if (sim->state == SIM_STATE_ATR_RECEIVING &&
+ sim->checking_ts_timing == 1) {
+
+ if ((tx_status & SIM_XMT_STATUS_GPCNT) &&
+ !(rx_status & SIM_RCV_STATUS_RDRF)) {
+ /*Disable the GPCNT timer and CWT timer right now*/
+ reg_data = __raw_readl(sim->ioaddr + CNTL);
+ reg_data &= ~(SIM_CNTL_GPCNT_CLK_SEL_MASK |
+ SIM_CNTL_CWTEN);
+ __raw_writel(reg_data, sim->ioaddr + CNTL);
+
+ reg_data = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_data |= (SIM_INT_MASK_GPCM |
+ SIM_INT_MASK_CWTM | SIM_INT_MASK_RIM);
+ __raw_writel(reg_data, sim->ioaddr + INT_MASK);
+ sim->errval = SIM_ERROR_ATR_DELAY;
+ complete(&sim->xfer_done);
+ sim->checking_ts_timing = 0;
+ } else if (rx_status & SIM_RCV_STATUS_RDRF) {
+ /*
+ * Reset/stop the GPCNT timer first.
+ */
+ sim_reset_timer(sim);
+
+ /*Enable GPC, CWT interrupt and
+ *disable the rx full interrupt
+ */
+ reg_data = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_data &= ~(SIM_INT_MASK_GPCM | SIM_INT_MASK_CWTM);
+ reg_data |= SIM_INT_MASK_RIM;
+ __raw_writel(reg_data, sim->ioaddr + INT_MASK);
+ sim_rcv_read_fifo(sim);
+
+ /*Clear the GPCNT expiring status*/
+ __raw_writel(SIM_XMT_STATUS_GPCNT,
+ sim->ioaddr + XMT_STATUS);
+
+ /*ATR each recieved byte will cost 12 ETU, so get the remaining etus*/
+ reg_data = ATR_MAX_DURATION - sim->rcv_count * 12;
+ __raw_writel(reg_data, sim->ioaddr + GPCNT);
+
+ sim_start_timer(sim, SIM_CNTL_GPCNT_ETU_CLK);
+
+ /*Receive fifo threshold set to max value*/
+ reg_data = SIM_RCV_THRESHOLD_RTH(0) | SIM_RCV_THRESHOLD_RDT(ATR_THRESHOLD_MAX);
+ __raw_writel(reg_data, sim->ioaddr + RCV_THRESHOLD);
+ sim->checking_ts_timing = 0;
+ } else {
+ pr_err("Unexpected irq when delay checking\n");
+ }
+ }
+
+ else if (sim->state == SIM_STATE_ATR_RECEIVING) {
+ if ((rx_status & SIM_RCV_STATUS_CWT) ||
+ ((tx_status & SIM_XMT_STATUS_GPCNT) &&
+ (sim->rcv_count != 0))) {
+
+ /*Disable the GPCNT timer and CWT timer right now*/
+ reg_data = __raw_readl(sim->ioaddr + CNTL);
+ reg_data &= ~(SIM_CNTL_GPCNT_CLK_SEL_MASK | SIM_CNTL_CWTEN);
+ __raw_writel(reg_data, sim->ioaddr + CNTL);
+
+ reg_data = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_data |= (SIM_INT_MASK_GPCM | SIM_INT_MASK_CWTM);
+ __raw_writel(reg_data, sim->ioaddr + INT_MASK);
+
+ if (tx_status & SIM_XMT_STATUS_GPCNT)
+ sim->errval |= SIM_ERROR_ATR_TIMEROUT;
+
+ if (rx_status & SIM_RCV_STATUS_CWT)
+ sim->errval |= SIM_ERROR_CWT;
+
+ sim_rcv_read_fifo(sim);
+ sim->state = SIM_STATE_ATR_RECEIVED;
+
+ complete(&sim->xfer_done);
+ }
+ }
+
+ else if (sim->state == SIM_STATE_XMTING) {
+ /*The CWT BWT expire should not happen when in the transmitting state*/
+ if (tx_status & SIM_XMT_STATUS_ETC) {
+ /*Once the transmit frame is completed, need to enable CWT timer*/
+ sim_set_cwt(sim, 1);
+ }
+ if (tx_status & SIM_XMT_STATUS_XTE) {
+ /*Disable TX*/
+ sim_set_tx(sim, 0);
+ /*Disalbe the timers*/
+ sim_set_cwt(sim, 0);
+ sim_set_bwt(sim, 0);
+ /*Disable the NACK interruptand TX related interrupt*/
+ sim_tx_irq_disable(sim);
+
+ /*Update the state and status*/
+ sim->errval |= SIM_ERROR_NACK_THRESHOLD;
+ sim->state = SIM_STATE_XMT_ERROR;
+
+ complete(&sim->xfer_done);
+ } else if (tx_status & SIM_XMT_STATUS_TDTF && sim->xmt_remaining != 0) {
+ sim_xmt_fill_fifo(sim);
+ if (sim->xmt_remaining == 0) {
+ /*Disable TX threshold interrupt and enable tx complete interrupt*/
+ reg_data = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_data |= SIM_INT_MASK_TDTFM;
+ /*Enable transmit complete and early transmit complete interrupt*/
+ reg_data &= ~(SIM_INT_MASK_TCIM | SIM_INT_MASK_ETCIM);
+ __raw_writel(reg_data, sim->ioaddr + INT_MASK);
+ }
+ } else if (tx_status & SIM_XMT_STATUS_TC && sim->xmt_remaining == 0) {
+ /*Disable the NACK interruptand TX related interrupt*/
+ sim_tx_irq_disable(sim);
+ sim_set_rx(sim, 1);
+ /*Update the state and status*/
+ sim->state = SIM_STATE_XMT_DONE;
+ complete(&sim->xfer_done);
+ }
+ }
+
+ /*
+ * It takes some time to change from SIM_STATE_XMT_DONE to SIM_STATE_RECEIVING
+ * RX would only be enabled after state becomes SIM_STATE_RECEIVING
+ */
+ else if (sim->state == SIM_STATE_RECEIVING) {
+ if (rx_status & SIM_RCV_STATUS_RTE) {
+ /*Disable RX*/
+ sim_set_rx(sim, 0);
+ /*Disable the BWT timer and CWT timer right now*/
+ sim_set_cwt(sim, 0);
+ sim_set_bwt(sim, 0);
+ /*Disable the interrupt right now*/
+ sim_rx_irq_disable(sim);
+ /*Should we read the fifo or just flush the fifo?*/
+ sim_rcv_read_fifo(sim);
+ sim->errval = SIM_ERROR_NACK_THRESHOLD;
+ sim->state = SIM_STATE_RECEIVE_ERROR;
+ complete(&sim->xfer_done);
+ }
+
+ if (rx_status & SIM_RCV_STATUS_RDRF) {
+ sim_rcv_read_fifo(sim);
+ if (sim->is_fixed_len_rec &&
+ sim->rcv_count >= sim->expected_rcv_cnt) {
+
+ /*Disable the BWT timer and CWT timer right now*/
+ sim_rx_irq_disable(sim);
+ /*Add the state judgement to ensure the maybe complete has been impletment in the above "if" case*/
+ if (sim->state == SIM_STATE_RECEIVING) {
+ sim->state = SIM_STATE_RECEIVE_DONE;
+ complete(&sim->xfer_done);
+ }
+ }
+ }
+
+ if ((rx_status & SIM_RCV_STATUS_CWT) ||
+ (rx_status & SIM_RCV_STATUS_BWT) ||
+ (rx_status & SIM_RCV_STATUS_BGT)) {
+
+ /*Disable the BWT timer and CWT timer right now*/
+ sim_set_cwt(sim, 0);
+ sim_set_bwt(sim, 0);
+ sim_rx_irq_disable(sim);
+
+ if (rx_status & SIM_RCV_STATUS_BWT) {
+ sim->errval |= SIM_ERROR_BWT;
+ }
+ if (rx_status & SIM_RCV_STATUS_CWT)
+ sim->errval |= SIM_ERROR_CWT;
+ if (rx_status & SIM_RCV_STATUS_BGT)
+ sim->errval |= SIM_ERROR_BGT;
+
+ sim_rcv_read_fifo(sim);
+ /*Add the state judgement to ensure the maybe complete has been impletment in the above "if" case*/
+ if (sim->state == SIM_STATE_RECEIVING) {
+ sim->state = SIM_STATE_RECEIVE_DONE;
+ complete(&sim->xfer_done);
+ }
+ }
+ }
+
+ else if ((sim->state == SIM_STATE_RESET_SEQUENCY) &&
+ (tx_status & SIM_XMT_STATUS_GPCNT))
+ complete(&sim->xfer_done);
+ else if (rx_status & SIM_RCV_STATUS_RDRF) {
+ pr_err("unexpected status %d\n", sim->state);
+ sim_rcv_read_fifo(sim);
+ }
+
+ return IRQ_HANDLED;
+};
+
+static void sim_start(struct sim_t *sim)
+{
+ u32 reg_data, clk_rate, clk_div = 0;
+ pr_debug("%s entering.\n", __func__);
+
+ if (sim->port_index == 1)
+ __raw_writel(SIM_SETUP_SPS_PORT1, sim->ioaddr + SETUP);
+ else
+ __raw_writel(SIM_SETUP_SPS_PORT0, sim->ioaddr + SETUP);
+
+ /*1 ~ 5 MHz */
+ clk_rate = clk_get_rate(sim->clk);
+ clk_div = (clk_rate + sim->clk_rate - 1) / sim->clk_rate;
+ __raw_writel(clk_div, sim->ioaddr + CLK_PRESCALER);
+
+ /*Set the port pin to be open drained*/
+ reg_data = __raw_readl(sim->ioaddr + OD_CONFIG);
+ if (sim->port_index == 1)
+ reg_data |= SIM_OD_CONFIG_OD_P1;
+ else
+ reg_data |= SIM_OD_CONFIG_OD_P0;
+
+ __raw_writel(reg_data, sim->ioaddr + OD_CONFIG);
+
+ reg_data = __raw_readl(sim->ioaddr + sim->port_ctrl_reg);
+
+ /*One pin mode*/
+ reg_data |= SIM_PORT_CNTL_3VOLT | SIM_PORT_CNTL_STEN;
+ __raw_writel(reg_data, sim->ioaddr + sim->port_ctrl_reg);
+
+ /* presense detect */
+ pr_debug("%s p0_det is 0x%x \n", __func__,
+ __raw_readl(sim->ioaddr + sim->port_detect_reg));
+ if (__raw_readl(sim->ioaddr + sim->port_detect_reg)
+ & SIM_PORT_DETECT_SPDP) {
+ reg_data = __raw_readl(sim->ioaddr + sim->port_detect_reg);
+ reg_data &= ~SIM_PORT_DETECT_SPDS;
+ __raw_writel(reg_data, sim->ioaddr + sim->port_detect_reg);
+ sim->present = SIM_PRESENT_REMOVED;
+ sim->state = SIM_STATE_REMOVED;
+ } else {
+ reg_data = __raw_readl(sim->ioaddr + sim->port_detect_reg);
+ reg_data |= SIM_PORT_DETECT_SPDS;
+ __raw_writel(reg_data, sim->ioaddr + sim->port_detect_reg);
+ sim->present = SIM_PRESENT_DETECTED;
+ sim->state = SIM_STATE_DETECTED;
+ };
+
+ /*enable card interrupt. clear interrupt status*/
+ reg_data = __raw_readl(sim->ioaddr + sim->port_detect_reg);
+ reg_data |= SIM_PORT_DETECT_SDI;
+ reg_data |= SIM_PORT_DETECT_SDIM;
+ __raw_writel(reg_data, sim->ioaddr + sim->port_detect_reg);
+};
+
+static void sim_cold_reset_sequency(struct sim_t *sim)
+{
+ u32 reg_data;
+
+ sim->state = SIM_STATE_RESET_SEQUENCY;
+
+ /*set VCC*/
+ reg_data = __raw_readl(sim->ioaddr + sim->port_ctrl_reg);
+ if (sim->sven_low_active)
+ reg_data &= ~SIM_PORT_CNTL_SVEN;
+ else
+ reg_data |= SIM_PORT_CNTL_SVEN;
+ __raw_writel(reg_data, sim->ioaddr + sim->port_ctrl_reg);
+
+ msleep(9);
+
+ /*enable CLK*/
+ reg_data = __raw_readl(sim->ioaddr + sim->port_ctrl_reg);
+ reg_data |= SIM_PORT_CNTL_SCEN;
+ __raw_writel(reg_data, sim->ioaddr + sim->port_ctrl_reg);
+
+ /*RST low time*/
+ sim_reset_low_timing(sim, EMV_RESET_LOW_CYCLES);
+
+ /*RST high*/
+ reg_data = __raw_readl(sim->ioaddr + sim->port_ctrl_reg);
+ reg_data |= SIM_PORT_CNTL_SRST;
+ __raw_writel(reg_data, sim->ioaddr + sim->port_ctrl_reg);
+
+ /*wait for ATR*/
+ sim_set_gpc_timer(sim, ATR_MAX_DELAY_CLK);
+};
+
+static void sim_deactivate(struct sim_t *sim)
+{
+ u32 reg_data;
+
+ pr_debug("%s entering.\n", __func__);
+ /* Auto powdown to implement the deactivate sequence */
+ if (sim->present != SIM_PRESENT_REMOVED) {
+ if (sim->sven_low_active) {
+ /*Set the RESET to be low*/
+ reg_data = __raw_readl(sim->ioaddr + sim->port_ctrl_reg);
+ reg_data &= ~SIM_PORT_CNTL_SRST;
+ writel(reg_data, sim->ioaddr + sim->port_ctrl_reg);
+ usleep_range(2, 5);
+
+ /*Set the clock to be low*/
+ reg_data &= ~SIM_PORT_CNTL_SCEN;
+ writel(reg_data, sim->ioaddr + sim->port_ctrl_reg);
+ usleep_range(2, 5);
+
+ /*Set the sven to be high*/
+ reg_data |= SIM_PORT_CNTL_SVEN;
+ writel(reg_data, sim->ioaddr + sim->port_ctrl_reg);
+
+ } else {
+ reg_data = __raw_readl(sim->ioaddr + sim->port_ctrl_reg);
+ reg_data |= SIM_PORT_CNTL_SAPD;
+ __raw_writel(reg_data,
+ sim->ioaddr + sim->port_ctrl_reg);
+ reg_data |= SIM_PORT_CNTL_SFPD;
+ __raw_writel(reg_data,
+ sim->ioaddr + sim->port_ctrl_reg);
+ }
+ } else
+ pr_err(">>>No card%s\n", __func__);
+};
+
+static void sim_cold_reset(struct sim_t *sim)
+{
+ if (sim->present != SIM_PRESENT_REMOVED) {
+ sim->state = SIM_STATE_DETECTED;
+ sim->present = SIM_PRESENT_DETECTED;
+ sim_cold_reset_sequency(sim);
+ sim_receive_atr_set(sim);
+ } else {
+ pr_err("No card%s\n", __func__);
+ }
+};
+
+static void sim_warm_reset_sequency(struct sim_t *sim)
+{
+ u32 reg_data;
+
+ sim->state = SIM_STATE_RESET_SEQUENCY;
+ reg_data = __raw_readl(sim->ioaddr + sim->port_ctrl_reg);
+ reg_data |= (SIM_PORT_CNTL_SRST | SIM_PORT_CNTL_SCEN);
+ if (sim->sven_low_active)
+ reg_data &= ~SIM_PORT_CNTL_SVEN;
+ else
+ reg_data |= SIM_PORT_CNTL_SVEN;
+ __raw_writel(reg_data, sim->ioaddr + sim->port_ctrl_reg);
+
+ usleep_range(20, 25);
+
+ reg_data = __raw_readl(sim->ioaddr + sim->port_ctrl_reg);
+ reg_data &= ~SIM_PORT_CNTL_SRST;
+ __raw_writel(reg_data, sim->ioaddr + sim->port_ctrl_reg);
+
+ sim_reset_low_timing(sim, EMV_RESET_LOW_CYCLES);
+
+ reg_data = __raw_readl(sim->ioaddr + sim->port_ctrl_reg);
+ reg_data |= SIM_PORT_CNTL_SRST;
+ __raw_writel(reg_data, sim->ioaddr + sim->port_ctrl_reg);
+ sim_set_gpc_timer(sim, ATR_MAX_DELAY_CLK);
+}
+
+static void sim_warm_reset(struct sim_t *sim)
+{
+ if (sim->present != SIM_PRESENT_REMOVED) {
+ sim_data_reset(sim);
+ sim_warm_reset_sequency(sim);
+ sim_receive_atr_set(sim);
+ } else {
+ pr_err("No card%s\n", __func__);
+ }
+};
+
+
+static int sim_card_lock(struct sim_t *sim)
+{
+ int errval;
+
+ /* place holder for true physcial locking */
+ if (sim->present != SIM_PRESENT_REMOVED)
+ errval = SIM_OK;
+ else
+ errval = -SIM_E_NOCARD;
+ return errval;
+};
+
+static int sim_card_eject(struct sim_t *sim)
+{
+ int errval;
+
+ pr_debug("%s entering.\n", __func__);
+ /* place holder for true physcial locking */
+ if (sim->present != SIM_PRESENT_REMOVED)
+ errval = SIM_OK;
+ else
+ errval = -SIM_E_NOCARD;
+ return errval;
+};
+
+static int sim_check_baud_rate(sim_baud_t *baud_rate)
+{
+ /*
+ * The valid value is decribed in the 8.3.3.1 in EMV 4.3
+ */
+ if (baud_rate->fi == 1 && (baud_rate->di == 1 ||
+ baud_rate->di == 2 || baud_rate->di == 3))
+ return 0;
+
+ return -EINVAL;
+}
+
+static int sim_set_baud_rate(struct sim_t *sim)
+{
+ u32 reg_data;
+ reg_data = __raw_readl(sim->ioaddr + CNTL);
+ reg_data &= ~(SIM_CNTL_BAUD_SEL_MASK);
+
+ switch (sim->baud_rate.di) {
+ case 1:
+ reg_data |= SIM_CNTL_BAUD_SEL(0);
+ break;
+ case 2:
+ reg_data |= SIM_CNTL_BAUD_SEL(1);
+ break;
+ case 3:
+ reg_data |= SIM_CNTL_BAUD_SEL(2);
+ break;
+ default:
+ pr_err("Invalid baud Di, Using default 372 / 1\n");
+ reg_data |= SIM_CNTL_BAUD_SEL(0);
+ break;
+ }
+
+ __raw_writel(reg_data, sim->ioaddr + CNTL);
+
+ return 0;
+}
+
+static int sim_check_timing_data(sim_timing_t *timing_data)
+{
+ if (timing_data->wwt > 0xFFFF ||
+ timing_data->cwt > 0xFFFF ||
+ timing_data->bgt > 0xFFFF ||
+ timing_data->cgt > 0xFF) {
+ /*Check whether the counter is out of the scope of SIM IP*/
+ pr_err("The timing value is out of scope of IP\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static void sim_set_timer_counter(struct sim_t *sim)
+{
+ if (sim->timing_data.wwt != 0 &&
+ sim->protocol_type == SIM_PROTOCOL_T0) {
+ sim->timing_data.cwt = sim->timing_data.wwt;
+ sim->timing_data.bwt = sim->timing_data.wwt;
+ }
+
+
+ if (sim->timing_data.bgt != 0) {
+ __raw_writel(sim->timing_data.bgt, sim->ioaddr + BGT);
+ }
+
+ if (sim->timing_data.cwt != 0)
+ __raw_writel(sim->timing_data.cwt, sim->ioaddr + CHAR_WAIT);
+
+ if (sim->timing_data.bwt != 0) {
+
+ __raw_writel(sim->timing_data.bwt & 0x0000FFFF, sim->ioaddr + BWT);
+ __raw_writel((sim->timing_data.bwt >> 16) & 0x0000FFFF,
+ sim->ioaddr + BWT_H);
+ }
+
+ if (sim->timing_data.cgt == 0xFF && sim->protocol_type == SIM_PROTOCOL_T0)
+ /* From EMV4.3 , CGT =0xFF in T0 mode means 12 ETU.
+ * Set register to be 12 ETU for transmitting and receiving.
+ */
+ __raw_writel(0 , sim->ioaddr + GUARD_CNTL);
+ else if (sim->timing_data.cgt == 0xFF && sim->protocol_type == SIM_PROTOCOL_T1)
+ /* From EMV4.3 , CGT =0xFF in T1 mode means 11 ETU.
+ * Set register to be 12 ETU for transmitting and receiving.
+ */
+ __raw_writel(0x1FF , sim->ioaddr + GUARD_CNTL);
+
+ /*For the T1 mode, use 11ETU to receive.*/
+ else if (sim->protocol_type == SIM_PROTOCOL_T1)
+ __raw_writel((sim->timing_data.cgt | SIM_GUARD_CNTL_RCVR11), sim->ioaddr + GUARD_CNTL);
+
+ else
+ /*sim->protocol_type == SIM_PROTOCOL_T0*/
+ __raw_writel(sim->timing_data.cgt, sim->ioaddr + GUARD_CNTL);
+}
+
+static void sim_xmt_start(struct sim_t *sim)
+{
+ u32 reg_val;
+
+ /*Set TX threshold if there are remaing data*/
+ if (sim->xmt_remaining != 0) {
+ reg_val = __raw_readl(sim->ioaddr + XMT_THRESHOLD);
+ reg_val &= ~SIM_XMT_THRESHOLD_TDT_MASK;
+ reg_val |= SIM_XMT_THRESHOLD_TDT(TX_FIFO_THRESHOLD);
+ __raw_writel(reg_val, sim->ioaddr + XMT_THRESHOLD);
+ }
+ sim_tx_irq_enable(sim);
+
+ /*Enable BWT and disalbe CWT timers when tx*/
+ sim_set_bwt(sim, 1);
+ sim_set_cwt(sim, 0);
+
+ /*Disalbe RX*/
+ sim_set_rx(sim, 0);
+
+ /*Enable TX*/
+ sim_set_tx(sim, 1);
+}
+
+static void sim_flush_fifo(struct sim_t *sim, u8 flush_tx, u8 flush_rx)
+{
+ u32 reg_val;
+
+ reg_val = __raw_readl(sim->ioaddr + RESET_CNTL);
+
+ if (flush_tx)
+ reg_val |= SIM_RESET_CNTL_FLUSH_XMT;
+ if (flush_rx)
+ reg_val |= SIM_RESET_CNTL_FLUSH_RCV;
+ __raw_writel(reg_val, sim->ioaddr + RESET_CNTL);
+
+ usleep_range(2, 3);
+
+ if (flush_tx)
+ reg_val &= ~(SIM_RESET_CNTL_FLUSH_XMT);
+ if (flush_rx)
+ reg_val &= ~(SIM_RESET_CNTL_FLUSH_RCV);
+ __raw_writel(reg_val, sim->ioaddr + RESET_CNTL);
+}
+
+static void sim_change_rcv_threshold(struct sim_t *sim)
+{
+ u32 rx_threshold = 0;
+ u32 reg_val = 0;
+
+ if (sim->is_fixed_len_rec) {
+ rx_threshold = sim->expected_rcv_cnt - sim->rcv_count;
+ reg_val = __raw_readl(sim->ioaddr + RCV_THRESHOLD);
+ reg_val &= ~(SIM_RCV_THRESHOLD_RDT_MASK);
+ reg_val |= SIM_RCV_THRESHOLD_RDT(rx_threshold);
+ __raw_writel(reg_val, sim->ioaddr + RCV_THRESHOLD);
+ }
+}
+
+static void sim_start_rcv(struct sim_t *sim)
+{
+ sim_set_baud_rate(sim);
+ if (sim->protocol_type == SIM_PROTOCOL_T0)
+ sim_set_nack(sim, 1);
+ else if (sim->protocol_type == SIM_PROTOCOL_T1)
+ sim_set_nack(sim, 0);
+
+ /*Set RX threshold*/
+ if (sim->protocol_type == SIM_PROTOCOL_T0)
+ __raw_writel(SIM_RCV_THRESHOLD_RTH(sim->nack_threshold) |
+ SIM_RCV_THRESHOLD_RDT(RX_FIFO_THRESHOLD), sim->ioaddr + RCV_THRESHOLD);
+ else
+ __raw_writel(SIM_RCV_THRESHOLD_RDT(RX_FIFO_THRESHOLD), sim->ioaddr + RCV_THRESHOLD);
+
+ /*Clear status and enable interrupt*/
+ sim_rx_irq_enable(sim);
+
+ /*Disalbe TX and Enable Rx*/
+ sim_set_rx(sim, 1);
+ sim_set_tx(sim, 0);
+}
+
+static void sim_polling_delay(struct sim_t *sim, u32 delay)
+{
+ u32 reg_data;
+
+ /*Reset the timer*/
+ reg_data = __raw_readl(sim->ioaddr + CNTL);
+ reg_data &= ~SIM_CNTL_GPCNT_CLK_SEL_MASK;
+ reg_data |= SIM_CNTL_GPCNT_CLK_SEL(0);
+ __raw_writel(reg_data, sim->ioaddr + CNTL);
+
+ /*Clear the interrupt status*/
+ __raw_writel(SIM_XMT_STATUS_GPCNT, sim->ioaddr + XMT_STATUS);
+
+ /*Disable timer interrupt*/
+ reg_data = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_data |= SIM_INT_MASK_GPCM;
+ __raw_writel(reg_data, sim->ioaddr + INT_MASK);
+
+ __raw_writel(delay, sim->ioaddr + GPCNT);
+
+ /*Set the ETU as clock source and start timer*/
+ reg_data = __raw_readl(sim->ioaddr + CNTL);
+ reg_data &= ~SIM_CNTL_GPCNT_CLK_SEL_MASK;
+ reg_data |= SIM_CNTL_GPCNT_CLK_SEL(3);
+ __raw_writel(reg_data, sim->ioaddr + CNTL);
+
+ /*Loop for timeout*/
+ while (!(__raw_readl(sim->ioaddr + XMT_STATUS) & SIM_XMT_STATUS_GPCNT))
+ usleep_range(10, 20);
+ __raw_writel(SIM_XMT_STATUS_GPCNT, sim->ioaddr + XMT_STATUS);
+}
+
+void sim_clear_rx_buf(struct sim_t *sim)
+{
+ unsigned int i;
+ for (i = 0; i < SIM_RCV_BUFFER_SIZE; i++)
+ sim->rcv_buffer[i] = 0;
+ sim->rcv_count = 0;
+ sim->rcv_head = 0;
+}
+
+static long sim_ioctl(struct file *file,
+ unsigned int cmd, unsigned long arg)
+{
+ int ret, errval = SIM_OK;
+ unsigned long timeout;
+ u32 reg_data;
+ u32 delay;
+ u32 copy_cnt, val;
+ unsigned long flags;
+ unsigned char __user *atr_buffer;
+ unsigned char __user *xmt_buffer;
+ unsigned char __user *rcv_buffer;
+
+ struct sim_t *sim = (struct sim_t *) file->private_data;
+
+ pr_debug("%s entering.\n", __func__);
+ switch (cmd) {
+
+ case SIM_IOCTL_GET_ATR:
+ if (sim->present != SIM_PRESENT_DETECTED) {
+ pr_err("NO card ...\n");
+ errval = -SIM_E_NOCARD;
+ break;
+ };
+ sim->timeout = ATR_TIMEOUT * HZ;
+ val = 0;
+ ret = copy_to_user(&(((sim_atr_t *)arg)->size), &val,
+ sizeof((((sim_atr_t *)arg)->size)));
+
+ timeout = wait_for_completion_interruptible_timeout(&sim->xfer_done,
+ sim->timeout);
+ /*Disalbe the GPCNT timer and CWT timer right now*/
+ reg_data = __raw_readl(sim->ioaddr + CNTL);
+ reg_data &= ~(SIM_CNTL_GPCNT_CLK_SEL_MASK | SIM_CNTL_CWTEN);
+ __raw_writel(reg_data, sim->ioaddr + CNTL);
+
+ reg_data = __raw_readl(sim->ioaddr + INT_MASK);
+ reg_data |= (SIM_INT_MASK_GPCM | SIM_INT_MASK_CWTM);
+ __raw_writel(reg_data, sim->ioaddr + INT_MASK);
+
+ if (timeout == 0) {
+ pr_err("ATR timeout\n");
+ errval = -SIM_E_TIMEOUT;
+ break;
+ }
+
+ ret = copy_to_user(&(((sim_atr_t *)arg)->size), &sim->rcv_count,
+ sizeof(sim->rcv_count));
+ if (ret) {
+ pr_err("ATR ACCESS rcv_count Error, %d\n", ret);
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+
+ __get_user(atr_buffer, &((sim_atr_t __user *)arg)->atr_buffer);
+ ret = copy_to_user(atr_buffer, sim->rcv_buffer, sim->rcv_count);
+ if (ret) {
+ pr_err("ATR ACCESS buffer Error %d %d\n", sim->rcv_count, ret);
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+
+ ret = copy_to_user(&(((sim_atr_t *)arg)->errval), &sim->errval,
+ sizeof(sim->errval));
+ if (ret) {
+ pr_err("ATR ACCESS Error\n");
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+ sim->rcv_count = 0;
+ sim->rcv_head = 0;
+ sim->errval = 0;
+
+ break;
+
+ case SIM_IOCTL_DEACTIVATE:
+
+ sim_deactivate(sim);
+ break;
+
+ case SIM_IOCTL_COLD_RESET:
+ sim->present = SIM_PRESENT_REMOVED;
+ sim->state = SIM_STATE_REMOVED;
+ sim_reset_module(sim);
+ sim_data_reset(sim);
+ sim_start(sim);
+ sim_cold_reset(sim);
+
+ break;
+
+ case SIM_IOCTL_WARM_RESET:
+ sim_warm_reset(sim);
+ break;
+
+ case SIM_IOCTL_XMT:
+ ret = copy_from_user(&sim->xmt_remaining, &(((sim_xmt_t *)arg)->xmt_length),
+ sizeof(uint32_t));
+ if (ret || sim->xmt_remaining > SIM_XMT_BUFFER_SIZE) {
+ pr_err("copy error or to big buffer\n");
+ errval = -EINVAL;
+ break;
+ }
+
+ __get_user(xmt_buffer, &((sim_xmt_t *)arg)->xmt_buffer);
+ ret = copy_from_user(sim->xmt_buffer, xmt_buffer, sim->xmt_remaining);
+
+ if (ret) {
+ pr_err("Copy Error\n");
+ errval = ret;
+ break;
+ }
+
+ sim_clear_rx_buf(sim);
+ sim_set_cwt(sim, 0);
+ sim_set_bwt(sim, 0);
+ /*Flush the tx rx fifo*/
+ sim_flush_fifo(sim, 1, 1);
+ sim->xmt_pos = 0;
+ sim->errval = 0;
+
+ sim_xmt_fill_fifo(sim);
+ sim_set_baud_rate(sim);
+ if (sim->protocol_type == SIM_PROTOCOL_T0)
+ sim_set_nack(sim, 1);
+ else if (sim->protocol_type == SIM_PROTOCOL_T1)
+ sim_set_nack(sim, 0);
+ else {
+ pr_err("Invalid protocol not T0 or T1\n");
+ errval = -EINVAL;
+ break;
+ }
+
+ sim_set_timer_counter(sim);
+ sim_xmt_start(sim);
+ sim->state = SIM_STATE_XMTING;
+
+ sim->timeout = TX_TIMEOUT * HZ;
+ timeout = wait_for_completion_interruptible_timeout(&sim->xfer_done,
+ sim->timeout);
+ if (timeout == 0) {
+ /*Disable the NACK interruptand TX related interrupt*/
+ sim_tx_irq_disable(sim);
+ pr_err("tx timeout\n");
+ }
+
+ if (timeout == 0 || sim->state == SIM_STATE_XMT_ERROR) {
+ pr_err("TX error\n");
+ /*Disable timers*/
+ sim_set_cwt(sim, 0);
+ sim_set_bwt(sim, 0);
+ /*Disable TX*/
+ sim_set_tx(sim, 0);
+ /*Flush the tx fifos*/
+ sim_flush_fifo(sim, 1, 0);
+ if (timeout == 0)
+ errval = -SIM_E_TIMEOUT;
+ else
+ errval = -SIM_E_NACK;
+
+ ret = copy_to_user(&(((sim_atr_t *)arg)->errval), &sim->errval,
+ sizeof(sim->errval));
+ sim->errval = 0;
+ break;
+ }
+
+ /*Copy the error status to user space*/
+ ret = copy_to_user(&(((sim_atr_t *)arg)->errval), &sim->errval,
+ sizeof(sim->errval));
+ sim->last_is_tx = true;
+ /*Start RX*/
+ sim->errval = 0;
+ sim->state = SIM_STATE_RECEIVING;
+ sim_start_rcv(sim);
+
+ break;
+
+ case SIM_IOCTL_RCV:
+ if (sim->present != SIM_PRESENT_DETECTED) {
+ errval = -SIM_E_NOCARD;
+ break;
+ }
+ sim->is_fixed_len_rec = 0;
+ val = 0;
+ ret = copy_from_user(&sim->expected_rcv_cnt, &(((sim_rcv_t *)arg)->rcv_length),
+ sizeof(sim->expected_rcv_cnt));
+
+ /*Set the length to be 0 at first*/
+ ret = copy_to_user(&(((sim_rcv_t *)arg)->rcv_length), &val,
+ sizeof(val));
+
+ /*Set error value to be 0 at first*/
+ ret = copy_to_user(&(((sim_rcv_t *)arg)->errval), &val,
+ sizeof(val));
+
+ if (sim->expected_rcv_cnt != 0)
+ sim->is_fixed_len_rec = 1;
+
+ if (sim->is_fixed_len_rec && sim->rcv_count >= sim->expected_rcv_cnt)
+ goto copy_data;
+
+ if (sim->state != SIM_STATE_RECEIVING) {
+ sim_set_timer_counter(sim);
+ /*Enable CWT BWT*/
+ sim_set_cwt(sim, 1);
+ sim_set_bwt(sim, 1);
+ sim->state = SIM_STATE_RECEIVING;
+ sim_start_rcv(sim);
+ }
+
+ spin_lock_irqsave(&sim->lock, flags);
+ if (sim->is_fixed_len_rec && sim->rcv_count < sim->expected_rcv_cnt)
+ sim_change_rcv_threshold(sim);
+ spin_unlock_irqrestore(&sim->lock, flags);
+ sim->timeout = RX_TIMEOUT * HZ;
+ timeout = wait_for_completion_interruptible_timeout(&sim->xfer_done,
+ sim->timeout);
+
+ if (timeout == 0) {
+ pr_err("Receiving timeout\n");
+ sim_set_cwt(sim, 0);
+ sim_set_bwt(sim, 0);
+ sim_rx_irq_disable(sim);
+ errval = -SIM_E_TIMEOUT;
+ break;
+ }
+
+copy_data:
+ if (sim->is_fixed_len_rec)
+ copy_cnt = sim->rcv_count >= sim->expected_rcv_cnt ? sim->expected_rcv_cnt : sim->rcv_count;
+ else
+ copy_cnt = sim->rcv_count;
+
+ ret = copy_to_user(&(((sim_rcv_t *)arg)->rcv_length), &copy_cnt,
+ sizeof(copy_cnt));
+ if (ret) {
+ pr_err("ATR ACCESS Error\n");
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+
+ __get_user(rcv_buffer, &((sim_rcv_t *)arg)->rcv_buffer);
+ ret = copy_to_user(rcv_buffer, &sim->rcv_buffer[sim->rcv_head], copy_cnt);
+ if (ret) {
+ pr_err("ATR ACCESS Error\n");
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+
+ ret = copy_to_user(&(((sim_rcv_t *)arg)->errval), &sim->errval,
+ sizeof(sim->errval));
+ if (ret) {
+ pr_err("ATR ACCESS Error\n");
+ errval = -SIM_E_ACCESS;
+ break;
+ }
+ /*Reset the receiving count and errval*/
+ spin_lock_irqsave(&sim->lock, flags);
+ sim->rcv_head += copy_cnt;
+ sim->rcv_count -= copy_cnt;
+ sim->errval = 0;
+ spin_unlock_irqrestore(&sim->lock, flags);
+
+ sim->last_is_tx = false;
+
+ break;
+
+ case SIM_IOCTL_SET_PROTOCOL:
+ ret = copy_from_user(&sim->protocol_type, (int *)arg,
+ sizeof(int));
+ if (ret)
+ errval = -SIM_E_ACCESS;
+ break;
+
+ case SIM_IOCTL_SET_TIMING:
+ ret = copy_from_user(&sim->timing_data, (sim_timing_t *)arg,
+ sizeof(sim_timing_t));
+ if (ret) {
+ pr_err("Copy Error\n");
+ errval = ret;
+ break;
+ }
+
+ ret = sim_check_timing_data(&sim->timing_data);
+
+ if (ret)
+ errval = ret;
+
+ break;
+
+ case SIM_IOCTL_SET_BAUD:
+ ret = copy_from_user(&sim->baud_rate, (sim_baud_t *)arg,
+ sizeof(sim_baud_t));
+
+ if (ret) {
+ pr_err("Copy Error\n");
+ errval = ret;
+ break;
+ }
+
+ sim_check_baud_rate(&sim->baud_rate);
+
+ break;
+ case SIM_IOCTL_WAIT:
+ ret = copy_from_user(&delay, (unsigned int *)arg,
+ sizeof(unsigned int));
+
+ if (ret) {
+ pr_err("\nWait Copy Error\n");
+ errval = ret;
+ break;
+ }
+
+ sim_polling_delay(sim, delay);
+ break;
+
+ case SIM_IOCTL_GET_PRESENSE:
+ if (put_user(sim->present, (int *)arg))
+ errval = -SIM_E_ACCESS;
+ break;
+
+ case SIM_IOCTL_CARD_LOCK:
+ errval = sim_card_lock(sim);
+ break;
+
+ case SIM_IOCTL_CARD_EJECT:
+ errval = sim_card_eject(sim);
+ break;
+
+ };
+
+ return errval;
+};
+
+static int sim_open(struct inode *inode, struct file *file)
+{
+ int errval = SIM_OK;
+ struct sim_t *sim = dev_get_drvdata(sim_dev.parent);
+
+ file->private_data = sim;
+ spin_lock_init(&sim->lock);
+
+ pr_debug("%s entering.\n", __func__);
+ if (!sim->ioaddr) {
+ errval = -ENOMEM;
+ return errval;
+ }
+
+ if (!sim->open_cnt)
+ clk_prepare_enable(sim->clk);
+
+ sim->open_cnt = 1;
+
+ errval = sim_reset_module(sim);
+ sim_data_reset(sim);
+
+ return errval;
+};
+
+static int sim_release(struct inode *inode, struct file *file)
+{
+ u32 reg_data;
+ struct sim_t *sim = (struct sim_t *) file->private_data;
+
+ /* disable presense detection */
+ reg_data = __raw_readl(sim->ioaddr + sim->port_detect_reg);
+ __raw_writel(reg_data | SIM_PORT_DETECT_SDIM,
+ sim->ioaddr + sim->port_detect_reg);
+
+ if (sim->present != SIM_PRESENT_REMOVED)
+ sim_deactivate(sim);
+
+
+ if (sim->open_cnt)
+ clk_disable_unprepare(sim->clk);
+
+ sim->open_cnt = 0;
+
+ return 0;
+};
+
+static const struct file_operations sim_fops = {
+ .owner = THIS_MODULE,
+ .open = sim_open,
+ .release = sim_release,
+ .unlocked_ioctl = sim_ioctl,
+};
+
+static struct miscdevice sim_dev = {
+ MISC_DYNAMIC_MINOR,
+ "mxc_sim",
+ &sim_fops
+};
+
+static struct platform_device_id imx_sim_devtype[] = {
+ {
+ .name = "imx7d-sim",
+ .driver_data = 0,
+ }, {
+ .name = "imx6ul-sim",
+ .driver_data = SIM_QUIRK_TKT259347,
+ }, {
+ /* sentinel */
+ }
+};
+
+enum imx_sim_type {
+ IMX7D_SIM = 0,
+ IMX6UL_SIM,
+};
+
+static const struct of_device_id sim_imx_dt_ids[] = {
+ { .compatible = "fsl,imx7d-sim",
+ .data = &imx_sim_devtype[IMX7D_SIM], },
+ { .compatible = "fsl,imx6ul-sim",
+ .data = &imx_sim_devtype[IMX6UL_SIM], },
+ { /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, sim_imx_dt_ids);
+
+static int sim_probe(struct platform_device *pdev)
+{
+ int ret = 0;
+ const struct of_device_id *of_id;
+ struct sim_t *sim = NULL;
+ struct device_node *of_node = pdev->dev.of_node;
+
+ sim = devm_kzalloc(&pdev->dev, sizeof(struct sim_t),
+ GFP_KERNEL);
+ if (!sim) {
+ dev_err(&pdev->dev, "can't allocate enough memory\n");
+ return -ENOMEM;
+ }
+
+
+ of_id = of_match_device(sim_imx_dt_ids, &pdev->dev);
+ if (of_id)
+ pdev->id_entry = of_id->data;
+ else
+ return -EINVAL;
+
+ sim->clk_rate = FCLK_FREQ;
+ sim->open_cnt = 0;
+
+ sim->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!sim->res) {
+ pr_err("Can't get the MEMORY\n");
+ return -ENOMEM;
+ }
+ sim->ioaddr = devm_ioremap_resource(&pdev->dev, sim->res);
+ dev_dbg(&pdev->dev, "mapped base address: 0x%08x\n", (u32)sim->ioaddr);
+ if (IS_ERR(sim->ioaddr)) {
+ dev_err(&pdev->dev,
+ "failed to get ioremap base\n");
+ ret = PTR_ERR(sim->ioaddr);
+ return ret;
+ }
+
+ /* request the sim clk and sim_serial_clk */
+ sim->clk = devm_clk_get(&pdev->dev, "sim");
+ if (IS_ERR(sim->clk)) {
+ ret = PTR_ERR(sim->clk);
+ pr_err("Get CLK ERROR !\n");
+ return ret;
+ }
+ pr_debug("sim clock:%lu\n", clk_get_rate(sim->clk));
+
+ sim->ipb_irq = platform_get_irq(pdev, 0);
+ if (sim->ipb_irq < 0) {
+ dev_err(&pdev->dev, "No ipb irq line provided\n");
+ return -ENOENT;
+ }
+ if (devm_request_irq(&pdev->dev, sim->ipb_irq, sim_irq_handler,
+ 0, "mxc_sim_ipb", sim)) {
+ dev_err(&pdev->dev, "can't claim irq %d\n", sim->ipb_irq);
+ return -ENOENT;
+ }
+
+ sim->sven_low_active = of_property_read_bool(of_node,
+ "sven_low_active");
+
+ ret = of_property_read_u32(of_node, "port", &sim->port_index);
+ if (ret)
+ sim->port_index = 0;
+ sim->port_ctrl_reg = (sim->port_index == 0) ?
+ PORT0_CNTL : PORT1_CNTL;
+ sim->port_detect_reg = (sim->port_index == 0) ?
+ PORT0_DETECT : PORT1_DETECT;
+ sim->quirks = pdev->id_entry->driver_data;
+
+ platform_set_drvdata(pdev, sim);
+
+ /*
+ *@todo: Need to figure a better way if possible.
+ */
+ sim_dev.parent = &(pdev->dev);
+
+ misc_register(&sim_dev);
+
+ return 0;
+}
+
+static int sim_remove(struct platform_device *pdev)
+{
+ struct sim_t *sim = platform_get_drvdata(pdev);
+
+ if (sim->open_cnt)
+ clk_disable_unprepare(sim->clk);
+
+ misc_deregister(&sim_dev);
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int sim_suspend(struct platform_device *pdev, pm_message_t state)
+{
+ struct sim_t *sim = platform_get_drvdata(pdev);
+
+ if (sim->open_cnt)
+ clk_disable_unprepare(sim->clk);
+
+ pinctrl_pm_select_sleep_state(&pdev->dev);
+
+ return 0;
+}
+
+static int sim_resume(struct platform_device *pdev)
+{
+ struct sim_t *sim = platform_get_drvdata(pdev);
+
+ if (sim->open_cnt)
+ clk_prepare_enable(sim->clk);
+
+ pinctrl_pm_select_default_state(&pdev->dev);
+
+ return 0;
+}
+#else
+#define sim_suspend NULL
+#define sim_resume NULL
+#endif
+
+static struct platform_driver sim_driver = {
+ .driver = {
+ .name = DRIVER_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = sim_imx_dt_ids,
+ },
+ .probe = sim_probe,
+ .remove = sim_remove,
+ .suspend = sim_suspend,
+ .resume = sim_resume,
+ .id_table = imx_sim_devtype,
+};
+
+static int __init sim_drv_init(void)
+{
+ return platform_driver_register(&sim_driver);
+}
+
+static void __exit sim_drv_exit(void)
+{
+ platform_driver_unregister(&sim_driver);
+}
+
+module_init(sim_drv_init);
+module_exit(sim_drv_exit);
+
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_DESCRIPTION("MXC SIM Driver");
+MODULE_LICENSE("GPL");
+
diff --git a/drivers/mxc/vpu/Kconfig b/drivers/mxc/vpu/Kconfig
new file mode 100644
index 000000000000..520209601dbe
--- /dev/null
+++ b/drivers/mxc/vpu/Kconfig
@@ -0,0 +1,31 @@
+#
+# Codec configuration
+#
+
+menu "MXC VPU(Video Processing Unit) support"
+
+config MXC_VPU
+ tristate "Support for MXC VPU(Video Processing Unit)"
+ depends on (SOC_IMX27 || SOC_IMX5 || SOC_IMX6Q)
+ default y
+ ---help---
+ The VPU codec device provides codec function for H.264/MPEG4/H.263,
+ as well as MPEG2/VC-1/DivX on some platforms.
+
+config MXC_VPU_DEBUG
+ bool "MXC VPU debugging"
+ depends on MXC_VPU != n
+ help
+ This is an option for the developers; most people should
+ say N here. This enables MXC VPU driver debugging.
+
+config MX6_VPU_352M
+ bool "MX6 VPU 352M"
+ depends on MXC_VPU
+ default n
+ help
+ Increase VPU frequncy to 352M, the config will disable bus frequency
+ adjust dynamic, and CPU lowest setpoint will be 352Mhz.
+ This config is used for special VPU use case.
+
+endmenu
diff --git a/drivers/mxc/vpu/Makefile b/drivers/mxc/vpu/Makefile
new file mode 100644
index 000000000000..1a821f4921cb
--- /dev/null
+++ b/drivers/mxc/vpu/Makefile
@@ -0,0 +1,9 @@
+#
+# Makefile for the VPU drivers.
+#
+
+obj-$(CONFIG_MXC_VPU) += mxc_vpu.o
+
+ifeq ($(CONFIG_MXC_VPU_DEBUG),y)
+EXTRA_CFLAGS += -DDEBUG
+endif
diff --git a/drivers/mxc/vpu/mxc_vpu.c b/drivers/mxc/vpu/mxc_vpu.c
new file mode 100755
index 000000000000..32e4e34a05bb
--- /dev/null
+++ b/drivers/mxc/vpu/mxc_vpu.c
@@ -0,0 +1,1349 @@
+/*
+ * Copyright 2006-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file mxc_vpu.c
+ *
+ * @brief VPU system initialization and file operation implementation
+ *
+ * @ingroup VPU
+ */
+
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/stat.h>
+#include <linux/platform_device.h>
+#include <linux/kdev_t.h>
+#include <linux/dma-mapping.h>
+#include <linux/wait.h>
+#include <linux/list.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/fsl_devices.h>
+#include <linux/uaccess.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/workqueue.h>
+#include <linux/sched/signal.h>
+#include <linux/sched.h>
+#include <linux/vmalloc.h>
+#include <linux/regulator/consumer.h>
+#include <linux/page-flags.h>
+#include <linux/mm_types.h>
+#include <linux/types.h>
+#include <linux/memblock.h>
+#include <linux/memory.h>
+#include <linux/version.h>
+#include <asm/page.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+#include <linux/module.h>
+#include <linux/pm_runtime.h>
+#include <linux/sizes.h>
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
+#include <linux/iram_alloc.h>
+#include <mach/clock.h>
+#include <mach/hardware.h>
+#include <mach/mxc_vpu.h>
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+#include <linux/busfreq-imx.h>
+#include <linux/clk.h>
+#include <linux/genalloc.h>
+#include <linux/mxc_vpu.h>
+#include <linux/of.h>
+#include <linux/reset.h>
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+#include <mach/busfreq.h>
+#include <mach/common.h>
+#else
+#include <asm/sizes.h>
+#endif
+
+/* Define one new pgprot which combined uncached and XN(never executable) */
+#define pgprot_noncachedxn(prot) \
+ __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED | L_PTE_XN)
+
+struct vpu_priv {
+ struct fasync_struct *async_queue;
+ struct work_struct work;
+ struct workqueue_struct *workqueue;
+ struct mutex lock;
+};
+
+/* To track the allocated memory buffer */
+struct memalloc_record {
+ struct list_head list;
+ struct vpu_mem_desc mem;
+};
+
+struct iram_setting {
+ u32 start;
+ u32 end;
+};
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+static struct gen_pool *iram_pool;
+static u32 iram_base;
+#endif
+
+static LIST_HEAD(head);
+
+static int vpu_major;
+static int vpu_clk_usercount;
+static struct class *vpu_class;
+static struct vpu_priv vpu_data;
+static u8 open_count;
+static struct clk *vpu_clk;
+static struct vpu_mem_desc bitwork_mem = { 0 };
+static struct vpu_mem_desc pic_para_mem = { 0 };
+static struct vpu_mem_desc user_data_mem = { 0 };
+static struct vpu_mem_desc share_mem = { 0 };
+static struct vpu_mem_desc vshare_mem = { 0 };
+
+static void __iomem *vpu_base;
+static int vpu_ipi_irq;
+static u32 phy_vpu_base_addr;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
+static phys_addr_t top_address_DRAM;
+static struct mxc_vpu_platform_data *vpu_plat;
+#endif
+
+static struct device *vpu_dev;
+
+/* IRAM setting */
+static struct iram_setting iram;
+
+/* implement the blocking ioctl */
+static int irq_status;
+static int codec_done;
+static wait_queue_head_t vpu_queue;
+
+#ifdef CONFIG_SOC_IMX6Q
+#define MXC_VPU_HAS_JPU
+#endif
+
+#ifdef MXC_VPU_HAS_JPU
+static int vpu_jpu_irq;
+#endif
+
+#ifdef CONFIG_PM
+static unsigned int regBk[64];
+static unsigned int pc_before_suspend;
+#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+static struct regulator *vpu_regulator;
+#endif
+#endif
+static atomic_t clk_cnt_from_ioc = ATOMIC_INIT(0);
+
+#define READ_REG(x) readl_relaxed(vpu_base + x)
+#define WRITE_REG(val, x) writel_relaxed(val, vpu_base + x)
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+/* redirect to static functions */
+static int cpu_is_mx6dl(void)
+{
+ int ret;
+ ret = of_machine_is_compatible("fsl,imx6dl");
+ return ret;
+}
+
+static int cpu_is_mx6q(void)
+{
+ int ret;
+ ret = of_machine_is_compatible("fsl,imx6q");
+ return ret;
+}
+#endif
+
+static void vpu_reset(void)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+ int ret;
+
+ ret = device_reset(vpu_dev);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+ imx_src_reset_vpu();
+#else
+ if (vpu_plat->reset)
+ vpu_plat->reset();
+#endif
+}
+
+static long vpu_power_get(bool on)
+{
+ long ret = 0;
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
+ if (on) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
+ vpu_regulator = regulator_get(NULL, "cpu_vddvpu");
+ ret = IS_ERR(vpu_regulator);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+ vpu_regulator = devm_regulator_get(vpu_dev, "pu");
+ ret = IS_ERR(vpu_regulator);
+#endif
+ } else {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
+ if (!IS_ERR(vpu_regulator))
+ regulator_put(vpu_regulator);
+#endif
+ }
+#endif
+ return ret;
+}
+
+static void vpu_power_up(bool on)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+ if (on)
+ pm_runtime_get_sync(vpu_dev);
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0) || LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+ if (on) {
+ if (!IS_ERR(vpu_regulator)) {
+ if (regulator_enable(vpu_regulator))
+ dev_err(vpu_dev, "failed to power up vpu\n");
+ }
+ } else {
+ if (!IS_ERR(vpu_regulator)) {
+ if (regulator_disable(vpu_regulator))
+ dev_err(vpu_dev, "failed to power down vpu\n");
+ }
+ }
+#else
+ imx_gpc_power_up_pu(on);
+#endif
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+ if (!on)
+ pm_runtime_put_sync_suspend(vpu_dev);
+#endif
+}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+static int cpu_is_mx53(void)
+{
+ return 0;
+}
+
+static int cpu_is_mx51(void)
+{
+ return 0;
+}
+
+#define VM_RESERVED 0
+#endif
+
+/*!
+ * Private function to alloc dma buffer
+ * @return status 0 success.
+ */
+static int vpu_alloc_dma_buffer(struct vpu_mem_desc *mem)
+{
+ mem->cpu_addr = (unsigned long)
+ dma_alloc_coherent(vpu_dev, PAGE_ALIGN(mem->size),
+ (dma_addr_t *) (&mem->phy_addr),
+ GFP_DMA | GFP_KERNEL);
+ dev_dbg(vpu_dev, "[ALLOC] mem alloc cpu_addr = 0x%x\n", mem->cpu_addr);
+ if ((void *)(mem->cpu_addr) == NULL) {
+ dev_err(vpu_dev, "Physical memory allocation error!\n");
+ return -1;
+ }
+ return 0;
+}
+
+/*!
+ * Private function to free dma buffer
+ */
+static void vpu_free_dma_buffer(struct vpu_mem_desc *mem)
+{
+ if (mem->cpu_addr != 0) {
+ dma_free_coherent(vpu_dev, PAGE_ALIGN(mem->size),
+ (void *)mem->cpu_addr, mem->phy_addr);
+ }
+}
+
+/*!
+ * Private function to free buffers
+ * @return status 0 success.
+ */
+static int vpu_free_buffers(void)
+{
+ struct memalloc_record *rec, *n;
+ struct vpu_mem_desc mem;
+
+ list_for_each_entry_safe(rec, n, &head, list) {
+ mem = rec->mem;
+ if (mem.cpu_addr != 0) {
+ vpu_free_dma_buffer(&mem);
+ dev_dbg(vpu_dev, "[FREE] freed paddr=0x%08X\n", mem.phy_addr);
+ /* delete from list */
+ list_del(&rec->list);
+ kfree(rec);
+ }
+ }
+
+ return 0;
+}
+
+static inline void vpu_worker_callback(struct work_struct *w)
+{
+ struct vpu_priv *dev = container_of(w, struct vpu_priv,
+ work);
+
+ if (dev->async_queue)
+ kill_fasync(&dev->async_queue, SIGIO, POLL_IN);
+
+ irq_status = 1;
+ /*
+ * Clock is gated on when dec/enc started, gate it off when
+ * codec is done.
+ */
+ if (codec_done)
+ codec_done = 0;
+
+ wake_up_interruptible(&vpu_queue);
+}
+
+/*!
+ * @brief vpu interrupt handler
+ */
+static irqreturn_t vpu_ipi_irq_handler(int irq, void *dev_id)
+{
+ struct vpu_priv *dev = dev_id;
+ unsigned long reg;
+
+ reg = READ_REG(BIT_INT_REASON);
+ if (reg & 0x8)
+ codec_done = 1;
+ WRITE_REG(0x1, BIT_INT_CLEAR);
+
+ queue_work(dev->workqueue, &dev->work);
+
+ return IRQ_HANDLED;
+}
+
+/*!
+ * @brief vpu jpu interrupt handler
+ */
+#ifdef MXC_VPU_HAS_JPU
+static irqreturn_t vpu_jpu_irq_handler(int irq, void *dev_id)
+{
+ struct vpu_priv *dev = dev_id;
+ unsigned long reg;
+
+ reg = READ_REG(MJPEG_PIC_STATUS_REG);
+ if (reg & 0x3)
+ codec_done = 1;
+
+ queue_work(dev->workqueue, &dev->work);
+
+ return IRQ_HANDLED;
+}
+#endif
+
+/*!
+ * @brief check phy memory prepare to pass to vpu is valid or not, we
+ * already address some issue that if pass a wrong address to vpu
+ * (like virtual address), system will hang.
+ *
+ * @return true return is a valid phy memory address, false return not.
+ */
+bool vpu_is_valid_phy_memory(u32 paddr)
+{
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
+ if (paddr > top_address_DRAM)
+ return false;
+#endif
+
+ return true;
+}
+
+/*!
+ * @brief open function for vpu file operation
+ *
+ * @return 0 on success or negative error code on error
+ */
+static int vpu_open(struct inode *inode, struct file *filp)
+{
+
+ mutex_lock(&vpu_data.lock);
+
+ if (open_count++ == 0) {
+ vpu_power_up(true);
+
+#ifdef CONFIG_SOC_IMX6Q
+ clk_prepare(vpu_clk);
+ clk_enable(vpu_clk);
+ if (READ_REG(BIT_CUR_PC))
+ dev_dbg(vpu_dev, "Not power off before vpu open!\n");
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+#endif
+ }
+
+ filp->private_data = (void *)(&vpu_data);
+ mutex_unlock(&vpu_data.lock);
+ return 0;
+}
+
+/*!
+ * @brief IO ctrl function for vpu file operation
+ * @param cmd IO ctrl command
+ * @return 0 on success or negative error code on error
+ */
+static long vpu_ioctl(struct file *filp, u_int cmd,
+ u_long arg)
+{
+ int ret = 0;
+
+ switch (cmd) {
+ case VPU_IOC_PHYMEM_ALLOC:
+ {
+ struct memalloc_record *rec;
+
+ rec = kzalloc(sizeof(*rec), GFP_KERNEL);
+ if (!rec)
+ return -ENOMEM;
+
+ ret = copy_from_user(&(rec->mem),
+ (struct vpu_mem_desc *)arg,
+ sizeof(struct vpu_mem_desc));
+ if (ret) {
+ kfree(rec);
+ return -EFAULT;
+ }
+
+ dev_dbg(vpu_dev, "[ALLOC] mem alloc size = 0x%x\n",
+ rec->mem.size);
+
+ ret = vpu_alloc_dma_buffer(&(rec->mem));
+ if (ret == -1) {
+ kfree(rec);
+ dev_err(vpu_dev,
+ "Physical memory allocation error!\n");
+ break;
+ }
+ ret = copy_to_user((void __user *)arg, &(rec->mem),
+ sizeof(struct vpu_mem_desc));
+ if (ret) {
+ kfree(rec);
+ ret = -EFAULT;
+ break;
+ }
+
+ mutex_lock(&vpu_data.lock);
+ list_add(&rec->list, &head);
+ mutex_unlock(&vpu_data.lock);
+
+ break;
+ }
+ case VPU_IOC_PHYMEM_FREE:
+ {
+ struct memalloc_record *rec, *n;
+ struct vpu_mem_desc vpu_mem;
+
+ ret = copy_from_user(&vpu_mem,
+ (struct vpu_mem_desc *)arg,
+ sizeof(struct vpu_mem_desc));
+ if (ret)
+ return -EACCES;
+
+ dev_dbg(vpu_dev, "[FREE] mem freed cpu_addr = 0x%x\n",
+ vpu_mem.cpu_addr);
+ if ((void *)vpu_mem.cpu_addr != NULL)
+ vpu_free_dma_buffer(&vpu_mem);
+
+ mutex_lock(&vpu_data.lock);
+ list_for_each_entry_safe(rec, n, &head, list) {
+ if (rec->mem.cpu_addr == vpu_mem.cpu_addr) {
+ /* delete from list */
+ list_del(&rec->list);
+ kfree(rec);
+ break;
+ }
+ }
+ mutex_unlock(&vpu_data.lock);
+
+ break;
+ }
+ case VPU_IOC_WAIT4INT:
+ {
+ u_long timeout = (u_long) arg;
+ if (!wait_event_interruptible_timeout
+ (vpu_queue, irq_status != 0,
+ msecs_to_jiffies(timeout))) {
+ dev_warn(vpu_dev, "VPU blocking: timeout.\n");
+ ret = -ETIME;
+ } else if (signal_pending(current)) {
+ dev_warn(vpu_dev, "VPU interrupt received.\n");
+ ret = -ERESTARTSYS;
+ } else
+ irq_status = 0;
+ break;
+ }
+ case VPU_IOC_IRAM_SETTING:
+ {
+ ret = copy_to_user((void __user *)arg, &iram,
+ sizeof(struct iram_setting));
+ if (ret)
+ ret = -EFAULT;
+
+ break;
+ }
+ case VPU_IOC_CLKGATE_SETTING:
+ {
+ u32 clkgate_en;
+
+ if (get_user(clkgate_en, (u32 __user *) arg))
+ return -EFAULT;
+
+ if (clkgate_en) {
+ clk_prepare(vpu_clk);
+ clk_enable(vpu_clk);
+ atomic_inc(&clk_cnt_from_ioc);
+ } else {
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+ atomic_dec(&clk_cnt_from_ioc);
+ }
+
+ break;
+ }
+ case VPU_IOC_GET_SHARE_MEM:
+ {
+ mutex_lock(&vpu_data.lock);
+ if (share_mem.cpu_addr != 0) {
+ ret = copy_to_user((void __user *)arg,
+ &share_mem,
+ sizeof(struct vpu_mem_desc));
+ mutex_unlock(&vpu_data.lock);
+ break;
+ } else {
+ if (copy_from_user(&share_mem,
+ (struct vpu_mem_desc *)arg,
+ sizeof(struct vpu_mem_desc))) {
+ mutex_unlock(&vpu_data.lock);
+ return -EFAULT;
+ }
+ if (vpu_alloc_dma_buffer(&share_mem) == -1)
+ ret = -EFAULT;
+ else {
+ if (copy_to_user((void __user *)arg,
+ &share_mem,
+ sizeof(struct
+ vpu_mem_desc)))
+ ret = -EFAULT;
+ }
+ }
+ mutex_unlock(&vpu_data.lock);
+ break;
+ }
+ case VPU_IOC_REQ_VSHARE_MEM:
+ {
+ mutex_lock(&vpu_data.lock);
+ if (vshare_mem.cpu_addr != 0) {
+ ret = copy_to_user((void __user *)arg,
+ &vshare_mem,
+ sizeof(struct vpu_mem_desc));
+ mutex_unlock(&vpu_data.lock);
+ break;
+ } else {
+ if (copy_from_user(&vshare_mem,
+ (struct vpu_mem_desc *)arg,
+ sizeof(struct
+ vpu_mem_desc))) {
+ mutex_unlock(&vpu_data.lock);
+ return -EFAULT;
+ }
+ /* vmalloc shared memory if not allocated */
+ if (!vshare_mem.cpu_addr)
+ vshare_mem.cpu_addr =
+ (unsigned long)
+ vmalloc_user(vshare_mem.size);
+ if (copy_to_user
+ ((void __user *)arg, &vshare_mem,
+ sizeof(struct vpu_mem_desc)))
+ ret = -EFAULT;
+ }
+ mutex_unlock(&vpu_data.lock);
+ break;
+ }
+ case VPU_IOC_GET_WORK_ADDR:
+ {
+ if (bitwork_mem.cpu_addr != 0) {
+ ret =
+ copy_to_user((void __user *)arg,
+ &bitwork_mem,
+ sizeof(struct vpu_mem_desc));
+ break;
+ } else {
+ if (copy_from_user(&bitwork_mem,
+ (struct vpu_mem_desc *)arg,
+ sizeof(struct vpu_mem_desc)))
+ return -EFAULT;
+
+ if (vpu_alloc_dma_buffer(&bitwork_mem) == -1)
+ ret = -EFAULT;
+ else if (copy_to_user((void __user *)arg,
+ &bitwork_mem,
+ sizeof(struct
+ vpu_mem_desc)))
+ ret = -EFAULT;
+ }
+ break;
+ }
+ /*
+ * The following two ioctl is used when user allocates working buffer
+ * and register it to vpu driver.
+ */
+ case VPU_IOC_QUERY_BITWORK_MEM:
+ {
+ if (copy_to_user((void __user *)arg,
+ &bitwork_mem,
+ sizeof(struct vpu_mem_desc)))
+ ret = -EFAULT;
+ break;
+ }
+ case VPU_IOC_SET_BITWORK_MEM:
+ {
+ if (copy_from_user(&bitwork_mem,
+ (struct vpu_mem_desc *)arg,
+ sizeof(struct vpu_mem_desc)))
+ ret = -EFAULT;
+ break;
+ }
+ case VPU_IOC_SYS_SW_RESET:
+ {
+ vpu_reset();
+ break;
+ }
+ case VPU_IOC_REG_DUMP:
+ break;
+ case VPU_IOC_PHYMEM_DUMP:
+ break;
+ case VPU_IOC_PHYMEM_CHECK:
+ {
+ struct vpu_mem_desc check_memory;
+ ret = copy_from_user(&check_memory,
+ (void __user *)arg,
+ sizeof(struct vpu_mem_desc));
+ if (ret != 0) {
+ dev_err(vpu_dev, "copy from user failure:%d\n", ret);
+ ret = -EFAULT;
+ break;
+ }
+ ret = vpu_is_valid_phy_memory((u32)check_memory.phy_addr);
+
+ dev_dbg(vpu_dev, "vpu: memory phy:0x%x %s phy memory\n",
+ check_memory.phy_addr, (ret ? "is" : "isn't"));
+ /* borrow .size to pass back the result. */
+ check_memory.size = ret;
+ ret = copy_to_user((void __user *)arg, &check_memory,
+ sizeof(struct vpu_mem_desc));
+ if (ret) {
+ ret = -EFAULT;
+ break;
+ }
+ break;
+ }
+ case VPU_IOC_LOCK_DEV:
+ {
+ u32 lock_en;
+
+ if (get_user(lock_en, (u32 __user *) arg))
+ return -EFAULT;
+
+ if (lock_en)
+ mutex_lock(&vpu_data.lock);
+ else
+ mutex_unlock(&vpu_data.lock);
+
+ break;
+ }
+ default:
+ {
+ dev_err(vpu_dev, "No such IOCTL, cmd is %d\n", cmd);
+ ret = -EINVAL;
+ break;
+ }
+ }
+ return ret;
+}
+
+/*!
+ * @brief Release function for vpu file operation
+ * @return 0 on success or negative error code on error
+ */
+static int vpu_release(struct inode *inode, struct file *filp)
+{
+ int i;
+ unsigned long timeout;
+
+ mutex_lock(&vpu_data.lock);
+
+ if (open_count > 0 && !(--open_count)) {
+
+ /* Wait for vpu go to idle state */
+ clk_prepare(vpu_clk);
+ clk_enable(vpu_clk);
+ if (READ_REG(BIT_CUR_PC)) {
+
+ timeout = jiffies + HZ;
+ while (READ_REG(BIT_BUSY_FLAG)) {
+ msleep(1);
+ if (time_after(jiffies, timeout)) {
+ dev_warn(vpu_dev, "VPU timeout during release\n");
+ break;
+ }
+ }
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+
+ /* Clean up interrupt */
+ cancel_work_sync(&vpu_data.work);
+ flush_workqueue(vpu_data.workqueue);
+ irq_status = 0;
+
+ clk_prepare(vpu_clk);
+ clk_enable(vpu_clk);
+ if (READ_REG(BIT_BUSY_FLAG)) {
+
+ if (cpu_is_mx51() || cpu_is_mx53()) {
+ dev_err(vpu_dev,
+ "fatal error: can't gate/power off when VPU is busy\n");
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+ mutex_unlock(&vpu_data.lock);
+ return -EFAULT;
+ }
+
+#ifdef CONFIG_SOC_IMX6Q
+ if (cpu_is_mx6dl() || cpu_is_mx6q()) {
+ WRITE_REG(0x11, 0x10F0);
+ timeout = jiffies + HZ;
+ while (READ_REG(0x10F4) != 0x77) {
+ msleep(1);
+ if (time_after(jiffies, timeout))
+ break;
+ }
+
+ if (READ_REG(0x10F4) != 0x77) {
+ dev_err(vpu_dev,
+ "fatal error: can't gate/power off when VPU is busy\n");
+ WRITE_REG(0x0, 0x10F0);
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+ mutex_unlock(&vpu_data.lock);
+ return -EFAULT;
+ } else
+ vpu_reset();
+ }
+#endif
+ }
+ }
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+
+ vpu_free_buffers();
+
+ /* Free shared memory when vpu device is idle */
+ vpu_free_dma_buffer(&share_mem);
+ share_mem.cpu_addr = 0;
+ vfree((void *)vshare_mem.cpu_addr);
+ vshare_mem.cpu_addr = 0;
+
+ vpu_clk_usercount = atomic_read(&clk_cnt_from_ioc);
+ for (i = 0; i < vpu_clk_usercount; i++) {
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+ atomic_dec(&clk_cnt_from_ioc);
+ }
+
+ vpu_power_up(false);
+ }
+ mutex_unlock(&vpu_data.lock);
+
+ return 0;
+}
+
+/*!
+ * @brief fasync function for vpu file operation
+ * @return 0 on success or negative error code on error
+ */
+static int vpu_fasync(int fd, struct file *filp, int mode)
+{
+ struct vpu_priv *dev = (struct vpu_priv *)filp->private_data;
+ return fasync_helper(fd, filp, mode, &dev->async_queue);
+}
+
+/*!
+ * @brief memory map function of harware registers for vpu file operation
+ * @return 0 on success or negative error code on error
+ */
+static int vpu_map_hwregs(struct file *fp, struct vm_area_struct *vm)
+{
+ unsigned long pfn;
+
+ vm->vm_flags |= VM_IO | VM_RESERVED;
+ /*
+ * Since vpu registers have been mapped with ioremap() at probe
+ * which L_PTE_XN is 1, and the same physical address must be
+ * mapped multiple times with same type, so set L_PTE_XN to 1 here.
+ * Otherwise, there may be unexpected result in video codec.
+ */
+ vm->vm_page_prot = pgprot_noncachedxn(vm->vm_page_prot);
+ pfn = phy_vpu_base_addr >> PAGE_SHIFT;
+ dev_dbg(vpu_dev, "size=0x%x, page no.=0x%x\n",
+ (int)(vm->vm_end - vm->vm_start), (int)pfn);
+ return remap_pfn_range(vm, vm->vm_start, pfn, vm->vm_end - vm->vm_start,
+ vm->vm_page_prot) ? -EAGAIN : 0;
+}
+
+/*!
+ * @brief memory map function of memory for vpu file operation
+ * @return 0 on success or negative error code on error
+ */
+static int vpu_map_dma_mem(struct file *fp, struct vm_area_struct *vm)
+{
+ int request_size;
+ request_size = vm->vm_end - vm->vm_start;
+
+ dev_dbg(vpu_dev, "start=0x%x, pgoff=0x%x, size=0x%x\n",
+ (unsigned int)(vm->vm_start), (unsigned int)(vm->vm_pgoff),
+ request_size);
+
+ vm->vm_flags |= VM_IO | VM_RESERVED;
+ vm->vm_page_prot = pgprot_writecombine(vm->vm_page_prot);
+
+ return remap_pfn_range(vm, vm->vm_start, vm->vm_pgoff,
+ request_size, vm->vm_page_prot) ? -EAGAIN : 0;
+
+}
+
+/* !
+ * @brief memory map function of vmalloced share memory
+ * @return 0 on success or negative error code on error
+ */
+static int vpu_map_vshare_mem(struct file *fp, struct vm_area_struct *vm)
+{
+ int ret = -EINVAL;
+
+ ret = remap_vmalloc_range(vm, (void *)(vm->vm_pgoff << PAGE_SHIFT), 0);
+ vm->vm_flags |= VM_IO;
+
+ return ret;
+}
+/*!
+ * @brief memory map interface for vpu file operation
+ * @return 0 on success or negative error code on error
+ */
+static int vpu_mmap(struct file *fp, struct vm_area_struct *vm)
+{
+ unsigned long offset;
+
+ offset = vshare_mem.cpu_addr >> PAGE_SHIFT;
+
+ if (vm->vm_pgoff && (vm->vm_pgoff == offset))
+ return vpu_map_vshare_mem(fp, vm);
+ else if (vm->vm_pgoff)
+ return vpu_map_dma_mem(fp, vm);
+ else
+ return vpu_map_hwregs(fp, vm);
+}
+
+const struct file_operations vpu_fops = {
+ .owner = THIS_MODULE,
+ .open = vpu_open,
+ .unlocked_ioctl = vpu_ioctl,
+ .release = vpu_release,
+ .fasync = vpu_fasync,
+ .mmap = vpu_mmap,
+};
+
+/*!
+ * This function is called by the driver framework to initialize the vpu device.
+ * @param dev The device structure for the vpu passed in by the framework.
+ * @return 0 on success or negative error code on error
+ */
+static int vpu_dev_probe(struct platform_device *pdev)
+{
+ int err = 0;
+ struct device *temp_class;
+ struct resource *res;
+ unsigned long addr = 0;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+ struct device_node *np = pdev->dev.of_node;
+ u32 iramsize;
+
+ err = of_property_read_u32(np, "iramsize", (u32 *)&iramsize);
+ if (!err && iramsize)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+ {
+ iram_pool = of_gen_pool_get(np, "iram", 0);
+ if (!iram_pool) {
+ dev_err(&pdev->dev, "iram pool not available\n");
+ return -ENOMEM;
+ }
+
+ iram_base = gen_pool_alloc(iram_pool, iramsize);
+ if (!iram_base) {
+ dev_err(&pdev->dev, "unable to alloc iram\n");
+ return -ENOMEM;
+ }
+
+ addr = gen_pool_virt_to_phys(iram_pool, iram_base);
+ }
+#else
+ iram_alloc(iramsize, &addr);
+#endif
+ if (addr == 0)
+ iram.start = iram.end = 0;
+ else {
+ iram.start = addr;
+ iram.end = addr + iramsize - 1;
+ }
+#else
+
+ vpu_plat = pdev->dev.platform_data;
+
+ if (vpu_plat && vpu_plat->iram_enable && vpu_plat->iram_size)
+ iram_alloc(vpu_plat->iram_size, &addr);
+ if (addr == 0)
+ iram.start = iram.end = 0;
+ else {
+ iram.start = addr;
+ iram.end = addr + vpu_plat->iram_size - 1;
+ }
+#endif
+
+ vpu_dev = &pdev->dev;
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vpu_regs");
+ if (!res) {
+ dev_err(vpu_dev, "vpu: unable to get vpu base addr\n");
+ return -ENODEV;
+ }
+ phy_vpu_base_addr = res->start;
+ vpu_base = ioremap(res->start, res->end - res->start);
+
+ vpu_major = register_chrdev(vpu_major, "mxc_vpu", &vpu_fops);
+ if (vpu_major < 0) {
+ dev_err(vpu_dev, "vpu: unable to get a major for VPU\n");
+ err = -EBUSY;
+ goto error;
+ }
+
+ vpu_class = class_create(THIS_MODULE, "mxc_vpu");
+ if (IS_ERR(vpu_class)) {
+ err = PTR_ERR(vpu_class);
+ goto err_out_chrdev;
+ }
+
+ temp_class = device_create(vpu_class, NULL, MKDEV(vpu_major, 0),
+ NULL, "mxc_vpu");
+ if (IS_ERR(temp_class)) {
+ err = PTR_ERR(temp_class);
+ goto err_out_class;
+ }
+
+ vpu_clk = clk_get(&pdev->dev, "vpu_clk");
+ if (IS_ERR(vpu_clk)) {
+ err = -ENOENT;
+ goto err_out_class;
+ }
+
+ vpu_ipi_irq = platform_get_irq_byname(pdev, "vpu_ipi_irq");
+ if (vpu_ipi_irq < 0) {
+ dev_err(vpu_dev, "vpu: unable to get vpu interrupt\n");
+ err = -ENXIO;
+ goto err_out_class;
+ }
+ err = request_irq(vpu_ipi_irq, vpu_ipi_irq_handler, 0, "VPU_CODEC_IRQ",
+ (void *)(&vpu_data));
+ if (err)
+ goto err_out_class;
+ if (vpu_power_get(true)) {
+ if (!(cpu_is_mx51() || cpu_is_mx53())) {
+ dev_err(vpu_dev, "failed to get vpu power\n");
+ goto err_out_class;
+ } else {
+ /* regulator_get will return error on MX5x,
+ * just igore it everywhere*/
+ dev_warn(vpu_dev, "failed to get vpu power\n");
+ }
+ }
+
+#ifdef MXC_VPU_HAS_JPU
+ vpu_jpu_irq = platform_get_irq_byname(pdev, "vpu_jpu_irq");
+ if (vpu_jpu_irq < 0) {
+ dev_err(vpu_dev, "vpu: unable to get vpu jpu interrupt\n");
+ err = -ENXIO;
+ free_irq(vpu_ipi_irq, &vpu_data);
+ goto err_out_class;
+ }
+ err = request_irq(vpu_jpu_irq, vpu_jpu_irq_handler, IRQF_TRIGGER_RISING,
+ "VPU_JPG_IRQ", (void *)(&vpu_data));
+ if (err) {
+ free_irq(vpu_ipi_irq, &vpu_data);
+ goto err_out_class;
+ }
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+ pm_runtime_enable(&pdev->dev);
+#endif
+
+ vpu_data.workqueue = create_workqueue("vpu_wq");
+ INIT_WORK(&vpu_data.work, vpu_worker_callback);
+ mutex_init(&vpu_data.lock);
+ dev_info(vpu_dev, "VPU initialized\n");
+ goto out;
+
+err_out_class:
+ device_destroy(vpu_class, MKDEV(vpu_major, 0));
+ class_destroy(vpu_class);
+err_out_chrdev:
+ unregister_chrdev(vpu_major, "mxc_vpu");
+error:
+ iounmap(vpu_base);
+out:
+ return err;
+}
+
+static int vpu_dev_remove(struct platform_device *pdev)
+{
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+ pm_runtime_disable(&pdev->dev);
+#endif
+ free_irq(vpu_ipi_irq, &vpu_data);
+#ifdef MXC_VPU_HAS_JPU
+ free_irq(vpu_jpu_irq, &vpu_data);
+#endif
+ cancel_work_sync(&vpu_data.work);
+ flush_workqueue(vpu_data.workqueue);
+ destroy_workqueue(vpu_data.workqueue);
+
+ iounmap(vpu_base);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+ if (iram.start)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+ gen_pool_free(iram_pool, iram_base, iram.end-iram.start+1);
+#else
+ iram_free(iram.start, iram.end-iram.start+1);
+#endif
+#else
+ if (vpu_plat && vpu_plat->iram_enable && vpu_plat->iram_size)
+ iram_free(iram.start, vpu_plat->iram_size);
+#endif
+
+ vpu_power_get(false);
+ return 0;
+}
+
+#ifdef CONFIG_PM
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+static int __maybe_unused vpu_suspend(struct device *dev)
+#else
+static int vpu_suspend(struct platform_device *pdev, pm_message_t state)
+#endif
+{
+ int i;
+ unsigned long timeout;
+
+ mutex_lock(&vpu_data.lock);
+ if (open_count == 0) {
+ /* VPU is released (all instances are freed),
+ * clock is already off, context is no longer needed,
+ * power is already off on MX6,
+ * gate power on MX51 */
+ if (cpu_is_mx51()) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
+ if (vpu_plat->pg)
+ vpu_plat->pg(1);
+#endif
+ }
+ } else {
+ /* Wait for vpu go to idle state, suspect vpu cannot be changed
+ to idle state after about 1 sec */
+ timeout = jiffies + HZ;
+ clk_prepare(vpu_clk);
+ clk_enable(vpu_clk);
+ while (READ_REG(BIT_BUSY_FLAG)) {
+ msleep(1);
+ if (time_after(jiffies, timeout)) {
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+ mutex_unlock(&vpu_data.lock);
+ return -EAGAIN;
+ }
+ }
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+
+ /* Make sure clock is disabled before suspend */
+ vpu_clk_usercount = atomic_read(&clk_cnt_from_ioc);
+ for (i = 0; i < vpu_clk_usercount; i++) {
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+ }
+
+ if (cpu_is_mx53()) {
+ mutex_unlock(&vpu_data.lock);
+ return 0;
+ }
+
+ if (bitwork_mem.cpu_addr != 0) {
+ clk_prepare(vpu_clk);
+ clk_enable(vpu_clk);
+ /* Save 64 registers from BIT_CODE_BUF_ADDR */
+ for (i = 0; i < 64; i++)
+ regBk[i] = READ_REG(BIT_CODE_BUF_ADDR + (i * 4));
+ pc_before_suspend = READ_REG(BIT_CUR_PC);
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+ }
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
+ if (vpu_plat->pg)
+ vpu_plat->pg(1);
+#endif
+
+ /* If VPU is working before suspend, disable
+ * regulator to make usecount right. */
+ vpu_power_up(false);
+ }
+
+ mutex_unlock(&vpu_data.lock);
+ return 0;
+}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+static int __maybe_unused vpu_resume(struct device *dev)
+#else
+static int vpu_resume(struct platform_device *pdev)
+#endif
+{
+ int i;
+
+ mutex_lock(&vpu_data.lock);
+ if (open_count == 0) {
+ /* VPU is released (all instances are freed),
+ * clock should be kept off, context is no longer needed,
+ * power should be kept off on MX6,
+ * disable power gating on MX51 */
+ if (cpu_is_mx51()) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
+ if (vpu_plat->pg)
+ vpu_plat->pg(0);
+#endif
+ }
+ } else {
+ if (cpu_is_mx53())
+ goto recover_clk;
+
+ /* If VPU is working before suspend, enable
+ * regulator to make usecount right. */
+ vpu_power_up(true);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
+ if (vpu_plat->pg)
+ vpu_plat->pg(0);
+#endif
+
+ if (bitwork_mem.cpu_addr != 0) {
+ u32 *p = (u32 *) bitwork_mem.cpu_addr;
+ u32 data, pc;
+ u16 data_hi;
+ u16 data_lo;
+
+ clk_prepare(vpu_clk);
+ clk_enable(vpu_clk);
+
+ pc = READ_REG(BIT_CUR_PC);
+ if (pc) {
+ dev_warn(vpu_dev, "Not power off after suspend (PC=0x%x)\n", pc);
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+ goto recover_clk;
+ }
+
+ /* Restore registers */
+ for (i = 0; i < 64; i++)
+ WRITE_REG(regBk[i], BIT_CODE_BUF_ADDR + (i * 4));
+
+ WRITE_REG(0x0, BIT_RESET_CTRL);
+ WRITE_REG(0x0, BIT_CODE_RUN);
+ /* MX6 RTL has a bug not to init MBC_SET_SUBBLK_EN on reset */
+#ifdef CONFIG_SOC_IMX6Q
+ WRITE_REG(0x0, MBC_SET_SUBBLK_EN);
+#endif
+
+ /*
+ * Re-load boot code, from the codebuffer in external RAM.
+ * Thankfully, we only need 4096 bytes, same for all platforms.
+ */
+ for (i = 0; i < 2048; i += 4) {
+ data = p[(i / 2) + 1];
+ data_hi = (data >> 16) & 0xFFFF;
+ data_lo = data & 0xFFFF;
+ WRITE_REG((i << 16) | data_hi, BIT_CODE_DOWN);
+ WRITE_REG(((i + 1) << 16) | data_lo,
+ BIT_CODE_DOWN);
+
+ data = p[i / 2];
+ data_hi = (data >> 16) & 0xFFFF;
+ data_lo = data & 0xFFFF;
+ WRITE_REG(((i + 2) << 16) | data_hi,
+ BIT_CODE_DOWN);
+ WRITE_REG(((i + 3) << 16) | data_lo,
+ BIT_CODE_DOWN);
+ }
+
+ if (pc_before_suspend) {
+ WRITE_REG(0x1, BIT_BUSY_FLAG);
+ WRITE_REG(0x1, BIT_CODE_RUN);
+ while (READ_REG(BIT_BUSY_FLAG))
+ ;
+ } else {
+ dev_warn(vpu_dev, "PC=0 before suspend\n");
+ }
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+ }
+
+recover_clk:
+ /* Recover vpu clock */
+ for (i = 0; i < vpu_clk_usercount; i++) {
+ clk_prepare(vpu_clk);
+ clk_enable(vpu_clk);
+ }
+ }
+
+ mutex_unlock(&vpu_data.lock);
+ return 0;
+}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+static int vpu_runtime_suspend(struct device *dev)
+{
+ release_bus_freq(BUS_FREQ_HIGH);
+ return 0;
+}
+
+static int vpu_runtime_resume(struct device *dev)
+{
+ request_bus_freq(BUS_FREQ_HIGH);
+ return 0;
+}
+
+static const struct dev_pm_ops vpu_pm_ops = {
+ SET_RUNTIME_PM_OPS(vpu_runtime_suspend, vpu_runtime_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(vpu_suspend, vpu_resume)
+};
+#endif
+
+#else
+#define vpu_suspend NULL
+#define vpu_resume NULL
+#endif /* !CONFIG_PM */
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+static const struct of_device_id vpu_of_match[] = {
+ { .compatible = "fsl,imx6-vpu", },
+ {/* sentinel */}
+};
+MODULE_DEVICE_TABLE(of, vpu_of_match);
+#endif
+
+/*! Driver definition
+ *
+ */
+static struct platform_driver mxcvpu_driver = {
+ .driver = {
+ .name = "mxc_vpu",
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
+ .of_match_table = vpu_of_match,
+#ifdef CONFIG_PM
+ .pm = &vpu_pm_ops,
+#endif
+#endif
+ },
+ .probe = vpu_dev_probe,
+ .remove = vpu_dev_remove,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
+ .suspend = vpu_suspend,
+ .resume = vpu_resume,
+#endif
+};
+
+static int __init vpu_init(void)
+{
+ int ret = platform_driver_register(&mxcvpu_driver);
+
+ init_waitqueue_head(&vpu_queue);
+
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 5, 0)
+ memblock_analyze();
+ top_address_DRAM = memblock_end_of_DRAM_with_reserved();
+#endif
+
+ return ret;
+}
+
+static void __exit vpu_exit(void)
+{
+ if (vpu_major > 0) {
+ device_destroy(vpu_class, MKDEV(vpu_major, 0));
+ class_destroy(vpu_class);
+ unregister_chrdev(vpu_major, "mxc_vpu");
+ vpu_major = 0;
+ }
+
+ vpu_free_dma_buffer(&bitwork_mem);
+ vpu_free_dma_buffer(&pic_para_mem);
+ vpu_free_dma_buffer(&user_data_mem);
+
+ /* reset VPU state */
+ vpu_power_up(true);
+ clk_prepare(vpu_clk);
+ clk_enable(vpu_clk);
+ vpu_reset();
+ clk_disable(vpu_clk);
+ clk_unprepare(vpu_clk);
+ vpu_power_up(false);
+
+ clk_put(vpu_clk);
+
+ platform_driver_unregister(&mxcvpu_driver);
+ return;
+}
+
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_DESCRIPTION("Linux VPU driver for Freescale i.MX/MXC");
+MODULE_LICENSE("GPL");
+
+module_init(vpu_init);
+module_exit(vpu_exit);
diff --git a/drivers/mxc/vpu_malone/Kconfig b/drivers/mxc/vpu_malone/Kconfig
new file mode 100644
index 000000000000..39bca920f7a4
--- /dev/null
+++ b/drivers/mxc/vpu_malone/Kconfig
@@ -0,0 +1,20 @@
+#
+# Codec configuration
+#
+
+menu "MXC VPU(Video Processing Unit) MALONE DECODER support"
+
+config MXC_VPU_MALONE
+ tristate "Support for MXC VPU(Video Processing Unit) MALONE B0 DECODER"
+ default y
+ ---help---
+ The VPU codec device provides codec function for H.265 H.264 MPEG2 MPEG4 etc.
+
+config MXC_VPU_MALONE_DEBUG
+ bool "MXC VPU MALONE debugging"
+ depends on MXC_VPU_MALONE != n
+ help
+ This is an option for the developers; most people should
+ say N here. This enables MXC VPU driver debugging.
+
+endmenu
diff --git a/drivers/mxc/vpu_malone/Makefile b/drivers/mxc/vpu_malone/Makefile
new file mode 100644
index 000000000000..fec4d43b361f
--- /dev/null
+++ b/drivers/mxc/vpu_malone/Makefile
@@ -0,0 +1,19 @@
+##
+## Makefile for the VPU and M0 driver
+##
+DEFINES += -D REBOOT=1 \
+ -D BOOT_ARCH=1
+
+EXTRA_CFLAGS += $(DEFINES)
+
+obj-$(CONFIG_MXC_VPU_MALONE) = vpu-malone.o
+vpu-malone-objs = vpu_b0.o \
+ vpu_rpc.o \
+ insert_startcode.o \
+ vpu_debug_log.o \
+ vpu_ts.o \
+ vpu_mu.o \
+ vpu_pm.o
+
+clean:
+ rm -rf $(vpu-malone-objs)
diff --git a/drivers/mxc/vpu_malone/insert_startcode.c b/drivers/mxc/vpu_malone/insert_startcode.c
new file mode 100644
index 000000000000..de8e1f78bbaa
--- /dev/null
+++ b/drivers/mxc/vpu_malone/insert_startcode.c
@@ -0,0 +1,776 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file insert_startcode.c
+ *
+ * copyright here may be changed later
+ *
+ *
+ */
+#include "insert_startcode.h"
+// Global VC1 ID and version
+u_int32 uVC1CodecID = 0x10; // Simple = 0x10, Main = 0x11
+u_int32 uVC1VersionID = 1;
+
+static int insert_RCV_seqhdr(unsigned char *pHeader, u_int32 *pHeaderLen, unsigned char *src,
+ u_int32 nFrameSize, u_int32 nWidth, u_int32 nHeight, int *pNoError)
+{
+ int nHeaderLen;
+
+ unsigned int nValue;
+ unsigned int HdrExtDataLen;
+ int i = 0;
+ int profile;
+
+ nHeaderLen = RCV_HEADER_LEN;
+
+ //Number of Frames, Header Extension Bit, Codec Version
+ nValue = RCV_NUM_FRAMES | RCV_SET_HDR_EXT | RCV_CODEC_VERSION;
+ pHeader[i++] = (unsigned char)nValue;
+ pHeader[i++] = (unsigned char)(nValue >> 8);
+ pHeader[i++] = (unsigned char)(nValue >> 16);
+#if 0 //1 ???
+ pHeader[i++] = 0xC5;
+#else
+ pHeader[i++] = (unsigned char)(nValue >> 24);
+#endif
+
+ //Header Extension Size
+ //ASF Parser gives 5 bytes whereas the VPU expects only 4 bytes, so limiting it
+ HdrExtDataLen = 4;
+ pHeader[i++] = (unsigned char)HdrExtDataLen;
+ pHeader[i++] = (unsigned char)(HdrExtDataLen >> 8);
+ pHeader[i++] = (unsigned char)(HdrExtDataLen >> 16);
+ pHeader[i++] = (unsigned char)(HdrExtDataLen >> 24);
+
+ profile = (*src)>>4;
+ if ((profile != 0) && (profile != 4) && (profile != 12)) {
+ //it is reasonable to return error immediately since only one sequence header inserted in whole rcv clip
+ *pNoError = 0;
+ }
+ memcpy(pHeader+i, src, HdrExtDataLen);
+ i += HdrExtDataLen;
+
+ //Height
+ pHeader[i++] = (unsigned char)nHeight;
+ pHeader[i++] = (unsigned char)(((nHeight >> 8) & 0xff));
+ pHeader[i++] = (unsigned char)(((nHeight >> 16) & 0xff));
+ pHeader[i++] = (unsigned char)(((nHeight >> 24) & 0xff));
+ //Width
+ pHeader[i++] = (unsigned char)nWidth;
+ pHeader[i++] = (unsigned char)(((nWidth >> 8) & 0xff));
+ pHeader[i++] = (unsigned char)(((nWidth >> 16) & 0xff));
+ pHeader[i++] = (unsigned char)(((nWidth >> 24) & 0xff));
+
+ //Frame Size
+ pHeader[i++] = (unsigned char)nFrameSize;
+ pHeader[i++] = (unsigned char)(nFrameSize >> 8);
+ pHeader[i++] = (unsigned char)(nFrameSize >> 16);
+#if 0 //1 ???
+ pHeader[i++] = (unsigned char)((nFrameSize >> 24));
+#else
+ pHeader[i++] = (unsigned char)((nFrameSize >> 24) | 0x80);
+#endif
+
+ *pHeaderLen = nHeaderLen;
+
+ return 1;
+}
+
+static int insert_RCV_pichdr(unsigned char *pHeader, int *pHeaderLen, unsigned int nInSize)
+{
+ pHeader[0] = (unsigned char)nInSize;
+ pHeader[1] = (unsigned char)(nInSize >> 8);
+ pHeader[2] = (unsigned char)(nInSize >> 16);
+ pHeader[3] = (unsigned char)(nInSize >> 24);
+ *pHeaderLen = 4;
+
+ return 1;
+}
+
+/*
+ * Byte 0-3: Startcode
+ * Byte 4: Payload length bits[23:16]
+ * Byte 5: Payload length bits[15:8]
+ * Byte 6: 0x4e
+ * Byte 7: Payload length bits[7:0]
+ * Byte 8: Codec ID Non-zero
+ * Byte 9: Codec Version ID Non-zero
+ * Byte 10: Picture Width bits[15:8]
+ * Byte 11: Picture Width bits[7:0]
+ * Byte 12: 0x58
+ * Byte 13: Picture Height bits[15:8]
+ * Byte 14: Picture Height bits[7:0]
+ * Byte 15: 0x50
+ */
+
+static void insert_payload_header_vc1(u_int8 *dst, u_int32 uScodeType, u_int32 uPayloadSize, u_int32 uWidth, u_int32 uHeight)
+{
+ // Startcode
+ dst[0] = 0x00;
+ dst[1] = 0x00;
+ dst[2] = 0x01;
+ dst[3] = uScodeType;
+
+ // Length
+ dst[4] = ((uPayloadSize>>16)&0xff);
+ dst[5] = ((uPayloadSize>>8)&0xff);
+ dst[6] = 0x4e;
+ dst[7] = ((uPayloadSize>>0)&0xff);
+
+ // Codec ID and Version
+ dst[8] = uVC1CodecID;
+ dst[9] = uVC1VersionID;
+
+ // Width
+ dst[10] = ((uWidth>>8)&0xff);
+ dst[11] = ((uWidth>>0)&0xff);
+ dst[12] = 0x58;
+
+ // Height
+ dst[13] = ((uHeight>>8)&0xff);
+ dst[14] = ((uHeight>>0)&0xff);
+ dst[15] = 0x50;
+}
+
+static int VC1CreateNALSeqHeader(unsigned char *pHeader, int *pHeaderLen,
+ unsigned char *pCodecPri, int nCodecSize, unsigned int *pData, int nMaxHeader)
+{
+ int nHeaderLen;
+ unsigned char temp[4] = {0x00, 0x00, 0x01, 0x0D};
+
+ nHeaderLen = nCodecSize - 1;
+ if ((4+nHeaderLen) > nMaxHeader) {
+ nHeaderLen = nMaxHeader - 4;
+ vpu_err("error: header length %d overrun !!! \r\n", nCodecSize);
+ }
+ memcpy(pHeader, pCodecPri+1, nHeaderLen);
+
+ if (VC1_IS_NOT_NAL(pData[0])) {
+ //insert 0x0000010D at the end of header
+ memcpy(pHeader+nHeaderLen, temp, 4);
+ nHeaderLen += 4;
+ }
+
+ *pHeaderLen = nHeaderLen;
+
+ return 1;
+}
+
+static int VC1CreateNalFrameHeader(unsigned char *pHeader, int *pHeaderLen, unsigned int *pInData)
+{
+ unsigned int VC1Id;
+
+ VC1Id = *pInData;
+ if (VC1_IS_NOT_NAL(VC1Id)) {
+ //need insert header : special ID
+ pHeader[0] = 0x0;
+ pHeader[1] = 0x0;
+ pHeader[2] = 0x01;
+ pHeader[3] = 0x0D;
+ *pHeaderLen = 4;
+ } else {
+ //need not insert header
+ //do nothing
+ *pHeaderLen = 0;
+ }
+
+ return 1;
+}
+
+void vp6_scd_sequence_header(unsigned char *buffer, int pic_width, int pic_height)
+{
+ int Length = 0;
+
+ buffer[0] = 0x00;
+ buffer[1] = 0x00;
+ buffer[2] = 0x01;
+ buffer[3] = 0x31;
+ buffer[4] = (Length+12)>>16;
+ buffer[5] = (Length+12)>>8;
+ buffer[6] = 0x4e;
+ buffer[7] = (Length+12);
+ buffer[8] = 0x36;
+ buffer[9] = 0x1;
+ buffer[10] = pic_width>>8;
+ buffer[11] = pic_width;
+ buffer[12] = 0x58;
+ buffer[13] = pic_height>>8;
+ buffer[14] = pic_height;
+ buffer[15] = 0x50;
+}
+
+void vp6_scd_frame_header(unsigned char *buffer, int pic_width, int pic_height, int Length)
+{
+ buffer[0] = 0x00;
+ buffer[1] = 0x00;
+ buffer[2] = 0x01;
+ buffer[3] = 0x32;
+ buffer[4] = (Length+12)>>16;
+ buffer[5] = (Length+12)>>8;
+ buffer[6] = 0x4e;
+ buffer[7] = (Length+12);
+ buffer[8] = 0x36;
+ buffer[9] = 0x1;
+ buffer[10] = pic_width>>8;
+ buffer[11] = pic_width;
+ buffer[12] = 0x58;
+ buffer[13] = pic_height>>8;
+ buffer[14] = pic_height;
+ buffer[15] = 0x50;
+}
+
+void vp8_ivf_sequence_header(unsigned char *buffer, int pic_width, int pic_height)
+{
+ int Length = 32;
+
+ buffer[0] = 0x44;
+ buffer[1] = 0x4b;
+ buffer[2] = 0x49;
+ buffer[3] = 0x46; //0-3byte signature "DKIF"
+ buffer[4] = 0x00;
+ buffer[5] = 0x00; //4-5byte version 0
+ buffer[6] = Length;
+ buffer[7] = Length >> 8; //length of Header
+ buffer[8] = 0x56;
+ buffer[9] = 0x50;
+ buffer[10] = 0x38;
+ buffer[11] = 0x30; //VP8 fourcc
+ buffer[12] = pic_width;
+ buffer[13] = pic_width >> 8;
+ buffer[14] = pic_height;
+ buffer[15] = pic_height >> 8;
+ buffer[16] = 0xe8;
+ buffer[17] = 0x03;
+ buffer[18] = 0x00;
+ buffer[19] = 0x00; //16-19 frame rate
+ buffer[20] = 0x01;
+ buffer[21] = 0x00;
+ buffer[22] = 0x00;
+ buffer[23] = 0x00; //20-23 time scale
+ buffer[24] = 0xdf;
+ buffer[25] = 0xf9;
+ buffer[26] = 0x09;
+ buffer[27] = 0x00; //24-27 number frames
+ //28-31 unused
+}
+
+void vp8_ivf_frame_header(unsigned char *buffer, u_int32 FrameSize)
+{
+ buffer[0] = FrameSize;
+ buffer[1] = FrameSize >> 8;
+ buffer[2] = FrameSize >> 16;
+ buffer[3] = FrameSize >> 24;
+ //4-11 timestamp
+}
+
+void vp8_scd_sequence_header(unsigned char *buffer, int pic_width, int pic_height)
+{
+ int Length = 32;
+
+ buffer[0] = 0x00;
+ buffer[1] = 0x00;
+ buffer[2] = 0x01;
+ buffer[3] = 0x31;
+ buffer[4] = (Length+12)>>16;
+ buffer[5] = (Length+12)>>8;
+ buffer[6] = 0x4e;
+ buffer[7] = (Length+12);
+ buffer[8] = 0x36;
+ buffer[9] = 0x1;
+ buffer[10] = pic_width>>8;
+ buffer[11] = pic_width;
+ buffer[12] = 0x58;
+ buffer[13] = pic_height>>8;
+ buffer[14] = pic_height;
+ buffer[15] = 0x50;
+}
+void vp8_scd_frame_header(unsigned char *buffer, int pic_width, int pic_height, int Length)
+{
+ buffer[0] = 0x00;
+ buffer[1] = 0x00;
+ buffer[2] = 0x01;
+ buffer[3] = 0x32;
+ buffer[4] = (Length+12)>>16;
+ buffer[5] = (Length+12)>>8;
+ buffer[6] = 0x4e;
+ buffer[7] = (Length+12);
+ buffer[8] = 0x36;
+ buffer[9] = 0x1;
+ buffer[10] = pic_width>>8;
+ buffer[11] = pic_width;
+ buffer[12] = 0x58;
+ buffer[13] = pic_height>>8;
+ buffer[14] = pic_height;
+ buffer[15] = 0x50;
+}
+
+static void insert_payload_header_divx(u_int8 *dst, u_int32 uPayloadSize, u_int32 uWidth, u_int32 uHeight)
+{
+ // Startcode
+ dst[0] = 0x00;
+ dst[1] = 0x00;
+ dst[2] = 0x01;
+ dst[3] = 0x32;
+
+ // Length
+ dst[4] = ((uPayloadSize>>16)&0xff);
+ dst[5] = ((uPayloadSize>>8)&0xff);
+ dst[6] = 0x4e;
+ dst[7] = ((uPayloadSize>>0)&0xff);
+
+ // Codec ID and Version
+ dst[8] = 0x38;
+ dst[9] = 0x01;
+
+ // Width
+ dst[10] = ((uWidth>>8)&0xff);
+ dst[11] = ((uWidth>>0)&0xff);
+ dst[12] = 0x58;
+
+ // Height
+ dst[13] = ((uHeight>>8)&0xff);
+ dst[14] = ((uHeight>>0)&0xff);
+ dst[15] = 0x50;
+}
+
+static void insert_seq_header_spk(u_int8 *dst, u_int32 uPayloadSize, u_int32 uWidth, u_int32 uHeight)
+{
+ // Startcode
+ dst[0] = 0x00;
+ dst[1] = 0x00;
+ dst[2] = 0x01;
+ dst[3] = 0x31;
+
+ // Length
+ dst[4] = ((uPayloadSize>>16)&0xff);
+ dst[5] = ((uPayloadSize>>8)&0xff);
+ dst[6] = 0x4e;
+ dst[7] = ((uPayloadSize>>0)&0xff);
+
+ // Codec ID and Version
+ dst[8] = 0x39;
+ dst[9] = 0x01;
+
+ // Width
+ dst[10] = ((uWidth>>8)&0xff);
+ dst[11] = ((uWidth>>0)&0xff);
+ dst[12] = 0x58;
+
+ // Height
+ dst[13] = ((uHeight>>8)&0xff);
+ dst[14] = ((uHeight>>0)&0xff);
+ dst[15] = 0x50;
+}
+
+static void insert_frame_header_spk(u_int8 *dst, u_int32 uPayloadSize, u_int32 uWidth, u_int32 uHeight)
+{
+ uPayloadSize = 0;
+ // Startcode
+ dst[0] = 0x00;
+ dst[1] = 0x00;
+ dst[2] = 0x01;
+ dst[3] = 0x32;
+
+ // Length
+ dst[4] = ((uPayloadSize>>16)&0xff);
+ dst[5] = ((uPayloadSize>>8)&0xff);
+ dst[6] = 0x4e;
+ dst[7] = ((uPayloadSize>>0)&0xff);
+
+ // Codec ID and Version
+ dst[8] = 0x39;
+ dst[9] = 0x01;
+
+ // Width
+ dst[10] = ((uWidth>>8)&0xff);
+ dst[11] = ((uWidth>>0)&0xff);
+ dst[12] = 0x58;
+
+ // Height
+ dst[13] = ((uHeight>>8)&0xff);
+ dst[14] = ((uHeight>>0)&0xff);
+ dst[15] = 0x50;
+}
+
+void insert_payload_header_arv(u_int8 *dst, u_int32 uScodeType,
+ enum ARV_FRAME_TYPE type, u_int32 uPayloadSize, u_int32 uWidth, u_int32 uHeight)
+{
+ // Startcode
+ dst[0] = 0x00;
+ dst[1] = 0x00;
+ dst[2] = 0x01;
+ dst[3] = uScodeType;
+
+ // Length
+ dst[4] = ((uPayloadSize>>16)&0xff);
+ dst[5] = ((uPayloadSize>>8)&0xff);
+ dst[6] = 0x4e;
+ dst[7] = ((uPayloadSize>>0)&0xff);
+
+ // Codec ID and Version
+ if (type == ARV_8)
+ dst[8] = 0x28;
+ else
+ dst[8] = 0x29;
+ dst[9] = 0x01;
+
+ // Width
+ dst[10] = ((uWidth>>8)&0xff);
+ dst[11] = ((uWidth>>0)&0xff);
+ dst[12] = 0x58;
+
+ // Height
+ dst[13] = ((uHeight>>8)&0xff);
+ dst[14] = ((uHeight>>0)&0xff);
+ dst[15] = 0x50;
+}
+
+u_int32 single_seq_info_format(struct queue_data *q_data)
+{
+ u_int32 ret = 0;
+
+ switch (q_data->fourcc) {
+ case V4L2_PIX_FMT_VC1_ANNEX_G:
+ case V4L2_PIX_FMT_VC1_ANNEX_L:
+ case VPU_PIX_FMT_RV:
+ case V4L2_PIX_FMT_MPEG4:
+ case V4L2_PIX_FMT_MPEG2:
+ case V4L2_PIX_FMT_XVID:
+ ret = 1;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+bool check_free_size_4_seq(struct vpu_ctx *ctx, u_int32 uPayloadSize)
+{
+ struct queue_data *q_data = &ctx->q_data[V4L2_SRC];
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ u_int32 nfreespace = 0;
+ u_int32 length = 0;
+
+ switch (q_data->vdec_std) {
+ case VPU_VIDEO_VC1:
+ length = VC1_MAX_SEQ_HEADER_SIZE + 16;
+ break;
+ case VPU_VIDEO_VP6:
+ length = uPayloadSize + 32;
+ break;
+ case VPU_VIDEO_VP8:
+ length = uPayloadSize + 72;
+ break;
+ case VPU_VIDEO_ASP:
+ length = uPayloadSize + 16;
+ break;
+ case VPU_VIDEO_SPK:
+ length = uPayloadSize + 32;
+ break;
+ case VPU_VIDEO_RV:
+ length = uPayloadSize + 16;
+ break;
+ case VPU_VIDEO_AVC:
+ case VPU_VIDEO_MPEG2:
+ case VPU_VIDEO_AVS:
+ case VPU_VIDEO_JPEG:
+ case VPU_VIDEO_AVC_MVC:
+ case VPU_VIDEO_HEVC:
+ case VPU_VIDEO_UNDEFINED:
+ length = uPayloadSize;
+ break;
+ default:
+ break;
+ }
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ nfreespace = got_free_space(pStrBufDesc->wptr, pStrBufDesc->rptr,
+ pStrBufDesc->start, pStrBufDesc->end);
+ if (nfreespace < (length + MIN_SPACE)) {
+ vpu_dbg(LVL_INFO, "buffer_full: the circular buffer freespace < buffer_size\n");
+ return false;
+ }
+
+ return true;
+}
+
+u_int32 insert_scode_4_seq(struct vpu_ctx *ctx, u_int8 *src, u_int32 uPayloadSize)
+{
+ struct queue_data *q_data = &ctx->q_data[V4L2_SRC];
+ u_int32 length = 0;
+
+ if (!check_free_size_4_seq(ctx, uPayloadSize))
+ return 0;
+
+ switch (q_data->vdec_std) {
+ case VPU_VIDEO_VC1: {
+ if (q_data->fourcc == V4L2_PIX_FMT_VC1_ANNEX_G) {
+ u_int8 payload_header[32] = {0};
+ u_int8 Header[VC1_MAX_SEQ_HEADER_SIZE] = {0};
+ u_int32 uWidth = q_data->width;
+ u_int32 uHeight = q_data->height; //Width & Height in the generic payload header are ignored
+ u_int32 FrameSize = 0x60;
+ u_int32 HeaderLen, NoError = 1;
+
+ //insert startcode for vc1
+ insert_payload_header_vc1(payload_header, SCODE_NEW_SEQUENCE, 20, uWidth, uHeight);
+ copy_buffer_to_stream(ctx, payload_header, 16);
+ length = 16;
+ //insert RCV sequence header for vc1 v1, length=20
+ insert_RCV_seqhdr(Header, &HeaderLen, src, FrameSize, uWidth, uHeight, &NoError);
+ HeaderLen = RCV_HEADER_LEN - 4;
+ copy_buffer_to_stream(ctx, Header, HeaderLen);
+ length += HeaderLen;
+ } else {
+ u_int8 Header[VC1_MAX_SEQ_HEADER_SIZE] = {0};
+ u_int32 HeaderLen;
+ VC1CreateNALSeqHeader(Header, &HeaderLen, src, uPayloadSize,
+ (unsigned int *)src, VC1_MAX_SEQ_HEADER_SIZE);
+ if (VC1_IS_NOT_NAL(((unsigned int *)src)[0]))
+ HeaderLen -= 4;
+ copy_buffer_to_stream(ctx, Header, HeaderLen);
+ length += HeaderLen;
+ }
+ }
+ break;
+ case VPU_VIDEO_VP6: {
+ u_int8 seq_header[16] = {0};
+ u_int8 frame_header[16] = {0};
+
+ vp6_scd_sequence_header(seq_header, q_data->width, q_data->height);
+ copy_buffer_to_stream(ctx, seq_header, 16);
+ length = 16;
+ vp6_scd_frame_header(frame_header, q_data->width, q_data->height, uPayloadSize);
+ copy_buffer_to_stream(ctx, frame_header, 16);
+ length += 16;
+ copy_buffer_to_stream(ctx, src, uPayloadSize);
+ length += uPayloadSize;
+ }
+ break;
+ case VPU_VIDEO_VP8: {
+ u_int8 scd_seq_header[16] = {0};
+ u_int8 ivf_seq_header[32] = {0};
+ u_int8 scd_frame_header[16] = {0};
+ u_int8 ivf_frame_header[8] = {0};
+
+ vp8_scd_sequence_header(scd_seq_header, q_data->width, q_data->height);
+ copy_buffer_to_stream(ctx, scd_seq_header, 16);
+ length = 16;
+ vp8_ivf_sequence_header(ivf_seq_header, q_data->width, q_data->height);
+ copy_buffer_to_stream(ctx, ivf_seq_header, 32);
+ length += 32;
+ vp8_scd_frame_header(scd_frame_header, q_data->width, q_data->height, uPayloadSize + 8);
+ copy_buffer_to_stream(ctx, scd_frame_header, 16);
+ length += 16;
+ vp8_ivf_frame_header(ivf_frame_header, uPayloadSize);
+ copy_buffer_to_stream(ctx, ivf_frame_header, 8);
+ length += 8;
+ copy_buffer_to_stream(ctx, src, uPayloadSize);
+ length += uPayloadSize;
+ }
+ break;
+ case VPU_VIDEO_ASP: {
+ if (q_data->fourcc == VPU_PIX_FMT_DIV3) {
+ u_int8 seq_header[16] = {0};
+
+ insert_payload_header_divx(seq_header, uPayloadSize, q_data->width, q_data->height);
+ copy_buffer_to_stream(ctx, seq_header, 16);
+ length = 16;
+ copy_buffer_to_stream(ctx, src, uPayloadSize);
+ length += uPayloadSize;
+ } else {
+ copy_buffer_to_stream(ctx, src, uPayloadSize);
+ length = uPayloadSize;
+ }
+ }
+ break;
+ case VPU_VIDEO_SPK: {
+ u_int8 seq_header[16] = {0};
+ u_int8 frame_header[16] = {0};
+
+ insert_seq_header_spk(seq_header, 0, q_data->width, q_data->height);
+ copy_buffer_to_stream(ctx, seq_header, 16);
+ length = 16;
+ insert_frame_header_spk(frame_header, uPayloadSize, q_data->width, q_data->height);
+ copy_buffer_to_stream(ctx, frame_header, 16);
+ length += 16;
+ copy_buffer_to_stream(ctx, src, uPayloadSize);
+ length += uPayloadSize;
+ }
+ break;
+ case VPU_VIDEO_RV: {
+ u_int8 seq_header[16] = {0};
+
+ if (strncmp((const char *)(src+8), "RV30", 4) == 0)
+ ctx->arv_type = ARV_8;
+ else
+ ctx->arv_type = ARV_9;
+
+ insert_payload_header_arv(seq_header, SCODE_NEW_SEQUENCE, ctx->arv_type, uPayloadSize + 12, q_data->width, q_data->height);
+ copy_buffer_to_stream(ctx, seq_header, 16);
+ length = 16;
+ copy_buffer_to_stream(ctx, src, uPayloadSize);
+ length += uPayloadSize;
+ }
+ break;
+ case VPU_VIDEO_AVC:
+ case VPU_VIDEO_MPEG2:
+ case VPU_VIDEO_AVS:
+ case VPU_VIDEO_JPEG:
+ case VPU_VIDEO_AVC_MVC:
+ case VPU_VIDEO_HEVC:
+ case VPU_VIDEO_UNDEFINED: {
+ copy_buffer_to_stream(ctx, src, uPayloadSize);
+ length = uPayloadSize;
+ }
+ break;
+ default:
+ break;
+ }
+ return length;
+}
+
+u_int32 insert_scode_4_pic(struct vpu_ctx *ctx, u_int8 *dst, u_int8 *src, u_int32 vdec_std, u_int32 uPayloadSize)
+{
+ struct queue_data *q_data = &ctx->q_data[V4L2_SRC];
+ u_int32 length = 0;
+
+ switch (vdec_std) {
+ case VPU_VIDEO_VC1: {
+ if (q_data->fourcc == V4L2_PIX_FMT_VC1_ANNEX_G) {
+ u_int8 Header[VC1_MAX_FRM_HEADER_SIZE];
+ u_int32 HeaderLen;
+ u_int32 uWidth = q_data->width;
+ u_int32 uHeight = q_data->height; //Width & Height in the generic payload header are ignored
+
+ insert_payload_header_vc1(dst, SCODE_NEW_PICTURE, uPayloadSize + 16, uWidth, uHeight);
+ insert_RCV_pichdr(Header, &HeaderLen, uPayloadSize);
+ memcpy(dst+16, Header, 4);
+ length = 16 + 4;
+ } else {
+ u_int8 Header[VC1_MAX_FRM_HEADER_SIZE];
+ u_int32 HeaderLen;
+
+ VC1CreateNalFrameHeader(Header, (int *)(&HeaderLen), (unsigned int *)(src));
+ memcpy(dst, Header, HeaderLen);
+ length = HeaderLen;
+ }
+ }
+ break;
+ case VPU_VIDEO_VP6: {
+ vp6_scd_frame_header(dst, q_data->width, q_data->height, uPayloadSize);
+ length = 16;
+ }
+ break;
+ case VPU_VIDEO_VP8: {
+ u_int8 frame_header[8];
+
+ vp8_scd_frame_header(dst, q_data->width, q_data->height, uPayloadSize + 8);
+ length = 16;
+ vp8_ivf_frame_header(frame_header, uPayloadSize);
+ memcpy(dst+length, frame_header, 8);
+ length += 8;
+ }
+ break;
+ case VPU_VIDEO_ASP: {
+ if (q_data->fourcc == VPU_PIX_FMT_DIV3) {
+ insert_payload_header_divx(dst, uPayloadSize, q_data->width, q_data->height);
+ length = 16;
+ }
+ }
+ break;
+ case VPU_VIDEO_SPK: {
+ insert_frame_header_spk(dst, uPayloadSize, q_data->width, q_data->height);
+ length = 16;
+ }
+ break;
+ case VPU_VIDEO_RV: {
+ u_int32 slice_num;
+ u_int32 packlen;
+
+ slice_num = ((src[16] << 24) | (src[17] << 16) | (src[18] << 8) | (src[19]));
+ packlen = 20 + 8 * slice_num;
+ insert_payload_header_arv(dst, SCODE_NEW_PICTURE, ctx->arv_type, packlen + 12, q_data->width, q_data->height);
+ length = 16;
+ }
+ break;
+ default:
+ break;
+ }
+ return length;
+}
+
+u_int32 insert_scode_4_arv_slice(struct vpu_ctx *ctx, u_int8 *dst, struct VPU_FMT_INFO_ARV *arv_frame, u_int32 uPayloadSize)
+{
+ struct queue_data *q_data = &ctx->q_data[V4L2_SRC];
+ u_int32 length = 0;
+
+ insert_payload_header_arv(dst, SCODE_NEW_SLICE, arv_frame->type, uPayloadSize, q_data->width, q_data->height);
+ length = 16;
+
+ return length;
+}
+
+struct VPU_FMT_INFO_ARV *get_arv_info(struct vpu_ctx *ctx, u_int8 *src, u_int32 size)
+{
+ u_int32 i;
+ struct VPU_FMT_INFO_ARV *arv_frame;
+
+ if (!ctx || !src)
+ return NULL;
+
+ if (size < 28)
+ return NULL;
+
+ arv_frame = kzalloc(sizeof(struct VPU_FMT_INFO_ARV), GFP_KERNEL);
+ if (IS_ERR_OR_NULL(arv_frame)) {
+ vpu_err("%s() error: arv_frame alloc failed\n", __func__);
+ goto err;
+ }
+
+ arv_frame->type = ctx->arv_type;
+
+ arv_frame->data_len = ((src[0] << 24) | (src[1] << 16) | (src[2] << 8) | (src[3]));
+ arv_frame->slice_num = ((src[16] << 24) | (src[17] << 16) | (src[18] << 8) | (src[19]));
+ if (arv_frame->data_len > size || arv_frame->slice_num > size) {
+ vpu_dbg(LVL_WARN, "arv frame info incorrect, data_len=%d slice_num=%d buffer_size=%d\n",
+ arv_frame->data_len, arv_frame->slice_num, size);
+ goto err;
+ }
+
+ arv_frame->slice_offset = kcalloc(arv_frame->slice_num, sizeof(u_int32), GFP_KERNEL);
+ if (IS_ERR_OR_NULL(arv_frame->slice_offset)) {
+ vpu_err("%s() error: slice_offset alloc failed\n", __func__);
+ goto err;
+ }
+
+ for (i = 0; i < arv_frame->slice_num; i++)
+ arv_frame->slice_offset[i] = ((src[20+8*i+4] << 24) | (src[20+8*i+5] << 16) | (src[20+8*i+6] << 8) | (src[20+8*i+7]));
+
+ return arv_frame;
+
+err:
+ kfree(arv_frame->slice_offset);
+ kfree(arv_frame);
+ return NULL;
+}
+
+void put_arv_info(struct VPU_FMT_INFO_ARV *arv_frame)
+{
+ kfree(arv_frame->slice_offset);
+ kfree(arv_frame);
+}
+
diff --git a/drivers/mxc/vpu_malone/insert_startcode.h b/drivers/mxc/vpu_malone/insert_startcode.h
new file mode 100644
index 000000000000..66a30135d152
--- /dev/null
+++ b/drivers/mxc/vpu_malone/insert_startcode.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file insert_startcode.h
+ *
+ */
+#ifndef __INSERT_STARTCODE_H__
+#define __INSERT_STARTCODE_H__
+
+#include "vpu_b0.h"
+#include "mediasys_types.h"
+#define SCODE_NEW_SEQUENCE 0x31
+#define SCODE_NEW_PICTURE 0x32
+#define SCODE_NEW_SLICE 0x33
+#define RCV_V2_FRAMESIZE_FLAGS (0xFF000000)
+#define RCV_HEADER_LEN 24
+#define RCV_CODEC_VERSION (0x5 << 24) //FOURCC_WMV3_WMV
+#define RCV_NUM_FRAMES 0xFF
+#define RCV_SET_HDR_EXT 0x80000000
+#define VC1_IS_NOT_NAL(id) ((id & 0x00FFFFFF) != 0x00010000)
+#define VC1_MAX_FRM_HEADER_SIZE 32
+#define VC1_MAX_SEQ_HEADER_SIZE 256
+
+u_int32 insert_scode_4_pic(struct vpu_ctx *ctx, u_int8 *dst, u_int8 *src, u_int32 vdec_std, u_int32 uPayloadSize);
+u_int32 insert_scode_4_seq(struct vpu_ctx *ctx, u_int8 *src, u_int32 uPayloadSize);
+u_int32 insert_scode_4_arv_slice(struct vpu_ctx *ctx, u_int8 *dst, struct VPU_FMT_INFO_ARV *arv_frame, u_int32 uPayloadSize);
+struct VPU_FMT_INFO_ARV *get_arv_info(struct vpu_ctx *ctx, u_int8 *src, u_int32 size);
+void put_arv_info(struct VPU_FMT_INFO_ARV *arv_frame);
+void insert_payload_header_arv(u_int8 *dst, u_int32 uScodeType,
+ enum ARV_FRAME_TYPE type, u_int32 uPayloadSize, u_int32 uWidth, u_int32 uHeight);
+u_int32 single_seq_info_format(struct queue_data *q_data);
+
+#endif
diff --git a/drivers/mxc/vpu_malone/mediasys_types.h b/drivers/mxc/vpu_malone/mediasys_types.h
new file mode 100644
index 000000000000..7b2613b65775
--- /dev/null
+++ b/drivers/mxc/vpu_malone/mediasys_types.h
@@ -0,0 +1,798 @@
+/*
+ * This file is provided under a dual BSD/GPLv2 license. When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _MEDIASYS_TYPES_H_
+#define _MEDIASYS_TYPES_H_
+
+typedef unsigned int u_int32;
+typedef unsigned char u_int8;
+typedef unsigned long u_int64;
+typedef unsigned int BOOL;
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+#define VPU_MAX_NUM_STREAMS 8
+#define VID_API_NUM_STREAMS 8
+#define VID_API_MAX_BUF_PER_STR 3
+#define VID_API_MAX_NUM_MVC_VIEWS 4
+#define MEDIAIP_MAX_NUM_MALONES 2
+#define MEDIAIP_MAX_NUM_MALONE_IRQ_PINS 2
+#define MEDIAIP_MAX_NUM_WINDSORS 1
+#define MEDIAIP_MAX_NUM_WINDSOR_IRQ_PINS 2
+#define MEDIAIP_MAX_NUM_CMD_IRQ_PINS 2
+#define MEDIAIP_MAX_NUM_MSG_IRQ_PINS 1
+#define MEDIAIP_MAX_NUM_TIMER_IRQ_PINS 4
+#define MEDIAIP_MAX_NUM_TIMER_IRQ_SLOTS 4
+#define VID_API_COMMAND_LIMIT 64
+#define VID_API_MESSAGE_LIMIT 256
+#define MSG_WORD_LENGTH 3
+#define MEDIA_PLAYER_SKIPPED_FRAME_ID 0x555
+
+#define API_CMD_AVAILABLE 0x0
+#define API_CMD_INCOMPLETE 0x1
+#define API_CMD_BUFFER_ERROR 0x2
+#define API_CMD_UNAVAILABLE 0x3
+#define API_MSG_AVAILABLE 0x0
+#define API_MSG_INCOMPLETE 0x1
+#define API_MSG_BUFFER_ERROR 0x2
+#define API_MSG_UNAVAILABLE 0x3
+
+typedef enum {
+ FRAME_ALLOC = 0,
+ FRAME_FREE,
+ FRAME_DECODED,
+ FRAME_READY,
+ FRAME_RELEASE,
+} FRAME_BUFFER_STAT;
+
+typedef enum {
+ VPU_APP,
+ VPU_DRIVER,
+ VPU_DECODER,
+} FRAME_BUFFER_OWNER;
+
+typedef enum {
+ INVALID_MODE = 0,
+ FRAME_LVL,
+ NON_FRAME_LVL,
+} STREAM_INPUT_MODE;
+
+typedef enum {
+ MEDIAIP_FRAME_REQ = 0,
+ MEDIAIP_MBI_REQ,
+ MEDIAIP_DCP_REQ,
+ MEDIAIP_REQ_LAST = MEDIAIP_DCP_REQ
+
+} MEDIAIP_MEM_REQ;
+
+typedef struct {
+ u_int32 uNum;
+ MEDIAIP_MEM_REQ eType;
+} MEDIA_PLAYER_FSREQ;
+
+typedef struct {
+ u_int32 uFSIdx;
+ MEDIAIP_MEM_REQ eType;
+ BOOL bNotDisplayed;
+} MEDIA_PLAYER_FSREL;
+
+typedef enum {
+ /* Non-Stream Specific messages */
+ MEDIA_PLAYER_API_MODE_INVALID = 0x00,
+ MEDIA_PLAYER_API_MODE_PARSE_STEP = 0x01,
+ MEDIA_PLAYER_API_MODE_DECODE_STEP = 0x02,
+ MEDIA_PLAYER_API_MODE_CONTINUOUS = 0x03
+} MEDIA_PLAYER_API_MODE;
+
+typedef enum {
+ /* Non-Stream Specific messages */
+ MEDIA_PLAYER_FS_CTRL_MODE_INTERNAL = 0x00,
+ MEDIA_PLAYER_FS_CTRL_MODE_EXTERNAL = 0x01
+} MEDIA_PLAYER_FS_CTRL_MODE;
+
+typedef enum {
+ /* Non-Stream Specific messages */
+ VID_API_CMD_NULL = 0x00,
+ VID_API_CMD_PARSE_NEXT_SEQ = 0x01,
+ VID_API_CMD_PARSE_NEXT_I = 0x02,
+ VID_API_CMD_PARSE_NEXT_IP = 0x03,
+ VID_API_CMD_PARSE_NEXT_ANY = 0x04,
+ VID_API_CMD_DEC_PIC = 0x05,
+ VID_API_CMD_UPDATE_ES_WR_PTR = 0x06,
+ VID_API_CMD_UPDATE_ES_RD_PTR = 0x07,
+ VID_API_CMD_UPDATE_UDATA = 0x08,
+ VID_API_CMD_GET_FSINFO = 0x09,
+ VID_API_CMD_SKIP_PIC = 0x0a,
+ VID_API_CMD_DEC_CHUNK = 0x0b,
+ VID_API_CMD_START = 0x10,
+ VID_API_CMD_STOP = 0x11,
+ VID_API_CMD_ABORT = 0x12,
+ VID_API_CMD_RST_BUF = 0x13,
+ VID_API_CMD_FS_RELEASE = 0x15,
+ VID_API_CMD_MEM_REGION_ATTACH = 0x16,
+ VID_API_CMD_MEM_REGION_DETACH = 0x17,
+ VID_API_CMD_MVC_VIEW_SELECT = 0x18,
+ VID_API_CMD_FS_ALLOC = 0x19,
+ VID_API_CMD_DBG_GET_STATUS = 0x1C,
+ VID_API_CMD_DBG_START_LOG = 0x1D,
+ VID_API_CMD_DBG_STOP_LOG = 0x1E,
+ VID_API_CMD_DBG_DUMP_LOG = 0x1F,
+ /* Begin Encode CMDs */
+ VID_API_CMD_YUV_READY = 0x20,
+
+ VID_API_CMD_FIRM_RESET = 0x40,
+
+#if BOOT_ARCH == REBOOT
+ VID_API_CMD_SNAPSHOT = 0xAA,
+ VID_API_CMD_ROLL_SNAPSHOT = 0xAB,
+ VID_API_CMD_LOCK_SCHEDULER = 0xAC,
+ VID_API_CMD_UNLOCK_SCHEDULER = 0xAD,
+#endif
+ VID_API_CMD_CQ_FIFO_DUMP = 0xAE,
+ VID_API_CMD_DBG_FIFO_DUMP = 0xAF,
+ VID_API_CMD_SVC_ILP = 0xBB,
+ VID_API_CMD_INVALID = 0xFF
+
+} TB_API_DEC_CMD;
+
+typedef enum {
+ /* Non-Stream Specific messages */
+ VID_API_EVENT_NULL = 0x00,
+ VID_API_EVENT_RESET_DONE = 0x01,
+ VID_API_EVENT_SEQ_HDR_FOUND = 0x02,
+ VID_API_EVENT_PIC_HDR_FOUND = 0x03,
+ VID_API_EVENT_PIC_DECODED = 0x04,
+ VID_API_EVENT_FIFO_LOW = 0x05,
+ VID_API_EVENT_FIFO_HIGH = 0x06,
+ VID_API_EVENT_FIFO_EMPTY = 0x07,
+ VID_API_EVENT_FIFO_FULL = 0x08,
+ VID_API_EVENT_BS_ERROR = 0x09,
+ VID_API_EVENT_UDATA_FIFO_UPTD = 0x0A,
+ VID_API_EVENT_RES_CHANGE = 0x0B,
+ VID_API_EVENT_FIFO_OVF = 0x0C,
+ VID_API_EVENT_CHUNK_DECODED = 0x0D,
+ VID_API_EVENT_REQ_FRAME_BUFF = 0x10,
+ VID_API_EVENT_FRAME_BUFF_RDY = 0x11,
+ VID_API_EVENT_REL_FRAME_BUFF = 0x12,
+ VID_API_EVENT_STR_BUF_RST = 0x13,
+ VID_API_EVENT_RET_PING = 0x14,
+ VID_API_EVENT_QMETER = 0x15,
+ VID_API_EVENT_STR_FMT_CHANGE = 0x16,
+ VID_API_EVENT_FIRMWARE_XCPT = 0x17,
+ VID_API_EVENT_START_DONE = 0x18,
+ VID_API_EVENT_STOPPED = 0x19,
+ VID_API_EVENT_ABORT_DONE = 0x1A,
+ VID_API_EVENT_FINISHED = 0x1B,
+ VID_API_EVENT_DBG_STAT_UPDATE = 0x1C,
+ VID_API_EVENT_DBG_LOG_STARTED = 0x1D,
+ VID_API_EVENT_DBG_LOG_STOPPED = 0x1E,
+ VID_API_EVENT_DBG_LOG_UPDATED = 0x1F,
+ VID_API_EVENT_DBG_MSG_DEC = 0x20,
+ VID_API_EVENT_DEC_SC_ERR = 0x21,
+ VID_API_EVENT_CQ_FIFO_DUMP = 0x22,
+ VID_API_EVENT_DBG_FIFO_DUMP = 0x23,
+ VID_API_EVENT_DEC_CHECK_RES = 0x24,
+ VID_API_EVENT_DEC_CFG_INFO = 0x25,
+ VID_API_EVENT_UNSUPPORTED_STREAM = 0x26,
+ VID_API_EVENT_STR_SUSPENDED = 0x30,
+ VID_API_EVENT_SNAPSHOT_DONE = 0x40,
+ VID_API_EVENT_INVALID = 0xFF
+
+} TB_API_DEC_EVENT;
+
+typedef enum {
+ MEDIAIP_PLAYMODE_CONNECTIVITY = 0,
+ MEDIAIP_PLAYMODE_BROADCAST,
+ MEDIAIP_PLAYMODE_BROADCAST_DSS,
+ MEDIAIP_PLAYMODE_LAST = MEDIAIP_PLAYMODE_BROADCAST_DSS
+
+} MEDIA_IP_PLAYMODE;
+
+typedef enum {
+ MEDIA_IP_FMT_NULL = 0x0,
+ MEDIA_IP_FMT_AVC = 0x1,
+ MEDIA_IP_FMT_VC1 = 0x2,
+ MEDIA_IP_FMT_MP2 = 0x3,
+ MEDIA_IP_FMT_AVS = 0x4,
+ MEDIA_IP_FMT_ASP = 0x5,
+ MEDIA_IP_FMT_JPG = 0x6,
+ MEDIA_IP_FMT_RV = 0x7,
+ MEDIA_IP_FMT_VP6 = 0x8,
+ MEDIA_IP_FMT_SPK = 0x9,
+ MEDIA_IP_FMT_VP8 = 0xA,
+ MEDIA_IP_FMT_MVC = 0xB,
+ MEDIA_IP_FMT_VP3 = 0xC,
+ MEDIA_IP_FMT_HEVC = 0xD,
+ MEDIA_IP_FMT_AUTO_DETECT = 0xAD00,
+ MEDIA_IP_FMT_ALL = (int)0xAAAAAAAA,
+ MEDIA_IP_FMT_UNSUPPORTED = (int)0xFFFFFFFF,
+ MEDIA_IP_FMT_LAST = MEDIA_IP_FMT_UNSUPPORTED
+
+} MEDIA_IP_FORMAT;
+
+typedef enum {
+ VSys_FrmtNull = 0x0,
+ VSys_AvcFrmt = 0x1,
+ VSys_Mp2Frmt = 0x2,
+ VSys_Vc1Frmt = 0x3,
+ VSys_AvsFrmt = 0x4,
+ VSys_AspFrmt = 0x5,
+ VSys_JpgFrmt = 0x6,
+ VSys_RvFrmt = 0x7,
+ VSys_Vp6Frmt = 0x8,
+ VSys_SpkFrmt = 0x9,
+ VSys_Vp8Frmt = 0xA,
+ VSys_HevcFrmt = 0xB,
+ VSys_LastFrmt = VSys_HevcFrmt
+} TB_API_DEC_FMT;
+
+typedef struct {
+ u_int32 bTopFldFirst;
+ u_int32 bRptFstField;
+ u_int32 uDispVerRes;
+ u_int32 uDispHorRes;
+ u_int32 uCentreVerOffset;
+ u_int32 uCentreHorOffset;
+ u_int32 uCropLeftRightOffset;
+ u_int32 uCropTopBotOffset;
+
+} MediaIPFW_Video_PicDispInfo;
+
+typedef struct MediaIPFW_PicPerfInfo {
+ u_int32 uMemCRC;
+ u_int32 uBSCRC;
+ u_int32 uSlcActiveCnt;
+ u_int32 uIBEmptyCnt;
+ u_int32 uBaseMemCRC;
+
+ u_int32 uBaseCRCSkip;
+ u_int32 uBaseCRCDrop;
+ BOOL bBaseCRCValid;
+
+ u_int32 uCRC0;
+ u_int32 uCRC1;
+ u_int32 uCRC2;
+ u_int32 uCRC3;
+ u_int32 uCRC4;
+ u_int32 uCRC5;
+
+ u_int32 uFrameActCount;
+ u_int32 uRbspBytesCount;
+ u_int32 uDpbReadCount;
+ u_int32 uMprWaitCount;
+ u_int32 uAccQP;
+ u_int32 uCacheStat;
+ u_int32 mbq_full;
+ u_int32 mbq_empty;
+ u_int32 slice_cnt;
+ u_int32 mb_count;
+
+ u_int32 uTotalTime_us;
+ u_int32 uTotalFwTime_us;
+
+ u_int32 uProcIaccTotRdCnt;
+ u_int32 uProcDaccTotRdCnt;
+ u_int32 uProcDaccTotWrCnt;
+ u_int32 uProcDaccRegRdCnt;
+ u_int32 uProcDaccRegWrCnt;
+ u_int32 uProcDaccRngRdCnt;
+ u_int32 uProcDaccRngWrCnt;
+
+} MediaIPFW_Video_PicPerfInfo;
+
+typedef struct {
+ u_int32 mb_count;
+ u_int32 slice_cnt;
+
+ /* Front End Metrics */
+ u_int32 uDFEBinsUsed;
+ u_int32 uDFECycleCount;
+ u_int32 uDFESliceCycleCount;
+ u_int32 uDFEIBWaitCount;
+ u_int32 uDFENumBytes;
+
+ u_int32 uProcIaccTotRdCnt;
+ u_int32 uProcDaccTotRdCnt;
+ u_int32 uProcDaccTotWrCnt;
+ u_int32 uProcDaccRegRdCnt;
+ u_int32 uProcDaccRegWrCnt;
+ u_int32 uProcDaccRngRdCnt;
+ u_int32 uProcDaccRngWrCnt;
+
+ /* Back End metrics */
+ u_int32 uNumBEUsed;
+ u_int32 uTotalTime_us;
+ u_int32 uTotalFwTime_us;
+ u_int32 uDBECycleCount[0x2];
+ u_int32 uDBESliceCycleCount[0x2];
+ u_int32 uDBEMprWaitCount[0x2];
+ u_int32 uDBEWaitCount[0x2];
+ u_int32 uDBECRC[0x2];
+ u_int32 uDBETotalTime_us[0x2];
+
+ u_int32 uDBEMPRPRXWaitCount[0x2];
+ u_int32 uDBEPXDPRXWaitCount[0x2];
+ u_int32 uDBEFCHPLQWaitCount[0x2];
+ u_int32 uDBEPXDPLQWaitCount[0x2];
+
+ u_int32 uDBEFchWordsCount[0x2];
+ u_int32 uDBEDpbCRC[0x2];
+ u_int32 uDBEDpbReadCount[0x2];
+ u_int32 uDBECacheStats[0x2];
+
+} MediaIPFW_Video_PicPerfDcpInfo, *pMediaIPFW_Video_PicPerfDcpInfo;
+
+typedef struct {
+ u_int32 uPicType;
+ u_int32 uPicStruct;
+ u_int32 bLastPicNPF;
+ u_int32 uPicStAddr;
+ u_int32 uFrameStoreID;
+ MediaIPFW_Video_PicDispInfo DispInfo;
+ MediaIPFW_Video_PicPerfInfo PerfInfo;
+ MediaIPFW_Video_PicPerfDcpInfo PerfDcpInfo;
+ u_int32 bUserDataAvail;
+ u_int32 uPercentInErr;
+
+ u_int32 uReservedBbd[3];
+ /* Luma top/bottom and Chroma top/bottom */
+ u_int32 uFSBaseAddr[4];
+
+ /* Only for RealVideo RPR */
+ u_int32 uRprPicWidth;
+ u_int32 uRprPicHeight;
+
+ /*only for divx3*/
+ u_int32 uFrameRate;
+
+} MediaIPFW_Video_PicInfo;
+
+
+typedef struct {
+ u_int32 bClosedGop;
+ u_int32 bBrokenLink;
+} MediaIPFW_Video_GopInfo;
+
+typedef struct {
+ u_int32 uIQuant;
+ u_int32 uIQuantAvail;
+ u_int32 uGopBitRate;
+ u_int32 uGopBitRateAvail;
+
+} MediaIPFW_Video_QMeterInfo;
+
+typedef struct {
+ u_int32 pPicInfoArrayBase;
+ u_int32 uNumSizeDescriptors;
+} MediaIPFW_Video_PicInfoBuffTabDesc;
+
+typedef struct {
+ u_int32 pGopInfoArrayBase;
+ u_int32 uNumSizeDescriptors;
+} MediaIPFW_Video_GopInfoBuffTabDesc;
+
+typedef struct {
+ u_int32 pQMeterInfoArrayBase;
+ u_int32 uNumSizeDescriptors;
+} MediaIPFW_Video_QMeterInfoTabDesc;
+
+typedef struct {
+ u_int32 uMemChunkBase;
+ u_int32 uMemChunkSize;
+
+} MediaIPFW_Video_FrameBuffer;
+
+typedef struct {
+ u_int32 uUDataBase;
+ u_int32 uUDataTotalSize;
+ u_int32 uUDataSlotSize;
+
+} MediaIPFW_Video_UData;
+
+typedef struct {
+ u_int32 uDecStatusLogBase;
+ u_int32 uDecStatusLogSize;
+ u_int32 uDecStatusLogLevel;
+ u_int32 uReserved;
+
+} MediaIPFW_Video_DbgLogDesc;
+
+typedef struct {
+ u_int32 uDTVLogBase[VID_API_NUM_STREAMS];
+ u_int32 uDTVLogSize[VID_API_NUM_STREAMS];
+
+} MediaIPFW_Video_EngAccessLogDesc;
+
+typedef struct MediaIPFW_FrameStore {
+ u_int32 uFrameStoreLumaBase;
+ u_int32 uFrameStoreChromaBase;
+
+} MediaIPFW_Video_FrameStore;
+
+typedef struct {
+ u_int32 uAddrFirstDescriptor;
+ u_int32 uNumSizeDescriptors;
+
+} MediaIPFW_Video_StreamBuffTabDesc;
+
+typedef struct {
+ u_int32 uAddrFirstDescriptor;
+ u_int32 uNumSizeDescriptors;
+} MediaIPFW_Video_UserDataBuffTabDesc;
+
+typedef struct {
+ u_int32 uNumRefFrms;
+ u_int32 uNumDPBFrms;
+ u_int32 uNumDFEAreas;
+ u_int32 uColorDesc;
+ u_int32 uTransferChars;
+ u_int32 uMatrixCoeffs;
+ u_int32 uVideoFullRangeFlag;
+ u_int32 uVUIPresent;
+ u_int32 uProgressive;
+ u_int32 uVerRes;
+ u_int32 uHorRes;
+ u_int32 uParWidth;
+ u_int32 uParHeight;
+ u_int32 FrameRate;
+ u_int32 UDispAspRatio;
+ u_int32 uLevelIDC;
+ u_int32 uVerDecodeRes;
+ u_int32 uHorDecodeRes;
+ u_int32 uOverScan;
+ u_int32 uChromaFmt;
+ u_int32 uPAFF;
+ u_int32 uMBAFF;
+ u_int32 uBitDepthLuma;
+ u_int32 uBitDepthChroma;
+ u_int32 uMVCNumViews;
+ u_int32 uMVCViewList[VID_API_MAX_NUM_MVC_VIEWS];
+ u_int32 uActiveSeqTag;
+ u_int32 uFrameCropValid;
+ u_int32 uFrameCropLeftOffset;
+ u_int32 uFrameCropRightOffset;
+ u_int32 uFrameCropTopOffset;
+ u_int32 uFrameCropBottomOffset;
+
+} MediaIPFW_Video_SeqInfo;
+
+typedef struct {
+ u_int32 pSeqInfoArrayBase;
+ u_int32 uNumSizeDescriptors;
+} MediaIPFW_Video_SeqInfoBuffTabDesc;
+
+typedef struct {
+ u_int32 wptr;
+ u_int32 rptr;
+ u_int32 start;
+ u_int32 end;
+
+} BUFFER_DESCRIPTOR_TYPE, *pBUFFER_DESCRIPTOR_TYPE;
+
+typedef struct {
+ u_int32 stream_input_mode;
+ u_int32 stream_pic_input_count;
+ u_int32 stream_pic_parsed_count;
+ u_int32 stream_buffer_threshold;
+ u_int32 stream_pic_end_flag;
+} BUFFER_INFO_TYPE, *pBUFFER_INFO_TYPE;
+
+typedef struct {
+ volatile u_int32 wptr;
+ volatile u_int32 rptr;
+ volatile u_int32 start;
+ volatile u_int32 end;
+ volatile u_int32 LWM;
+
+} STREAM_BUFFER_DESCRIPTOR_TYPE, *pSTREAM_BUFFER_DESCRIPTOR_TYPE;
+
+typedef struct {
+ u_int32 uRotationAngle;
+ u_int32 uHorizScaleFactor;
+ u_int32 uVertScaleFactor;
+ u_int32 uRotationMode;
+ u_int32 uRGBMode;
+ u_int32 uChunkMode; /* 0 ~ 1 */
+ u_int32 uLastChunk; /* 0 ~ 1 */
+ u_int32 uChunkRows; /* 0 ~ 255 */
+ u_int32 uNumBytes;
+ u_int32 uJpgCropXStart;
+ u_int32 uJpgCropYStart;
+ u_int32 uJpgCropWidth;
+ u_int32 uJpgCropHeight;
+ u_int32 uJpgMjpegMode;
+ u_int32 uJpgMjpegInterlaced;
+
+} MediaIPFW_Video_JpegParams;
+
+typedef struct {
+ u_int32 pJpegParamArrayBase;
+ u_int32 uNumSizeDescriptors;
+
+} MediaIPFW_Video_JpegParamTabDesc;
+
+typedef struct {
+ u_int32 uDispImm;
+ u_int32 uFourCC;
+ u_int32 uCodecVersion;
+ u_int32 uFrameRate;
+ u_int32 uEnableDbgLog;
+ u_int32 uBSDMALWM;
+ u_int32 bbd_coring;
+ u_int32 bbd_s_thr_row;
+ u_int32 bbd_p_thr_row;
+ u_int32 bbd_s_thr_logo_row;
+ u_int32 bbd_p_thr_logo_row;
+ u_int32 bbd_s_thr_col;
+ u_int32 bbd_p_thr_col;
+ u_int32 bbd_chr_thr_row;
+ u_int32 bbd_chr_thr_col;
+ u_int32 bbd_uv_mid_level;
+ u_int32 bbd_excl_win_mb_left;
+ u_int32 bbd_excl_win_mb_right;
+
+} MediaIPFW_Video_CodecParams;
+
+typedef struct {
+ u_int32 uFramePitch;
+
+} MediaIPFW_Video_PitchInfo;
+
+typedef struct {
+ u_int32 uWrPtr;
+ u_int32 uRdPtr;
+ u_int32 uStart;
+ u_int32 uEnd;
+ u_int32 uLo;
+ u_int32 uHi;
+
+} MediaIPFW_Video_BufDesc;
+
+typedef struct {
+ u_int32 pCodecParamArrayBase;
+ u_int32 uNumSizeDescriptors;
+
+} MediaIPFW_Video_CodecParamTabDesc;
+
+typedef struct {
+ u_int32 uRC4Key[0x8];
+ u_int32 uMemObfuscVal;
+
+} MediaIPFW_Video_Encrypt_Info, *pMediaIPFW_Video_Encrypt_Info;
+
+typedef struct {
+ u_int32 uCfgCookie;
+
+ u_int32 uNumMalones;
+ u_int32 uMaloneBaseAddress[MEDIAIP_MAX_NUM_MALONES];
+ u_int32 uHifOffset[MEDIAIP_MAX_NUM_MALONES];
+ u_int32 uMaloneIrqPin[MEDIAIP_MAX_NUM_MALONES][MEDIAIP_MAX_NUM_MALONE_IRQ_PINS];
+ u_int32 uMaloneIrqTarget[MEDIAIP_MAX_NUM_MALONES][MEDIAIP_MAX_NUM_MALONE_IRQ_PINS];
+
+ u_int32 uNumWindsors;
+ u_int32 uWindsorBaseAddress[MEDIAIP_MAX_NUM_WINDSORS];
+ u_int32 uWindsorIrqPin[MEDIAIP_MAX_NUM_WINDSORS][MEDIAIP_MAX_NUM_WINDSOR_IRQ_PINS];
+ u_int32 uWindsorIrqTarget[MEDIAIP_MAX_NUM_WINDSORS][MEDIAIP_MAX_NUM_WINDSOR_IRQ_PINS];
+
+ u_int32 uCmdIrqPin[MEDIAIP_MAX_NUM_CMD_IRQ_PINS];
+ u_int32 uCmdIrqTarget[MEDIAIP_MAX_NUM_CMD_IRQ_PINS];
+
+ u_int32 uMsgIrqPin[MEDIAIP_MAX_NUM_MSG_IRQ_PINS];
+ u_int32 uMsgIrqTarget[MEDIAIP_MAX_NUM_MSG_IRQ_PINS];
+
+ u_int32 uSysClkFreq;
+ u_int32 uNumTimers;
+ u_int32 uTimerBaseAddr;
+ u_int32 uTimerIrqPin[MEDIAIP_MAX_NUM_TIMER_IRQ_PINS];
+ u_int32 uTimerIrqTarget[MEDIAIP_MAX_NUM_TIMER_IRQ_PINS];
+ u_int32 uTimerSlots[MEDIAIP_MAX_NUM_TIMER_IRQ_SLOTS];
+
+ u_int32 uGICBaseAddr;
+ u_int32 uUartBaseAddr;
+
+ u_int32 uDPVBaseAddr;
+ u_int32 uDPVIrqPin;
+ u_int32 uDPVIrqTarget;
+
+ u_int32 uPixIfBaseAddr;
+
+ u_int32 pal_trace_level;
+ u_int32 pal_trace_destination;
+
+ u_int32 pal_trace_level1;
+ u_int32 pal_trace_destination1;
+
+ u_int32 uHeapBase;
+ u_int32 uHeapSize;
+
+ u_int32 uFSLCacheBaseAddr[2];
+
+} MEDIAIP_FW_SYSTEM_CONFIG, *pMEDIAIP_FW_SYSTEM_CONFIG;
+
+typedef struct {
+ u_int32 FwExecBaseAddr;
+ u_int32 FwExecAreaSize;
+ MediaIPFW_Video_BufDesc StreamCmdBufferDesc;
+ MediaIPFW_Video_BufDesc StreamMsgBufferDesc;
+ u_int32 StreamCmdIntEnable[VID_API_NUM_STREAMS];
+ MediaIPFW_Video_PitchInfo StreamPitchInfo[VID_API_NUM_STREAMS];
+ u_int32 StreamConfig[VID_API_NUM_STREAMS];
+ MediaIPFW_Video_CodecParamTabDesc CodecParamTabDesc; /* TODO-KMC should we just go ahead and remove the concept of tabdesc? It is basicaly a bad coding style used for pinkys anyway */
+ MediaIPFW_Video_JpegParamTabDesc JpegParamTabDesc;
+ u_int32 pStreamBuffDesc[VID_API_NUM_STREAMS][VID_API_MAX_BUF_PER_STR];
+ MediaIPFW_Video_SeqInfoBuffTabDesc SeqInfoTabDesc;
+ MediaIPFW_Video_PicInfoBuffTabDesc PicInfoTabDesc;
+ MediaIPFW_Video_GopInfoBuffTabDesc GopInfoTabDesc;
+ MediaIPFW_Video_QMeterInfoTabDesc QMeterInfoTabDesc;
+ u_int32 StreamError[VID_API_NUM_STREAMS];
+ u_int32 FWVersion;
+ u_int32 uFWOffset;
+ u_int32 uMaxDecoderStreams;
+ MediaIPFW_Video_DbgLogDesc DbgLogDesc;
+ MediaIPFW_Video_FrameBuffer StreamFrameBuffer[VID_API_NUM_STREAMS];
+ MediaIPFW_Video_FrameBuffer StreamDCPBuffer[VID_API_NUM_STREAMS];
+ MediaIPFW_Video_UData UDataBuffer[VID_API_NUM_STREAMS];
+ MediaIPFW_Video_BufDesc DebugBufferDesc;
+ MediaIPFW_Video_BufDesc EngAccessBufferDesc[VID_API_NUM_STREAMS];
+ u_int32 ptEncryptInfo[VID_API_NUM_STREAMS];
+ MEDIAIP_FW_SYSTEM_CONFIG sSystemCfg;
+ u_int32 uApiVersion;
+ BUFFER_INFO_TYPE StreamBuffInfo[VID_API_NUM_STREAMS];
+} DEC_RPC_HOST_IFACE, *pDEC_RPC_HOST_IFACE;
+
+//x means source data , y means destination data
+#define VID_STREAM_CONFIG_FORMAT_MASK 0x0000000F
+#define VID_STREAM_CONFIG_FORMAT_POS 0
+#define VID_STREAM_CONFIG_FORMAT_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_FORMAT_POS)&VID_STREAM_CONFIG_FORMAT_MASK)))
+
+#define VID_STREAM_CONFIG_STRBUFIDX_MASK 0x00000300
+#define VID_STREAM_CONFIG_STRBUFIDX_POS 8
+#define VID_STREAM_CONFIG_STRBUFIDX_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_STRBUFIDX_POS)&VID_STREAM_CONFIG_STRBUFIDX_MASK)))
+
+#define VID_STREAM_CONFIG_NOSEQ_MASK 0x00000400
+#define VID_STREAM_CONFIG_NOSEQ_POS 10
+#define VID_STREAM_CONFIG_NOSEQ_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_NOSEQ_POS)&VID_STREAM_CONFIG_NOSEQ_MASK)))
+
+#define VID_STREAM_CONFIG_DEBLOCK_MASK 0x00000800
+#define VID_STREAM_CONFIG_DEBLOCK_POS 11
+#define VID_STREAM_CONFIG_DEBLOCK_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_DEBLOCK_POS)&VID_STREAM_CONFIG_DEBLOCK_MASK)))
+
+#define VID_STREAM_CONFIG_DERING_MASK 0x00001000
+#define VID_STREAM_CONFIG_DERING_POS 12
+#define VID_STREAM_CONFIG_DERING_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_DERING_POS)&VID_STREAM_CONFIG_DERING_MASK)))
+
+#define VID_STREAM_CONFIG_IBWAIT_MASK 0x00002000
+#define VID_STREAM_CONFIG_IBWAIT_POS 13
+#define VID_STREAM_CONFIG_IBWAIT_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_IBWAIT_POS)&VID_STREAM_CONFIG_IBWAIT_MASK)))
+
+#define VID_STREAM_CONFIG_FBC_MASK 0x00004000
+#define VID_STREAM_CONFIG_FBC_POS 14
+#define VID_STREAM_CONFIG_FBC_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_FBC_POS)&VID_STREAM_CONFIG_FBC_MASK)))
+
+#define VID_STREAM_CONFIG_PLAY_MODE_MASK 0x00030000
+#define VID_STREAM_CONFIG_PLAY_MODE_POS 16
+#define VID_STREAM_CONFIG_PLAY_MODE_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_PLAY_MODE_POS)&VID_STREAM_CONFIG_PLAY_MODE_MASK)))
+
+#define VID_STREAM_CONFIG_ENABLE_DCP_MASK 0x00100000
+#define VID_STREAM_CONFIG_ENABLE_DCP_POS 20
+#define VID_STREAM_CONFIG_ENABLE_DCP_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_ENABLE_DCP_POS)&VID_STREAM_CONFIG_ENABLE_DCP_MASK)))
+
+#define VID_STREAM_CONFIG_NUM_STR_BUF_MASK 0x00600000
+#define VID_STREAM_CONFIG_NUM_STR_BUF_POS 21
+#define VID_STREAM_CONFIG_NUM_STR_BUF_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_NUM_STR_BUF_POS)&VID_STREAM_CONFIG_NUM_STR_BUF_MASK)))
+
+#define VID_STREAM_CONFIG_MALONE_USAGE_MASK 0x01800000
+#define VID_STREAM_CONFIG_MALONE_USAGE_POS 23
+#define VID_STREAM_CONFIG_MALONE_USAGE_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_MALONE_USAGE_POS)&VID_STREAM_CONFIG_MALONE_USAGE_MASK)))
+
+#define VID_STREAM_CONFIG_MULTI_VID_MASK 0x02000000
+#define VID_STREAM_CONFIG_MULTI_VID_POS 25
+#define VID_STREAM_CONFIG_MULTI_VID_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_MULTI_VID_POS)&VID_STREAM_CONFIG_MULTI_VID_MASK)))
+
+#define VID_STREAM_CONFIG_OBFUSC_EN_MASK 0x04000000
+#define VID_STREAM_CONFIG_OBFUSC_EN_POS 26
+#define VID_STREAM_CONFIG_OBFUSC_EN_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_OBFUSC_EN_POS)&VID_STREAM_CONFIG_OBFUSC_EN_MASK)))
+
+#define VID_STREAM_CONFIG_RC4_EN_MASK 0x08000000
+#define VID_STREAM_CONFIG_RC4_EN_POS 27
+#define VID_STREAM_CONFIG_RC4_EN_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_RC4_EN_POS)&VID_STREAM_CONFIG_RC4_EN_MASK)))
+
+#define VID_STREAM_CONFIG_MCX_MASK 0x10000000
+#define VID_STREAM_CONFIG_MCX_POS 28
+#define VID_STREAM_CONFIG_MCX_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_MCX_POS)&VID_STREAM_CONFIG_MCX_MASK)))
+
+#define VID_STREAM_CONFIG_PES_MASK 0x20000000
+#define VID_STREAM_CONFIG_PES_POS 29
+#define VID_STREAM_CONFIG_PES_SET(x, y) ((*y = (*y | ((x << VID_STREAM_CONFIG_PES_POS)&VID_STREAM_CONFIG_PES_MASK))))
+
+#define VID_STREAM_CONFIG_NUM_DBE_MASK 0x40000000
+#define VID_STREAM_CONFIG_NUM_DBE_POS 30
+#define VID_STREAM_CONFIG_NUM_DBE_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_NUM_DBE_POS)&VID_STREAM_CONFIG_NUM_DBE_MASK)))
+
+#define VID_STREAM_CONFIG_FS_CTRL_MODE_MASK 0x80000000
+#define VID_STREAM_CONFIG_FS_CTRL_MODE_POS 31
+#define VID_STREAM_CONFIG_FS_CTRL_MODE_SET(x, y) (*y = (*y | ((x << VID_STREAM_CONFIG_FS_CTRL_MODE_POS)&VID_STREAM_CONFIG_FS_CTRL_MODE_MASK)))
+
+#define SCB_XREG_SLV_BASE 0x00000000
+#define SCB_SCB_BLK_CTRL 0x00070000
+#define SCB_BLK_CTRL_XMEM_RESET_SET 0x00000090
+#define SCB_BLK_CTRL_CACHE_RESET_SET 0x000000A0
+#define SCB_BLK_CTRL_CACHE_RESET_CLR 0x000000A4
+#define SCB_BLK_CTRL_SCB_CLK_ENABLE_SET 0x00000100
+
+#define XMEM_CONTROL 0x00041000
+
+#define DEC_MFD_XREG_SLV_BASE 0x00180000
+
+#define MFD_HIF 0x0001C000
+#define MFD_HIF_MSD_REG_INTERRUPT_STATUS 0x00000018
+#define MFD_SIF 0x0001D000
+#define MFD_SIF_CTRL_STATUS 0x000000F0
+#define MFD_SIF_INTR_STATUS 0x000000F4
+#define MFD_MCX 0x00020800
+#define MFD_MCX_OFF 0x00000020
+
+#define MFD_BLK_CTRL 0x00030000
+#define MFD_BLK_CTRL_MFD_SYS_RESET_SET 0x00000000
+#define MFD_BLK_CTRL_MFD_SYS_RESET_CLR 0x00000004
+#define MFD_BLK_CTRL_MFD_SYS_CLOCK_ENABLE_SET 0x00000100
+#define MFD_BLK_CTRL_MFD_SYS_CLOCK_ENABLE_CLR 0x00000104
+
+#define CSR_CM0Px_ADDR_OFFSET 0x00000000
+#define CSR_CM0Px_CPUWAIT 0x00000004
+
+#endif
diff --git a/drivers/mxc/vpu_malone/vpu_b0.c b/drivers/mxc/vpu_malone/vpu_b0.c
new file mode 100644
index 000000000000..780e5a607335
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_b0.c
@@ -0,0 +1,6693 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file vpu-b0.c
+ *
+ * copyright here may be changed later
+ *
+ *
+ */
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/module.h>
+#include <linux/videodev2.h>
+#include <linux/firmware.h>
+#include <linux/file.h>
+#include <linux/slab.h>
+#include <linux/platform_data/dma-imx.h>
+#include <linux/miscdevice.h>
+#include <linux/fs.h>
+#include <linux/pm_runtime.h>
+#include <linux/uaccess.h>
+#include <linux/debugfs.h>
+
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-ioctl.h>
+#include <media/v4l2-mem2mem.h>
+#include <media/videobuf2-v4l2.h>
+#include <media/videobuf2-dma-contig.h>
+#include <media/videobuf2-dma-sg.h>
+
+#include "vpu_b0.h"
+#include "insert_startcode.h"
+#include "vpu_debug_log.h"
+#include "vpu_ts.h"
+#include "vpu_pm.h"
+#include "vpu_mu.h"
+
+unsigned int vpu_dbg_level_decoder = LVL_WARN;
+static int vpu_frm_depth = INVALID_FRAME_DEPTH;
+static int vpu_log_depth = DEFAULT_LOG_DEPTH;
+static int vpu_max_bufsize = MAX_BUFFER_SIZE;
+static int vpu_frmdbg_ena = DEFAULT_FRMDBG_ENABLE;
+static int vpu_frmdbg_level = DEFAULT_FRMDBG_LEVEL;
+static int vpu_frmdbg_raw = 1;
+static int vpu_dbe_num = 1;
+static int vpu_frmcrcdump_ena;
+static int stream_buffer_threshold = 0x10000;
+static int tsm_mode = MODE_AI;
+static int tsm_buffer_size = 1024;
+static int tsm_use_consumed_length = 1;
+static int precheck_show_bytes;
+static int vpu_show_perf_ena;
+static int vpu_show_perf_idx = (1 << VPU_MAX_NUM_STREAMS) - 1;
+static int vpu_show_perf_ent;
+static int vpu_datadump_ena;
+
+/* Generic End of content startcodes to differentiate from those naturally in the stream/file */
+#define EOS_GENERIC_HEVC 0x7c010000
+#define EOS_GENERIC_JPEG 0xefff0000
+#define EOS_GENERIC_MPEG 0xCC010000
+static void vpu_api_event_handler(struct vpu_ctx *ctx, u_int32 uStrIdx, u_int32 uEvent, u_int32 *event_data);
+static void v4l2_vpu_send_cmd(struct vpu_ctx *ctx, uint32_t idx, uint32_t cmdid, uint32_t cmdnum, uint32_t *local_cmddata);
+static int add_scode(struct vpu_ctx *ctx, u_int32 uStrBufIdx, VPU_PADDING_SCODE_TYPE eScodeType, bool bUpdateWr);
+static void v4l2_update_stream_addr(struct vpu_ctx *ctx, uint32_t uStrBufIdx);
+static int swreset_vpu_firmware(struct vpu_dev *dev, u_int32 idx);
+static int find_first_available_instance(struct vpu_dev *dev);
+static int remove_instance_file(struct vpu_ctx *ctx);
+static void fill_stream_buffer_info(struct vpu_ctx *ctx);
+static void set_pic_end_flag(struct vpu_ctx *ctx);
+static void clear_pic_end_flag(struct vpu_ctx *ctx);
+static void send_skip_event(struct vpu_ctx* ctx);
+static void reset_mbi_dcp_count(struct vpu_ctx *ctx);
+static bool verify_frame_buffer_size(struct queue_data *q_data,
+ struct vb2_data_req *p_data_req);
+static void add_buffer_to_queue(struct queue_data *q_data, struct vb2_data_req *data_req);
+static int send_abort_cmd(struct vpu_ctx *ctx);
+static int send_stop_cmd(struct vpu_ctx *ctx);
+static int vpu_dec_cmd_reset(struct vpu_ctx *ctx);
+static void vpu_dec_event_decode_error(struct vpu_ctx *ctx);
+static void vpu_calculate_performance(struct vpu_ctx *ctx, u_int32 uEvent, const char *str);
+
+#define CHECK_BIT(var, pos) (((var) >> (pos)) & 1)
+
+static char *cmd2str[] = {
+ "VID_API_CMD_NULL", /*0x0*/
+ "VID_API_CMD_PARSE_NEXT_SEQ", /*0x1*/
+ "VID_API_CMD_PARSE_NEXT_I",
+ "VID_API_CMD_PARSE_NEXT_IP",
+ "VID_API_CMD_PARSE_NEXT_ANY",
+ "VID_API_CMD_DEC_PIC",
+ "VID_API_CMD_UPDATE_ES_WR_PTR",
+ "VID_API_CMD_UPDATE_ES_RD_PTR",
+ "VID_API_CMD_UPDATE_UDATA",
+ "VID_API_CMD_GET_FSINFO",
+ "VID_API_CMD_SKIP_PIC",
+ "VID_API_CMD_DEC_CHUNK", /*0x0b*/
+ "VID_API_CMD_UNDEFINED",
+ "VID_API_CMD_UNDEFINED",
+ "VID_API_CMD_UNDEFINED",
+ "VID_API_CMD_UNDEFINED",
+ "VID_API_CMD_START", /*0x10*/
+ "VID_API_CMD_STOP",
+ "VID_API_CMD_ABORT",
+ "VID_API_CMD_RST_BUF",
+ "VID_API_CMD_UNDEFINED",
+ "VID_API_CMD_FS_RELEASE",
+ "VID_API_CMD_MEM_REGION_ATTACH",
+ "VID_API_CMD_MEM_REGION_DETACH",
+ "VID_API_CMD_MVC_VIEW_SELECT",
+ "VID_API_CMD_FS_ALLOC", /*0x19*/
+ "VID_API_CMD_UNDEFINED",
+ "VID_API_CMD_UNDEFINED",
+ "VID_API_CMD_DBG_GET_STATUS", /*0x1C*/
+ "VID_API_CMD_DBG_START_LOG",
+ "VID_API_CMD_DBG_STOP_LOG",
+ "VID_API_CMD_DBG_DUMP_LOG",
+ "VID_API_CMD_YUV_READY", /*0x20*/
+};
+
+static char *event2str[] = {
+ "VID_API_EVENT_NULL", /*0x0*/
+ "VID_API_EVENT_RESET_DONE", /*0x1*/
+ "VID_API_EVENT_SEQ_HDR_FOUND",
+ "VID_API_EVENT_PIC_HDR_FOUND",
+ "VID_API_EVENT_PIC_DECODED",
+ "VID_API_EVENT_FIFO_LOW",
+ "VID_API_EVENT_FIFO_HIGH",
+ "VID_API_EVENT_FIFO_EMPTY",
+ "VID_API_EVENT_FIFO_FULL",
+ "VID_API_EVENT_BS_ERROR",
+ "VID_API_EVENT_UDATA_FIFO_UPTD",
+ "VID_API_EVENT_RES_CHANGE",
+ "VID_API_EVENT_FIFO_OVF",
+ "VID_API_EVENT_CHUNK_DECODED", /*0x0D*/
+ "VID_API_EVENT_UNDEFINED",
+ "VID_API_EVENT_UNDEFINED",
+ "VID_API_EVENT_REQ_FRAME_BUFF", /*0x10*/
+ "VID_API_EVENT_FRAME_BUFF_RDY",
+ "VID_API_EVENT_REL_FRAME_BUFF",
+ "VID_API_EVENT_STR_BUF_RST",
+ "VID_API_EVENT_RET_PING",
+ "VID_API_EVENT_QMETER",
+ "VID_API_EVENT_STR_FMT_CHANGED",
+ "VID_API_EVENT_FIRMWARE_XCPT",
+ "VID_API_EVENT_START_DONE",
+ "VID_API_EVENT_STOPPED",
+ "VID_API_EVENT_ABORT_DONE",
+ "VID_API_EVENT_FINISHED",
+ "VID_API_EVENT_DBG_STAT_UPDATE",
+ "VID_API_EVENT_DBG_LOG_STARTED",
+ "VID_API_EVENT_DBG_LOG_STOPPED",
+ "VID_API_EVENT_DBG_LOG_UPFATED",
+ "VID_API_EVENT_DBG_MSG_DEC", /*0x20*/
+ "VID_API_EVENT_DEC_SC_ERR",
+ "VID_API_EVENT_CQ_FIFO_DUMP",
+ "VID_API_EVENT_DBG_FIFO_DUMP",
+ "VID_API_EVENT_DEC_CHECK_RES",
+ "VID_API_EVENT_DEC_CFG_INFO", /*0x25*/
+};
+
+static char *bufstat[] = {
+ "FRAME_ALLOC",
+ "FRAME_FREE",
+ "FRAME_DECODED",
+ "FRAME_READY",
+ "FRAME_RELEASE",
+};
+
+static int alloc_vpu_buffer(struct vpu_ctx *ctx);
+static bool vpu_dec_is_active(struct vpu_ctx *ctx);
+static void respond_req_frame(struct vpu_ctx *ctx,
+ struct queue_data *queue,
+ bool abnormal);
+static void release_frame_buffer(struct vpu_ctx *ctx,
+ u32 uStrIdx,
+ struct vb2_data_req *p_data_req);
+static void send_eos_event(struct vpu_ctx *ctx);
+static void release_queue_data(struct vpu_ctx *ctx);
+
+static char *get_event_str(u32 event)
+{
+ if (event == VID_API_EVENT_SNAPSHOT_DONE)
+ return "VID_API_EVENT_SNAPSHOT_DONE";
+ else if (event >= ARRAY_SIZE(event2str))
+ return "UNKNOWN EVENT";
+ return event2str[event];
+}
+
+static char *get_cmd_str(u32 cmdid)
+{
+ if (cmdid == VID_API_CMD_FIRM_RESET)
+ return "VID_API_CMD_FIRM_RESET";
+ else if (cmdid == VID_API_CMD_SNAPSHOT)
+ return "VID_API_CMD_SNAPSHOT";
+ else if (cmdid >= ARRAY_SIZE(cmd2str))
+ return "UNKNOWN CMD";
+ return cmd2str[cmdid];
+}
+
+static void vpu_log_event(u_int32 uEvent, u_int32 ctxid)
+{
+ if (uEvent > ARRAY_SIZE(event2str)-1)
+ vpu_dbg(LVL_BIT_EVT, "reveive event: 0x%X, ctx id:%d\n",
+ uEvent, ctxid);
+ else
+ vpu_dbg(LVL_BIT_EVT, "recevie event: %s, ctx id:%d\n",
+ event2str[uEvent], ctxid);
+}
+
+static void vpu_log_cmd(u_int32 cmdid, u_int32 ctxid)
+{
+ if (cmdid > ARRAY_SIZE(cmd2str)-1)
+ vpu_dbg(LVL_BIT_CMD, "send cmd: 0x%X, ctx id:%d\n",
+ cmdid, ctxid);
+ else
+ vpu_dbg(LVL_BIT_CMD, "send cmd: %s ctx id:%d\n",
+ cmd2str[cmdid], ctxid);
+}
+
+static void vpu_log_buffer_state(struct vpu_ctx *ctx)
+{
+ struct vb2_data_req *p_data_req;
+ struct queue_data *This;
+ int i;
+
+ if (!ctx)
+ return;
+
+ This = &ctx->q_data[V4L2_DST];
+ down(&This->drv_q_lock);
+ for (i = 0; i < VPU_MAX_BUFFER; i++) {
+ p_data_req = &This->vb2_reqs[i];
+ if (p_data_req->vb2_buf != NULL)
+ vpu_dbg(LVL_BIT_BUFFER_STAT,
+ "ctx: %d, buffer[%d] status: %s\n",
+ ctx->str_index, i, bufstat[p_data_req->status]);
+ }
+ up(&This->drv_q_lock);
+}
+
+static void count_event(struct vpu_statistic *statistic, u32 event)
+{
+ if (!statistic)
+ return;
+
+ if (event < ARRAY_SIZE(event2str))
+ statistic->event[event]++;
+ else
+ statistic->event[VID_API_EVENT_DEC_CFG_INFO + 1]++;
+
+ statistic->current_event = event;
+ getrawmonotonic(&statistic->ts_event);
+}
+
+static void count_cmd(struct vpu_statistic *statistic, u32 cmdid)
+{
+ if (!statistic)
+ return;
+
+ if (cmdid < ARRAY_SIZE(cmd2str))
+ statistic->cmd[cmdid]++;
+ else
+ statistic->cmd[VID_API_CMD_YUV_READY + 1]++;
+ statistic->current_cmd = cmdid;
+ getrawmonotonic(&statistic->ts_cmd);
+}
+
+static u32 get_greatest_common_divisor(u32 a, u32 b)
+{
+ u32 tmp;
+
+ if (!a)
+ return b;
+
+ while (b) {
+ tmp = a % b;
+ a = b;
+ b = tmp;
+ }
+
+ return a;
+}
+
+static void get_kmp_next(const u8 *p, int *next, int size)
+{
+ int k = -1;
+ int j = 0;
+
+ next[0] = -1;
+ while (j < size - 1) {
+ if (k == -1 || p[j] == p[k]) {
+ ++k;
+ ++j;
+ next[j] = k;
+ } else {
+ k = next[k];
+ }
+ }
+}
+
+static int kmp_search(u8 *s, int s_len, const u8 *p, int p_len, int *next)
+{
+ int i = 0;
+ int j = 0;
+
+ while (i < s_len && j < p_len) {
+ if (j == -1 || s[i] == p[j]) {
+ i++;
+ j++;
+ } else {
+ j = next[j];
+ }
+ }
+ if (j == p_len)
+ return i - j;
+ else
+ return -1;
+}
+
+static void find_pattern_from_vb(struct vpu_dev *dev, unsigned long index,
+ struct vb2_buffer *vb, unsigned int plane_no)
+{
+ u8 *ptr = NULL;
+ int ret;
+
+ if (!dev || !dev->precheck_num)
+ return;
+
+ if (!vb || plane_no >= vb->num_planes)
+ return;
+
+ ptr = vb2_plane_vaddr(vb, plane_no);
+ if (!ptr)
+ return;
+
+ ret = kmp_search(ptr,
+ vb->planes[plane_no].bytesused,
+ dev->precheck_pattern,
+ dev->precheck_num,
+ dev->precheck_next);
+ if (ret < 0)
+ return;
+ vpu_dbg(LVL_WARN, "[%12ld]pattern(%s) found : %d\n",
+ index,
+ dev->precheck_content,
+ ret);
+}
+
+static void show_beginning_of_data(unsigned long index,
+ struct vb2_buffer *vb, unsigned int plane_no)
+{
+ u8 *pdata;
+ u32 length;
+ u32 bytes = 0;
+ u32 show_count;
+ char temp[1028];
+ int i;
+
+ if (!precheck_show_bytes)
+ return;
+
+ if (!vb || plane_no >= vb->num_planes)
+ return;
+
+ pdata = vb2_plane_vaddr(vb, plane_no);
+ length = vb->planes[plane_no].bytesused;
+ if (!pdata || !length)
+ return;
+ show_count = min_t(u32, precheck_show_bytes, length);
+ for (i = 0; i < show_count; i++) {
+ bytes += scnprintf(temp + bytes,
+ sizeof(temp) - bytes,
+ "%s0x%02x",
+ i ? " " : "",
+ pdata[i]);
+ if (bytes >= sizeof(temp))
+ break;
+ }
+ vpu_dbg(LVL_WARN, "[%12ld]%s\n", index, temp);
+}
+
+static void precheck_vb_data(struct vpu_ctx *ctx, struct vb2_buffer *vb)
+{
+ unsigned long index;
+
+ if (!ctx || !vb)
+ return;
+
+ index = ctx->q_data[V4L2_SRC].qbuf_count;
+ show_beginning_of_data(index, vb, 0);
+ find_pattern_from_vb(ctx->dev, index, vb, 0);
+}
+
+static bool check_vb_is_changed(struct vb2_data_req *p_data_req, u32 pattern)
+{
+ u32 luma_addr;
+ u32 *pphy_address;
+
+ pphy_address = vb2_plane_cookie(p_data_req->vb2_buf, 0);
+ luma_addr = *pphy_address + p_data_req->data_offset[0];
+ if (luma_addr != pattern)
+ return true;
+
+ return false;
+}
+
+static int find_buffer_id(struct vpu_ctx *ctx, u_int32 addr)
+{
+ struct queue_data *This;
+ struct vb2_data_req *p_data_req;
+ u_int32 LumaAddr;
+ u_int32 i;
+
+ if (!ctx)
+ return -1;
+
+ This = &ctx->q_data[V4L2_DST];
+ down(&This->drv_q_lock);
+ for (i = 0; i < VPU_MAX_BUFFER; i++) {
+ p_data_req = &This->vb2_reqs[i];
+
+ if (!p_data_req->vb2_buf)
+ continue;
+
+ LumaAddr = p_data_req->phy_addr[0] + p_data_req->data_offset[0];
+ if (LumaAddr == addr) {
+ if (check_vb_is_changed(p_data_req, LumaAddr))
+ vpu_err("ctx[%d] frame buffer[%d] is changed\n",
+ ctx->str_index, i);
+ break;
+ }
+ }
+ up(&This->drv_q_lock);
+ if (i == VPU_MAX_BUFFER) {
+ vpu_err("error: ctx[%d] can't find id based on address(0x%x)\n",
+ ctx->str_index, addr);
+ return -1;
+ }
+ return i;
+}
+
+static u32 get_str_buffer_desc_offset(struct vpu_ctx *ctx)
+{
+ return DEC_MFD_XREG_SLV_BASE + MFD_MCX + MFD_MCX_OFF * ctx->str_index;
+}
+
+pSTREAM_BUFFER_DESCRIPTOR_TYPE get_str_buffer_desc(struct vpu_ctx *ctx)
+{
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+
+ WARN_ON(!ctx || !ctx->dev);
+ pStrBufDesc = ctx->dev->regs_base + get_str_buffer_desc_offset(ctx);
+ return pStrBufDesc;
+}
+
+static void set_data_req_status(struct vb2_data_req *p_data_req,
+ FRAME_BUFFER_STAT status)
+{
+ vpu_dbg(LVL_BIT_BUFFER_STAT, "Buffer Status [%2d] : %s -> %s\n",
+ p_data_req->id,
+ bufstat[p_data_req->status],
+ bufstat[status]);
+ p_data_req->status = status;
+}
+
+static u32 vpu_dec_cpu_phy_to_mu(struct vpu_dev *dev, u32 addr)
+{
+ return addr - dev->m0_p_fw_space_phy;
+}
+
+#ifdef DEBUG
+static void vpu_log_shared_mem(struct vpu_ctx *ctx)
+{
+ struct vpu_dev *dev = ctx->dev;
+ struct shared_addr *This = &dev->shared_mem;
+ pDEC_RPC_HOST_IFACE pSharedInterface = (pDEC_RPC_HOST_IFACE)This->shared_mem_vir;
+ MediaIPFW_Video_BufDesc *pMsgDesc = &pSharedInterface->StreamMsgBufferDesc;
+ MediaIPFW_Video_BufDesc *pCmdDesc = &pSharedInterface->StreamCmdBufferDesc;
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ u_int32 index = ctx->str_index;
+
+ vpu_dbg(LVL_INFO, "msg: wr: 0x%x, rd: 0x%x, cmd: wr : 0x%x, rd: 0x%x\n",
+ pMsgDesc->uWrPtr, pMsgDesc->uRdPtr, pCmdDesc->uWrPtr, pCmdDesc->uRdPtr);
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ vpu_dbg(LVL_INFO, "data: wptr(0x%x) rptr(0x%x) start(0x%x) end(0x%x) uStrIdx(%d)\n",
+ pStrBufDesc->wptr, pStrBufDesc->rptr, pStrBufDesc->start, pStrBufDesc->end, index);
+}
+#endif
+/*
+ * v4l2 ioctl() operation
+ *
+ */
+static struct vpu_v4l2_fmt formats_compressed_dec[] = {
+ {
+ .name = "H264 Encoded Stream",
+ .fourcc = V4L2_PIX_FMT_H264,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_AVC,
+ .disable = 0,
+ },
+ {
+ .name = "VC1 Encoded Stream",
+ .fourcc = V4L2_PIX_FMT_VC1_ANNEX_G,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_VC1,
+ .disable = 0,
+ },
+ {
+ .name = "VC1 RCV Encoded Stream",
+ .fourcc = V4L2_PIX_FMT_VC1_ANNEX_L,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_VC1,
+ .disable = 0,
+ },
+ {
+ .name = "MPEG2 Encoded Stream",
+ .fourcc = V4L2_PIX_FMT_MPEG2,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_MPEG2,
+ .disable = 0,
+ },
+
+ {
+ .name = "AVS Encoded Stream",
+ .fourcc = VPU_PIX_FMT_AVS,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_AVS,
+ .disable = 0,
+ },
+ {
+ .name = "MPEG4 ASP Encoded Stream",
+ .fourcc = V4L2_PIX_FMT_MPEG4,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_ASP,
+ .disable = 0,
+ },
+ {
+ .name = "DIVX Encoded Stream",
+ .fourcc = VPU_PIX_FMT_DIV3,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_ASP,
+ .disable = 0,
+ },
+ {
+ .name = "DIVX Encoded Stream",
+ .fourcc = VPU_PIX_FMT_DIVX,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_ASP,
+ .disable = 0,
+ },
+ {
+ .name = "JPEG stills",
+ .fourcc = V4L2_PIX_FMT_JPEG,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_JPEG,
+ .disable = 0,
+ },
+ {
+ .name = "RV Encoded Stream",
+ .fourcc = VPU_PIX_FMT_RV,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_RV,
+ .disable = 0,
+ },
+ {
+ .name = "VP6 Encoded Stream",
+ .fourcc = VPU_PIX_FMT_VP6,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_VP6,
+ .disable = 0,
+ },
+ {
+ .name = "SPK Encoded Stream",
+ .fourcc = VPU_PIX_FMT_SPK,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_SPK,
+ .disable = 0,
+ },
+ {
+ .name = "H263 Encoded Stream",
+ .fourcc = V4L2_PIX_FMT_H263,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_ASP,
+ .disable = 0,
+ },
+ {
+ .name = "VP8 Encoded Stream",
+ .fourcc = V4L2_PIX_FMT_VP8,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_VP8,
+ .disable = 0,
+ },
+ {
+ .name = "H264/MVC Encoded Stream",
+ .fourcc = V4L2_PIX_FMT_H264_MVC,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_AVC_MVC,
+ .disable = 0,
+ },
+ {
+ .name = "H265 HEVC Encoded Stream",
+ .fourcc = VPU_PIX_FMT_HEVC,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_HEVC,
+ .disable = 0,
+ },
+ {
+ .name = "Xvid Encoded Stream",
+ .fourcc = V4L2_PIX_FMT_XVID,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_ASP,
+ .disable = 0,
+ },
+ {
+ .name = "Logo",
+ .fourcc = VPU_PIX_FMT_LOGO,
+ .num_planes = 1,
+ .vdec_std = VPU_VIDEO_UNDEFINED,
+ .disable = 0,
+ },
+};
+
+static struct vpu_v4l2_fmt formats_yuv_dec[] = {
+ {
+ .name = "4:2:0 2 Planes Y/CbCr",
+ .fourcc = V4L2_PIX_FMT_NV12,
+ .num_planes = 2,
+ .vdec_std = VPU_PF_YUV420_SEMIPLANAR,
+ .disable = 0,
+ },
+ {
+ .name = "4:2:0 2 Planes Y/CbCr",
+ .fourcc = V4L2_PIX_FMT_NV12_10BIT,
+ .num_planes = 2,
+ .vdec_std = VPU_PF_YUV420_SEMIPLANAR,
+ .disable = 0,
+ },
+};
+
+static int v4l2_ioctl_querycap(struct file *file,
+ void *fh,
+ struct v4l2_capability *cap
+ )
+{
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+ strlcpy(cap->driver, "vpu B0", sizeof(cap->driver));
+ strlcpy(cap->card, "vpu B0", sizeof(cap->card));
+ strlcpy(cap->bus_info, "platform:", sizeof(cap->bus_info));
+ cap->version = KERNEL_VERSION(0, 0, 1);
+ cap->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING;
+ cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
+ return 0;
+}
+
+static int v4l2_ioctl_enum_fmt_vid_cap(struct file *file,
+ void *fh,
+ struct v4l2_fmtdesc *f
+ )
+{
+ struct vpu_v4l2_fmt *fmt;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ return -EINVAL;
+
+ if (f->index >= ARRAY_SIZE(formats_yuv_dec))
+ return -EINVAL;
+
+ fmt = &formats_yuv_dec[f->index];
+ strlcpy(f->description, fmt->name, sizeof(f->description));
+ f->pixelformat = fmt->fourcc;
+ vpu_dbg(LVL_INFO, "CAPTURE fmt[%d] %c%c%c%c\n",
+ f->index,
+ f->pixelformat & 0xff,
+ (f->pixelformat >> 8) & 0xff,
+ (f->pixelformat >> 16) & 0xff,
+ (f->pixelformat >> 24) & 0xff);
+ return 0;
+}
+
+static bool check_fmt_is_support(struct vpu_ctx *ctx, struct vpu_v4l2_fmt *fmt)
+{
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ bool support;
+
+ if (!ctx || !ctx->dev || !fmt)
+ return false;
+
+ if (fmt->disable)
+ return false;
+
+ pSharedInterface = ctx->dev->shared_mem.pSharedInterface;
+ support = true;
+
+ switch (fmt->fourcc) {
+ case VPU_PIX_FMT_DIV3:
+ case VPU_PIX_FMT_DIVX:
+ if (!(pSharedInterface->FWVersion & VPU_DEC_FMT_DIVX_MASK))
+ support = false;
+ break;
+ case VPU_PIX_FMT_RV:
+ if (!(pSharedInterface->FWVersion & VPU_DEC_FMT_RV_MASK))
+ support = false;
+ break;
+ default:
+ break;
+ }
+
+ return support;
+}
+
+static int v4l2_ioctl_enum_fmt_vid_out(struct file *file,
+ void *fh,
+ struct v4l2_fmtdesc *f
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct vpu_v4l2_fmt *fmt;
+ u_int32 index = 0, i;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
+ return -EINVAL;
+
+ if (f->index >= ARRAY_SIZE(formats_compressed_dec))
+ return -EINVAL;
+
+ for (i = 0; i < ARRAY_SIZE(formats_compressed_dec); i++) {
+ fmt = &formats_compressed_dec[i];
+ if (!check_fmt_is_support(ctx, fmt))
+ continue;
+ if (f->index == index)
+ break;
+ index++;
+ }
+
+ if (i == ARRAY_SIZE(formats_compressed_dec))
+ return -EINVAL;
+
+ strlcpy(f->description, fmt->name, sizeof(f->description));
+ f->pixelformat = fmt->fourcc;
+ f->flags |= V4L2_FMT_FLAG_COMPRESSED;
+ vpu_dbg(LVL_INFO, "OUTPUT fmt[%d] %c%c%c%c\n",
+ f->index,
+ f->pixelformat & 0xff,
+ (f->pixelformat >> 8) & 0xff,
+ (f->pixelformat >> 16) & 0xff,
+ (f->pixelformat >> 24) & 0xff);
+
+ return 0;
+}
+
+static bool is_10bit_format(struct vpu_ctx *ctx)
+{
+ WARN_ON(!ctx);
+ if (ctx->seqinfo.uBitDepthLuma > 8)
+ return true;
+ if (ctx->seqinfo.uBitDepthChroma > 8)
+ return true;
+ return false;
+}
+
+static void calculate_frame_size(struct vpu_ctx *ctx)
+{
+ u_int32 width = ctx->seqinfo.uHorDecodeRes;
+ u_int32 height = ctx->seqinfo.uVerDecodeRes;
+ u_int32 luma_size;
+ u_int32 chroma_size;
+ u_int32 chroma_height;
+ bool b10BitFormat = is_10bit_format(ctx);
+ struct queue_data *q_data;
+
+ q_data = &ctx->q_data[V4L2_DST];
+
+ width = b10BitFormat?(width + ((width + 3) >> 2)):width;
+ width = ALIGN(width, V4L2_NXP_FRAME_HORIZONTAL_ALIGN);
+ q_data->stride = width;
+
+ height = ALIGN(height, V4L2_NXP_FRAME_VERTICAL_ALIGN);
+ chroma_height = height >> 1;
+
+ luma_size = width * height;
+ chroma_size = width * chroma_height;
+
+ q_data->width = ctx->seqinfo.uHorRes;
+ q_data->height = ctx->seqinfo.uVerRes;
+ q_data->sizeimage[0] = luma_size;
+ q_data->sizeimage[1] = chroma_size;
+ if (ctx->seqinfo.uProgressive == 1)
+ q_data->field = V4L2_FIELD_NONE;
+ else
+ q_data->field = V4L2_FIELD_INTERLACED;
+}
+
+static int v4l2_ioctl_g_fmt(struct file *file,
+ void *fh,
+ struct v4l2_format *f
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
+ unsigned int i;
+ struct queue_data *q_data;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
+ q_data = &ctx->q_data[V4L2_DST];
+ down(&q_data->drv_q_lock);
+ if (is_10bit_format(ctx))
+ pix_mp->pixelformat = V4L2_PIX_FMT_NV12_10BIT;
+ else
+ pix_mp->pixelformat = V4L2_PIX_FMT_NV12;
+
+ pix_mp->width = q_data->width;
+ pix_mp->height = q_data->height;
+ pix_mp->field = q_data->field;
+ pix_mp->num_planes = 2;
+ pix_mp->colorspace = V4L2_COLORSPACE_REC709;
+ for (i = 0; i < pix_mp->num_planes; i++) {
+ pix_mp->plane_fmt[i].bytesperline = q_data->stride;
+ pix_mp->plane_fmt[i].sizeimage = q_data->sizeimage[i];
+ }
+ up(&q_data->drv_q_lock);
+ } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+ q_data = &ctx->q_data[V4L2_SRC];
+
+ down(&q_data->drv_q_lock);
+ pix_mp->width = q_data->width;
+ pix_mp->height = q_data->height;
+ pix_mp->field = V4L2_FIELD_NONE;
+ pix_mp->num_planes = q_data->num_planes;
+ for (i = 0; i < pix_mp->num_planes; i++) {
+ pix_mp->plane_fmt[i].bytesperline = q_data->stride;
+ pix_mp->plane_fmt[i].sizeimage = q_data->sizeimage[i];
+
+ }
+ pix_mp->pixelformat = q_data->fourcc;
+ up(&q_data->drv_q_lock);
+ } else
+ return -EINVAL;
+ vpu_dbg(LVL_BIT_FLOW, "%s g_fmt : %c%c%c%c %d x %d\n",
+ V4L2_TYPE_IS_OUTPUT(f->type) ? "OUTPUT" : "CAPTURE",
+ pix_mp->pixelformat & 0xff,
+ (pix_mp->pixelformat >> 8) & 0xff,
+ (pix_mp->pixelformat >> 16) & 0xff,
+ (pix_mp->pixelformat >> 24) & 0xff,
+ pix_mp->width,
+ pix_mp->height);
+ return 0;
+}
+
+static bool set_video_standard(struct vpu_ctx *ctx,
+ struct queue_data *q_data,
+ struct v4l2_format *f,
+ struct vpu_v4l2_fmt *pformat_table,
+ uint32_t table_size)
+{
+ unsigned int i;
+
+ for (i = 0; i < table_size; i++) {
+ if (pformat_table[i].fourcc == f->fmt.pix_mp.pixelformat) {
+ if (!check_fmt_is_support(ctx, &pformat_table[i]))
+ return false;
+ q_data->vdec_std = pformat_table[i].vdec_std;
+ }
+ }
+ return true;
+}
+
+static int v4l2_ioctl_s_fmt(struct file *file,
+ void *fh,
+ struct v4l2_format *f
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
+ struct queue_data *q_data;
+ u_int32 i;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ vpu_dbg(LVL_BIT_FLOW, "%s s_fmt : %c%c%c%c %d x %d\n",
+ V4L2_TYPE_IS_OUTPUT(f->type) ? "OUTPUT" : "CAPTURE",
+ pix_mp->pixelformat & 0xff,
+ (pix_mp->pixelformat >> 8) & 0xff,
+ (pix_mp->pixelformat >> 16) & 0xff,
+ (pix_mp->pixelformat >> 24) & 0xff,
+ pix_mp->width,
+ pix_mp->height);
+ if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
+ q_data = &ctx->q_data[V4L2_DST];
+ if (!set_video_standard(ctx, q_data, f, formats_yuv_dec, ARRAY_SIZE(formats_yuv_dec)))
+ return -EINVAL;
+ pix_mp->num_planes = 2;
+ pix_mp->colorspace = V4L2_COLORSPACE_REC709;
+ } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+ q_data = &ctx->q_data[V4L2_SRC];
+ if (!set_video_standard(ctx, q_data, f, formats_compressed_dec, ARRAY_SIZE(formats_compressed_dec)))
+ return -EINVAL;
+ } else
+ return -EINVAL;
+
+ q_data->num_planes = pix_mp->num_planes;
+ q_data->fourcc = pix_mp->pixelformat;
+
+ down(&q_data->drv_q_lock);
+ if (V4L2_TYPE_IS_OUTPUT(f->type) || ctx->b_firstseq) {
+ for (i = 0; i < q_data->num_planes; i++) {
+ q_data->stride = pix_mp->plane_fmt[i].bytesperline;
+ q_data->sizeimage[i] = pix_mp->plane_fmt[i].sizeimage;
+ }
+ q_data->width = pix_mp->width;
+ q_data->height = pix_mp->height;
+ } else {
+ for (i = 0; i < q_data->num_planes; i++) {
+ pix_mp->plane_fmt[i].bytesperline = q_data->stride;
+ pix_mp->plane_fmt[i].sizeimage = q_data->sizeimage[i];
+ }
+ pix_mp->width = q_data->width;
+ pix_mp->height = q_data->height;
+ }
+ up(&q_data->drv_q_lock);
+
+ if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ vpu_calculate_performance(ctx, 0xff, "capture set fmt");
+ else
+ vpu_calculate_performance(ctx, 0xff, "output set fmt");
+
+ return 0;
+}
+
+static int vpu_dec_queue_expbuf(struct queue_data *queue,
+ struct v4l2_exportbuffer *buf)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_expbuf(&queue->vb2_q, buf);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_dec_queue_reqbufs(struct queue_data *queue,
+ struct v4l2_requestbuffers *reqbuf)
+{
+ struct vpu_ctx *ctx;
+ int ret = -EINVAL;
+
+ ctx = container_of(queue, struct vpu_ctx, q_data[queue->type]);
+
+ down(&queue->drv_q_lock);
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] %s %s buffers\n",
+ ctx->str_index,
+ queue->type ? "CAPTURE" : "OUTPUT",
+ reqbuf->count ? "request" : "free");
+
+ if (queue->type == V4L2_SRC)
+ vpu_calculate_performance(ctx, 0xff, reqbuf->count ? "output request buffer begin" : "output free buffer begin");
+ else
+ vpu_calculate_performance(ctx, 0xff, reqbuf->count ? "capture request buffer begin" : "capture free buffer begin");
+
+ if (queue->vb2_q_inited)
+ ret = vb2_reqbufs(&queue->vb2_q, reqbuf);
+
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] %s %s buffers done\n",
+ ctx->str_index,
+ queue->type ? "CAPTURE" : "OUTPUT",
+ reqbuf->count ? "request" : "free");
+ if (queue->type == V4L2_SRC)
+ vpu_calculate_performance(ctx, 0xff, reqbuf->count ? "output request buffer finish" : "output free buffer finish");
+ else
+ vpu_calculate_performance(ctx, 0xff, reqbuf->count ? "capture request buffer finish" : "capture free buffer finish");
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_dec_queue_querybuf(struct queue_data *queue,
+ struct v4l2_buffer *buf)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_querybuf(&queue->vb2_q, buf);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_dec_queue_qbuf(struct queue_data *queue,
+ struct v4l2_buffer *buf)
+{
+ int ret = -EINVAL;
+ struct vb2_buffer *vb;
+
+ if (buf->index >= queue->vb2_q.num_buffers) {
+ vpu_err("[%s] buffer index(%d) out of range\n",
+ queue->type ? "CAPTURE" : "OUTPUT", buf->index);
+ return -EINVAL;
+ }
+ vb = queue->vb2_q.bufs[buf->index];
+ if (vb->state != VB2_BUF_STATE_DEQUEUED) {
+ vpu_err("[%s] buffer[%d] has been queued before\n",
+ queue->type ? "CAPTURE" : "OUTPUT", buf->index);
+ return -EINVAL;
+ }
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
+ ret = vb2_qbuf(&queue->vb2_q, queue->ctx->dev->v4l2_dev.mdev, buf);
+#else
+ ret = vb2_qbuf(&queue->vb2_q, buf);
+#endif
+ }
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_dec_queue_dqbuf(struct queue_data *queue,
+ struct v4l2_buffer *buf, bool nonblocking)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_dqbuf(&queue->vb2_q, buf, nonblocking);
+ if (!ret)
+ queue->dqbuf_count++;
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_dec_queue_enable(struct queue_data *queue,
+ enum v4l2_buf_type type)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_streamon(&queue->vb2_q, type);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static void check_queue_is_releasd(struct queue_data *queue, char *desc)
+{
+ struct vb2_data_req *p_data_req = NULL;
+ int i;
+
+ for (i = 0; i < queue->vb2_q.num_buffers; i++) {
+ p_data_req = &queue->vb2_reqs[i];
+ if (!p_data_req->vb2_buf)
+ continue;
+
+ if (p_data_req->status != FRAME_ALLOC)
+ vpu_dbg(LVL_WARN,
+ "%s:buffer(%d) status is %s when %s\n",
+ queue->type ? "CAPTURE" : "OUTPUT",
+ i, bufstat[p_data_req->status],
+ desc);
+ }
+}
+
+static void clear_queue(struct queue_data *queue)
+{
+ struct vb2_data_req *p_data_req = NULL;
+ struct vb2_data_req *p_temp;
+ struct vb2_buffer *vb;
+ struct vpu_ctx *ctx;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s() is called\n", __func__);
+ ctx = container_of(queue, struct vpu_ctx, q_data[queue->type]);
+ check_queue_is_releasd(queue, "clear queue");
+
+ list_for_each_entry_safe(p_data_req, p_temp, &queue->drv_q, list) {
+ list_del(&p_data_req->list);
+ p_data_req->queued = false;
+ }
+
+ list_for_each_entry(vb, &queue->vb2_q.queued_list, queued_entry) {
+ if (vb->state == VB2_BUF_STATE_ACTIVE)
+ vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
+ }
+ INIT_LIST_HEAD(&queue->drv_q);
+ if (queue->type == V4L2_SRC)
+ ctx->eos_stop_received = false;
+ vpu_dbg(LVL_BIT_FRAME_COUNT,
+ "%s qbuf_count : %ld, dqbuf_count : %ld\n",
+ queue->type == V4L2_DST ? "CAPTURE" : "OUTPUT",
+ queue->qbuf_count,
+ queue->dqbuf_count);
+ queue->qbuf_count = 0;
+ queue->dqbuf_count = 0;
+ queue->process_count = 0;
+}
+
+static int vpu_dec_queue_disable(struct queue_data *queue,
+ enum v4l2_buf_type type)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_streamoff(&queue->vb2_q, type);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_dec_queue_release(struct queue_data *queue)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited) {
+ clear_queue(queue);
+ vb2_queue_release(&queue->vb2_q);
+ }
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_dec_queue_mmap(struct queue_data *queue,
+ struct vm_area_struct *vma)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_mmap(&queue->vb2_q, vma);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int v4l2_ioctl_expbuf(struct file *file,
+ void *fh,
+ struct v4l2_exportbuffer *buf
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ if (buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
+ q_data = &ctx->q_data[V4L2_SRC];
+ else if (buf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ q_data = &ctx->q_data[V4L2_DST];
+ else
+ return -EINVAL;
+
+ return vpu_dec_queue_expbuf(q_data, buf);
+}
+
+static int v4l2_ioctl_subscribe_event(struct v4l2_fh *fh,
+ const struct v4l2_event_subscription *sub
+ )
+{
+ vpu_dbg(LVL_BIT_FUNC, "%s(), type: 0x%x\n", __func__, sub->type);
+
+ switch (sub->type) {
+ case V4L2_EVENT_EOS:
+ return v4l2_event_subscribe(fh, sub, 0, NULL);
+ case V4L2_EVENT_SKIP:
+ return v4l2_event_subscribe(fh, sub, 0, NULL);
+ case V4L2_EVENT_SOURCE_CHANGE:
+ return v4l2_src_change_event_subscribe(fh, sub);
+ case V4L2_EVENT_DECODE_ERROR:
+ return v4l2_event_subscribe(fh, sub, 0, NULL);
+ default:
+ return -EINVAL;
+ }
+}
+
+static void vpu_dec_cleanup_event(struct vpu_ctx *ctx)
+{
+ struct v4l2_event ev;
+ int ret;
+
+ while (v4l2_event_pending(&ctx->fh)) {
+ ret = v4l2_event_dequeue(&ctx->fh, &ev, 1);
+ if (ret)
+ break;
+ };
+}
+
+static void init_dma_buffer(struct dma_buffer *buffer)
+{
+ if (!buffer)
+ return;
+
+ buffer->dma_phy = 0;
+ buffer->dma_virt = NULL;
+ buffer->dma_size = 0;
+}
+
+static int alloc_dma_buffer(struct vpu_ctx *ctx, struct dma_buffer *buffer)
+{
+ if (!ctx || !ctx->dev || !buffer) {
+ vpu_dec_event_decode_error(ctx);
+ return -EINVAL;
+ }
+
+ buffer->dma_virt = dma_alloc_coherent(&ctx->dev->plat_dev->dev,
+ buffer->dma_size,
+ (dma_addr_t *)&buffer->dma_phy,
+ GFP_KERNEL | GFP_DMA32 | __GFP_NOWARN);
+
+ if (!buffer->dma_virt) {
+ vpu_err("error: %s() dma buffer alloc size(%x) fail!\n",
+ __func__, buffer->dma_size);
+ vpu_dec_event_decode_error(ctx);
+ return -ENOMEM;
+ }
+
+ memset_io(buffer->dma_virt, 0, buffer->dma_size);
+ atomic64_add(buffer->dma_size, &ctx->statistic.total_dma_size);
+ return 0;
+}
+
+static int free_dma_buffer(struct vpu_ctx *ctx, struct dma_buffer *buffer)
+{
+ if (!ctx || !ctx->dev || !buffer)
+ return -EINVAL;
+
+ if (!buffer->dma_virt)
+ return -1;
+
+ dma_free_coherent(&ctx->dev->plat_dev->dev,
+ buffer->dma_size,
+ buffer->dma_virt,
+ buffer->dma_phy);
+
+ atomic64_sub(buffer->dma_size, &ctx->statistic.total_dma_size);
+ init_dma_buffer(buffer);
+ return 0;
+}
+
+static u_int32 get_mbi_size(struct queue_data *queue)
+{
+ u_int32 uAlign = 0x800;
+ u_int32 mbi_size;
+
+ mbi_size = (queue->sizeimage[0] + queue->sizeimage[1])/4;
+ return ALIGN(mbi_size, uAlign);
+}
+
+static int alloc_mbi_buffer(struct vpu_ctx *ctx, u32 index)
+{
+ struct dma_buffer *mbi_buffer = NULL;
+ u_int32 ret = 0;
+
+ if (index >= ARRAY_SIZE(ctx->mbi_buffer)) {
+ vpu_err("request mbi buffer number(%d) out of range\n", index);
+ return -EINVAL;
+ }
+ if (!ctx->mbi_size) {
+ vpu_err("mbi buffer size is not initialized\n");
+ return -EINVAL;
+ }
+
+ mbi_buffer = &ctx->mbi_buffer[index];
+ if (mbi_buffer->dma_virt && mbi_buffer->dma_size >= ctx->mbi_size)
+ return 0;
+
+ free_dma_buffer(ctx, mbi_buffer);
+ mbi_buffer->dma_size = ctx->mbi_size;
+ ret = alloc_dma_buffer(ctx, mbi_buffer);
+ if (ret) {
+ vpu_err("error: alloc mbi buffer[%d] fail\n", index);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int alloc_dcp_buffer(struct vpu_ctx *ctx, uint32_t index)
+{
+ struct dma_buffer *dcp_buffer = NULL;
+ int ret = 0;
+
+ if (index >= ARRAY_SIZE(ctx->dcp_buffer))
+ return -EINVAL;
+
+ dcp_buffer = &ctx->dcp_buffer[index];
+ if (dcp_buffer->dma_virt && dcp_buffer->dma_size >= DCP_SIZE)
+ return 0;
+
+ free_dma_buffer(ctx, dcp_buffer);
+ dcp_buffer->dma_size = DCP_SIZE;
+ ret = alloc_dma_buffer(ctx, dcp_buffer);
+ if (ret) {
+ vpu_err("error: alloc dcp buffer[%d] fail\n", index);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int free_mbi_buffers(struct vpu_ctx *ctx)
+{
+ u_int32 i;
+
+ for (i = 0; i < ARRAY_SIZE(ctx->mbi_buffer); i++)
+ free_dma_buffer(ctx, &ctx->mbi_buffer[i]);
+
+ return 0;
+}
+
+static int free_dcp_buffers(struct vpu_ctx *ctx)
+{
+ u_int32 i;
+
+ for (i = 0; i < ARRAY_SIZE(ctx->dcp_buffer); i++)
+ free_dma_buffer(ctx, &ctx->dcp_buffer[i]);
+
+ return 0;
+}
+
+static int free_decoder_buffer(struct vpu_ctx *ctx)
+{
+ struct queue_data *queue;
+
+ queue = &ctx->q_data[V4L2_DST];
+ down(&queue->drv_q_lock);
+ reset_mbi_dcp_count(ctx);
+ up(&queue->drv_q_lock);
+
+ queue = &ctx->q_data[V4L2_SRC];
+ down(&queue->drv_q_lock);
+ free_dma_buffer(ctx, &ctx->stream_buffer);
+ free_dma_buffer(ctx, &ctx->udata_buffer);
+ up(&queue->drv_q_lock);
+
+ return 0;
+}
+
+static int v4l2_ioctl_reqbufs(struct file *file,
+ void *fh,
+ struct v4l2_requestbuffers *reqbuf
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ int ret;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s(), buffer_type: %d, buffer_count: %d\n",
+ __func__, reqbuf->type, reqbuf->count);
+
+ if (reqbuf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
+ q_data = &ctx->q_data[V4L2_SRC];
+ else if (reqbuf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ q_data = &ctx->q_data[V4L2_DST];
+ else
+ return -EINVAL;
+
+ if (vb2_is_streaming(&q_data->vb2_q)) {
+ vpu_err("%s reqbufs (%d) during streaming\n",
+ q_data->type ? "CAPTURE" : "OUTPUT",
+ reqbuf->count);
+ return -EBUSY;
+ }
+
+ if (reqbuf->count > 0 && !q_data->sizeimage[0]) {
+ vpu_err("sizeimage isn't initialized, %s reqbufs fail\n",
+ q_data->type ? "CAPTURE" : "OUTPUT");
+ return -EINVAL;
+ }
+
+ ret = vpu_dec_queue_reqbufs(q_data, reqbuf);
+ if (ret) {
+ vpu_dbg(LVL_WARN, "warning: %s() can't request (%d) buffer : %d\n",
+ __func__, reqbuf->count, ret);
+ return ret;
+ }
+ if (V4L2_TYPE_IS_OUTPUT(reqbuf->type))
+ return ret;
+
+ return ret;
+}
+
+static int v4l2_ioctl_querybuf(struct file *file,
+ void *fh,
+ struct v4l2_buffer *buf
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ unsigned int i;
+ int ret;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ if (buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
+ q_data = &ctx->q_data[V4L2_SRC];
+ else if (buf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ q_data = &ctx->q_data[V4L2_DST];
+ else
+ return -EINVAL;
+
+ ret = vpu_dec_queue_querybuf(q_data, buf);
+ if (!ret) {
+ if (buf->memory == V4L2_MEMORY_MMAP) {
+ if (V4L2_TYPE_IS_MULTIPLANAR(buf->type)) {
+ for (i = 0; i < buf->length; i++)
+ buf->m.planes[i].m.mem_offset |= (q_data->type << MMAP_BUF_TYPE_SHIFT);
+ } else
+ buf->m.offset |= (q_data->type << MMAP_BUF_TYPE_SHIFT);
+ }
+ } else
+ vpu_err("error: %s() return ret=%d\n", __func__, ret);
+
+ return ret;
+}
+
+static bool is_codec_config_data(struct vb2_buffer *vb)
+{
+ struct vb2_v4l2_buffer *vbuf;
+
+ if (!vb)
+ return false;
+
+ vbuf = to_vb2_v4l2_buffer(vb);
+ if (vbuf->flags & V4L2_NXP_BUF_FLAG_CODECCONFIG)
+ return true;
+ return false;
+}
+
+static void vpu_dec_receive_ts(struct vpu_ctx *ctx,
+ struct vb2_buffer *vb,
+ int size)
+{
+ struct vb2_v4l2_buffer *vbuf;
+ TSM_TIMESTAMP input_ts;
+
+ if (!ctx || !vb)
+ return;
+
+ vbuf = to_vb2_v4l2_buffer(vb);
+ if (vbuf->flags & V4L2_NXP_BUF_FLAG_TIMESTAMP_INVALID) {
+ vpu_dbg(LVL_BIT_TS, "[INPUT TS]Invalid timestamp\n");
+ vb->timestamp = TSM_TIMESTAMP_NONE;
+ }
+
+ input_ts = vb->timestamp;
+ if (input_ts < 0)
+ input_ts = TSM_TIMESTAMP_NONE;
+
+ if (TSM_TS_IS_VALID(input_ts) && input_ts == ctx->output_ts)
+ vpu_dbg(LVL_BIT_TS, "repetitive timestamp\n");
+ if (TSM_TS_IS_VALID(input_ts) && input_ts > ctx->output_ts)
+ ctx->output_ts = input_ts;
+
+ if (down_interruptible(&ctx->tsm_lock)) {
+ vpu_err("%s() get tsm lock fail\n", __func__);
+ return;
+ }
+
+ if (is_codec_config_data(vb) && !TSM_TS_IS_VALID(input_ts)) {
+ vpu_dbg(LVL_BIT_TS, "[INPUT TS]codec data\n");
+ ctx->extra_size += size;
+ up(&ctx->tsm_lock);
+ return;
+ }
+
+ if (ctx->tsm_sync_flag) {
+ vpu_dbg(LVL_BIT_TS, "resyncTSManager\n");
+ resyncTSManager(ctx->tsm, input_ts, tsm_mode);
+ ctx->tsm_sync_flag = false;
+ }
+ size += ctx->extra_size;
+ ctx->extra_size = 0;
+ vpu_dbg(LVL_BIT_TS, "[INPUT TS]%32lld\n", input_ts);
+ TSManagerReceive2(ctx->tsm, input_ts, size);
+ ctx->total_ts_bytes += size;
+ vpu_dbg(LVL_BIT_FRAME_BYTES, "[%d]receive bytes : %8d / %16ld\n",
+ ctx->str_index, size, ctx->total_ts_bytes);
+ up(&ctx->tsm_lock);
+}
+
+static int v4l2_ioctl_qbuf(struct file *file,
+ void *fh,
+ struct v4l2_buffer *buf
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ struct vb2_data_req *p_data_req;
+ int ret;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ if (buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+ ctx->total_qbuf_bytes += buf->m.planes[0].bytesused;
+ vpu_dbg(LVL_BIT_FRAME_BYTES, "[%d]input bytes : %8d / %16ld\n",
+ ctx->str_index,
+ buf->m.planes[0].bytesused,
+ ctx->total_qbuf_bytes);
+ q_data = &ctx->q_data[V4L2_SRC];
+
+ v4l2_update_stream_addr(ctx, 0);
+ } else if (buf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
+ q_data = &ctx->q_data[V4L2_DST];
+ down(&q_data->drv_q_lock);
+ p_data_req = &q_data->vb2_reqs[buf->index];
+ p_data_req->data_offset[0] = buf->m.planes[0].data_offset;
+ p_data_req->data_offset[1] = buf->m.planes[1].data_offset;
+ up(&q_data->drv_q_lock);
+ } else {
+ vpu_err("qbuf invalid buf type : %d\n", buf->type);
+ return -EINVAL;
+ }
+
+ ret = vpu_dec_queue_qbuf(q_data, buf);
+ if (ret) {
+ vpu_err("error: %s() return ret=%d\n", __func__, ret);
+ return ret;
+ }
+ v4l2_update_stream_addr(ctx, 0);
+
+ return ret;
+}
+
+static void vpu_dec_send_ts(struct vpu_ctx *ctx, struct v4l2_buffer *buf)
+{
+ TSM_TIMESTAMP ts;
+
+ if (down_interruptible(&ctx->tsm_lock)) {
+ vpu_err("%s() get tsm lock fail\n", __func__);
+ return;
+ }
+
+ ts = TSManagerSend2(ctx->tsm, NULL);
+ if (TSM_TS_IS_VALID(ts) && ts < ctx->capture_ts) {
+ vpu_dbg(LVL_BIT_TS, "revise timestamp: %32lld -> %32lld\n",
+ ts, ctx->capture_ts);
+ ts = ctx->capture_ts;
+ }
+ vpu_dbg(LVL_BIT_TS, "[OUTPUT TS]%32lld (%lld)\n",
+ ts, getTSManagerFrameInterval(ctx->tsm));
+ buf->timestamp = ns_to_timeval(ts);
+ buf->flags |= V4L2_BUF_FLAG_TIMESTAMP_COPY;
+
+ up(&ctx->tsm_lock);
+
+ if (TSM_TS_IS_VALID(ts))
+ ctx->capture_ts = ts;
+}
+
+static void vpu_dec_valid_ts(struct vpu_ctx *ctx,
+ u32 consumed_pic_bytesused,
+ struct vb2_data_req *p_data_req)
+{
+ WARN_ON(!ctx || !ctx->tsm);
+
+ if (down_interruptible(&ctx->tsm_lock)) {
+ vpu_err("%s() get tsm lock fail\n", __func__);
+ return;
+ }
+
+ vpu_dbg(LVL_BIT_FRAME_BYTES, "[%d]Valid bytes : %8d / %16ld\n",
+ ctx->str_index, consumed_pic_bytesused,
+ ctx->total_consumed_bytes);
+ TSManagerValid2(ctx->tsm,
+ consumed_pic_bytesused,
+ p_data_req ? p_data_req->vb2_buf : NULL);
+
+ up(&ctx->tsm_lock);
+}
+
+static void vpu_dec_skip_ts(struct vpu_ctx *ctx)
+{
+ TSM_TIMESTAMP ts;
+
+ WARN_ON(!ctx || !ctx->tsm);
+
+ if (down_interruptible(&ctx->tsm_lock)) {
+ vpu_err("%s() get tsm lock fail\n", __func__);
+ return;
+ }
+
+ ts = TSManagerSend2(ctx->tsm, NULL);
+
+ up(&ctx->tsm_lock);
+
+ vpu_dbg(LVL_BIT_TS, "[SKIP TS]%32lld\n", ts);
+}
+
+static int v4l2_ioctl_dqbuf(struct file *file,
+ void *fh,
+ struct v4l2_buffer *buf
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ int ret;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ if (buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
+ q_data = &ctx->q_data[V4L2_SRC];
+ else if (buf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ q_data = &ctx->q_data[V4L2_DST];
+ else
+ return -EINVAL;
+
+ ret = vpu_dec_queue_dqbuf(q_data, buf, file->f_flags & O_NONBLOCK);
+
+ if (ret) {
+ vpu_err("error: %s() return ret=%d\n", __func__, ret);
+ return ret;
+ }
+
+ if (q_data->vb2_reqs[buf->index].bfield)
+ buf->field = V4L2_FIELD_INTERLACED;
+ else
+ buf->field = V4L2_FIELD_NONE;
+ v4l2_update_stream_addr(ctx, 0);
+ if (!V4L2_TYPE_IS_OUTPUT(buf->type) && is_10bit_format(ctx))
+ buf->reserved = 1;
+
+ if (!V4L2_TYPE_IS_OUTPUT(buf->type))
+ vpu_dec_send_ts(ctx, buf);
+ if (V4L2_TYPE_IS_OUTPUT(buf->type))
+ buf->flags &= ~V4L2_NXP_BUF_MASK_FLAGS;
+
+ return ret;
+}
+
+static bool format_is_support(struct vpu_v4l2_fmt *format_table,
+ unsigned int table_size,
+ struct v4l2_format *f)
+{
+ unsigned int i;
+
+ for (i = 0; i < table_size; i++) {
+ if (format_table[i].fourcc == f->fmt.pix_mp.pixelformat)
+ return true;
+ }
+ return false;
+}
+
+static int v4l2_ioctl_try_fmt(struct file *file,
+ void *fh,
+ struct v4l2_format *f
+ )
+{
+ unsigned int table_size;
+
+ if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+ table_size = ARRAY_SIZE(formats_compressed_dec);
+ if (!format_is_support(formats_compressed_dec, table_size, f))
+ return -EINVAL;
+ } else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
+ table_size = ARRAY_SIZE(formats_yuv_dec);
+ if (!format_is_support(formats_yuv_dec, table_size, f))
+ return -EINVAL;
+ } else
+ return -EINVAL;
+
+ return 0;
+}
+
+static int vpu_dec_v4l2_ioctl_g_selection(struct file *file, void *fh,
+ struct v4l2_selection *s)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ if (s->target != V4L2_SEL_TGT_CROP && s->target != V4L2_SEL_TGT_COMPOSE)
+ return -EINVAL;
+
+ s->r.left = ctx->seqinfo.uFrameCropLeftOffset;
+ s->r.top = ctx->seqinfo.uFrameCropTopOffset;
+ s->r.width = ctx->seqinfo.uHorRes;
+ s->r.height = ctx->seqinfo.uVerRes;
+
+ return 0;
+}
+
+static int v4l2_ioctl_decoder_cmd(struct file *file,
+ void *fh,
+ struct v4l2_decoder_cmd *cmd
+ )
+{
+ int ret = 0;
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ switch (cmd->cmd) {
+ case V4L2_DEC_CMD_START:
+ break;
+ case V4L2_DEC_CMD_STOP: {
+ vpu_dbg(LVL_EVENT, "ctx[%d]: receive V4L2_DEC_CMD_STOP\n", ctx->str_index);
+ ctx->eos_stop_received = true;
+ v4l2_update_stream_addr(ctx, 0);
+ }
+ break;
+ case V4L2_DEC_CMD_PAUSE:
+ break;
+ case V4L2_DEC_CMD_RESUME:
+ break;
+ case IMX_V4L2_DEC_CMD_RESET:
+ v4l2_update_stream_addr(ctx, 0);
+ mutex_lock(&ctx->dev->fw_flow_mutex);
+ ret = vpu_dec_cmd_reset(ctx);
+ mutex_unlock(&ctx->dev->fw_flow_mutex);
+ break;
+ default:
+ return -EINVAL;
+ }
+ return ret;
+}
+
+static int v4l2_ioctl_streamon(struct file *file,
+ void *fh,
+ enum v4l2_buf_type i
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ int ret;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s(), buffer_type: %d\n", __func__, i);
+
+ if (i == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
+ q_data = &ctx->q_data[V4L2_SRC];
+ else if (i == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ q_data = &ctx->q_data[V4L2_DST];
+ else
+ return -EINVAL;
+
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] %s on\n", ctx->str_index,
+ V4L2_TYPE_IS_OUTPUT(i) ? "OUTPUT" : "CAPTURE");
+
+ ctx->firmware_finished = false;
+
+ ret = vpu_dec_queue_enable(q_data, i);
+ if (!ret)
+ v4l2_update_stream_addr(ctx, 0);
+ else
+ vpu_err("error: %s %s() return ret=%d\n", V4L2_TYPE_IS_OUTPUT(i) ? "OUTPUT" : "CAPTURE", __func__, ret);
+
+ if (ctx->hang_status) {
+ vpu_err("%s(): not succeed and some instance are blocked\n", __func__);
+ return -EINVAL;
+ }
+ if (ret)
+ return ret;
+
+ down(&q_data->drv_q_lock);
+ q_data->enable = true;
+ if (!V4L2_TYPE_IS_OUTPUT(i))
+ respond_req_frame(ctx, q_data, false);
+ up(&q_data->drv_q_lock);
+
+ return ret;
+}
+
+static bool is_need_abort(struct vpu_ctx *ctx, enum v4l2_buf_type type)
+{
+ bool src_status = vb2_is_streaming(&ctx->q_data[V4L2_SRC].vb2_q);
+
+ if (V4L2_TYPE_IS_OUTPUT(type))
+ return false;
+ if (!vpu_dec_is_active(ctx))
+ return false;
+
+ if (src_status)
+ ctx->seek_flag = false;
+ else
+ ctx->seek_flag = true;
+ if (ctx->wait_res_change_done) {
+ if (src_status)
+ return false;
+ vpu_dbg(LVL_INFO,
+ "ctx[%d] seek in res change\n", ctx->str_index);
+ }
+ return true;
+}
+
+static int v4l2_ioctl_streamoff(struct file *file,
+ void *fh,
+ enum v4l2_buf_type i
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ int ret;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s(): ctx[%d] buf_type: %d\n",
+ __func__, ctx->str_index, i);
+
+ if (i == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
+ q_data = &ctx->q_data[V4L2_SRC];
+ else if (i == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ q_data = &ctx->q_data[V4L2_DST];
+ else
+ return -EINVAL;
+
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] %s off\n", ctx->str_index,
+ V4L2_TYPE_IS_OUTPUT(i) ? "OUTPUT" : "CAPTURE");
+
+ down(&q_data->drv_q_lock);
+ q_data->enable = false;
+ up(&q_data->drv_q_lock);
+
+ if (is_need_abort(ctx, i)) {
+ mutex_lock(&ctx->dev->fw_flow_mutex);
+ send_abort_cmd(ctx);
+ mutex_unlock(&ctx->dev->fw_flow_mutex);
+ }
+
+ if (V4L2_TYPE_IS_OUTPUT(i))
+ ctx->output_ts = TSM_TIMESTAMP_NONE;
+ else
+ ctx->capture_ts = TSM_TIMESTAMP_NONE;
+
+ ret = vpu_dec_queue_disable(q_data, i);
+ if (ctx->hang_status) {
+ vpu_err("%s(): not succeed and some instance are blocked\n", __func__);
+ ret = -EINVAL;
+ }
+
+ return ret;
+}
+
+static int vpu_dec_v4l2_ioctl_g_parm(struct file *file, void *fh,
+ struct v4l2_streamparm *parm)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ u32 numerator;
+ u32 denominator;
+
+ mutex_lock(&ctx->instance_mutex);
+
+ numerator = ctx->fixed_frame_interval.numerator;
+ denominator = ctx->fixed_frame_interval.denominator;
+ if (!numerator || !denominator) {
+ numerator = ctx->frame_interval.numerator;
+ denominator = ctx->frame_interval.denominator;
+ }
+ if (!numerator || !denominator) {
+ numerator = 0;
+ denominator = 0;
+ }
+ parm->parm.capture.timeperframe.numerator = numerator;
+ parm->parm.capture.timeperframe.denominator = denominator;
+
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static void vpu_dec_set_tsm_frame_rate(struct vpu_ctx *ctx)
+{
+ u32 numerator;
+ u32 denominator;
+
+ WARN_ON(!ctx || !ctx->tsm);
+
+ if (down_interruptible(&ctx->tsm_lock)) {
+ vpu_err("%s() get tsm lock fail\n", __func__);
+ return;
+ }
+ numerator = ctx->fixed_frame_interval.numerator;
+ denominator = ctx->fixed_frame_interval.denominator;
+ if (numerator && denominator) {
+ setTSManagerFrameRate(ctx->tsm, denominator, numerator);
+ goto exit;
+ }
+
+ numerator = ctx->frame_interval.numerator;
+ denominator = ctx->frame_interval.denominator;
+ if (numerator && denominator)
+ setTSManagerFrameRate(ctx->tsm, denominator, numerator);
+exit:
+ up(&ctx->tsm_lock);
+}
+
+static int vpu_dec_v4l2_ioctl_s_parm(struct file *file, void *fh,
+ struct v4l2_streamparm *parm)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ u32 gcd;
+
+ if (!parm->parm.capture.timeperframe.numerator ||
+ !parm->parm.capture.timeperframe.denominator)
+ return -EINVAL;
+
+ gcd = get_greatest_common_divisor(
+ parm->parm.capture.timeperframe.numerator,
+ parm->parm.capture.timeperframe.denominator);
+
+ mutex_lock(&ctx->instance_mutex);
+ ctx->fixed_frame_interval.numerator =
+ parm->parm.capture.timeperframe.numerator / gcd;
+ ctx->fixed_frame_interval.denominator =
+ parm->parm.capture.timeperframe.denominator / gcd;
+ vpu_dec_set_tsm_frame_rate(ctx);
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static const struct v4l2_ioctl_ops v4l2_decoder_ioctl_ops = {
+ .vidioc_querycap = v4l2_ioctl_querycap,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
+ .vidioc_enum_fmt_vid_cap = v4l2_ioctl_enum_fmt_vid_cap,
+ .vidioc_enum_fmt_vid_out = v4l2_ioctl_enum_fmt_vid_out,
+#else
+ .vidioc_enum_fmt_vid_cap_mplane = v4l2_ioctl_enum_fmt_vid_cap,
+ .vidioc_enum_fmt_vid_out_mplane = v4l2_ioctl_enum_fmt_vid_out,
+#endif
+ .vidioc_g_fmt_vid_cap_mplane = v4l2_ioctl_g_fmt,
+ .vidioc_g_fmt_vid_out_mplane = v4l2_ioctl_g_fmt,
+ .vidioc_try_fmt_vid_cap_mplane = v4l2_ioctl_try_fmt,
+ .vidioc_try_fmt_vid_out_mplane = v4l2_ioctl_try_fmt,
+ .vidioc_s_fmt_vid_cap_mplane = v4l2_ioctl_s_fmt,
+ .vidioc_s_fmt_vid_out_mplane = v4l2_ioctl_s_fmt,
+ .vidioc_g_parm = vpu_dec_v4l2_ioctl_g_parm,
+ .vidioc_s_parm = vpu_dec_v4l2_ioctl_s_parm,
+ .vidioc_expbuf = v4l2_ioctl_expbuf,
+ .vidioc_g_selection = vpu_dec_v4l2_ioctl_g_selection,
+ .vidioc_decoder_cmd = v4l2_ioctl_decoder_cmd,
+ .vidioc_subscribe_event = v4l2_ioctl_subscribe_event,
+ .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
+ .vidioc_reqbufs = v4l2_ioctl_reqbufs,
+ .vidioc_querybuf = v4l2_ioctl_querybuf,
+ .vidioc_qbuf = v4l2_ioctl_qbuf,
+ .vidioc_dqbuf = v4l2_ioctl_dqbuf,
+ .vidioc_streamon = v4l2_ioctl_streamon,
+ .vidioc_streamoff = v4l2_ioctl_streamoff,
+};
+
+// Set/Get controls - v4l2 control framework
+
+static struct vpu_v4l2_control vpu_controls_dec[] = {
+ {
+ .id = V4L2_CID_MIN_BUFFERS_FOR_CAPTURE,
+ .minimum = 1,
+ .maximum = 32,
+ .step = 1,
+ .default_value = 4,
+ .is_volatile = true,
+ },
+};
+
+static struct v4l2_ctrl_config vpu_custom_g_cfg[] = {
+ {
+ .id = V4L2_CID_USER_FRAME_COLORDESC,
+ .name = "color description",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = 0,
+ .max = 10,
+ .step = 1,
+ .def = 1,
+ .flags = V4L2_CTRL_FLAG_VOLATILE,
+ },
+ {
+ .id = V4L2_CID_USER_FRAME_TRANSFERCHARS,
+ .name = "transfer characteristics",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = 0,
+ .max = 18,
+ .step = 1,
+ .def = 0,
+ .flags = V4L2_CTRL_FLAG_VOLATILE,
+ },
+ {
+ .id = V4L2_CID_USER_FRAME_MATRIXCOEFFS,
+ .name = "matrix coefficients",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = 0,
+ .max = 10,
+ .step = 1,
+ .def = 0,
+ .flags = V4L2_CTRL_FLAG_VOLATILE,
+ },
+ {
+ .id = V4L2_CID_USER_FRAME_FULLRANGE,
+ .name = "vido full range flg",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = 0,
+ .max = 1,
+ .step = 1,
+ .def = 0,
+ .flags = V4L2_CTRL_FLAG_VOLATILE,
+ },
+ {
+ .id = V4L2_CID_USER_FRAME_VUIPRESENT,
+ .name = "VUI present",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = 0,
+ .max = 1,
+ .step = 1,
+ .def = 0,
+ .flags = V4L2_CTRL_FLAG_VOLATILE,
+ }
+};
+
+static struct v4l2_ctrl_config vpu_custom_s_cfg[] = {
+ {
+ .id = V4L2_CID_USER_RAW_BASE,
+ .name = "Raw Ctrl",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = 0,
+ .max = 1,
+ .step = 1,
+ .def = 0,
+ },
+ {
+ .id = V4L2_CID_USER_FRAME_DEPTH,
+ .name = "frame depth ctrl",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = -1,
+ .max = 999,
+ .step = 1,
+ },
+ {
+ .id = V4L2_CID_USER_FRAME_DIS_REORDER,
+ .name = "frame disable reoder ctrl",
+ .type = V4L2_CTRL_TYPE_BOOLEAN,
+ .min = 0,
+ .max = 1,
+ .step = 1,
+ .def = 0,
+ },
+ {
+ .id = V4L2_CID_USER_TS_THRESHOLD,
+ .name = "frame timestamp threshold",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = 0,
+ .max = INT_MAX,
+ .step = 1,
+ .def = 0,
+ },
+ {
+ .id = V4L2_CID_USER_BS_L_THRESHOLD,
+ .name = "frame bitstream low threshold",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = 0,
+ .step = 1,
+ .def = 0,
+ },
+ {
+ .id = V4L2_CID_USER_BS_H_THRESHOLD,
+ .name = "frame bitstream high threshold",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = 0,
+ .step = 1,
+ .def = 0,
+ },
+ {
+ .id = V4L2_CID_USER_STREAM_INPUT_MODE,
+ .name = "stream input mode",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .min = 0,
+ .max = NON_FRAME_LVL,
+ .step = 1,
+ .def = 1,
+ }
+};
+
+#define CNT_STAND_G_CTRLS ARRAY_SIZE(vpu_controls_dec)
+#define CNT_CUSTOM_G_CFG ARRAY_SIZE(vpu_custom_g_cfg)
+#define CNT_CUSTOM_S_CFG ARRAY_SIZE(vpu_custom_s_cfg)
+#define CNT_CTRLS_DEC (CNT_STAND_G_CTRLS + CNT_CUSTOM_G_CFG + CNT_CUSTOM_S_CFG)
+
+static int v4l2_custom_s_ctrl(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+
+ vpu_dbg(LVL_BIT_FUNC, "%s() control(%d)\n",
+ __func__, ctrl->id);
+
+ switch (ctrl->id) {
+ case V4L2_CID_USER_RAW_BASE:
+ ctx->start_code_bypass = ctrl->val;
+ break;
+ case V4L2_CID_USER_FRAME_DEPTH:
+ vpu_frm_depth = ctrl->val;
+ break;
+ case V4L2_CID_USER_FRAME_DIS_REORDER:
+ ctx->b_dis_reorder = ctrl->val;
+ break;
+ case V4L2_CID_USER_TS_THRESHOLD:
+ ctx->ts_threshold = ctrl->val;
+ break;
+ case V4L2_CID_USER_BS_L_THRESHOLD:
+ ctx->bs_l_threshold = ctrl->val;
+ break;
+ case V4L2_CID_USER_BS_H_THRESHOLD:
+ ctx->bs_h_threshold = ctrl->val;
+ break;
+ case V4L2_CID_USER_STREAM_INPUT_MODE:
+ ctx->stream_input_mode = ctrl->val;
+ break;
+ default:
+ vpu_err("%s() Invalid costomer control(%d)\n",
+ __func__, ctrl->id);
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int v4l2_custom_g_ctrl(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct v4l2_ctrl_config *ctrl_cfg = NULL;
+ int i;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s() control(%d)\n",
+ __func__, ctrl->id);
+
+ for (i = 0; i < CNT_CUSTOM_G_CFG; i++) {
+ if (vpu_custom_g_cfg[i].id == ctrl->id) {
+ ctrl_cfg = &vpu_custom_g_cfg[i];
+ break;
+ }
+ }
+ if (!ctrl_cfg) {
+ vpu_err("%s() Invalid costomer control(%d)\n",
+ __func__, ctrl->id);
+ return -EINVAL;
+ }
+
+ switch (ctrl->id) {
+ case V4L2_CID_USER_FRAME_COLORDESC:
+ ctrl->val = ctx->seqinfo.uColorDesc;
+ break;
+ case V4L2_CID_USER_FRAME_TRANSFERCHARS:
+ ctrl->val = ctx->seqinfo.uTransferChars;
+ break;
+ case V4L2_CID_USER_FRAME_MATRIXCOEFFS:
+ ctrl->val = ctx->seqinfo.uMatrixCoeffs;
+ break;
+ case V4L2_CID_USER_FRAME_FULLRANGE:
+ ctrl->val = ctx->seqinfo.uVideoFullRangeFlag;
+ break;
+ case V4L2_CID_USER_FRAME_VUIPRESENT:
+ ctrl->val = ctx->seqinfo.uVUIPresent;
+ break;
+ default:
+ vpu_err("%s() Invalid costomer control(%d)\n",
+ __func__, ctrl->id);
+ return -EINVAL;
+ }
+ ctrl->val = max_t(s32, ctrl->val, ctrl_cfg->min);
+ ctrl->val = min_t(s32, ctrl->val, ctrl_cfg->max);
+ vpu_dbg(LVL_BIT_FLOW, "%s = %d\n", ctrl->name, ctrl->val);
+ return 0;
+}
+
+static int v4l2_dec_g_v_ctrl(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+
+ vpu_dbg(LVL_BIT_FUNC, "%s() control(%d)\n",
+ __func__, ctrl->id);
+
+ switch (ctrl->id) {
+ case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
+ ctrl->val = ctx->seqinfo.uNumDPBFrms + ctx->seqinfo.uNumRefFrms;
+ break;
+ default:
+ vpu_err("%s() Invalid control(%d)\n",
+ __func__, ctrl->id);
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int add_stand_g_ctrl(struct vpu_ctx *This)
+{
+ static const struct v4l2_ctrl_ops vpu_dec_ctrl_ops = {
+ .g_volatile_ctrl = v4l2_dec_g_v_ctrl,
+ };
+ u_int32 i;
+ struct v4l2_ctrl *ctrl;
+
+ if (!This)
+ return -EINVAL;
+
+ for (i = 0; i < CNT_STAND_G_CTRLS; i++) {
+ ctrl = v4l2_ctrl_new_std(&This->ctrl_handler,
+ &vpu_dec_ctrl_ops,
+ vpu_controls_dec[i].id,
+ vpu_controls_dec[i].minimum,
+ vpu_controls_dec[i].maximum,
+ vpu_controls_dec[i].step,
+ vpu_controls_dec[i].default_value);
+ if (This->ctrl_handler.error || !ctrl) {
+ vpu_err("%s() v4l2_ctrl_new_std[%d] failed: %d\n",
+ __func__, i, This->ctrl_handler.error);
+ return This->ctrl_handler.error;
+ }
+
+ if (vpu_controls_dec[i].is_volatile)
+ ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
+ }
+
+ ctrl = NULL;
+ return 0;
+}
+
+static int add_custom_s_ctrl(struct vpu_ctx *This)
+{
+ static const struct v4l2_ctrl_ops vpu_custom_ctrl_ops = {
+ .s_ctrl = v4l2_custom_s_ctrl,
+ };
+ uint32_t i;
+ struct v4l2_ctrl *ctrl;
+
+ if (!This)
+ return -EINVAL;
+
+ for (i = 0; i < CNT_CUSTOM_S_CFG; i++) {
+ vpu_custom_s_cfg[i].ops = &vpu_custom_ctrl_ops;
+
+ if (vpu_custom_s_cfg[i].id == V4L2_CID_USER_FRAME_DEPTH)
+ vpu_custom_s_cfg[i].def = vpu_frm_depth;
+ if (vpu_custom_s_cfg[i].id == V4L2_CID_USER_BS_L_THRESHOLD ||
+ vpu_custom_s_cfg[i].id == V4L2_CID_USER_BS_H_THRESHOLD)
+ vpu_custom_s_cfg[i].max = vpu_max_bufsize;
+
+ ctrl = v4l2_ctrl_new_custom(&This->ctrl_handler,
+ &vpu_custom_s_cfg[i], NULL);
+
+ if (This->ctrl_handler.error || !ctrl) {
+ vpu_err("%s() v4l2_ctrl_new_std[%d] failed: %d\n",
+ __func__, i, This->ctrl_handler.error);
+ return This->ctrl_handler.error;
+ }
+ }
+
+ ctrl = NULL;
+ return 0;
+}
+
+static int add_custom_g_ctrl(struct vpu_ctx *This)
+{
+ static const struct v4l2_ctrl_ops vpu_custom_g_ctrl_ops = {
+ .g_volatile_ctrl = v4l2_custom_g_ctrl,
+ };
+
+ uint32_t i;
+ struct v4l2_ctrl *ctrl;
+
+ if (!This)
+ return -EINVAL;
+
+ for (i = 0; i < CNT_CUSTOM_G_CFG; i++) {
+ vpu_custom_g_cfg[i].ops = &vpu_custom_g_ctrl_ops;
+ ctrl = v4l2_ctrl_new_custom(&This->ctrl_handler,
+ &vpu_custom_g_cfg[i], NULL);
+
+ if (This->ctrl_handler.error || !ctrl) {
+ vpu_err("%s() v4l2_ctrl_new_std[%d] failed: %d\n",
+ __func__, i, This->ctrl_handler.error);
+ return This->ctrl_handler.error;
+ }
+ }
+
+ ctrl = NULL;
+ return 0;
+}
+
+static int add_dec_ctrl(struct vpu_ctx *This)
+{
+ if (!This)
+ return -EINVAL;
+
+ add_stand_g_ctrl(This);
+ add_custom_s_ctrl(This);
+ add_custom_g_ctrl(This);
+
+ return 0;
+}
+
+
+static int ctrls_setup_decoder(struct vpu_ctx *This)
+{
+ if (!This)
+ return -EINVAL;
+
+ v4l2_ctrl_handler_init(&This->ctrl_handler, CNT_CTRLS_DEC);
+ if (This->ctrl_handler.error) {
+ vpu_err("%s() v4l2_ctrl_handler_init failed(%d)\n",
+ __func__, This->ctrl_handler.error);
+
+ return This->ctrl_handler.error;
+ } else {
+ vpu_dbg(LVL_INFO, "%s() v4l2_ctrl_handler_init ctrls(%ld)\n",
+ __func__, CNT_CTRLS_DEC);
+ This->ctrl_inited = true;
+ }
+
+ add_dec_ctrl(This);
+
+ v4l2_ctrl_handler_setup(&This->ctrl_handler);
+
+ return 0;
+}
+
+static void ctrls_delete_decoder(struct vpu_ctx *This)
+{
+ if (!This)
+ return;
+
+ if (This->ctrl_inited) {
+ v4l2_ctrl_handler_free(&This->ctrl_handler);
+ This->ctrl_inited = false;
+ }
+}
+
+static void update_wptr(struct vpu_ctx *ctx,
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc,
+ u32 wptr)
+{
+ u32 size;
+ u32 length;
+
+ size = pStrBufDesc->end - pStrBufDesc->start;
+ length = (wptr + size - pStrBufDesc->wptr) % size;
+ ctx->total_write_bytes += length;
+
+ vpu_dbg(LVL_BIT_WPTR, "wptr : 0x%08x -> 0x%08x\n",
+ pStrBufDesc->wptr, wptr);
+ pStrBufDesc->wptr = wptr;
+}
+
+/* Insert either the codec specific EOS type or a special scode to mark that this frame should be flushed/pushed directly for decode */
+static int add_scode_vpu(struct vpu_ctx *ctx, u_int32 uStrBufIdx, VPU_PADDING_SCODE_TYPE eScodeType, bool bUpdateWr)
+{
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ struct queue_data *q_data = &ctx->q_data[V4L2_SRC];
+ uint32_t start;
+ uint32_t end;
+ uint32_t wptr;
+ uint32_t rptr;
+ uint8_t *pbbuffer;
+ uint32_t *plbuffer;
+ uint32_t last;
+ uint32_t last2 = 0x0;
+ uint32_t pad_bytes = 0;
+ uint8_t *buffer;
+
+ vpu_dbg(LVL_BIT_FUNC, "enter %s()\n", __func__);
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ start = pStrBufDesc->start;
+ end = pStrBufDesc->end;
+ wptr = pStrBufDesc->wptr;
+ rptr = pStrBufDesc->rptr;
+
+ if (start != ctx->stream_buffer.dma_phy ||
+ end != ctx->stream_buffer.dma_phy + ctx->stream_buffer.dma_size) {
+ vpu_err("error: %s(), start or end pointer cross-border\n", __func__);
+ return 0;
+ }
+ if (wptr < start || wptr > end) {
+ vpu_err("error: %s(), wptr pointer cross-border\n", __func__);
+ return 0;
+ }
+ if (rptr < start || rptr > end) {
+ vpu_err("error: %s(), rptr pointer cross-border\n", __func__);
+ return 0;
+ }
+
+ buffer = kzalloc(SCODE_SIZE, GFP_KERNEL);
+ if (!buffer)
+ return 0;
+
+ atomic64_add(SCODE_SIZE, &ctx->statistic.total_alloc_size);
+ plbuffer = (uint32_t *)buffer;
+ if (wptr - start < ctx->stream_buffer.dma_size)
+ pbbuffer = (uint8_t *)(ctx->stream_buffer.dma_virt + wptr - start);
+ else {
+ vpu_err("error: return wptr(0x%x), start(0x%x) is not valid\n", wptr, start);
+ goto error;
+ }
+
+ if (((u_int64)pbbuffer)%4 != 0) {
+ int i;
+ if (end%4 != 0) {
+ vpu_err("end address of stream not aligned by 4 bytes !\n");
+ goto error;
+ }
+ pad_bytes = 4 - (((u_int64)pbbuffer)%4);
+ for (i = 0; i < pad_bytes; i++)
+ pbbuffer[i] = 0;
+ pbbuffer += pad_bytes;
+ wptr += pad_bytes;
+ if (wptr == end) {
+ wptr = start;
+ pbbuffer = (uint8_t *)ctx->stream_buffer.dma_virt;
+ }
+ }
+
+ if (eScodeType == BUFABORT_PADDING_TYPE) {
+ switch (q_data->vdec_std) {
+ case VPU_VIDEO_AVC:
+ last = 0x0B010000;
+ break;
+ case VPU_VIDEO_VC1:
+ last = 0x0a010000;
+ break;
+ case VPU_VIDEO_MPEG2:
+ last = 0xb7010000;
+ break;
+ case VPU_VIDEO_ASP:
+ case VPU_VIDEO_AVS:
+ last = 0xb1010000;
+ break;
+ case VPU_VIDEO_SPK:
+ case VPU_VIDEO_VP6:
+ case VPU_VIDEO_VP8:
+ case VPU_VIDEO_RV:
+ last = 0x34010000;
+ break;
+ case VPU_VIDEO_HEVC:
+ last = 0x4A010000;
+ last2 = 0x20;
+ break;
+ case VPU_VIDEO_JPEG:
+ default:
+ last = 0x0;
+ break;
+ }
+ } else if (eScodeType == EOS_PADDING_TYPE) {
+ switch (q_data->vdec_std) {
+ case VPU_VIDEO_AVC:
+ last = 0x0B010000;
+ break;
+ case VPU_VIDEO_VC1:
+ last = 0x0a010000;
+ break;
+ case VPU_VIDEO_MPEG2:
+ case VPU_VIDEO_AVS:
+ last = EOS_GENERIC_MPEG;
+ break;
+ case VPU_VIDEO_ASP:
+ last = 0xb1010000;
+ break;
+ case VPU_VIDEO_SPK:
+ case VPU_VIDEO_VP6:
+ case VPU_VIDEO_VP8:
+ case VPU_VIDEO_RV:
+ last = 0x34010000;
+ break;
+ case VPU_VIDEO_JPEG:
+ last = EOS_GENERIC_JPEG;
+ break;
+ case VPU_VIDEO_HEVC:
+ last = 0x4A010000;
+ last2 = 0x20;
+ break;
+ default:
+ last = 0x0;
+ break;
+ }
+ } else {
+ if (q_data->vdec_std == VPU_VIDEO_AVC) {
+ last = 0x15010000;
+ last2 = 0x0;
+ } else {
+ /* all other standards do not support the frame flush mechanism so just return */
+ vpu_dbg(LVL_WARN, "warning: format(%d) not support frame flush mechanism !\n", q_data->vdec_std);
+ goto error;
+ }
+ }
+ plbuffer[0] = last;
+ plbuffer[1] = last2;
+
+ if ((wptr == rptr) || (wptr > rptr)) {
+ if (end - wptr >= SCODE_SIZE) {
+ memcpy(pbbuffer, buffer, SCODE_SIZE);
+ wptr += SCODE_SIZE;
+ if (wptr == end)
+ wptr = start;
+ pad_bytes += SCODE_SIZE;
+ } else {
+ if (rptr - start > SCODE_SIZE - (end - wptr)) {
+ memcpy(pbbuffer, buffer, end - wptr);
+ memcpy(ctx->stream_buffer.dma_virt, buffer + (end - wptr), SCODE_SIZE - (end - wptr));
+ wptr = start + SCODE_SIZE - (end - wptr);
+ pad_bytes += SCODE_SIZE;
+ } else {
+ vpu_err("No enough space to insert padding data, size=%d, rptr(%x), wptr(%x)\n",
+ (end - wptr) + (rptr - start), rptr, wptr);
+ }
+ }
+ } else {
+ if (rptr - wptr >= SCODE_SIZE) {
+ memcpy(pbbuffer, buffer, SCODE_SIZE);
+ wptr += SCODE_SIZE;
+ pad_bytes += SCODE_SIZE;
+ } else {
+ vpu_err("No enough space to insert padding data, size=%d, rptr(%x), wptr(%x)\n",
+ rptr - wptr, rptr, wptr);
+ }
+ }
+ mb();
+
+ if (bUpdateWr)
+ update_wptr(ctx, pStrBufDesc, wptr);
+ kfree(buffer);
+ atomic64_sub(SCODE_SIZE, &ctx->statistic.total_alloc_size);
+
+ return pad_bytes;
+error:
+ kfree(buffer);
+ atomic64_sub(SCODE_SIZE, &ctx->statistic.total_alloc_size);
+ return 0;
+}
+
+static int add_scode(struct vpu_ctx *ctx, u_int32 uStrBufIdx, VPU_PADDING_SCODE_TYPE eScodeType, bool bUpdateWr)
+{
+ int size = 0;
+
+ if (!ctx)
+ return 0;
+
+ if (eScodeType == EOS_PADDING_TYPE)
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] add eos\n", ctx->str_index);
+
+ mutex_lock(&ctx->instance_mutex);
+ size = add_scode_vpu(ctx, uStrBufIdx, eScodeType, bUpdateWr);
+ if (size > 0)
+ set_pic_end_flag(ctx);
+ else
+ size = 0;
+ mutex_unlock(&ctx->instance_mutex);
+ return size;
+}
+
+TB_API_DEC_FMT vpu_format_remap(uint32_t vdec_std)
+{
+ TB_API_DEC_FMT malone_format = VSys_FrmtNull;
+
+ switch (vdec_std) {
+ case VPU_VIDEO_AVC:
+ malone_format = VSys_AvcFrmt;
+ vpu_dbg(LVL_INFO, "format translated to AVC");
+ break;
+ case VPU_VIDEO_VC1:
+ malone_format = VSys_Vc1Frmt;
+ vpu_dbg(LVL_INFO, "format translated to VC1");
+ break;
+ case VPU_VIDEO_MPEG2:
+ malone_format = VSys_Mp2Frmt;
+ vpu_dbg(LVL_INFO, "format translated to MP2");
+ break;
+ case VPU_VIDEO_AVS:
+ malone_format = VSys_AvsFrmt;
+ vpu_dbg(LVL_INFO, "format translated to AVS");
+ break;
+ case VPU_VIDEO_ASP:
+ malone_format = VSys_AspFrmt;
+ vpu_dbg(LVL_INFO, "format translated to ASP");
+ break;
+ case VPU_VIDEO_JPEG:
+ malone_format = VSys_JpgFrmt;
+ vpu_dbg(LVL_INFO, "format translated to JPG");
+ break;
+ case VPU_VIDEO_VP6:
+ malone_format = VSys_Vp6Frmt;
+ vpu_dbg(LVL_INFO, "format translated to VP6");
+ break;
+ case VPU_VIDEO_SPK:
+ malone_format = VSys_SpkFrmt;
+ vpu_dbg(LVL_INFO, "format translated to SPK");
+ break;
+ case VPU_VIDEO_VP8:
+ malone_format = VSys_Vp8Frmt;
+ vpu_dbg(LVL_INFO, "format translated to VP8");
+ break;
+ case VPU_VIDEO_HEVC:
+ malone_format = VSys_HevcFrmt;
+ vpu_dbg(LVL_INFO, "format translated to HEVC");
+ break;
+ case VPU_VIDEO_RV:
+ malone_format = VSys_RvFrmt;
+ vpu_dbg(LVL_INFO, "format translated to RV");
+ break;
+ case VPU_VIDEO_AVC_MVC:
+ malone_format = VSys_AvcFrmt;
+ vpu_dbg(LVL_INFO, "format translated to AVC");
+ break;
+ default:
+ malone_format = VSys_FrmtNull;
+ vpu_dbg(LVL_INFO, "unspport format");
+ break;
+ }
+ vpu_dbg(LVL_INFO, "\n");
+
+ return malone_format;
+}
+
+static void do_send_cmd_to_firmware(struct vpu_ctx *ctx,
+ uint32_t idx, uint32_t cmdid,
+ uint32_t cmdnum, uint32_t *local_cmddata)
+{
+ vpu_log_cmd(cmdid, idx);
+ count_cmd(&ctx->statistic, cmdid);
+ record_log_info(ctx, LOG_COMMAND, cmdid, 0);
+
+ mutex_lock(&ctx->dev->cmd_mutex);
+ rpc_send_cmd_buf(&ctx->dev->shared_mem, idx, cmdid, cmdnum,
+ local_cmddata);
+ mb();
+ vpu_mu_send_msg(ctx->dev, COMMAND, 0xffff);
+ mutex_unlock(&ctx->dev->cmd_mutex);
+}
+
+static struct vpu_dec_cmd_request vpu_dec_cmds[] = {
+ {
+ .request = VID_API_CMD_START,
+ .response = VID_API_EVENT_START_DONE,
+ .block = true,
+ },
+ {
+ .request = VID_API_CMD_STOP,
+ .response = VID_API_EVENT_STOPPED,
+ .block = true,
+ },
+ {
+ .request = VID_API_CMD_ABORT,
+ .response = VID_API_EVENT_ABORT_DONE,
+ .block = true,
+ },
+ {
+ .request = VID_API_CMD_RST_BUF,
+ .response = VID_API_EVENT_STR_BUF_RST,
+ .block = true,
+ }
+};
+
+static struct vpu_dec_cmd_request *get_cmd_request(struct vpu_ctx *ctx,
+ u32 cmdid)
+{
+ struct vpu_dec_cmd_request *request;
+ int i;
+
+ request = vzalloc(sizeof(*request));
+ if (!request)
+ return NULL;
+
+ atomic64_add(sizeof(*request), &ctx->statistic.total_alloc_size);
+ request->request = cmdid;
+ request->response = VID_API_EVENT_INVALID;
+ request->block = false;
+ for (i = 0; i < ARRAY_SIZE(vpu_dec_cmds); i++) {
+ if (vpu_dec_cmds[i].request == cmdid) {
+ memcpy(request, &vpu_dec_cmds[i], sizeof(*request));
+ break;
+ }
+ }
+
+ return request;
+}
+
+static void put_cmd_request(struct vpu_ctx *ctx,
+ struct vpu_dec_cmd_request *request)
+{
+ if (!request)
+ return;
+
+ atomic64_sub(sizeof(*request), &ctx->statistic.total_alloc_size);
+ vfree(request);
+}
+
+static void vpu_dec_cleanup_cmd(struct vpu_ctx *ctx)
+{
+ struct vpu_dec_cmd_request *request;
+ struct vpu_dec_cmd_request *tmp;
+
+ mutex_lock(&ctx->cmd_lock);
+ if (ctx->pending) {
+ vpu_err("ctx[%d]'s cmd(%s) is not finished yet\n",
+ ctx->str_index, get_cmd_str(ctx->pending->request));
+ put_cmd_request(ctx, ctx->pending);
+ ctx->pending = NULL;
+ }
+ list_for_each_entry_safe(request, tmp, &ctx->cmd_q, list) {
+ list_del_init(&request->list);
+ vpu_err("cmd(%s) of ctx[%d] is missed\n",
+ get_cmd_str(request->request), ctx->str_index);
+ put_cmd_request(ctx, request);
+ }
+ mutex_unlock(&ctx->cmd_lock);
+}
+
+static void process_cmd_request(struct vpu_ctx *ctx)
+{
+ struct vpu_dec_cmd_request *request;
+ struct vpu_dec_cmd_request *tmp;
+
+ if (ctx->pending)
+ return;
+
+ list_for_each_entry_safe(request, tmp, &ctx->cmd_q, list) {
+ list_del_init(&request->list);
+ do_send_cmd_to_firmware(ctx,
+ request->idx,
+ request->request,
+ request->num,
+ request->data);
+ if (request->block &&
+ request->response != VID_API_EVENT_INVALID) {
+ ctx->pending = request;
+ break;
+ }
+ put_cmd_request(ctx, request);
+ }
+}
+
+static void vpu_dec_request_cmd(struct vpu_ctx *ctx,
+ uint32_t idx, uint32_t cmdid,
+ uint32_t cmdnum, uint32_t *local_cmddata)
+{
+ struct vpu_dec_cmd_request *request;
+ u32 i;
+
+ if (cmdnum > VPU_DEC_CMD_DATA_MAX_NUM) {
+ vpu_err("cmd(%s)'s data number(%d) > %d, drop it\n",
+ get_cmd_str(cmdid), cmdnum, VPU_DEC_CMD_DATA_MAX_NUM);
+ return;
+ }
+
+ request = get_cmd_request(ctx, cmdid);
+ if (!request) {
+ vpu_err("cmd(%s) of ctx[%d] is missed\n",
+ get_cmd_str(cmdid), idx);
+ return;
+ }
+
+ request->idx = idx;
+ request->num = cmdnum;
+ for (i = 0; i < cmdnum && i < ARRAY_SIZE(request->data); i++)
+ request->data[i] = local_cmddata[i];
+
+ mutex_lock(&ctx->cmd_lock);
+ list_add_tail(&request->list, &ctx->cmd_q);
+ process_cmd_request(ctx);
+ mutex_unlock(&ctx->cmd_lock);
+}
+
+static void vpu_dec_response_cmd(struct vpu_ctx *ctx, u32 event)
+{
+ mutex_lock(&ctx->cmd_lock);
+ if (ctx->pending && event == ctx->pending->response) {
+ put_cmd_request(ctx, ctx->pending);
+ ctx->pending = NULL;
+ }
+
+ process_cmd_request(ctx);
+ mutex_unlock(&ctx->cmd_lock);
+}
+
+static void vpu_dec_clear_pending_cmd(struct vpu_ctx *ctx)
+{
+ mutex_lock(&ctx->cmd_lock);
+ if (ctx->pending) {
+ put_cmd_request(ctx, ctx->pending);
+ ctx->pending = NULL;
+ }
+ mutex_unlock(&ctx->cmd_lock);
+}
+
+static void v4l2_vpu_send_cmd(struct vpu_ctx *ctx,
+ uint32_t idx, uint32_t cmdid,
+ uint32_t cmdnum, uint32_t *local_cmddata)
+{
+ vpu_dec_request_cmd(ctx, idx, cmdid, cmdnum, local_cmddata);
+}
+
+static void dump_input_data_to_local(struct vpu_ctx *ctx, void *src, u_int32 len)
+{
+ struct file *fp;
+ mm_segment_t fs;
+ loff_t pos;
+ char input_file[64];
+
+ if (!vpu_datadump_ena)
+ return;
+
+ scnprintf(input_file, sizeof(input_file) - 1,
+ "/data/vpu_input_data_%d.bin", ctx->str_index);
+
+ if (ctx->first_dump_data_flag) {
+ fp = filp_open(input_file, O_RDWR | O_TRUNC | O_CREAT, 0644);
+ ctx->first_dump_data_flag = false;
+ } else {
+ fp = filp_open(input_file, O_RDWR | O_APPEND | O_CREAT, 0644);
+ }
+ if (IS_ERR(fp)) {
+ vpu_dbg(LVL_WARN, "warning: open file(%s) fail\n", input_file);
+ return;
+ }
+ fs = get_fs();
+ set_fs(KERNEL_DS);
+ pos = fp->f_pos;
+ vfs_write(fp, src, len, &pos);
+ fp->f_pos = pos;
+ set_fs(fs);
+ filp_close(fp, NULL);
+}
+
+static int send_start_cmd(struct vpu_ctx *ctx)
+{
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ u_int32 uStrBufIdx = 0; //set to be default 0, FIX_ME later
+ MediaIPFW_Video_UData *pUdataBuf;
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ MediaIPFW_Video_CodecParams *pCodecPara;
+ unsigned int *CurrStrfg;
+ u32 vdec_std;
+
+ if (!ctx)
+ return -EINVAL;
+ if (vpu_dec_is_active(ctx))
+ return -EINVAL;
+
+ pSharedInterface = ctx->dev->shared_mem.pSharedInterface;
+ pUdataBuf = &pSharedInterface->UDataBuffer[ctx->str_index];
+ pCodecPara = ctx->dev->shared_mem.codec_mem_vir;
+ CurrStrfg = &pSharedInterface->StreamConfig[ctx->str_index];
+ vdec_std = ctx->q_data[V4L2_SRC].vdec_std;
+
+ vpu_dbg(LVL_WARN, "firmware version is %d.%d.%d\n",
+ (pSharedInterface->FWVersion & 0x00ff0000) >> 16,
+ (pSharedInterface->FWVersion & 0x0000ff00) >> 8,
+ pSharedInterface->FWVersion & 0x000000ff);
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ pStrBufDesc->wptr = ctx->stream_buffer.dma_phy;
+ pStrBufDesc->rptr = ctx->stream_buffer.dma_phy;
+ pStrBufDesc->start = ctx->stream_buffer.dma_phy;
+ pStrBufDesc->end = ctx->stream_buffer.dma_phy + ctx->stream_buffer.dma_size;
+ pStrBufDesc->LWM = 0x01;
+ ctx->pre_pic_end_addr = pStrBufDesc->start;
+ ctx->beginning = pStrBufDesc->start;
+
+ pSharedInterface->pStreamBuffDesc[ctx->str_index][uStrBufIdx] =
+ (VPU_REG_BASE + get_str_buffer_desc_offset(ctx));
+ pUdataBuf->uUDataBase = ctx->udata_buffer.dma_phy;
+ pUdataBuf->uUDataSlotSize = ctx->udata_buffer.dma_size;
+ VID_STREAM_CONFIG_FORMAT_SET(vpu_format_remap(vdec_std), CurrStrfg);
+
+ if (vdec_std == VPU_VIDEO_JPEG) {
+ MediaIPFW_Video_JpegParams *pJpgPara;
+
+ pJpgPara = (MediaIPFW_Video_JpegParams *)ctx->dev->shared_mem.jpeg_mem_vir;
+ pJpgPara[ctx->str_index].uJpgMjpegMode = 1; //1:JPGD_MJPEG_MODE_A; 2:JPGD_MJPEG_MODE_B
+ pJpgPara[ctx->str_index].uJpgMjpegInterlaced = 0; //0: JPGD_MJPEG_PROGRESSIVE
+ }
+
+ if (ctx->b_dis_reorder)
+ pCodecPara[ctx->str_index].uDispImm = 1;
+ else
+ pCodecPara[ctx->str_index].uDispImm = 0;
+
+ pCodecPara[ctx->str_index].uEnableDbgLog = CHECK_BIT(vpu_frmdbg_ena, ctx->str_index) ? 1 : 0;
+ pSharedInterface->DbgLogDesc.uDecStatusLogLevel = vpu_frmdbg_level;
+
+ ctx->frm_dis_delay = 0;
+ ctx->frm_dec_delay = 0;
+ ctx->frm_total_num = 0;
+ fill_stream_buffer_info(ctx);
+
+ v4l2_vpu_send_cmd(ctx, ctx->str_index, VID_API_CMD_START, 0, NULL);
+ ctx->firmware_stopped = false;
+ ctx->tsm_sync_flag = true;
+ ctx->first_data_flag = true;
+
+ vpu_calculate_performance(ctx, 0xff, "send start cmd");
+
+ return 0;
+}
+
+static void activate_vpu_dec(struct vpu_ctx *ctx)
+{
+ int ret;
+
+ vpu_calculate_performance(ctx, 0xff, "alloc stream buffer begin");
+ ret = alloc_vpu_buffer(ctx);
+ if (ret) {
+ vpu_err("alloc vpu buffer fail\n");
+ return;
+ }
+ vpu_calculate_performance(ctx, 0xff, "alloc stream buffer finish");
+
+ send_start_cmd(ctx);
+}
+
+u_int32 got_free_space(u_int32 wptr, u_int32 rptr, u_int32 start, u_int32 end)
+{
+ u_int32 freespace = 0;
+
+ if (wptr == rptr)
+ freespace = end - start;
+ if (wptr < rptr)
+ freespace = rptr - wptr;
+ if (wptr > rptr)
+ freespace = (end - wptr) + (rptr - start);
+ return freespace;
+}
+
+static u32 got_used_space(u32 wptr, u32 rptr, u32 start, u32 end)
+{
+ u32 stream_size = 0;
+
+ if (wptr == rptr)
+ stream_size = 0;
+ else if (rptr < wptr)
+ stream_size = wptr - rptr;
+ else
+ stream_size = (end - rptr) + (wptr - start);
+
+ return stream_size;
+}
+
+
+int copy_buffer_to_stream(struct vpu_ctx *ctx, void *buffer, uint32_t length)
+{
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ void *wptr_virt;
+ uint32_t wptr;
+ uint32_t rptr;
+ uint32_t start;
+ uint32_t end;
+
+ if (!ctx || !buffer || !length)
+ return 0;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ wptr = pStrBufDesc->wptr;
+ rptr = pStrBufDesc->rptr;
+ start = pStrBufDesc->start;
+ end = pStrBufDesc->end;
+
+ if (start != ctx->stream_buffer.dma_phy ||
+ end != ctx->stream_buffer.dma_phy + ctx->stream_buffer.dma_size) {
+ vpu_err("error: %s(), start or end pointer cross-border\n", __func__);
+ return 0;
+ }
+ if (wptr < start || wptr > end) {
+ vpu_err("error: %s(), wptr pointer cross-border\n", __func__);
+ return 0;
+ }
+ if (rptr < start || rptr > end) {
+ vpu_err("error: %s(), rptr pointer cross-border\n", __func__);
+ return 0;
+ }
+
+
+ wptr_virt = (void *)ctx->stream_buffer.dma_virt + wptr - start;
+ if ((wptr == rptr) || (wptr > rptr)) {
+ if (end - wptr >= length) {
+ memcpy(wptr_virt, buffer, length);
+ wptr += length;
+ if (wptr == end)
+ wptr = start;
+ } else {
+ memcpy(wptr_virt, buffer, end-wptr);
+ memcpy(ctx->stream_buffer.dma_virt, buffer + (end-wptr), length - (end-wptr));
+ wptr = start + length - (end - wptr);
+ }
+ } else {
+ memcpy(wptr_virt, buffer, length);
+ wptr += length;
+ }
+ dump_input_data_to_local(ctx, buffer, length);
+ mb();
+ update_wptr(ctx, pStrBufDesc, wptr);
+ return length;
+}
+
+static int send_abort_cmd(struct vpu_ctx *ctx)
+{
+ int size;
+
+ if (!ctx)
+ return -EINVAL;
+
+ if (!vpu_dec_is_active(ctx))
+ return 0;
+
+ ctx->wait_rst_done = true;
+ vpu_dbg(LVL_INFO, "%s(): send VID_API_CMD_ABORT\n", __func__);
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] send ABORT CMD\n", ctx->str_index);
+ size = add_scode(ctx, 0, BUFABORT_PADDING_TYPE, false);
+ record_log_info(ctx, LOG_PADDING, 0, 0);
+ if (size <= 0)
+ vpu_err("%s(): failed to fill abort padding data\n", __func__);
+ v4l2_vpu_send_cmd(ctx, ctx->str_index, VID_API_CMD_ABORT, 1, &size);
+ reinit_completion(&ctx->completion);
+ if (!wait_for_completion_timeout(&ctx->completion, msecs_to_jiffies(1000))) {
+ ctx->hang_status = true;
+ vpu_err("the path id:%d firmware timeout after send VID_API_CMD_ABORT\n",
+ ctx->str_index);
+ vpu_dec_clear_pending_cmd(ctx);
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+static int send_stop_cmd(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return -EINVAL;
+
+ if (!vpu_dec_is_active(ctx))
+ return 0;
+
+ ctx->wait_rst_done = true;
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] send STOP CMD\n", ctx->str_index);
+ v4l2_vpu_send_cmd(ctx, ctx->str_index, VID_API_CMD_STOP, 0, NULL);
+ reinit_completion(&ctx->stop_cmp);
+ if (!wait_for_completion_timeout(&ctx->stop_cmp, msecs_to_jiffies(1000))) {
+ vpu_dec_clear_pending_cmd(ctx);
+ ctx->hang_status = true;
+ vpu_err("the path id:%d firmware hang after send VID_API_CMD_STOP\n", ctx->str_index);
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+static int vpu_dec_cmd_reset(struct vpu_ctx *ctx)
+{
+ int ret = 0;
+
+ if (!ctx)
+ return -EPERM;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] reset decoder\n", ctx->str_index);
+
+ if (ctx->hang_status) {
+ vpu_dbg(LVL_WARN, "warning: %s() failed. hang_status: %d\n",
+ __func__, ctx->hang_status);
+ return -EPERM;
+ }
+
+ ret = send_abort_cmd(ctx);
+ if (ret)
+ return ret;
+ ret = send_stop_cmd(ctx);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
+static void vpu_dec_event_decode_error(struct vpu_ctx *ctx)
+{
+ const struct v4l2_event ev = {
+ .type = V4L2_EVENT_DECODE_ERROR
+ };
+
+ if (!ctx)
+ return;
+
+ vpu_dbg(LVL_BIT_FLOW, "send decode error event\n");
+ v4l2_event_queue_fh(&ctx->fh, &ev);
+}
+
+static int update_stream_addr(struct vpu_ctx *ctx, void *input_buffer, uint32_t buffer_size, uint32_t uStrBufIdx)
+{
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ struct queue_data *q_data = &ctx->q_data[V4L2_SRC];
+ u_int8 payload_header[256] = {0};
+ uint32_t nfreespace = 0;
+ uint32_t wptr;
+ uint32_t rptr;
+ uint32_t start;
+ uint32_t end;
+ uint32_t header_length = 0;
+ uint32_t copy_length = 0;
+ uint32_t input_offset = 0;
+ struct VPU_FMT_INFO_ARV *arv_frame;
+ uint32_t i;
+
+ vpu_dbg(LVL_BIT_FUNC, "enter %s\n", __func__);
+
+ // changed to virtual address and back
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ vpu_dbg(LVL_BIT_BUFFER_DESC,
+ "%s wptr(%x) rptr(%x) start(%x) end(%x) uStrBufIdx(%d)\n",
+ __func__,
+ pStrBufDesc->wptr,
+ pStrBufDesc->rptr,
+ pStrBufDesc->start,
+ pStrBufDesc->end,
+ uStrBufIdx);
+ wptr = pStrBufDesc->wptr;
+ rptr = pStrBufDesc->rptr;
+ start = pStrBufDesc->start;
+ end = pStrBufDesc->end;
+
+ nfreespace = got_free_space(wptr, rptr, start, end);
+ header_length = insert_scode_4_pic(ctx, payload_header, input_buffer, q_data->vdec_std, buffer_size);
+ if (q_data->vdec_std != VPU_VIDEO_RV) {
+ if (nfreespace < (buffer_size + header_length + MIN_SPACE)) {
+ vpu_dbg(LVL_INFO, "buffer_full: the circular buffer freespace < buffer_size\n");
+ return 0;
+ }
+
+ copy_length += copy_buffer_to_stream(ctx, payload_header, header_length);
+ copy_length += copy_buffer_to_stream(ctx, input_buffer, buffer_size);
+ } else {
+ arv_frame = get_arv_info(ctx, input_buffer, buffer_size);
+ if (!arv_frame) {
+ vpu_dbg(LVL_WARN, "warning: %s() get arv frame info failed\n", __func__);
+ return -1;
+ }
+ if (nfreespace < (buffer_size + header_length + arv_frame->slice_num * 16 + MIN_SPACE)) {
+ vpu_dbg(LVL_INFO, "buffer_full: the circular buffer freespace < buffer_size\n");
+ put_arv_info(arv_frame);
+ arv_frame = NULL;
+ return 0;
+ }
+
+ arv_frame->packlen = 20 + 8 * arv_frame->slice_num;
+
+ if (arv_frame->packlen > buffer_size - input_offset) {
+ put_arv_info(arv_frame);
+ arv_frame = NULL;
+ return -1;
+ }
+
+ copy_length += copy_buffer_to_stream(ctx, payload_header, header_length);
+ copy_length += copy_buffer_to_stream(ctx, input_buffer + input_offset, arv_frame->packlen);
+ input_offset += arv_frame->packlen;
+ for (i = 0; i < arv_frame->slice_num; i++) {
+ if (i == arv_frame->slice_num - 1)
+ arv_frame->packlen = arv_frame->data_len - arv_frame->slice_offset[i];
+ else
+ arv_frame->packlen = arv_frame->slice_offset[i+1] - arv_frame->slice_offset[i];
+ header_length = insert_scode_4_arv_slice(ctx, payload_header, arv_frame, arv_frame->packlen + 12);
+ copy_length += copy_buffer_to_stream(ctx, payload_header, header_length);
+ copy_length += copy_buffer_to_stream(ctx, input_buffer + input_offset, arv_frame->packlen);
+ input_offset += arv_frame->packlen;
+ }
+
+ put_arv_info(arv_frame);
+ arv_frame = NULL;
+ }
+
+ return copy_length;
+}
+
+static int update_stream_addr_vpu(struct vpu_ctx *ctx, void *input_buffer, uint32_t buffer_size, uint32_t uStrBufIdx)
+{
+ int size = 0;
+
+ if (ctx->wait_rst_done == true)
+ return size;
+
+ mutex_lock(&ctx->instance_mutex);
+ size = update_stream_addr(ctx, input_buffer, buffer_size, uStrBufIdx);
+ mutex_unlock(&ctx->instance_mutex);
+
+ return size;
+}
+
+static int update_stream_addr_bypass(struct vpu_ctx *ctx,
+ void *input_buffer,
+ uint32_t buffer_size)
+{
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ uint32_t nfreespace = 0;
+ uint32_t wptr;
+ uint32_t rptr;
+ uint32_t start;
+ uint32_t end;
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ wptr = pStrBufDesc->wptr;
+ rptr = pStrBufDesc->rptr;
+ start = pStrBufDesc->start;
+ end = pStrBufDesc->end;
+ nfreespace = got_free_space(wptr, rptr, start, end);
+
+ if (nfreespace < (buffer_size + MIN_SPACE)) {
+ vpu_dbg(LVL_INFO, "buffer_full: the circular buffer freespace < buffer_size\n");
+ return 0;
+ }
+ return copy_buffer_to_stream(ctx, input_buffer, buffer_size);
+}
+
+static void fill_stream_buffer_info(struct vpu_ctx *ctx)
+{
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ pBUFFER_INFO_TYPE buffer_info;
+
+ if (!ctx)
+ return;
+
+ pSharedInterface = ctx->dev->shared_mem.pSharedInterface;
+ buffer_info = &pSharedInterface->StreamBuffInfo[ctx->str_index];
+
+ buffer_info->stream_input_mode = ctx->stream_input_mode;
+ if (ctx->stream_input_mode == NON_FRAME_LVL)
+ buffer_info->stream_buffer_threshold = stream_buffer_threshold;
+
+ buffer_info->stream_pic_input_count = ctx->frm_total_num;
+}
+
+static void set_pic_end_flag(struct vpu_ctx *ctx)
+{
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ pBUFFER_INFO_TYPE buffer_info;
+
+ if (!ctx)
+ return;
+
+ pSharedInterface = ctx->dev->shared_mem.pSharedInterface;
+ buffer_info = &pSharedInterface->StreamBuffInfo[ctx->str_index];
+
+ buffer_info->stream_pic_end_flag = 0x1;
+}
+
+static void clear_pic_end_flag(struct vpu_ctx *ctx)
+{
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ pBUFFER_INFO_TYPE buffer_info;
+
+ if (!ctx)
+ return;
+
+ pSharedInterface = ctx->dev->shared_mem.pSharedInterface;
+ buffer_info = &pSharedInterface->StreamBuffInfo[ctx->str_index];
+
+ buffer_info->stream_pic_end_flag = 0x0;
+}
+
+static bool vpu_dec_stream_is_ready(struct vpu_ctx *ctx)
+{
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ u32 stream_size = 0;
+
+ WARN_ON(!ctx);
+
+ if (ctx->fifo_low)
+ return true;
+ if (ctx->tsm_sync_flag)
+ return true;
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ stream_size = got_used_space(pStrBufDesc->wptr,
+ pStrBufDesc->rptr,
+ pStrBufDesc->start,
+ pStrBufDesc->end);
+ if (ctx->bs_l_threshold > 0) {
+ if (stream_size < ctx->bs_l_threshold)
+ return true;
+ }
+
+ /*
+ *frame depth need to be set by user and then the condition works
+ */
+ if (vpu_frm_depth != INVALID_FRAME_DEPTH &&
+ ctx->stream_input_mode == FRAME_LVL) {
+ if ((getTSManagerPreBufferCnt(ctx->tsm)) >= vpu_frm_depth)
+ return false;
+ }
+
+ if ((getTSManagerPreBufferCnt(ctx->tsm)) >= (tsm_buffer_size * 9 / 10))
+ return false;
+
+ if (ctx->ts_threshold > 0 &&
+ TSM_TS_IS_VALID(ctx->output_ts) &&
+ TSM_TS_IS_VALID(ctx->capture_ts)) {
+ s64 threshold = ctx->ts_threshold * NSEC_PER_MSEC;
+
+ if (ctx->output_ts > ctx->capture_ts + threshold)
+ return false;
+ }
+
+ if (ctx->bs_h_threshold > 0) {
+ if (stream_size > ctx->bs_h_threshold)
+ return false;
+ }
+
+ return true;
+}
+
+static bool verify_decoded_frames(struct vpu_ctx *ctx)
+{
+ pDEC_RPC_HOST_IFACE pSharedInterface = ctx->dev->shared_mem.pSharedInterface;
+ pBUFFER_INFO_TYPE buffer_info = &pSharedInterface->StreamBuffInfo[ctx->str_index];
+
+ if (ctx->stream_input_mode != FRAME_LVL)
+ return true;
+
+ if (buffer_info->stream_pic_input_count != buffer_info->stream_pic_parsed_count) {
+ vpu_dbg(LVL_WARN,
+ "ctx[%d] amount inconsistent between input(%d) and output(%d)\n",
+ ctx->str_index, buffer_info->stream_pic_input_count,
+ buffer_info->stream_pic_parsed_count);
+ return false;
+ }
+
+ return true;
+}
+
+static bool is_valid_frame(struct vpu_ctx *ctx, struct vb2_buffer *vb)
+{
+ struct queue_data *q_data = &ctx->q_data[V4L2_SRC];
+
+ if (!ctx || !vb)
+ return false;
+ if (ctx->first_data_flag && single_seq_info_format(q_data))
+ return false;
+ if (is_codec_config_data(vb))
+ return false;
+
+ return true;
+}
+
+static int increase_frame_num(struct vpu_ctx *ctx, struct vb2_buffer *vb)
+{
+ if (!ctx || !vb)
+ return -EINVAL;
+
+ if (is_valid_frame(ctx, vb)) {
+ ctx->frm_dec_delay++;
+ ctx->frm_dis_delay++;
+ ctx->frm_total_num++;
+ fill_stream_buffer_info(ctx);
+ }
+ ctx->first_data_flag = false;
+
+ return 0;
+}
+
+static void enqueue_stream_data(struct vpu_ctx *ctx, uint32_t uStrBufIdx)
+{
+ struct vb2_data_req *p_data_req;
+ struct queue_data *This = &ctx->q_data[V4L2_SRC];
+ void *input_buffer;
+ uint32_t buffer_size;
+ int frame_bytes;
+
+ while (!list_empty(&This->drv_q)) {
+ struct vb2_buffer *vb;
+
+ if (!vpu_dec_stream_is_ready(ctx)) {
+ vpu_dbg(LVL_INFO,
+ "[%d] stream is not ready\n", ctx->str_index);
+ break;
+ }
+ p_data_req = list_first_entry(&This->drv_q,
+ typeof(*p_data_req), list);
+
+ if (!p_data_req->vb2_buf)
+ break;
+
+ vb = p_data_req->vb2_buf;
+ buffer_size = vb->planes[0].bytesused;
+ input_buffer = (void *)vb2_plane_vaddr(vb, 0);
+
+ if (ctx->start_code_bypass)
+ frame_bytes = update_stream_addr_bypass(ctx, input_buffer, buffer_size);
+ else if (ctx->first_data_flag || is_codec_config_data(vb))
+ frame_bytes = insert_scode_4_seq(ctx, input_buffer, buffer_size);
+ else
+ frame_bytes = update_stream_addr_vpu(ctx, input_buffer, buffer_size, uStrBufIdx);
+
+ if (frame_bytes == 0) {
+ vpu_dbg(LVL_INFO, " %s no space to write\n", __func__);
+ return;
+ } else if (frame_bytes < 0) {
+ vpu_dbg(LVL_WARN, "warning: incorrect input buffer data\n");
+ } else {
+ if (ctx->b_dis_reorder && !is_codec_config_data(vb)) {
+ /* frame successfully written into the stream buffer if in special low latency mode
+ mark that this frame should be flushed for decode immediately */
+ frame_bytes += add_scode(ctx,
+ 0,
+ BUFFLUSH_PADDING_TYPE,
+ true);
+ record_log_info(ctx, LOG_PADDING, 0, 0);
+ }
+
+ increase_frame_num(ctx, vb);
+
+ record_log_info(ctx, LOG_UPDATE_STREAM, 0, buffer_size);
+ vpu_dec_receive_ts(ctx, vb, frame_bytes);
+ This->process_count++;
+ }
+
+ list_del(&p_data_req->list);
+ p_data_req->queued = false;
+ vb2_buffer_done(vb, VB2_BUF_STATE_DONE);
+ }
+ if (list_empty(&This->drv_q) && ctx->eos_stop_received) {
+ if (vpu_dec_is_active(ctx)) {
+ vpu_dbg(LVL_EVENT, "ctx[%d]: insert eos directly\n", ctx->str_index);
+ if (add_scode(ctx, 0, EOS_PADDING_TYPE, true) > 0) {
+ record_log_info(ctx, LOG_EOS, 0, 0);
+ ctx->eos_stop_received = false;
+ ctx->eos_stop_added = true;
+ }
+ } else {
+ ctx->eos_stop_received = false;
+ send_eos_event(ctx);
+ }
+ }
+}
+
+//warn uStrIdx need to refine how to handle it
+static void v4l2_update_stream_addr(struct vpu_ctx *ctx, uint32_t uStrBufIdx)
+{
+ struct queue_data *This = &ctx->q_data[V4L2_SRC];
+
+ down(&This->drv_q_lock);
+ enqueue_stream_data(ctx, uStrBufIdx);
+ up(&This->drv_q_lock);
+}
+
+static void report_buffer_done(struct vpu_ctx *ctx, void *frame_info)
+{
+ struct vb2_data_req *p_data_req;
+ struct queue_data *This = &ctx->q_data[V4L2_DST];
+ u_int32 *FrameInfo = (u_int32 *)frame_info;
+ u_int32 fs_id = FrameInfo[0x0];
+ uint32_t stride = FrameInfo[3];
+ bool b10BitFormat = is_10bit_format(ctx);
+ int buffer_id;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s() fs_id=%d, ulFsLumaBase[0]=%x, stride=%d, b10BitFormat=%d, ctx->seqinfo.uBitDepthLuma=%d\n",
+ __func__, fs_id, FrameInfo[1], stride, b10BitFormat, ctx->seqinfo.uBitDepthLuma);
+ v4l2_update_stream_addr(ctx, 0);
+
+ buffer_id = find_buffer_id(ctx, FrameInfo[1]);
+ if (buffer_id == -1) {
+ vpu_err("%s() ctx[%d] not find buffer id: %d, addr: 0x%x\n",
+ __func__, ctx->str_index, fs_id, FrameInfo[1]);
+ return;
+ }
+
+ if (buffer_id != fs_id) {
+ if (fs_id == MEDIA_PLAYER_SKIPPED_FRAME_ID) {
+ send_skip_event(ctx);
+ ctx->frm_dis_delay--;
+ return;
+ }
+ vpu_err("error: find buffer_id(%d) and firmware return id(%d) doesn't match\n",
+ buffer_id, fs_id);
+ }
+ if (ctx->q_data[V4L2_DST].vb2_reqs[buffer_id].status != FRAME_DECODED)
+ vpu_err("error: buffer(%d) need to set FRAME_READY, but previous state %s is not FRAME_DECODED\n",
+ buffer_id, bufstat[ctx->q_data[V4L2_DST].vb2_reqs[buffer_id].status]);
+
+ set_data_req_status(&ctx->q_data[V4L2_DST].vb2_reqs[buffer_id],
+ FRAME_READY);
+ ctx->frm_dis_delay--;
+ vpu_dbg(LVL_INFO, "frame total: %d; depth: %d; delay: [dec, dis] = [%d, %d]\n", ctx->frm_total_num,
+ vpu_frm_depth, ctx->frm_dec_delay, ctx->frm_dis_delay);
+
+ down(&This->drv_q_lock);
+ p_data_req = &This->vb2_reqs[buffer_id];
+ if (p_data_req->vb2_buf) {
+ p_data_req->vb2_buf->planes[0].bytesused = This->sizeimage[0];
+ p_data_req->vb2_buf->planes[1].bytesused = This->sizeimage[1];
+ if (p_data_req->vb2_buf->state == VB2_BUF_STATE_ACTIVE)
+ vb2_buffer_done(p_data_req->vb2_buf,
+ VB2_BUF_STATE_DONE);
+ else
+ vpu_err("warning: wait_rst_done(%d) check buffer(%d) state(%d)\n",
+ ctx->wait_rst_done, buffer_id, p_data_req->vb2_buf->state);
+ }
+ up(&This->drv_q_lock);
+ vpu_dbg(LVL_INFO, "leave %s\n", __func__);
+}
+
+static void send_skip_event(struct vpu_ctx *ctx)
+{
+ const struct v4l2_event ev = {
+ .type = V4L2_EVENT_SKIP
+ };
+
+ if (!ctx)
+ return;
+
+ vpu_dbg(LVL_INFO, "send skip event\n");
+ v4l2_event_queue_fh(&ctx->fh, &ev);
+}
+
+static void send_eos_event(struct vpu_ctx *ctx)
+{
+ const struct v4l2_event ev = {
+ .type = V4L2_EVENT_EOS
+ };
+
+ if (!ctx)
+ return;
+
+ vpu_dbg(LVL_BIT_FLOW, "send eos event\n");
+ v4l2_event_queue_fh(&ctx->fh, &ev);
+}
+
+static void send_source_change_event(struct vpu_ctx *ctx)
+{
+ const struct v4l2_event ev = {
+ .type = V4L2_EVENT_SOURCE_CHANGE,
+ .u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION
+ };
+
+ if (!ctx)
+ return;
+
+ ctx->res_change_send_count++;
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] send source change event : %dx%d\n",
+ ctx->str_index, ctx->seqinfo.uHorRes, ctx->seqinfo.uVerRes);
+ v4l2_event_queue_fh(&ctx->fh, &ev);
+}
+
+static void reset_mbi_dcp_count(struct vpu_ctx *ctx)
+{
+ free_mbi_buffers(ctx);
+ ctx->mbi_count = 0;
+ free_dcp_buffers(ctx);
+ ctx->dcp_count = 0;
+}
+
+static void reset_frame_buffer(struct vpu_ctx *ctx)
+{
+ struct queue_data *queue;
+ struct vb2_data_req *p_data_req = NULL;
+ int i;
+
+ queue = &ctx->q_data[V4L2_DST];
+ for (i = 0; i < queue->vb2_q.num_buffers; i++) {
+ p_data_req = &queue->vb2_reqs[i];
+
+ if (p_data_req->status == FRAME_ALLOC ||
+ p_data_req->status == FRAME_RELEASE)
+ continue;
+ set_data_req_status(p_data_req, FRAME_RELEASE);
+ release_frame_buffer(ctx, ctx->str_index, p_data_req);
+ }
+}
+
+static bool verify_frame_buffer_size(struct queue_data *q_data,
+ struct vb2_data_req *p_data_req)
+{
+ uint32_t size_0 = 0;
+ uint32_t size_1 = 0;
+ struct vpu_ctx *ctx = container_of(q_data, struct vpu_ctx,
+ q_data[V4L2_DST]);
+
+ if (!q_data || !p_data_req)
+ return false;
+
+ size_0 = p_data_req->vb2_buf->planes[0].length
+ - p_data_req->vb2_buf->planes[0].data_offset;
+ size_1 = p_data_req->vb2_buf->planes[1].length
+ - p_data_req->vb2_buf->planes[1].data_offset;
+ if (size_0 >= q_data->sizeimage[0] && size_1 >= q_data->sizeimage[1])
+ return true;
+
+ vpu_dbg(LVL_WARN, "warning: %s() ctx[%d] frame buffer size is smaller than need\n",
+ __func__, ctx->str_index);
+ return false;
+}
+
+static void add_buffer_to_queue(struct queue_data *q_data, struct vb2_data_req *data_req)
+{
+ if (!q_data || !data_req)
+ return;
+ if (data_req->queued == true)
+ return;
+ list_add_tail(&data_req->list, &q_data->drv_q);
+ data_req->queued = true;
+}
+
+static u32 correct_consumed_length(struct vpu_ctx *ctx,
+ u32 consumed_pic_bytesused)
+{
+ long total_read_bytes;
+ long delta;
+ u32 circle_count;
+ u32 stream_size;
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ stream_size = got_used_space(pStrBufDesc->wptr,
+ pStrBufDesc->rptr,
+ pStrBufDesc->start,
+ pStrBufDesc->end);
+ total_read_bytes = ctx->total_write_bytes - stream_size;
+ delta = total_read_bytes - ctx->total_consumed_bytes;
+ if (delta < ctx->stream_buffer.dma_size)
+ return consumed_pic_bytesused;
+
+ circle_count = delta / ctx->stream_buffer.dma_size;
+ vpu_dbg(LVL_BIT_FRAME_BYTES,
+ "ctx[%d] cross over %d circles\n",
+ ctx->str_index, circle_count);
+
+ consumed_pic_bytesused += ctx->stream_buffer.dma_size * circle_count;
+ ctx->total_consumed_bytes += ctx->stream_buffer.dma_size * circle_count;
+
+ return consumed_pic_bytesused;
+}
+
+static u32 get_consumed_pic_bytesused(struct vpu_ctx *ctx,
+ u32 pic_start_addr,
+ u32 pic_end_addr)
+{
+ u32 consumed_pic_bytesused;
+ u32 pic_size;
+
+ consumed_pic_bytesused = pic_end_addr +
+ + ctx->stream_buffer.dma_size
+ - ctx->pre_pic_end_addr;
+ consumed_pic_bytesused %= ctx->stream_buffer.dma_size;
+ pic_size = pic_end_addr + ctx->stream_buffer.dma_size - pic_start_addr;
+ pic_size %= ctx->stream_buffer.dma_size;
+
+ ctx->total_consumed_bytes += consumed_pic_bytesused;
+ consumed_pic_bytesused = correct_consumed_length(ctx,
+ consumed_pic_bytesused);
+
+ vpu_dbg(LVL_BIT_PIC_ADDR, "<0x%08x 0x%08x>, %8d, %8d\n",
+ pic_start_addr, pic_end_addr, pic_size, consumed_pic_bytesused);
+ if (consumed_pic_bytesused < pic_size)
+ vpu_err("ErrorAddr:[%d] Start(0x%x), End(0x%x), preEnd(0x%x)\n",
+ ctx->str_index,
+ pic_start_addr,
+ pic_end_addr,
+ ctx->pre_pic_end_addr);
+
+
+ ctx->pre_pic_end_addr = pic_end_addr;
+
+ return consumed_pic_bytesused;
+}
+
+static int parse_frame_interval_from_seqinfo(struct vpu_ctx *ctx,
+ MediaIPFW_Video_SeqInfo *seq_info)
+{
+ u32 gcd;
+
+ ctx->frame_interval.numerator = 1000;
+ ctx->frame_interval.denominator = seq_info->FrameRate;
+ if (!seq_info->FrameRate) {
+ vpu_dbg(LVL_INFO, "unknown FrameRate(%d)\n",
+ seq_info->FrameRate);
+ return -EINVAL;
+ }
+
+ gcd = get_greatest_common_divisor(ctx->frame_interval.numerator,
+ ctx->frame_interval.denominator);
+ ctx->frame_interval.numerator /= gcd;
+ ctx->frame_interval.denominator /= gcd;
+
+ mutex_lock(&ctx->instance_mutex);
+ vpu_dec_set_tsm_frame_rate(ctx);
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static struct vb2_data_req *get_frame_buffer(struct queue_data *queue)
+{
+ struct vb2_data_req *p_data_req;
+ struct vb2_data_req *p_temp;
+ bool found = false;
+
+ list_for_each_entry_safe(p_data_req, p_temp, &queue->drv_q, list) {
+ if (!p_data_req->vb2_buf)
+ continue;
+ if (p_data_req->status != FRAME_ALLOC)
+ continue;
+ if (verify_frame_buffer_size(queue, p_data_req)) {
+ list_del(&p_data_req->list);
+ p_data_req->queued = false;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ return NULL;
+
+ return p_data_req;
+}
+
+static void respond_req_frame_abnormal(struct vpu_ctx *ctx)
+{
+ u32 local_cmddata[10];
+
+ ctx->req_frame_count--;
+ if (ctx->firmware_stopped)
+ return;
+
+ memset(local_cmddata, 0, sizeof(local_cmddata));
+ local_cmddata[0] = (ctx->seqinfo.uActiveSeqTag + 0xf0)<<24;
+ local_cmddata[6] = MEDIAIP_FRAME_REQ;
+ v4l2_vpu_send_cmd(ctx, ctx->str_index,
+ VID_API_CMD_FS_ALLOC, 7, local_cmddata);
+}
+
+static bool alloc_frame_buffer(struct vpu_ctx *ctx,
+ struct queue_data *queue)
+{
+ struct vb2_data_req *p_data_req;
+ u32 local_cmddata[10];
+ dma_addr_t LumaAddr = 0;
+ dma_addr_t ChromaAddr = 0;
+
+ if (!ctx || !queue->enable || ctx->b_firstseq || ctx->firmware_stopped)
+ return false;
+
+ p_data_req = get_frame_buffer(queue);
+ if (!p_data_req)
+ return false;
+
+ LumaAddr = p_data_req->phy_addr[0] + p_data_req->data_offset[0];
+ ChromaAddr = p_data_req->phy_addr[1] + p_data_req->data_offset[1];
+ vpu_dbg(LVL_INFO, "%s() :LumaAddr(%llx) ChromaAddr(%llx) buf_id (%d)\n",
+ __func__, LumaAddr, ChromaAddr, p_data_req->id);
+
+ p_data_req->seq_tag = ctx->seqinfo.uActiveSeqTag;
+ memset(local_cmddata, 0, sizeof(local_cmddata));
+ local_cmddata[0] = p_data_req->id | (p_data_req->seq_tag << 24);
+ local_cmddata[1] = LumaAddr;
+ local_cmddata[2] = local_cmddata[1] + queue->sizeimage[0]/2;
+ local_cmddata[3] = ChromaAddr;
+ local_cmddata[4] = local_cmddata[3] + queue->sizeimage[1]/2;
+ local_cmddata[5] = queue->stride;
+ local_cmddata[6] = MEDIAIP_FRAME_REQ;
+
+ ctx->req_frame_count--;
+ v4l2_vpu_send_cmd(ctx, ctx->str_index,
+ VID_API_CMD_FS_ALLOC, 7, local_cmddata);
+ set_data_req_status(p_data_req, FRAME_FREE);
+ vpu_dbg(LVL_INFO,
+ "VID_API_CMD_FS_ALLOC, ctx[%d] vb2_buf=%p, id=%d\n",
+ ctx->str_index, p_data_req->vb2_buf, p_data_req->id);
+
+ return true;
+}
+
+static void check_wait_res_changed(struct vpu_ctx *ctx)
+{
+ struct queue_data *q_data = &ctx->q_data[V4L2_DST];
+ struct vb2_data_req *p_data_req;
+ struct vb2_data_req *p_temp;
+
+ if (!q_data->enable)
+ return;
+
+ list_for_each_entry_safe(p_data_req, p_temp, &q_data->drv_q, list) {
+ if (!p_data_req->vb2_buf)
+ continue;
+ if (verify_frame_buffer_size(q_data, p_data_req)) {
+ ctx->res_change_done_count++;
+ ctx->wait_res_change_done = false;
+ vpu_dbg(LVL_BIT_FLOW,
+ "ctx[%d] res change done, %d, %d, %d\n",
+ ctx->str_index,
+ ctx->res_change_occu_count,
+ ctx->res_change_send_count,
+ ctx->res_change_done_count);
+ vpu_calculate_performance(ctx, 0xff, "first provide buffer");
+ break;
+ }
+ }
+}
+
+static void respond_req_frame(struct vpu_ctx *ctx,
+ struct queue_data *queue,
+ bool abnormal)
+{
+ if (ctx->wait_res_change_done) {
+ if (ctx->seek_flag)
+ return;
+ check_wait_res_changed(ctx);
+ }
+
+ if (ctx->wait_res_change_done)
+ return;
+
+ while (ctx->req_frame_count > 0) {
+ if (abnormal) {
+ respond_req_frame_abnormal(ctx);
+ continue;
+ }
+ if (!queue->enable)
+ break;
+ if (!alloc_frame_buffer(ctx, queue))
+ break;
+ }
+}
+
+static void release_frame_buffer(struct vpu_ctx *ctx,
+ u32 uStrIdx,
+ struct vb2_data_req *p_data_req)
+{
+ u32 local_cmddata[1];
+
+ local_cmddata[0] = p_data_req->id | (p_data_req->seq_tag << 24);
+ v4l2_vpu_send_cmd(ctx, uStrIdx,
+ VID_API_CMD_FS_RELEASE, 1, local_cmddata);
+ set_data_req_status(p_data_req, FRAME_ALLOC);
+}
+
+static void get_seq_info(MediaIPFW_Video_SeqInfo *pSeqInfo,
+ u32 *event_data,
+ MediaIPFW_Video_SeqInfo *pRpcSeqInfo)
+{
+ memset(pSeqInfo, 0, sizeof(*pSeqInfo));
+
+ if (event_data && event_data[0]) {
+ pSeqInfo->uNumRefFrms = event_data[0];
+ pSeqInfo->uNumDPBFrms = event_data[1];
+ pSeqInfo->uNumDFEAreas = event_data[2];
+ pSeqInfo->uProgressive = event_data[3];
+ pSeqInfo->uVerRes = event_data[4];
+ pSeqInfo->uHorRes = event_data[5];
+ pSeqInfo->uParWidth = event_data[6];
+ pSeqInfo->uParHeight = event_data[7];
+ pSeqInfo->FrameRate = event_data[8];
+ pSeqInfo->UDispAspRatio = event_data[9];
+ pSeqInfo->uLevelIDC = event_data[10];
+ pSeqInfo->uVerDecodeRes = event_data[11];
+ pSeqInfo->uHorDecodeRes = event_data[12];
+ pSeqInfo->uBitDepthLuma = event_data[13];
+ pSeqInfo->uBitDepthChroma = event_data[14];
+ pSeqInfo->uChromaFmt = event_data[15];
+ pSeqInfo->uColorDesc = event_data[16];
+ pSeqInfo->uTransferChars = event_data[17];
+ pSeqInfo->uMatrixCoeffs = event_data[18];
+ pSeqInfo->uVideoFullRangeFlag = event_data[19];
+ pSeqInfo->uVUIPresent = event_data[20];
+ pSeqInfo->uMVCNumViews = event_data[21];
+ pSeqInfo->uFrameCropValid = event_data[22];
+ pSeqInfo->uFrameCropLeftOffset = event_data[23];
+ pSeqInfo->uFrameCropRightOffset = event_data[24];
+ pSeqInfo->uFrameCropTopOffset = event_data[25];
+ pSeqInfo->uFrameCropBottomOffset = event_data[25];
+ pSeqInfo->uActiveSeqTag = event_data[27];
+ return;
+ }
+
+ memcpy(pSeqInfo, pRpcSeqInfo, sizeof(*pSeqInfo));
+}
+
+static bool check_seq_info_is_valid(u32 ctx_id, MediaIPFW_Video_SeqInfo *info)
+{
+ if (!info)
+ return false;
+
+ if (!info->uHorRes || !info->uVerRes) {
+ vpu_err("ctx[%d] invalid seq info : %d x %d\n",
+ ctx_id, info->uHorRes, info->uVerRes);
+ return false;
+ }
+ if (info->uHorRes > VPU_DEC_MAX_WIDTH ||
+ info->uVerRes > VPU_DEC_MAX_HEIGTH) {
+ vpu_err("ctx[%d] invalid seq info : %d x %d\n",
+ ctx_id, info->uHorRes, info->uVerRes);
+ return false;
+ }
+
+ return true;
+}
+
+static bool check_res_is_changed(struct vpu_ctx *ctx,
+ MediaIPFW_Video_SeqInfo *pSeqInfo)
+{
+ if (ctx->seqinfo.uHorDecodeRes != pSeqInfo->uHorDecodeRes)
+ return true;
+ if (ctx->seqinfo.uVerDecodeRes != pSeqInfo->uVerDecodeRes)
+ return true;
+ if (ctx->seqinfo.uNumRefFrms != pSeqInfo->uNumRefFrms)
+ return true;
+ if (ctx->seqinfo.uNumDPBFrms != pSeqInfo->uNumDPBFrms)
+ return true;
+ if (ctx->seqinfo.uBitDepthLuma != pSeqInfo->uBitDepthLuma)
+ return true;
+ if (ctx->seqinfo.uBitDepthChroma != pSeqInfo->uBitDepthChroma)
+ return true;
+
+ return false;
+}
+
+static bool check_is_need_reset_after_abort(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return false;
+ if (ctx->b_firstseq)
+ return true;
+ if (!ctx->frame_decoded)
+ return true;
+
+ return false;
+}
+
+static struct vpu_dec_perf_queue *get_dec_perf_queue(struct vpu_ctx *ctx)
+{
+ struct vpu_dec_perf_queue *perf;
+
+ perf = vzalloc(sizeof(*perf));
+ if (!perf)
+ return NULL;
+
+ atomic64_add(sizeof(*perf), &ctx->statistic.total_alloc_size);
+
+ return perf;
+}
+
+static void put_dec_perf_queue(struct vpu_ctx *ctx, struct vpu_dec_perf_queue *perf)
+{
+ if (!perf)
+ return;
+
+ vfree(perf);
+ atomic64_sub(sizeof(*perf), &ctx->statistic.total_alloc_size);
+}
+
+static void cleanup_perf_queue(struct vpu_ctx *ctx)
+{
+ struct vpu_dec_perf_queue *perf;
+ struct vpu_dec_perf_queue *tmp;
+
+ mutex_lock(&ctx->perf_lock);
+ list_for_each_entry_safe(perf, tmp, &ctx->perf_q, list) {
+ list_del_init(&perf->list);
+ put_dec_perf_queue(ctx, perf);
+ }
+ mutex_unlock(&ctx->perf_lock);
+}
+
+static void vpu_calculate_performance(struct vpu_ctx *ctx, u_int32 uEvent, const char *str)
+{
+ u_int64 Time;
+ u_int64 total_Time;
+ struct timespec64 ts;
+ struct vpu_dec_perf_queue *perf;
+
+ if (!vpu_show_perf_ena)
+ return;
+ if (!(vpu_show_perf_idx & (1<<ctx->str_index)))
+ return;
+
+ ktime_get_real_ts64(&ts);
+ Time = ((ts.tv_sec * 1000000000ULL) + ts.tv_nsec) / 1000000ULL;
+
+ switch (uEvent) {
+ case VID_API_EVENT_PIC_DECODED:
+ if (ctx->statistic.event[VID_API_EVENT_PIC_DECODED] == 1) {
+ ctx->perf_time.first_decoded_time = Time - 1;
+ ctx->perf_time.last_decoded_time = Time - 1;
+ }
+
+ ctx->perf_time.cur_decoded_interv = Time - ctx->perf_time.last_decoded_time;
+ total_Time = Time - ctx->perf_time.first_decoded_time;
+ ctx->perf_time.decoded_fps = ctx->statistic.event[VID_API_EVENT_PIC_DECODED] * 1000ULL / total_Time;
+ ctx->perf_time.last_decoded_time = Time;
+ if (vpu_show_perf_ent & VPU_DECODED_EVENT_PERF_MASK)
+ vpu_dbg(LVL_WARN, "[%2d] dec[%8ld] interv: %8ld ms fps: %ld\n",
+ ctx->str_index,
+ ctx->statistic.event[VID_API_EVENT_PIC_DECODED],
+ ctx->perf_time.cur_decoded_interv,
+ ctx->perf_time.decoded_fps);
+
+ break;
+ case VID_API_EVENT_FRAME_BUFF_RDY:
+ if (ctx->statistic.event[VID_API_EVENT_FRAME_BUFF_RDY] == 1) {
+ ctx->perf_time.first_ready_time = Time - 1;
+ ctx->perf_time.last_ready_time = Time - 1;
+ }
+
+ ctx->perf_time.cur_ready_interv = Time - ctx->perf_time.last_ready_time;
+ total_Time = Time - ctx->perf_time.first_ready_time;
+ ctx->perf_time.ready_fps = ctx->statistic.event[VID_API_EVENT_FRAME_BUFF_RDY] * 1000ULL / total_Time;
+ ctx->perf_time.last_ready_time = Time;
+ if (vpu_show_perf_ent & VPU_READY_EVENT_PERF_MASK)
+ vpu_dbg(LVL_WARN, "[%2d] rdy[%8ld] interv: %8ld ms fps: %ld\n",
+ ctx->str_index,
+ ctx->statistic.event[VID_API_EVENT_FRAME_BUFF_RDY],
+ ctx->perf_time.cur_ready_interv,
+ ctx->perf_time.ready_fps);
+
+ break;
+ default:
+ break;
+ }
+
+ if (ctx->statistic.event[VID_API_EVENT_FRAME_BUFF_RDY] > 1)
+ return;
+
+ if (str != NULL) {
+ perf = get_dec_perf_queue(ctx);
+ if (!perf) {
+ vpu_err("get_dec_perf_queue fail\n");
+ return;
+ }
+
+ scnprintf(perf->str, (VPU_MAX_STEP_STRING_LENGTH - 1), str);
+ perf->time = Time;
+
+ mutex_lock(&ctx->perf_lock);
+ list_add_tail(&perf->list, &ctx->perf_q);
+ mutex_unlock(&ctx->perf_lock);
+ }
+}
+
+static void vpu_api_event_handler(struct vpu_ctx *ctx, u_int32 uStrIdx, u_int32 uEvent, u_int32 *event_data)
+{
+ struct vpu_dev *dev;
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+
+ vpu_log_event(uEvent, uStrIdx);
+ count_event(&ctx->statistic, uEvent);
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ record_log_info(ctx, LOG_EVENT, uEvent, pStrBufDesc->rptr);
+
+ if (ctx == NULL) {
+ vpu_err("receive event: 0x%X after instance released, ignore it\n", uEvent);
+ return;
+ }
+
+ if (ctx->firmware_stopped) {
+ switch (uEvent) {
+ case VID_API_EVENT_START_DONE:
+ case VID_API_EVENT_FIRMWARE_XCPT:
+ break;
+ case VID_API_EVENT_FIFO_LOW:
+ return;
+ default:
+ vpu_err("receive event: 0x%X after stopped, ignore it\n", uEvent);
+ return;
+ }
+ }
+
+ dev = ctx->dev;
+ pSharedInterface = (pDEC_RPC_HOST_IFACE)dev->shared_mem.shared_mem_vir;
+
+ vpu_dec_response_cmd(ctx, uEvent);
+ switch (uEvent) {
+ case VID_API_EVENT_START_DONE:
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] START DONE\n", ctx->str_index);
+ ctx->firmware_stopped = false;
+ ctx->firmware_finished = false;
+ ctx->req_frame_count = 0;
+ vpu_calculate_performance(ctx, uEvent, "start done");
+ break;
+ case VID_API_EVENT_STOPPED: {
+ vpu_dbg(LVL_INFO, "receive VID_API_EVENT_STOPPED\n");
+ vpu_dbg(LVL_BIT_FLOW,
+ "ctx[%d] STOPPED, output qbuf(%ld), dqbuf(%ld)\n",
+ ctx->str_index,
+ ctx->q_data[V4L2_SRC].qbuf_count,
+ ctx->q_data[V4L2_SRC].dqbuf_count);
+ ctx->firmware_stopped = true;
+ ctx->frame_decoded = false;
+ ctx->wait_rst_done = false;
+ /* This also can fix an Andorid case indirectly:
+ * seek in the beginning, but has not do capture port
+ * streamoff/on when receive res changed event, then will cause
+ * seek_flag status incorrect.
+ * If abort before receive seq_hdr_found evnt will call stop cmd
+ * to fw, then will reset seek_flag and wait_res_change_done.
+ */
+ ctx->wait_res_change_done = false;
+ ctx->seek_flag = false;
+ ctx->res_change_occu_count = 0;
+ ctx->res_change_send_count = 0;
+ ctx->res_change_done_count = 0;
+ ctx->fifo_low = false;
+ down(&ctx->q_data[V4L2_DST].drv_q_lock);
+ ctx->b_firstseq = true;
+ respond_req_frame(ctx, &ctx->q_data[V4L2_DST], true);
+ reset_mbi_dcp_count(ctx);
+ memset(&ctx->seqinfo, 0, sizeof(MediaIPFW_Video_SeqInfo));
+ up(&ctx->q_data[V4L2_DST].drv_q_lock);
+ vpu_dec_cleanup_event(ctx);
+ complete(&ctx->completion);//reduce possibility of abort hang if decoder enter stop automatically
+ complete(&ctx->stop_cmp);
+ }
+ break;
+ case VID_API_EVENT_RESET_DONE:
+ break;
+ case VID_API_EVENT_PIC_DECODED: {
+ MediaIPFW_Video_QMeterInfo *pQMeterInfo = (MediaIPFW_Video_QMeterInfo *)dev->shared_mem.qmeter_mem_vir;
+ MediaIPFW_Video_PicInfo *pPicInfo = (MediaIPFW_Video_PicInfo *)dev->shared_mem.pic_mem_vir;
+ MediaIPFW_Video_PicDispInfo *pDispInfo = &pPicInfo[uStrIdx].DispInfo;
+ MediaIPFW_Video_PicPerfInfo *pPerfInfo = &pPicInfo[uStrIdx].PerfInfo;
+ MediaIPFW_Video_PicPerfDcpInfo *pPerfDcpInfo = &pPicInfo[uStrIdx].PerfDcpInfo;
+ int buffer_id;
+ u_int32 uDecFrmId = event_data[7];
+ u_int32 uPicStartAddr = event_data[10];
+ u_int32 uPicEndAddr = event_data[12];
+ struct queue_data *This = &ctx->q_data[V4L2_DST];
+ u_int32 uDpbmcCrc;
+ size_t wr_size;
+ u32 consumed_pic_bytesused = 0;
+ struct vb2_data_req *p_data_req = NULL;
+
+ if (This->vdec_std == VPU_VIDEO_HEVC)
+ uDpbmcCrc = pPerfDcpInfo->uDBEDpbCRC[0];
+ else
+ uDpbmcCrc = pPerfInfo->uMemCRC;
+ if (vpu_frmcrcdump_ena) {
+ wr_size = kernel_write(ctx->crc_fp, &uDpbmcCrc, sizeof(uDpbmcCrc), &ctx->pos);
+ ctx->pos += wr_size;
+ }
+
+ vpu_dbg(LVL_INFO, "PICINFO GET: uPicType:%d uPicStruct:%d uPicStAddr:0x%x uFrameStoreID:%d uPercentInErr:%d, uRbspBytesCount=%d, ulLumBaseAddr[0]=%x, pQMeterInfo:%p, pPicInfo:%p, pDispInfo:%p, pPerfInfo:%p, pPerfDcpInfo:%p, uPicStartAddr=0x%x, uDpbmcCrc:%x\n",
+ pPicInfo[uStrIdx].uPicType, pPicInfo[uStrIdx].uPicStruct,
+ pPicInfo[uStrIdx].uPicStAddr, pPicInfo[uStrIdx].uFrameStoreID,
+ pPicInfo[uStrIdx].uPercentInErr, pPerfInfo->uRbspBytesCount, event_data[0],
+ pQMeterInfo, pPicInfo, pDispInfo, pPerfInfo, pPerfDcpInfo, uPicStartAddr, uDpbmcCrc);
+
+ down(&ctx->q_data[V4L2_SRC].drv_q_lock);
+ if (tsm_use_consumed_length)
+ consumed_pic_bytesused = get_consumed_pic_bytesused(ctx,
+ uPicStartAddr,
+ uPicEndAddr);
+ up(&ctx->q_data[V4L2_SRC].drv_q_lock);
+
+ buffer_id = find_buffer_id(ctx, event_data[0]);
+ if (buffer_id == -1) {
+ vpu_err("error: %s() ctx[%d] not find buffer id: %d, addr: 0x%x\n",
+ __func__, ctx->str_index, uDecFrmId, event_data[0]);
+ vpu_dec_valid_ts(ctx,
+ consumed_pic_bytesused,
+ NULL);
+ break;
+ }
+
+ if (buffer_id != uDecFrmId) {
+ if (uDecFrmId == MEDIA_PLAYER_SKIPPED_FRAME_ID) {
+ send_skip_event(ctx);
+ ctx->frm_dec_delay--;
+ vpu_dec_valid_ts(ctx,
+ consumed_pic_bytesused,
+ NULL);
+ break;
+ }
+ vpu_err("error: VID_API_EVENT_PIC_DECODED address and id doesn't match\n");
+ }
+ p_data_req = &This->vb2_reqs[buffer_id];
+ if (p_data_req->status != FRAME_FREE)
+ vpu_err("error: buffer(%d) need to set FRAME_DECODED, but previous state %s is not FRAME_FREE\n",
+ buffer_id, bufstat[ctx->q_data[V4L2_DST].vb2_reqs[buffer_id].status]);
+ set_data_req_status(p_data_req, FRAME_DECODED);
+ if (ctx->seqinfo.uProgressive == 1)
+ p_data_req->bfield = false;
+ else
+ p_data_req->bfield = true;
+
+ vpu_dec_valid_ts(ctx, consumed_pic_bytesused, p_data_req);
+ This->process_count++;
+ }
+ if (ctx->statistic.event[VID_API_EVENT_PIC_DECODED] == 1)
+ vpu_calculate_performance(ctx, uEvent, "first decoded");
+ else
+ vpu_calculate_performance(ctx, uEvent, NULL);
+
+ ctx->frm_dec_delay--;
+ ctx->fifo_low = false;
+ ctx->frame_decoded = true;
+ v4l2_update_stream_addr(ctx, 0);
+ break;
+ case VID_API_EVENT_SEQ_HDR_FOUND: {
+ MediaIPFW_Video_SeqInfo *pSeqInfo = (MediaIPFW_Video_SeqInfo *)dev->shared_mem.seq_mem_vir;
+ MediaIPFW_Video_SeqInfo info;
+// MediaIPFW_Video_FrameBuffer *pStreamFrameBuffer = &pSharedInterface->StreamFrameBuffer[uStrIdx];
+// MediaIPFW_Video_FrameBuffer *pStreamDCPBuffer = &pSharedInterface->StreamDCPBuffer[uStrIdx];
+ MediaIPFW_Video_PitchInfo *pStreamPitchInfo = &pSharedInterface->StreamPitchInfo[uStrIdx];
+ unsigned int num = pSharedInterface->SeqInfoTabDesc.uNumSizeDescriptors;
+ int wait_times = 0;
+
+ get_seq_info(&info, event_data, &pSeqInfo[ctx->str_index]);
+ if (!check_seq_info_is_valid(ctx->str_index, &info))
+ break;
+
+ while (ctx->wait_res_change_done && wait_times++ < 100) {
+ if (!vpu_dec_is_active(ctx))
+ break;
+ mdelay(10);
+ }
+ if (!vpu_dec_is_active(ctx))
+ break;
+ if (ctx->wait_res_change_done)
+ vpu_dbg(LVL_WARN, "warning: ctx[%d] update seq info when waiting res change\n",
+ ctx->str_index);
+
+ down(&ctx->q_data[V4L2_DST].drv_q_lock);
+ respond_req_frame(ctx, &ctx->q_data[V4L2_DST], true);
+ if (check_res_is_changed(ctx, &info))
+ ctx->res_change_occu_count++;
+ memcpy(&ctx->seqinfo, &info, sizeof(MediaIPFW_Video_SeqInfo));
+ up(&ctx->q_data[V4L2_DST].drv_q_lock);
+
+ parse_frame_interval_from_seqinfo(ctx, &ctx->seqinfo);
+ vpu_dbg(LVL_BIT_FLOW,
+ "ctx[%d] SEQINFO GET: uHorRes:%d uVerRes:%d uHorDecodeRes:%d uVerDecodeRes:%d\n",
+ ctx->str_index,
+ ctx->seqinfo.uHorRes,
+ ctx->seqinfo.uVerRes,
+ ctx->seqinfo.uHorDecodeRes,
+ ctx->seqinfo.uVerDecodeRes);
+ vpu_dbg(LVL_BIT_FLOW,
+ "ctx[%d] SEQINFO GET: uNumDPBFrms:%d, num:%d, uNumRefFrms:%d, uNumDFEAreas:%d, scan lines: %s\n",
+ ctx->str_index,
+ ctx->seqinfo.uNumDPBFrms,
+ num,
+ ctx->seqinfo.uNumRefFrms,
+ ctx->seqinfo.uNumDFEAreas,
+ ctx->seqinfo.uProgressive ? "progressive" : "interlaced");
+ vpu_dbg(LVL_BIT_FLOW,
+ "uColorDesc = %d, uTransferChars = %d, uMatrixCoeffs = %d, uVideoFullRangeFlag = %d, uVUIPresent = %d\n",
+ ctx->seqinfo.uColorDesc,
+ ctx->seqinfo.uTransferChars,
+ ctx->seqinfo.uMatrixCoeffs,
+ ctx->seqinfo.uVideoFullRangeFlag,
+ ctx->seqinfo.uVUIPresent);
+ down(&ctx->q_data[V4L2_DST].drv_q_lock);
+ calculate_frame_size(ctx);
+ if (ctx->b_firstseq) {
+ ctx->b_firstseq = false;
+ reset_mbi_dcp_count(ctx);
+ ctx->mbi_size = get_mbi_size(&ctx->q_data[V4L2_DST]);
+ reset_frame_buffer(ctx);
+ ctx->q_data[V4L2_DST].enable = false;
+ ctx->wait_res_change_done = true;
+ send_source_change_event(ctx);
+ pStreamPitchInfo->uFramePitch = 0x4000;
+ vpu_calculate_performance(ctx, uEvent, "seq_hdr_found");
+ }
+ up(&ctx->q_data[V4L2_DST].drv_q_lock);
+ }
+ break;
+ case VID_API_EVENT_PIC_HDR_FOUND:
+ break;
+ case VID_API_EVENT_REQ_FRAME_BUFF: {
+ MEDIA_PLAYER_FSREQ *pFSREQ = (MEDIA_PLAYER_FSREQ *)event_data;
+ u_int32 local_cmddata[10];
+ struct queue_data *This = &ctx->q_data[V4L2_DST];
+
+ vpu_dbg(LVL_INFO, "VID_API_EVENT_REQ_FRAME_BUFF, type=%d, size=%ld\n", pFSREQ->eType, sizeof(MEDIA_PLAYER_FSREQ));
+ if (pFSREQ->eType == MEDIAIP_DCP_REQ) {
+ if (ctx->dcp_count >= MAX_DCP_NUM) {
+ vpu_err("error: request dcp buffers number is over MAX_DCP_NUM\n");
+ break;
+ }
+ if (alloc_dcp_buffer(ctx, ctx->dcp_count))
+ break;
+
+ local_cmddata[0] = ctx->dcp_count | (ctx->seqinfo.uActiveSeqTag<<24);
+ local_cmddata[1] = ctx->dcp_buffer[ctx->dcp_count].dma_phy;
+ local_cmddata[2] = DCP_SIZE;
+ local_cmddata[3] = 0;
+ local_cmddata[4] = 0;
+ local_cmddata[5] = 0;
+ local_cmddata[6] = pFSREQ->eType;
+ v4l2_vpu_send_cmd(ctx, uStrIdx, VID_API_CMD_FS_ALLOC, 7, local_cmddata);
+ vpu_dbg(LVL_INFO, "VID_API_CMD_FS_ALLOC, ctx[%d] eType=%d, index=%d\n",
+ ctx->str_index, pFSREQ->eType, ctx->dcp_count);
+ ctx->dcp_count++;
+ } else if (pFSREQ->eType == MEDIAIP_MBI_REQ) {
+ if (alloc_mbi_buffer(ctx, ctx->mbi_count))
+ break;
+
+ local_cmddata[0] = ctx->mbi_count | (ctx->seqinfo.uActiveSeqTag<<24);
+ local_cmddata[1] = ctx->mbi_buffer[ctx->mbi_count].dma_phy;
+ local_cmddata[2] = ctx->mbi_buffer[ctx->mbi_count].dma_size;
+ local_cmddata[3] = 0;
+ local_cmddata[4] = 0;
+ local_cmddata[5] = 0;
+ local_cmddata[6] = pFSREQ->eType;
+ v4l2_vpu_send_cmd(ctx, uStrIdx, VID_API_CMD_FS_ALLOC, 7, local_cmddata);
+ vpu_dbg(LVL_INFO, "VID_API_CMD_FS_ALLOC, ctx[%d] eType=%d, index=%d\n",
+ ctx->str_index, pFSREQ->eType, ctx->mbi_count);
+ ctx->mbi_count++;
+ } else {
+ down(&This->drv_q_lock);
+ ctx->req_frame_count++;
+ respond_req_frame(ctx, This, false);
+ up(&This->drv_q_lock);
+ }
+ }
+ break;
+ case VID_API_EVENT_REL_FRAME_BUFF: {
+ MEDIA_PLAYER_FSREL *fsrel = (MEDIA_PLAYER_FSREL *)event_data;
+ struct queue_data *This = &ctx->q_data[V4L2_DST];
+ struct vb2_data_req *p_data_req;
+
+ down(&This->drv_q_lock);
+ if (fsrel->eType == MEDIAIP_FRAME_REQ) {
+ p_data_req = &This->vb2_reqs[fsrel->uFSIdx];
+ if (!p_data_req->vb2_buf) {
+ vpu_dbg(LVL_INFO,
+ "frame[%d] buffer already freed!\n",
+ p_data_req->id);
+ up(&This->drv_q_lock);
+ break;
+ }
+
+ if (ctx->wait_rst_done != true && p_data_req->status != FRAME_READY) {
+ vpu_dbg(LVL_INFO, "warning: normal release and previous status %s, frame not for display, queue the buffer to list again\n",
+ bufstat[p_data_req->status]);
+
+ if (p_data_req->status == FRAME_DECODED) {
+ vpu_dec_skip_ts(ctx);
+ send_skip_event(ctx);
+ }
+ add_buffer_to_queue(This, p_data_req);
+ }
+ if (p_data_req->status != FRAME_ALLOC) {
+ set_data_req_status(p_data_req, FRAME_RELEASE);
+ release_frame_buffer(ctx, uStrIdx, p_data_req);
+ } else {
+ vpu_dbg(LVL_INFO,
+ "frame[%d] already released\n",
+ p_data_req->id);
+ }
+ respond_req_frame(ctx, This, false);
+ } else if (fsrel->eType == MEDIAIP_MBI_REQ) {
+ vpu_dbg(LVL_INFO, "ctx[%d] relase MEDIAIP_MBI_REQ frame[%d]\n",
+ ctx->str_index, fsrel->uFSIdx);
+ } else if (fsrel->eType == MEDIAIP_DCP_REQ) {
+ vpu_dbg(LVL_INFO, "ctx[%d] relase MEDIAIP_DCP_REQ frame[%d]\n",
+ ctx->str_index, fsrel->uFSIdx);
+ } else {
+ vpu_dbg(LVL_WARN, "warning: ctx[%d] release unknown type frame!\n",
+ ctx->str_index);
+ }
+ up(&This->drv_q_lock);
+ vpu_dbg(LVL_INFO, "VID_API_EVENT_REL_FRAME_BUFF uFSIdx=%d, eType=%d, size=%ld\n",
+ fsrel->uFSIdx, fsrel->eType, sizeof(MEDIA_PLAYER_FSREL));
+ } break;
+ case VID_API_EVENT_FRAME_BUFF_RDY: {
+ u_int32 *FrameInfo = (u_int32 *)event_data;
+
+ report_buffer_done(ctx, FrameInfo);
+ if (ctx->statistic.event[VID_API_EVENT_FRAME_BUFF_RDY] == 1)
+ vpu_calculate_performance(ctx, uEvent, "first ready");
+ else
+ vpu_calculate_performance(ctx, uEvent, NULL);
+ }
+ break;
+ case VID_API_EVENT_CHUNK_DECODED:
+ break;
+ case VID_API_EVENT_FIFO_LOW: {
+ u_int32 uStrBufIdx = 0; //use buffer 0 for the stream
+
+ ctx->fifo_low = true;
+ v4l2_update_stream_addr(ctx, uStrBufIdx);
+ } break;
+ case VID_API_EVENT_FIFO_HIGH:
+ break;
+ case VID_API_EVENT_FIFO_EMPTY:
+ break;
+ case VID_API_EVENT_FIFO_FULL:
+ break;
+ case VID_API_EVENT_FIFO_OVF:
+ break;
+ case VID_API_EVENT_BS_ERROR:
+ break;
+ case VID_API_EVENT_UDATA_FIFO_UPTD:
+ break;
+ case VID_API_EVENT_DBG_STAT_UPDATE:
+ break;
+ case VID_API_EVENT_DBG_LOG_STARTED:
+ break;
+ case VID_API_EVENT_DBG_LOG_STOPPED:
+ break;
+ case VID_API_EVENT_ABORT_DONE: {
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ struct queue_data *queue = &ctx->q_data[V4L2_SRC];
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ vpu_dbg(LVL_INFO, "%s AbrtDone StrBuf Curr, wptr(%x) rptr(%x) start(%x) end(%x)\n",
+ __func__,
+ pStrBufDesc->wptr,
+ pStrBufDesc->rptr,
+ pStrBufDesc->start,
+ pStrBufDesc->end);
+
+ down(&queue->drv_q_lock);
+ vpu_dbg(LVL_BIT_FLOW,
+ "ctx[%d] ABORT DONE, output qbuf(%ld/%ld),dqbuf(%ld)\n",
+ ctx->str_index,
+ queue->process_count,
+ queue->qbuf_count,
+ queue->dqbuf_count);
+ vpu_dbg(LVL_BIT_FRAME_BYTES,
+ "[%d]total bytes: %ld, %ld, %ld, %ld\n",
+ ctx->str_index,
+ ctx->total_qbuf_bytes,
+ ctx->total_ts_bytes,
+ ctx->total_write_bytes,
+ ctx->total_consumed_bytes);
+ update_wptr(ctx, pStrBufDesc, pStrBufDesc->rptr);
+ ctx->pre_pic_end_addr = pStrBufDesc->rptr;
+ ctx->beginning = pStrBufDesc->rptr;
+ ctx->total_qbuf_bytes = 0;
+ ctx->total_write_bytes = 0;
+ ctx->total_consumed_bytes = 0;
+ ctx->total_ts_bytes = 0;
+ ctx->tsm_sync_flag = true;
+ up(&queue->drv_q_lock);
+
+ clear_pic_end_flag(ctx);
+ ctx->frm_dis_delay = 0;
+ ctx->frm_dec_delay = 0;
+ ctx->frm_total_num = 0;
+ v4l2_vpu_send_cmd(ctx, uStrIdx, VID_API_CMD_RST_BUF, 0, NULL);
+ }
+ break;
+ case VID_API_EVENT_RES_CHANGE: {
+ struct queue_data *This;
+
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] RES CHANGE\n", ctx->str_index);
+ This = &ctx->q_data[V4L2_DST];
+ down(&This->drv_q_lock);
+ reset_mbi_dcp_count(ctx);
+ ctx->mbi_size = get_mbi_size(This);
+ reset_frame_buffer(ctx);
+ up(&This->drv_q_lock);
+ vpu_dbg(LVL_BIT_FLOW,
+ "warning: ctx[%d] RES_CHANGE event, seq id: %d\n",
+ ctx->str_index, ctx->seqinfo.uActiveSeqTag);
+ vpu_log_buffer_state(ctx);
+ down(&This->drv_q_lock);
+ This->enable = false;
+ up(&This->drv_q_lock);
+ ctx->wait_res_change_done = true;
+ send_source_change_event(ctx);
+ }
+ break;
+ case VID_API_EVENT_STR_BUF_RST: {
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ struct queue_data *This;
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+ vpu_dbg(LVL_INFO, "%s wptr(%x) rptr(%x) start(%x) end(%x)\n",
+ __func__,
+ pStrBufDesc->wptr,
+ pStrBufDesc->rptr,
+ pStrBufDesc->start,
+ pStrBufDesc->end
+ );
+ This = &ctx->q_data[V4L2_DST];
+ down(&This->drv_q_lock);
+ check_queue_is_releasd(This, "EVENT_STR_BUF_RST is received");
+ up(&This->drv_q_lock);
+ if (check_is_need_reset_after_abort(ctx)) {
+ vpu_dbg(LVL_BIT_FLOW,
+ "Force reset ctx[%d]\n", ctx->str_index);
+ v4l2_vpu_send_cmd(ctx, ctx->str_index,
+ VID_API_CMD_STOP, 0, NULL);
+ } else {
+ ctx->wait_rst_done = false;
+ complete(&ctx->completion);
+ }
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] STR_BUF_RST\n", ctx->str_index);
+ }
+ break;
+ case VID_API_EVENT_RET_PING:
+ break;
+ case VID_API_EVENT_STR_FMT_CHANGE:
+ break;
+ case VID_API_EVENT_FINISHED: {
+ if (ctx->eos_stop_added == false)
+ vpu_err("warning: receive VID_API_EVENT_FINISHED before eos_stop_added set\n");
+ ctx->eos_stop_added = false;
+ if (ctx->firmware_finished == true)
+ vpu_err("warning: receive VID_API_EVENT_FINISHED when firmware_finished == true\n");
+ ctx->firmware_finished = true;
+ verify_decoded_frames(ctx);
+ vpu_dbg(LVL_BIT_FLOW, "ctx[%d] FINISHED\n", ctx->str_index);
+ vpu_dbg(LVL_INFO, "receive VID_API_EVENT_FINISHED and notfiy app eos\n");
+ clear_pic_end_flag(ctx);
+ vpu_log_buffer_state(ctx);
+ send_eos_event(ctx); //notfiy app stream eos reached
+ } break;
+ case VID_API_EVENT_FIRMWARE_XCPT: {
+ char *xcpt_info = (char*)event_data;
+
+ vpu_err("warning: VID_API_EVENT_FIRMWARE_XCPT,exception info: %s\n", xcpt_info);
+ ctx->hang_status = true;
+ send_eos_event(ctx);
+ }
+ break;
+ case VID_API_EVENT_DEC_CFG_INFO:
+ break;
+ case VID_API_EVENT_UNSUPPORTED_STREAM:
+ vpu_dbg(LVL_WARN, "warning: HW unsupprot the format or stream\n");
+ vpu_dec_event_decode_error(ctx);
+ break;
+ default:
+ vpu_err("warning: uEvent %d is not handled\n", uEvent);
+ break;
+ }
+ vpu_dbg(LVL_INFO, "leave %s, uEvent %d\n", __func__, uEvent);
+}
+
+static void release_vpu_ctx(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return;
+
+ remove_instance_file(ctx);
+ vpu_dec_cleanup_cmd(ctx);
+ release_queue_data(ctx);
+ free_decoder_buffer(ctx);
+ destroy_log_info_queue(ctx);
+ cleanup_perf_queue(ctx);
+
+ if (atomic64_read(&ctx->statistic.total_alloc_size) != 0)
+ vpu_err("error: memory leak for vpu kalloc buffer\n");
+ if (atomic64_read(&ctx->statistic.total_dma_size) != 0)
+ vpu_err("error: memory leak for vpu dma buffer\n");
+
+ mutex_destroy(&ctx->instance_mutex);
+ mutex_destroy(&ctx->cmd_lock);
+ mutex_destroy(&ctx->perf_lock);
+ clear_bit(ctx->str_index, &ctx->dev->instance_mask);
+ ctx->dev->ctx[ctx->str_index] = NULL;
+ pm_runtime_put_sync(ctx->dev->generic_dev);
+ kfree(ctx);
+}
+
+static int release_hang_instance(struct vpu_dev *dev)
+{
+ u_int32 i;
+
+ if (!dev)
+ return -EINVAL;
+
+ for (i = 0; i < VPU_MAX_NUM_STREAMS; i++)
+ if (dev->ctx[i]) {
+ release_vpu_ctx(dev->ctx[i]);
+ dev->ctx[i] = NULL;
+ }
+
+ return 0;
+}
+
+static int get_reset_index(struct vpu_dev *dev)
+{
+ int idx;
+
+ for (idx = 0; idx < VPU_MAX_NUM_STREAMS; idx++)
+ if (CHECK_BIT(dev->instance_mask, idx))
+ break;
+
+ return idx;
+}
+
+/*
+ * Add judge to find if it has available path to decode, if all
+ * path hang, reset vpu and then get one index
+ */
+static int vpu_next_free_instance(struct vpu_dev *dev)
+{
+ int idx;
+
+ if (dev->hang_mask == dev->instance_mask
+ && dev->instance_mask != 0) {
+ idx = get_reset_index(dev);
+ if (idx < 0 || idx >= VPU_MAX_NUM_STREAMS)
+ return -EBUSY;
+ else {
+ if (swreset_vpu_firmware(dev, idx))
+ return -EINVAL;
+ release_hang_instance(dev);
+ }
+ dev->hang_mask = 0;
+ dev->instance_mask = 0;
+ }
+
+ idx = ffz(dev->instance_mask);
+ if (idx < 0 || idx >= VPU_MAX_NUM_STREAMS)
+ return -EBUSY;
+
+ release_vpu_ctx(dev->ctx[idx]);
+
+ return idx;
+}
+
+static void send_msg_queue(struct vpu_ctx *ctx, struct event_msg *msg)
+{
+ u_int32 ret;
+
+ ret = kfifo_in(&ctx->msg_fifo, msg, sizeof(u_int32) * (MSG_WORD_LENGTH + msg->msgnum));
+ if (ret != sizeof(u_int32) * (MSG_WORD_LENGTH + msg->msgnum))
+ vpu_err("There is no memory for msg fifo, ret=%d\n", ret);
+}
+
+static bool receive_msg_queue(struct vpu_ctx *ctx, struct event_msg *msg)
+{
+ u_int32 ret;
+
+ if (kfifo_len(&ctx->msg_fifo) >= sizeof(u_int32) * MSG_WORD_LENGTH) {
+ ret = kfifo_out(&ctx->msg_fifo, msg, sizeof(u_int32) * MSG_WORD_LENGTH);
+ if (ret != sizeof(u_int32) * MSG_WORD_LENGTH) {
+ vpu_err("kfifo_out msg word has error, ret=%d\n", ret);
+ return false;
+ } else {
+ if (msg->msgnum > 0) {
+ if (kfifo_len(&ctx->msg_fifo) >= sizeof(u_int32) * msg->msgnum) {
+ ret = kfifo_out(&ctx->msg_fifo, msg->msgdata, sizeof(u_int32) * msg->msgnum);
+ if (ret != sizeof(u_int32) * msg->msgnum) {
+ vpu_err("kfifo_out msg data has error, ret=%d\n", ret);
+ return false;
+ } else
+ return true;
+ } else
+ return false;
+ } else
+ return true;
+ }
+ } else
+ return false;
+}
+
+extern u_int32 rpc_MediaIPFW_Video_message_check(struct shared_addr *This);
+static void vpu_receive_msg_event(struct vpu_dev *dev)
+{
+ struct event_msg msg;
+ struct shared_addr *This;
+ struct vpu_ctx *ctx;
+
+ This = &dev->shared_mem;
+ if (!This)
+ return;
+
+ memset(&msg, 0, sizeof(struct event_msg));
+ while (rpc_MediaIPFW_Video_message_check(This) == API_MSG_AVAILABLE) {
+ rpc_receive_msg_buf(This, &msg);
+ mutex_lock(&dev->dev_mutex);
+ ctx = dev->ctx[msg.idx];
+ if (ctx != NULL) {
+ if (!ctx->ctx_released) {
+ send_msg_queue(ctx, &msg);
+ queue_work(ctx->instance_wq, &ctx->instance_work);
+ }
+ }
+ mutex_unlock(&dev->dev_mutex);
+ }
+ if (rpc_MediaIPFW_Video_message_check(This) == API_MSG_BUFFER_ERROR)
+ vpu_err("error: message size is too big to handle\n");
+}
+
+static void vpu_handle_msg_data(struct vpu_dev *dev, u32 data)
+{
+ if (data == 0xaa) {
+ rpc_init_shared_memory(&dev->shared_mem,
+ vpu_dec_cpu_phy_to_mu(dev, dev->m0_rpc_phy),
+ dev->m0_rpc_virt,
+ dev->m0_rpc_size);
+ dev->print_buf = dev->m0_rpc_virt + M0_PRINT_OFFSET;
+ rpc_set_system_cfg_value(dev->shared_mem.pSharedInterface,
+ VPU_REG_BASE);
+
+ mutex_lock(&dev->cmd_mutex);
+ vpu_mu_send_msg(dev, RPC_BUF_OFFSET,
+ vpu_dec_cpu_phy_to_mu(dev, dev->m0_rpc_phy));
+ vpu_mu_send_msg(dev, BOOT_ADDRESS, dev->m0_p_fw_space_phy);
+ vpu_mu_send_msg(dev, INIT_DONE, 2);
+ mutex_unlock(&dev->cmd_mutex);
+ } else if (data == 0x55) {
+ dev->firmware_started = true;
+ complete(&dev->start_cmp);
+ } else if (data == 0xA5) {
+ /*receive snapshot done msg and wakeup complete to suspend*/
+ complete(&dev->snap_done_cmp);
+ } else {
+ vpu_receive_msg_event(dev);
+ }
+}
+
+static void vpu_msg_run_work(struct work_struct *work)
+{
+ struct vpu_dev *dev = container_of(work, struct vpu_dev, msg_work);
+ u32 data;
+
+ while (vpu_mu_receive_msg(dev, &data) >= sizeof(u_int32))
+ vpu_handle_msg_data(dev, data);
+}
+
+static void vpu_msg_instance_work(struct work_struct *work)
+{
+ struct vpu_ctx *ctx = container_of(work, struct vpu_ctx, instance_work);
+ struct event_msg msg;
+
+ if (!ctx)
+ return;
+
+ memset(&msg, 0, sizeof(struct event_msg));
+
+ while (receive_msg_queue(ctx, &msg)) {
+ vpu_api_event_handler(ctx, msg.idx, msg.msgid, msg.msgdata);
+ memset(&msg, 0, sizeof(struct event_msg));
+ }
+}
+
+static int vpu_queue_setup(struct vb2_queue *vq,
+ unsigned int *buf_count,
+ unsigned int *plane_count,
+ unsigned int psize[],
+ struct device *allocators[])
+{
+ struct queue_data *This = (struct queue_data *)vq->drv_priv;
+ struct vpu_ctx *ctx = NULL;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s() is called\n", __func__);
+
+ ctx = container_of(This, struct vpu_ctx, q_data[This->type]);
+ if ((vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) ||
+ (vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ ) {
+ if (vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
+ *plane_count = 2;
+ psize[0] = This->sizeimage[0];//check alignment
+ psize[1] = This->sizeimage[1];//check colocated_size
+ } else {
+ psize[0] = This->sizeimage[0] + This->sizeimage[1];
+ *plane_count = 1;
+ }
+ } else {
+ *plane_count = 1;
+ psize[0] = This->sizeimage[0];
+ }
+
+ if (!V4L2_TYPE_IS_OUTPUT(vq->type))
+ ctx->seek_flag = false;
+
+ return 0;
+}
+
+static int vpu_buf_init(struct vb2_buffer *vb)
+{
+ struct vb2_queue *vq = vb->vb2_queue;
+ struct queue_data *queue = (struct queue_data *)vq->drv_priv;
+ struct vb2_data_req *p_data_req;
+
+ p_data_req = &queue->vb2_reqs[vb->index];
+ p_data_req->vb2_buf = vb;
+ p_data_req->id = vb->index;
+ set_data_req_status(p_data_req, FRAME_ALLOC);
+
+ return 0;
+}
+
+static void vpu_buf_cleanup(struct vb2_buffer *vb)
+{
+ struct vb2_queue *vq = vb->vb2_queue;
+ struct queue_data *queue = (struct queue_data *)vq->drv_priv;
+ struct vb2_data_req *p_data_req;
+
+ p_data_req = &queue->vb2_reqs[vb->index];
+ p_data_req->vb2_buf = NULL;
+}
+
+static int vpu_buf_prepare(struct vb2_buffer *vb)
+{
+ vpu_dbg(LVL_BIT_FUNC, "%s() is called\n", __func__);
+
+ return 0;
+}
+
+
+static int vpu_start_streaming(struct vb2_queue *q,
+ unsigned int count
+ )
+{
+ int ret = 0;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s() is called\n", __func__);
+
+ return ret;
+}
+
+
+static void vpu_stop_streaming(struct vb2_queue *q)
+{
+ struct queue_data *queue = (struct queue_data *)q->drv_priv;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s() is called\n", __func__);
+ clear_queue(queue);
+}
+
+static void vpu_buf_queue(struct vb2_buffer *vb)
+{
+ struct vb2_queue *vq = vb->vb2_queue;
+ struct queue_data *This = (struct queue_data *)vq->drv_priv;
+ struct vb2_data_req *data_req;
+ u_int32 *pphy_address_0, *pphy_address_1;
+ struct vpu_ctx *ctx = NULL;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s() is called\n", __func__);
+
+ vpu_dbg(LVL_BIT_FUNC, "%s(), vq->type=%d, vb->index=%d\n",
+ __func__, vq->type, vb->index);
+
+ ctx = container_of(This, struct vpu_ctx, q_data[This->type]);
+ data_req = &This->vb2_reqs[vb->index];
+ if (vq->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
+ pphy_address_0 = (u_int32 *)vb2_plane_cookie(vb, 0);
+ pphy_address_1 = (u_int32 *)vb2_plane_cookie(vb, 1);
+ if (pphy_address_0 == NULL || pphy_address_1 == NULL) {
+ vpu_dbg(LVL_WARN, "%s() warning: pphy_address == NULL\n",
+ __func__);
+ return;
+ }
+ data_req->phy_addr[0] = *pphy_address_0;
+ data_req->phy_addr[1] = *pphy_address_1;
+ }
+
+ add_buffer_to_queue(This, data_req);
+
+ if (V4L2_TYPE_IS_OUTPUT(vq->type)) {
+ if (!vpu_dec_is_active(ctx))
+ activate_vpu_dec(ctx);
+ precheck_vb_data(ctx, vb);
+ enqueue_stream_data(ctx, 0);
+ } else {
+ respond_req_frame(ctx, This, false);
+ }
+
+ This->qbuf_count++;
+}
+
+static void vpu_prepare(struct vb2_queue *q)
+{
+ vpu_dbg(LVL_BIT_FUNC, "%s() is called\n", __func__);
+}
+
+static void vpu_finish(struct vb2_queue *q)
+{
+ vpu_dbg(LVL_BIT_FUNC, "%s() is called\n", __func__);
+}
+
+struct vb2_ops v4l2_qops = {
+ .queue_setup = vpu_queue_setup,
+ .wait_prepare = vpu_prepare,
+ .wait_finish = vpu_finish,
+ .buf_init = vpu_buf_init,
+ .buf_cleanup = vpu_buf_cleanup,
+ .buf_prepare = vpu_buf_prepare,
+ .start_streaming = vpu_start_streaming,
+ .stop_streaming = vpu_stop_streaming,
+ .buf_queue = vpu_buf_queue,
+};
+
+static void init_vb2_queue(struct queue_data *This, unsigned int type, struct vpu_ctx *ctx)
+{
+ struct vb2_queue *vb2_q = &This->vb2_q;
+ int ret;
+ u_int32 i;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ for (i = 0; i < VPU_MAX_BUFFER; i++)
+ This->vb2_reqs[i].status = 0;
+ // initialze driver queue
+ INIT_LIST_HEAD(&This->drv_q);
+ // initialize vb2 queue
+ vb2_q->type = type;
+ vb2_q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
+ vb2_q->gfp_flags = GFP_KERNEL | GFP_DMA32 | __GFP_NOWARN;
+ vb2_q->ops = &v4l2_qops;
+ vb2_q->drv_priv = This;
+ vb2_q->mem_ops = (struct vb2_mem_ops *)&vb2_dma_contig_memops;
+ vb2_q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
+ vb2_q->dev = &ctx->dev->plat_dev->dev;
+ ret = vb2_queue_init(vb2_q);
+ if (ret)
+ vpu_err("error: %s vb2_queue_init() failed (%d)!\n",
+ __func__, ret);
+ else
+ This->vb2_q_inited = true;
+}
+
+static void init_queue_data(struct vpu_ctx *ctx)
+{
+ init_vb2_queue(&ctx->q_data[V4L2_SRC], V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, ctx);
+ ctx->q_data[V4L2_SRC].type = V4L2_SRC;
+ ctx->q_data[V4L2_SRC].ctx = ctx;
+ sema_init(&ctx->q_data[V4L2_SRC].drv_q_lock, 1);
+ init_vb2_queue(&ctx->q_data[V4L2_DST], V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, ctx);
+ ctx->q_data[V4L2_DST].type = V4L2_DST;
+ ctx->q_data[V4L2_DST].ctx = ctx;
+ sema_init(&ctx->q_data[V4L2_DST].drv_q_lock, 1);
+}
+
+static void release_queue_data(struct vpu_ctx *ctx)
+{
+ vpu_dec_queue_release(&ctx->q_data[V4L2_SRC]);
+ vpu_dec_queue_release(&ctx->q_data[V4L2_DST]);
+}
+
+static void enable_csr_reg(struct vpu_dev *This)
+{
+ writel(This->m0_p_fw_space_phy, This->csr_base + CSR_CM0Px_ADDR_OFFSET);
+ writel(0x0, This->csr_base + CSR_CM0Px_CPUWAIT);
+}
+
+static void cleanup_firmware_memory(struct vpu_dev *vpudev)
+{
+ if (!vpudev->need_cleanup_firmware)
+ return;
+ memset_io(vpudev->m0_p_fw_space_vir, 0, vpudev->m0_boot_size);
+ vpudev->need_cleanup_firmware = false;
+}
+
+static int vpu_firmware_download(struct vpu_dev *This)
+{
+ unsigned char *image;
+ unsigned int FW_Size = 0;
+ int ret = 0;
+ char *p = This->m0_p_fw_space_vir;
+
+ This->firmware_started = false;
+ ret = request_firmware((const struct firmware **)&This->m0_pfw,
+ M0FW_FILENAME,
+ This->generic_dev
+ );
+
+ if (ret || !This->m0_pfw) {
+ vpu_err("error: %s() request fw %s failed(%d)\n",
+ __func__, M0FW_FILENAME, ret);
+
+ if (This->m0_pfw) {
+ release_firmware(This->m0_pfw);
+ This->m0_pfw = NULL;
+ }
+
+ return ret;
+ }
+
+ vpu_dbg(LVL_INFO, "%s() request fw %s got size(%d)\n",
+ __func__, M0FW_FILENAME, (int)This->m0_pfw->size);
+ image = (uint8_t *)This->m0_pfw->data;
+ FW_Size = This->m0_pfw->size;
+
+ cleanup_firmware_memory(This);
+ memcpy(This->m0_p_fw_space_vir, image, FW_Size);
+
+ p[16] = This->plat_type;
+ p[18] = 1;
+ enable_csr_reg(This);
+ This->need_cleanup_firmware = true;
+
+ release_firmware(This->m0_pfw);
+ This->m0_pfw = NULL;
+
+ return ret;
+}
+
+static int dbglog_show(struct seq_file *s, void *data)
+{
+#define DBG_UNIT_SIZE (7)
+ struct vpu_dev *dev = s->private;
+ u_int32 *pbuf;
+ u_int32 line;
+ int length;
+
+ pbuf = (u_int32 *)dev->shared_mem.dbglog_mem_vir;
+ line = (DBGLOG_SIZE) / (DBG_UNIT_SIZE * sizeof(u_int32));
+ if (!line)
+ return 0;
+
+ if (!vpu_frmdbg_raw) {
+ u_int32 i;
+
+ length = 9 * DBG_UNIT_SIZE * line + 1;
+ if (s->count + length >= s->size) {
+ s->count = s->size;
+ return 0;
+ }
+ for (i = 0; i < line; i++) {
+ seq_printf(s, "%08x %08x %08x %08x %08x %08x %08x\n",
+ pbuf[0], pbuf[1], pbuf[2], pbuf[3],
+ pbuf[4], pbuf[5], pbuf[6]);
+ pbuf += DBG_UNIT_SIZE;
+ }
+
+ return 0;
+ }
+
+ length = DBG_UNIT_SIZE * sizeof(u_int32) * line;
+ if (s->count + length >= s->size) {
+ s->count = s->size;
+ return 0;
+ }
+
+ return seq_write(s, (void *)pbuf, length);
+}
+
+static int dbglog_open(struct inode *inode, struct file *filp)
+{
+ return single_open(filp, dbglog_show, inode->i_private);
+}
+
+static struct file_operations dbglog_fops = {
+ .owner = THIS_MODULE,
+ .open = dbglog_open,
+ .release = single_release,
+ .read = seq_read,
+};
+
+static int create_dbglog_file(struct vpu_dev *dev)
+{
+ if (dev->debugfs_root == NULL) {
+ dev->debugfs_root = debugfs_create_dir("vpu", NULL);
+ if (!dev->debugfs_root) {
+ vpu_err("error: create debugfs_root fail\n");
+ return -EINVAL;
+ }
+ }
+
+ if (dev->debugfs_dbglog)
+ return 0;
+
+ dev->debugfs_dbglog = debugfs_create_file("dbglog",
+ VERIFY_OCTAL_PERMISSIONS(0444),
+ dev->debugfs_root,
+ dev,
+ &dbglog_fops);
+ if (!dev->debugfs_dbglog) {
+ vpu_err("error: create debugfs_dbglog fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int fwlog_show(struct seq_file *s, void *data)
+{
+ struct vpu_dev *dev = s->private;
+ int length;
+ u32 rptr;
+ u32 wptr;
+ int ret = 0;
+
+ if (!dev->print_buf)
+ return 0;
+
+ rptr = dev->print_buf->read;
+ wptr = dev->print_buf->write;
+
+ if (rptr == wptr)
+ return 0;
+ else if (rptr < wptr)
+ length = wptr - rptr;
+ else
+ length = dev->print_buf->bytes + wptr - rptr;
+
+ if (s->count + length >= s->size) {
+ s->count = s->size;
+ return 0;
+ }
+
+ if (rptr + length > dev->print_buf->bytes) {
+ int num = dev->print_buf->bytes - rptr;
+
+ if (seq_write(s, dev->print_buf->buffer + rptr, num))
+ ret = -1;
+ length -= num;
+ rptr = 0;
+ }
+ if (seq_write(s, dev->print_buf->buffer + rptr, length))
+ ret = -1;
+ rptr += length;
+ rptr %= dev->print_buf->bytes;
+ if (!ret)
+ dev->print_buf->read = rptr;
+
+ return 0;
+}
+
+static int fwlog_open(struct inode *inode, struct file *filp)
+{
+ return single_open(filp, fwlog_show, inode->i_private);
+}
+
+static const struct file_operations fwlog_fops = {
+ .owner = THIS_MODULE,
+ .open = fwlog_open,
+ .release = single_release,
+ .read = seq_read,
+};
+
+static int create_fwlog_file(struct vpu_dev *dev)
+{
+ if (dev->debugfs_root == NULL) {
+ dev->debugfs_root = debugfs_create_dir("vpu", NULL);
+ if (!dev->debugfs_root) {
+ vpu_err("error: create debugfs_root fail\n");
+ return -EINVAL;
+ }
+ }
+
+ if (dev->debugfs_fwlog)
+ return 0;
+ dev->debugfs_fwlog = debugfs_create_file("vpu_malone_log",
+ VERIFY_OCTAL_PERMISSIONS(0444),
+ dev->debugfs_root,
+ dev,
+ &fwlog_fops);
+ if (!dev->debugfs_fwlog) {
+ vpu_err("error: create debugfs_fwlog fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+
+static ssize_t show_instance_command_info(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_ctx *ctx;
+ struct vpu_statistic *statistic;
+ int i, size, num = 0;
+
+ ctx = container_of(attr, struct vpu_ctx, dev_attr_instance_command);
+ statistic = &ctx->statistic;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "command number:\n");
+ for (i = VID_API_CMD_NULL; i < VID_API_CMD_YUV_READY + 1; i++) {
+ size = scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s(%2d):%16ld\n",
+ cmd2str[i], i, statistic->cmd[i]);
+ num += size;
+ }
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "\t%40s :%16ld\n",
+ "UNKNOWN COMMAND", statistic->cmd[VID_API_CMD_YUV_READY + 1]);
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "current command:\n");
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "%10s:%40s;%10ld.%06ld\n", "command",
+ get_cmd_str(statistic->current_cmd),
+ statistic->ts_cmd.tv_sec,
+ statistic->ts_cmd.tv_nsec / 1000);
+
+ if (ctx->pending)
+ num += scnprintf(buf + num, PAGE_SIZE - num, "pending\n");
+
+ return num;
+}
+
+static ssize_t show_instance_event_info(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_ctx *ctx;
+ struct vpu_statistic *statistic;
+ int i, size, num = 0;
+
+ ctx = container_of(attr, struct vpu_ctx, dev_attr_instance_event);
+ statistic = &ctx->statistic;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "event number:\n");
+ for (i = VID_API_EVENT_NULL; i < VID_API_EVENT_DEC_CFG_INFO + 1; i++) {
+ size = scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s(%2d):%16ld\n",
+ event2str[i], i, statistic->event[i]);
+ num += size;
+ }
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "\t%40s :%16ld\n",
+ "UNKNOWN EVENT",
+ statistic->event[VID_API_EVENT_DEC_CFG_INFO + 1]);
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "current event:\n");
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "%10s:%40s;%10ld.%06ld\n", "event",
+ get_event_str(statistic->current_event),
+ statistic->ts_event.tv_sec,
+ statistic->ts_event.tv_nsec / 1000);
+
+ return num;
+}
+
+static ssize_t show_instance_buffer_info(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_ctx *ctx;
+ struct vpu_statistic *statistic;
+ struct vb2_data_req *p_data_req;
+ struct queue_data *This;
+ pSTREAM_BUFFER_DESCRIPTOR_TYPE pStrBufDesc;
+ u_int32 stream_length = 0;
+ int i, size, num = 0;
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ pBUFFER_INFO_TYPE buffer_info;
+
+ ctx = container_of(attr, struct vpu_ctx, dev_attr_instance_buffer);
+ statistic = &ctx->statistic;
+ pSharedInterface = ctx->dev->shared_mem.pSharedInterface;
+ buffer_info = &pSharedInterface->StreamBuffInfo[ctx->str_index];
+
+ This = &ctx->q_data[V4L2_SRC];
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "output buffer status(%d):\n", This->vb2_q.num_buffers);
+ for (i = 0; i < This->vb2_q.num_buffers; i++) {
+ p_data_req = &This->vb2_reqs[i];
+ if (!p_data_req->vb2_buf)
+ continue;
+ if (!p_data_req->queued)
+ continue;
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s(%2d):queued\n",
+ "buffer", i);
+ }
+
+ This = &ctx->q_data[V4L2_DST];
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "frame buffer status(%d):\n", This->vb2_q.num_buffers);
+ for (i = 0; i < VPU_MAX_BUFFER; i++) {
+ p_data_req = &This->vb2_reqs[i];
+ if (p_data_req->vb2_buf != NULL) {
+ size = scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s(%2d):%16s:%d\n",
+ "buffer",
+ i,
+ bufstat[p_data_req->status],
+ p_data_req->vb2_buf->state);
+ num += size;
+ }
+ }
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "stream buffer status:\n");
+
+ pStrBufDesc = get_str_buffer_desc(ctx);
+
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16x\n", "wptr", pStrBufDesc->wptr);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16x\n", "rptr", pStrBufDesc->rptr);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16x\n", "start", pStrBufDesc->start);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16x\n", "end", pStrBufDesc->end);
+ if (ctx->stream_buffer.dma_size)
+ stream_length = got_used_space(pStrBufDesc->wptr,
+ pStrBufDesc->rptr,
+ pStrBufDesc->start,
+ pStrBufDesc->end);
+
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d / %16d\n", "stream length",
+ stream_length,
+ ctx->stream_buffer.dma_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "decode delay frame",
+ ctx->frm_dec_delay);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "display delay frame",
+ ctx->frm_dis_delay);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "total frame number",
+ ctx->frm_total_num);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "timestamp delay frame",
+ getTSManagerPreBufferCnt(ctx->tsm));
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16lld\n", "timestamp threshold(ms)",
+ ctx->ts_threshold);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%6lld,%09lld\n", "output timestamp(ns)",
+ ctx->output_ts / NSEC_PER_SEC,
+ ctx->output_ts % NSEC_PER_SEC);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%6lld,%09lld\n", "capture timestamp(ns)",
+ ctx->capture_ts / NSEC_PER_SEC,
+ ctx->capture_ts % NSEC_PER_SEC);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "bitstream low threshold",
+ ctx->bs_l_threshold);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "bitstream high threshold",
+ ctx->bs_h_threshold);
+
+ This = &ctx->q_data[V4L2_SRC];
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16ld\n", "output qbuf count",
+ This->qbuf_count);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16ld\n", "output dqbuf count",
+ This->dqbuf_count);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16ld\n", "output write count",
+ This->process_count);
+
+ This = &ctx->q_data[V4L2_DST];
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16ld\n", "capture qbuf count",
+ This->qbuf_count);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16ld\n", "capture dqbuf count",
+ This->dqbuf_count);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16x\n", "beginning",
+ ctx->beginning);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "request frame count",
+ ctx->req_frame_count);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%12s%c%c%c%c\n",
+ "output pixel format", "",
+ ctx->q_data[V4L2_SRC].fourcc & 0xff,
+ (ctx->q_data[V4L2_SRC].fourcc >> 8) & 0xff,
+ (ctx->q_data[V4L2_SRC].fourcc >> 16) & 0xff,
+ (ctx->q_data[V4L2_SRC].fourcc >> 24) & 0xff);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%12s%c%c%c%c\n",
+ "capture pixel format", "",
+ ctx->q_data[V4L2_DST].fourcc & 0xff,
+ (ctx->q_data[V4L2_DST].fourcc >> 8) & 0xff,
+ (ctx->q_data[V4L2_DST].fourcc >> 16) & 0xff,
+ (ctx->q_data[V4L2_DST].fourcc >> 24) & 0xff);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%13d(%d)\n", "output status",
+ ctx->q_data[V4L2_SRC].enable,
+ vb2_is_streaming(&ctx->q_data[V4L2_SRC].vb2_q));
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%13d(%d)\n", "capture status",
+ ctx->q_data[V4L2_DST].enable,
+ vb2_is_streaming(&ctx->q_data[V4L2_DST].vb2_q));
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s: %dx%d(%dx%d), %d(DPB), %d(Ref), %d(DFE)\n",
+ "seqinfo",
+ ctx->seqinfo.uHorRes,
+ ctx->seqinfo.uVerRes,
+ ctx->seqinfo.uHorDecodeRes,
+ ctx->seqinfo.uVerDecodeRes,
+ ctx->seqinfo.uNumDPBFrms,
+ ctx->seqinfo.uNumRefFrms,
+ ctx->seqinfo.uNumDFEAreas);
+
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "stream_pic_input_count",
+ buffer_info->stream_pic_input_count);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "stream_pic_parsed_count",
+ buffer_info->stream_pic_parsed_count);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "stream_pic_end_flag",
+ buffer_info->stream_pic_end_flag);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "stream_input_mode",
+ buffer_info->stream_input_mode);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "stream_buffer_threshold",
+ buffer_info->stream_buffer_threshold);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "start_code_bypass",
+ ctx->start_code_bypass);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "res change occur",
+ ctx->res_change_occu_count);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "res change send",
+ ctx->res_change_send_count);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%40s:%16d\n", "res change done",
+ ctx->res_change_done_count);
+
+ return num;
+}
+
+static ssize_t show_instance_log_info(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_ctx *ctx;
+ struct vpu_statistic *statistic;
+ struct vpu_log_info *vpu_info;
+ struct vpu_log_info *tem_info;
+ int num = 0;
+
+ ctx = container_of(attr, struct vpu_ctx, dev_attr_instance_flow);
+ statistic = &ctx->statistic;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "log info under depth: %d\n",
+ vpu_log_depth);
+
+ mutex_lock(&ctx->instance_mutex);
+ if (list_empty(&ctx->log_q))
+ goto exit;
+
+ list_for_each_entry_safe(vpu_info, tem_info, &ctx->log_q, list) {
+ switch (vpu_info->type) {
+ case LOG_EVENT:
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%20s:%40s %20s:%20x\n", "event", get_event_str(vpu_info->log_info[vpu_info->type]),
+ "rptr", vpu_info->data);
+ break;
+ case LOG_COMMAND:
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%20s:%40s\n", "command", get_cmd_str(vpu_info->log_info[vpu_info->type]));
+ break;
+ case LOG_EOS:
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%20s:%40s\n", "add eos", "done");
+ break;
+ case LOG_PADDING:
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%20s:%40s\n", "add padding", "done");
+ break;
+ case LOG_UPDATE_STREAM:
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t%20s:%40s %16d\n", "update stream data", "stream size", vpu_info->data);
+ break;
+ default:
+ break;
+ }
+ }
+
+exit:
+ mutex_unlock(&ctx->instance_mutex);
+ return num;
+}
+
+static ssize_t show_instance_perf_info(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_ctx *ctx;
+ struct vpu_statistic *statistic;
+ int num = 0;
+ u_int64 start_time = 0;
+ u_int64 prev_time = 0;
+ u_int64 interv = 0;
+ u_int64 total = 0;
+ struct vpu_dec_perf_queue *perf;
+ struct vpu_dec_perf_queue *tmp;
+ int i = 0;
+
+ ctx = container_of(attr, struct vpu_ctx, dev_attr_instance_perf);
+ statistic = &ctx->statistic;
+
+ if (!vpu_show_perf_ena)
+ return num;
+ if (!(vpu_show_perf_idx & (1<<ctx->str_index)))
+ return num;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "beginning:\n");
+ num += scnprintf(
+ buf + num, PAGE_SIZE - num,
+ "unit: ms \t\t time-point \t interval total\n");
+
+ mutex_lock(&ctx->perf_lock);
+ list_for_each_entry_safe(perf, tmp, &ctx->perf_q, list) {
+ if (i == 0) {
+ start_time = perf->time;
+ prev_time = perf->time;
+ }
+
+ interv = perf->time - prev_time;
+ total = perf->time - start_time;
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "%40s: %8ld %8ld\n", perf->str, interv, total);
+ prev_time = perf->time;
+
+ if (++i > 50) {
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "Too many initialization steps, omitting the following\n");
+ break;
+ }
+ }
+ mutex_unlock(&ctx->perf_lock);
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "decoded:\n");
+ num += scnprintf(buf + num, PAGE_SIZE - num, "\t count: %8ld \t fps: %8ld\n",
+ ctx->statistic.event[VID_API_EVENT_PIC_DECODED],
+ ctx->perf_time.decoded_fps);
+ num += scnprintf(buf + num, PAGE_SIZE - num, "ready:\n");
+ num += scnprintf(buf + num, PAGE_SIZE - num, "\t count: %8ld \t fps: %8ld\n",
+ ctx->statistic.event[VID_API_EVENT_FRAME_BUFF_RDY],
+ ctx->perf_time.ready_fps);
+
+ return num;
+}
+
+static ssize_t precheck_pattern_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_dev *vdev = dev_get_drvdata(dev);
+ int num = 0;
+
+ if (vdev->precheck_num)
+ num = scnprintf(buf, PAGE_SIZE, "%s\n", vdev->precheck_content);
+
+ return num;
+}
+
+static ssize_t precheck_pattern_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ struct vpu_dev *vdev = dev_get_drvdata(dev);
+ long val;
+ int num = 0;
+ int bytes = 0;
+ const char *delim = " ,;";
+ char strbuf[1024];
+ char *token;
+ char *cur;
+
+ strncpy(strbuf, buf, sizeof(strbuf));
+ cur = strbuf;
+ while ((token = strsep(&cur, delim))) {
+ if (!strlen(token))
+ continue;
+ if (kstrtol((const char *)token, 0, &val))
+ continue;
+ vdev->precheck_pattern[num] = val;
+ bytes += scnprintf(vdev->precheck_content + bytes,
+ sizeof(vdev->precheck_content) - bytes,
+ "%s0x%02x",
+ num ? " " : "",
+ vdev->precheck_pattern[num]);
+ num++;
+ if (num >= ARRAY_SIZE(vdev->precheck_pattern))
+ break;
+ }
+ get_kmp_next(vdev->precheck_pattern, vdev->precheck_next, num);
+ if (num >= 3)
+ vdev->precheck_num = num;
+ else
+ vdev->precheck_num = 0;
+
+ return count;
+}
+DEVICE_ATTR_RW(precheck_pattern);
+
+static int create_instance_command_file(struct vpu_ctx *ctx)
+{
+ scnprintf(ctx->command_name, sizeof(ctx->command_name) - 1,
+ "instance%d_command",
+ ctx->str_index);
+ sysfs_attr_init(&ctx->dev_attr_instance_command.attr);
+ ctx->dev_attr_instance_command.attr.name = ctx->command_name;
+ ctx->dev_attr_instance_command.attr.mode = VERIFY_OCTAL_PERMISSIONS(0444);
+ ctx->dev_attr_instance_command.show = show_instance_command_info;
+
+ device_create_file(ctx->dev->generic_dev, &ctx->dev_attr_instance_command);
+
+ return 0;
+}
+
+static int create_instance_event_file(struct vpu_ctx *ctx)
+{
+ scnprintf(ctx->event_name, sizeof(ctx->event_name) - 1,
+ "instance%d_event",
+ ctx->str_index);
+ sysfs_attr_init(&ctx->dev_attr_instance_event.attr);
+ ctx->dev_attr_instance_event.attr.name = ctx->event_name;
+ ctx->dev_attr_instance_event.attr.mode = VERIFY_OCTAL_PERMISSIONS(0444);
+ ctx->dev_attr_instance_event.show = show_instance_event_info;
+
+ device_create_file(ctx->dev->generic_dev, &ctx->dev_attr_instance_event);
+
+ return 0;
+}
+
+static int create_instance_buffer_file(struct vpu_ctx *ctx)
+{
+ scnprintf(ctx->buffer_name, sizeof(ctx->buffer_name) - 1,
+ "instance%d_buffer",
+ ctx->str_index);
+ sysfs_attr_init(&ctx->dev_attr_instance_buffer.attr);
+ ctx->dev_attr_instance_buffer.attr.name = ctx->buffer_name;
+ ctx->dev_attr_instance_buffer.attr.mode = VERIFY_OCTAL_PERMISSIONS(0444);
+ ctx->dev_attr_instance_buffer.show = show_instance_buffer_info;
+
+ device_create_file(ctx->dev->generic_dev, &ctx->dev_attr_instance_buffer);
+
+ return 0;
+}
+
+static int create_instance_flow_file(struct vpu_ctx *ctx)
+{
+ scnprintf(ctx->flow_name, sizeof(ctx->flow_name) - 1,
+ "instance%d_flow",
+ ctx->str_index);
+ sysfs_attr_init(&ctx->dev_attr_instance_flow.attr);
+ ctx->dev_attr_instance_flow.attr.name = ctx->flow_name;
+ ctx->dev_attr_instance_flow.attr.mode = VERIFY_OCTAL_PERMISSIONS(0444);
+ ctx->dev_attr_instance_flow.show = show_instance_log_info;
+
+ device_create_file(ctx->dev->generic_dev, &ctx->dev_attr_instance_flow);
+
+ return 0;
+}
+
+static int create_instance_perf_file(struct vpu_ctx *ctx)
+{
+ scnprintf(ctx->perf_name, sizeof(ctx->perf_name) - 1,
+ "instance%d_perf",
+ ctx->str_index);
+ sysfs_attr_init(&ctx->dev_attr_instance_perf.attr);
+ ctx->dev_attr_instance_perf.attr.name = ctx->perf_name;
+ ctx->dev_attr_instance_perf.attr.mode = VERIFY_OCTAL_PERMISSIONS(0444);
+ ctx->dev_attr_instance_perf.show = show_instance_perf_info;
+
+ device_create_file(ctx->dev->generic_dev, &ctx->dev_attr_instance_perf);
+
+ return 0;
+}
+
+static int create_instance_file(struct vpu_ctx *ctx)
+{
+ if (!ctx || !ctx->dev || !ctx->dev->generic_dev)
+ return -EINVAL;
+
+ create_instance_command_file(ctx);
+ create_instance_event_file(ctx);
+ create_instance_buffer_file(ctx);
+ create_instance_flow_file(ctx);
+ create_instance_perf_file(ctx);
+ atomic64_set(&ctx->statistic.total_dma_size, 0);
+ atomic64_set(&ctx->statistic.total_alloc_size, 0);
+
+ return 0;
+}
+
+static int remove_instance_file(struct vpu_ctx *ctx)
+{
+ if (!ctx || !ctx->dev || !ctx->dev->generic_dev)
+ return -EINVAL;
+
+ device_remove_file(ctx->dev->generic_dev, &ctx->dev_attr_instance_command);
+ device_remove_file(ctx->dev->generic_dev, &ctx->dev_attr_instance_event);
+ device_remove_file(ctx->dev->generic_dev, &ctx->dev_attr_instance_buffer);
+ device_remove_file(ctx->dev->generic_dev, &ctx->dev_attr_instance_flow);
+ device_remove_file(ctx->dev->generic_dev, &ctx->dev_attr_instance_perf);
+
+ return 0;
+}
+
+static int init_vpu_buffer(struct vpu_ctx *ctx)
+{
+ u_int32 i;
+
+ if (!ctx)
+ return -EINVAL;
+
+ for (i = 0; i < MAX_DCP_NUM; i++)
+ init_dma_buffer(&ctx->dcp_buffer[i]);
+ ctx->dcp_count = 0;
+ for (i = 0; i < MAX_MBI_NUM; i++)
+ init_dma_buffer(&ctx->mbi_buffer[i]);
+ ctx->mbi_count = 0;
+ ctx->mbi_size = 0;
+ init_dma_buffer(&ctx->stream_buffer);
+ init_dma_buffer(&ctx->udata_buffer);
+
+ return 0;
+}
+
+static int alloc_vpu_buffer(struct vpu_ctx *ctx)
+{
+ u_int32 ret = 0;
+
+ if (!ctx)
+ return -EINVAL;
+
+ if (!ctx->stream_buffer.dma_phy) {
+ ctx->stream_buffer.dma_size = vpu_max_bufsize;
+ ret = alloc_dma_buffer(ctx, &ctx->stream_buffer);
+ if (ret) {
+ vpu_err("error: alloc stream buffer fail!\n");
+ return ret;
+ }
+ }
+
+ if (!ctx->udata_buffer.dma_phy) {
+ ctx->udata_buffer.dma_size = UDATA_BUFFER_SIZE;
+ ret = alloc_dma_buffer(ctx, &ctx->udata_buffer);
+ if (ret) {
+ vpu_err("error: alloc udata buffer fail!\n");
+ free_dma_buffer(ctx, &ctx->stream_buffer);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+static int open_crc_file(struct vpu_ctx *ctx)
+{
+ char crc_file[64];
+ int ret = 0;
+
+ if (!ctx)
+ return -EINVAL;
+
+ scnprintf(crc_file, sizeof(crc_file) - 1,
+ "/data/instance%d_crc.txt",
+ ctx->str_index);
+ ctx->crc_fp = filp_open(crc_file, O_RDWR | O_CREAT | O_TRUNC, 0644);
+ if (IS_ERR(ctx->crc_fp)) {
+ vpu_err("error: open crc file fail\n");
+ ret = -1;
+ }
+ ctx->pos = 0;
+
+ return ret;
+}
+
+static int close_crc_file(struct vpu_ctx *ctx)
+{
+ int ret = 0;
+
+ if (!ctx)
+ return -EINVAL;
+
+ if (!IS_ERR(ctx->crc_fp))
+ ret = filp_close(ctx->crc_fp, NULL);
+ ctx->pos = 0;
+
+ return ret;
+}
+
+static bool vpu_dec_is_active(struct vpu_ctx *ctx)
+{
+ bool status = true;
+
+ if (!ctx)
+ return false;
+ if (ctx->firmware_stopped)
+ return false;
+ mutex_lock(&ctx->cmd_lock);
+ if (ctx->pending && ctx->pending->request == VID_API_CMD_STOP)
+ status = false;
+ mutex_unlock(&ctx->cmd_lock);
+
+ return status;
+}
+
+static int v4l2_open(struct file *filp)
+{
+ struct video_device *vdev = video_devdata(filp);
+ struct vpu_dev *dev = video_get_drvdata(vdev);
+ struct vpu_ctx *ctx = NULL;
+ int idx;
+ int ret = 0;
+
+ pm_runtime_get_sync(dev->generic_dev);
+ ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+ if (!ctx) {
+ pm_runtime_put_sync(dev->generic_dev);
+ return -ENOMEM;
+ }
+ mutex_lock(&dev->dev_mutex);
+ idx = vpu_next_free_instance(dev);
+ if (idx < 0) {
+ ret = idx;
+ mutex_unlock(&dev->dev_mutex);
+ goto err_find_index;
+ }
+ set_bit(idx, &dev->instance_mask);
+ mutex_unlock(&dev->dev_mutex);
+ init_completion(&ctx->completion);
+ init_completion(&ctx->stop_cmp);
+ init_completion(&ctx->eos_cmp);
+
+ v4l2_fh_init(&ctx->fh, video_devdata(filp));
+ filp->private_data = &ctx->fh;
+ v4l2_fh_add(&ctx->fh);
+
+ ctx->ctrl_inited = false;
+ ctrls_setup_decoder(ctx);
+ ctx->fh.ctrl_handler = &ctx->ctrl_handler;
+
+ ctx->instance_wq = alloc_workqueue("vpu_instance", WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
+ if (!ctx->instance_wq) {
+ vpu_err("error: %s unable to alloc workqueue for ctx\n", __func__);
+ ret = -ENOMEM;
+ goto err_alloc_wq;
+ }
+ INIT_WORK(&ctx->instance_work, vpu_msg_instance_work);
+
+ mutex_init(&ctx->instance_mutex);
+ mutex_init(&ctx->cmd_lock);
+ mutex_init(&ctx->perf_lock);
+ if (kfifo_alloc(&ctx->msg_fifo,
+ sizeof(struct event_msg) * VID_API_MESSAGE_LIMIT,
+ GFP_KERNEL)) {
+ vpu_err("fail to alloc fifo when open\n");
+ ret = -ENOMEM;
+ goto err_alloc_fifo;
+ }
+ ctx->dev = dev;
+ ctx->str_index = idx;
+ dev->ctx[idx] = ctx;
+ ctx->b_firstseq = true;
+ ctx->wait_rst_done = false;
+ ctx->wait_res_change_done = false;
+ ctx->firmware_stopped = true;
+ ctx->firmware_finished = false;
+ ctx->frame_decoded = false;
+ ctx->eos_stop_received = false;
+ ctx->eos_stop_added = false;
+ ctx->ctx_released = false;
+ ctx->b_dis_reorder = false;
+ ctx->start_code_bypass = false;
+ ctx->stream_input_mode = FRAME_LVL;
+ ctx->hang_status = false;
+ ctx->first_dump_data_flag = true;
+ INIT_LIST_HEAD(&ctx->cmd_q);
+ INIT_LIST_HEAD(&ctx->perf_q);
+ ctx->tsm = createTSManager(tsm_buffer_size);
+ if (!ctx->tsm)
+ goto err_create_tsm;
+ sema_init(&ctx->tsm_lock, 1);
+ resyncTSManager(ctx->tsm, 0, tsm_mode);
+ ctx->tsm_sync_flag = false;
+ ctx->output_ts = TSM_TIMESTAMP_NONE;
+ ctx->capture_ts = TSM_TIMESTAMP_NONE;
+ create_instance_file(ctx);
+ if (vpu_frmcrcdump_ena) {
+ ret = open_crc_file(ctx);
+ if (ret)
+ goto err_open_crc;
+ }
+ ctx->seqinfo.uProgressive = 1;
+
+ init_queue_data(ctx);
+ init_log_info_queue(ctx);
+ create_log_info_queue(ctx, vpu_log_depth);
+ mutex_lock(&dev->dev_mutex);
+ if (!dev->fw_is_ready) {
+ ret = vpu_firmware_download(dev);
+ if (ret) {
+ vpu_err("error: vpu_firmware_download fail\n");
+ mutex_unlock(&dev->dev_mutex);
+ goto err_firmware_load;
+ }
+ vpu_dbg(LVL_INFO, "done: vpu_firmware_download\n");
+ if (!ctx->dev->firmware_started) {
+ reinit_completion(&ctx->dev->start_cmp);
+ if (!wait_for_completion_timeout(&ctx->dev->start_cmp, msecs_to_jiffies(1000))) {
+ vpu_err("error: don't get start interrupt\n");
+ ret = -1;
+ mutex_unlock(&dev->dev_mutex);
+ goto err_firmware_load;
+ }
+ }
+ dev->fw_is_ready = true;
+ create_fwlog_file(ctx->dev);
+ create_dbglog_file(ctx->dev);
+ }
+ mutex_unlock(&dev->dev_mutex);
+ rpc_set_stream_cfg_value(dev->shared_mem.pSharedInterface, ctx->str_index, vpu_dbe_num);
+ init_vpu_buffer(ctx);
+
+ vpu_dbg(LVL_BIT_FLOW, "<%d> ctx[%d] open\n",
+ current->pid, ctx->str_index);
+ vpu_calculate_performance(ctx, 0xff, "open device");
+
+ return 0;
+
+err_firmware_load:
+ destroy_log_info_queue(ctx);
+ cleanup_perf_queue(ctx);
+ release_queue_data(ctx);
+
+ if (vpu_frmcrcdump_ena)
+ close_crc_file(ctx);
+err_open_crc:
+ if (ctx->tsm)
+ destroyTSManager(ctx->tsm);
+ ctx->tsm = NULL;
+err_create_tsm:
+ remove_instance_file(ctx);
+ kfifo_free(&ctx->msg_fifo);
+ dev->ctx[idx] = NULL;
+err_alloc_fifo:
+ mutex_destroy(&ctx->instance_mutex);
+ mutex_destroy(&ctx->cmd_lock);
+ mutex_destroy(&ctx->perf_lock);
+ destroy_workqueue(ctx->instance_wq);
+err_alloc_wq:
+ ctrls_delete_decoder(ctx);
+ v4l2_fh_del(&ctx->fh);
+ v4l2_fh_exit(&ctx->fh);
+ clear_bit(ctx->str_index, &dev->instance_mask);
+err_find_index:
+ if (atomic64_read(&ctx->statistic.total_alloc_size) != 0)
+ vpu_err("error: memory leak for vpu kalloc buffer\n");
+ kfree(ctx);
+ pm_runtime_put_sync(dev->generic_dev);
+
+ return ret;
+}
+
+static void vpu_dec_disable(struct vpu_ctx *ctx, struct queue_data *queue)
+{
+ bool enable = false;
+
+ down(&queue->drv_q_lock);
+ if (queue->enable) {
+ enable = true;
+ queue->enable = false;
+ }
+ up(&queue->drv_q_lock);
+
+ if (!enable)
+ return;
+
+ vpu_dbg(LVL_BIT_FLOW, "Pls stream off %s of ctx[%d] before release\n",
+ V4L2_TYPE_IS_OUTPUT(queue->vb2_q.type) ? "Output" : "Capture",
+ ctx->str_index);
+ if (!V4L2_TYPE_IS_OUTPUT(queue->vb2_q.type)) {
+ mutex_lock(&ctx->dev->fw_flow_mutex);
+ send_abort_cmd(ctx);
+ mutex_unlock(&ctx->dev->fw_flow_mutex);
+ ctx->capture_ts = TSM_TIMESTAMP_NONE;
+ } else {
+ ctx->output_ts = TSM_TIMESTAMP_NONE;
+ }
+
+ vpu_dec_queue_disable(queue, queue->vb2_q.type);
+}
+
+static int v4l2_release(struct file *filp)
+{
+ struct video_device *vdev = video_devdata(filp);
+ struct vpu_dev *dev = video_get_drvdata(vdev);
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(filp->private_data);
+
+ vpu_dbg(LVL_BIT_FLOW, "<%d> ctx[%d] close\n",
+ current->pid, ctx->str_index);
+ vpu_dbg(LVL_BIT_FUNC,
+ "ctx[%d]: %s() - %s, %s, %s, total frame: %d\n",
+ ctx->str_index,
+ __func__,
+ ctx->firmware_stopped ? "stopped" : "not stopped",
+ ctx->firmware_finished ? "finished" : "not finished",
+ ctx->eos_stop_added ? "eos_added" : "not eos_added",
+ ctx->frm_total_num);
+
+ vpu_dec_disable(ctx, &ctx->q_data[V4L2_SRC]);
+ vpu_dec_disable(ctx, &ctx->q_data[V4L2_DST]);
+
+ mutex_lock(&ctx->dev->fw_flow_mutex);
+ send_stop_cmd(ctx);
+ mutex_unlock(&ctx->dev->fw_flow_mutex);
+
+ mutex_lock(&ctx->dev->dev_mutex);
+ ctx->ctx_released = true;
+ cancel_work_sync(&ctx->instance_work);
+ kfifo_free(&ctx->msg_fifo);
+ if (ctx->instance_wq)
+ destroy_workqueue(ctx->instance_wq);
+ mutex_unlock(&ctx->dev->dev_mutex);
+
+ if (ctx->tsm) {
+ destroyTSManager(ctx->tsm);
+ ctx->tsm = NULL;
+ }
+ if (vpu_frmcrcdump_ena)
+ close_crc_file(ctx);
+ ctrls_delete_decoder(ctx);
+ v4l2_fh_del(&ctx->fh);
+ v4l2_fh_exit(&ctx->fh);
+
+ mutex_lock(&dev->dev_mutex);
+ if (!ctx->hang_status)
+ release_vpu_ctx(ctx);
+ else
+ set_bit(ctx->str_index, &dev->hang_mask);
+ mutex_unlock(&dev->dev_mutex);
+
+ return 0;
+}
+
+static unsigned int v4l2_poll(struct file *filp, poll_table *wait)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(filp->private_data);
+ struct vb2_queue *src_q, *dst_q;
+ unsigned int rc = 0;
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ if (ctx) {
+ poll_wait(filp, &ctx->fh.wait, wait);
+
+ if (v4l2_event_pending(&ctx->fh)) {
+ vpu_dbg(LVL_INFO, "%s() v4l2_event_pending\n", __func__);
+ rc |= POLLPRI;
+ }
+
+ src_q = &ctx->q_data[V4L2_SRC].vb2_q;
+ dst_q = &ctx->q_data[V4L2_DST].vb2_q;
+
+ if (ctx->firmware_finished && !list_empty(&dst_q->done_list))
+ rc = 0;
+
+ poll_wait(filp, &src_q->done_wq, wait);
+ if (!list_empty(&src_q->done_list))
+ rc |= POLLOUT | POLLWRNORM;
+ poll_wait(filp, &dst_q->done_wq, wait);
+ if (!list_empty(&dst_q->done_list))
+ rc |= POLLIN | POLLRDNORM;
+ } else
+ rc = POLLERR;
+
+ return rc;
+}
+
+static int v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+ long ret = -EPERM;
+ unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
+ struct queue_data *q_data;
+ enum QUEUE_TYPE type;
+
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(filp->private_data);
+
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+
+ if (ctx) {
+ type = offset >> MMAP_BUF_TYPE_SHIFT;
+ q_data = &ctx->q_data[type];
+
+ offset &= ~MMAP_BUF_TYPE_MASK;
+ offset = offset >> PAGE_SHIFT;
+ vma->vm_pgoff = offset;
+ ret = vpu_dec_queue_mmap(q_data, vma);
+ }
+
+ return ret;
+}
+
+static const struct v4l2_file_operations v4l2_decoder_fops = {
+ .owner = THIS_MODULE,
+ .open = v4l2_open,
+ .unlocked_ioctl = video_ioctl2,
+ .release = v4l2_release,
+ .poll = v4l2_poll,
+ .mmap = v4l2_mmap,
+};
+
+static struct video_device v4l2_videodevice_decoder = {
+ .name = "vpu decoder",
+ .fops = &v4l2_decoder_fops,
+ .ioctl_ops = &v4l2_decoder_ioctl_ops,
+ .vfl_dir = VFL_DIR_M2M,
+};
+
+static void vpu_setup(struct vpu_dev *This)
+{
+ uint32_t read_data = 0;
+
+ vpu_dbg(LVL_BIT_FUNC, "enter %s\n", __func__);
+ writel(0x1, This->regs_base + SCB_XREG_SLV_BASE + SCB_SCB_BLK_CTRL + SCB_BLK_CTRL_SCB_CLK_ENABLE_SET);
+ writel(0xffffffff, This->regs_base + 0x70190);
+ writel(0xffffffff, This->regs_base + SCB_XREG_SLV_BASE + SCB_SCB_BLK_CTRL + SCB_BLK_CTRL_XMEM_RESET_SET);
+
+ writel(0xE, This->regs_base + SCB_XREG_SLV_BASE + SCB_SCB_BLK_CTRL + SCB_BLK_CTRL_SCB_CLK_ENABLE_SET);
+ writel(0x7, This->regs_base + SCB_XREG_SLV_BASE + SCB_SCB_BLK_CTRL + SCB_BLK_CTRL_CACHE_RESET_SET);
+
+ writel(0x1f, This->regs_base + DEC_MFD_XREG_SLV_BASE + MFD_BLK_CTRL + MFD_BLK_CTRL_MFD_SYS_CLOCK_ENABLE_SET);
+ writel(0xffffffff, This->regs_base + DEC_MFD_XREG_SLV_BASE + MFD_BLK_CTRL + MFD_BLK_CTRL_MFD_SYS_RESET_SET);
+
+ writel(0x102, This->regs_base + XMEM_CONTROL);
+
+ read_data = readl(This->regs_base+0x70108);
+ vpu_dbg(LVL_INFO, "%s read_data=%x\n", __func__, read_data);
+}
+
+static void vpu_reset(struct vpu_dev *This)
+{
+ vpu_dbg(LVL_BIT_FUNC, "enter %s\n", __func__);
+ writel(0x7, This->regs_base + SCB_XREG_SLV_BASE + SCB_SCB_BLK_CTRL + SCB_BLK_CTRL_CACHE_RESET_CLR);
+ writel(0xffffffff, This->regs_base + DEC_MFD_XREG_SLV_BASE + MFD_BLK_CTRL + MFD_BLK_CTRL_MFD_SYS_RESET_CLR);
+}
+
+static int vpu_enable_hw(struct vpu_dev *This)
+{
+ vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__);
+ vpu_setup(This);
+ return 0;
+}
+static void vpu_disable_hw(struct vpu_dev *This)
+{
+ vpu_reset(This);
+}
+
+static int swreset_vpu_firmware(struct vpu_dev *dev, u_int32 idx)
+{
+ int ret = 0;
+ struct vpu_ctx *ctx;
+
+ if (!dev || !dev->ctx[idx])
+ return 0;
+
+ ctx = dev->ctx[idx];
+ vpu_dbg(LVL_WARN, "SWRESET: swreset_vpu_firmware\n");
+ dev->firmware_started = false;
+ kfifo_reset(&dev->mu_msg_fifo);
+
+ do_send_cmd_to_firmware(ctx, 0, VID_API_CMD_FIRM_RESET, 0, NULL);
+
+ reinit_completion(&dev->start_cmp);
+ if (!wait_for_completion_timeout(&dev->start_cmp, msecs_to_jiffies(10000))) {
+ vpu_err("error: %s() fail\n", __func__);
+ return -1;
+ }
+ dev->firmware_started = true;
+
+ return ret;
+}
+
+static int parse_dt_info(struct vpu_dev *dev, struct device_node *np)
+{
+ u_int32 core_type;
+ struct resource reserved_res;
+ struct device_node *reserved_node;
+ u_int32 csr_base;
+ int ret;
+
+ if (!dev || !np)
+ return -EINVAL;
+
+ ret = of_property_read_u32(np, "core_type", &core_type);
+ if (ret) {
+ vpu_err("error: Cannot get core num %d\n", ret);
+ return -EINVAL;
+ }
+ if (core_type == 2)
+ dev->plat_type = IMX8QM;
+ else
+ dev->plat_type = IMX8QXP;
+ reserved_node = of_parse_phandle(np, "boot-region", 0);
+ if (!reserved_node) {
+ vpu_err("error: boot-region of_parse_phandle error\n");
+ return -ENODEV;
+ }
+
+ if (of_address_to_resource(reserved_node, 0, &reserved_res)) {
+ vpu_err("error: boot-region of_address_to_resource error\n");
+ return -EINVAL;
+ }
+ dev->m0_p_fw_space_phy = reserved_res.start;
+ dev->m0_boot_size = reserved_res.end - reserved_res.start;
+ reserved_node = of_parse_phandle(np, "rpc-region", 0);
+ if (!reserved_node) {
+ vpu_err("error: rpc-region of_parse_phandle error\n");
+ return -ENODEV;
+ }
+
+ if (of_address_to_resource(reserved_node, 0, &reserved_res)) {
+ vpu_err("error: rpc-region of_address_to_resource error\n");
+ return -EINVAL;
+ }
+ dev->m0_rpc_phy = reserved_res.start;
+ dev->m0_rpc_size = reserved_res.end - reserved_res.start;
+
+ ret = of_property_read_u32(np, "reg-csr", &csr_base);
+ if (ret) {
+ vpu_err("error: Cannot get csr offset %d\n", ret);
+ return -EINVAL;
+ }
+ dev->csr_base = ioremap(csr_base, 8); //for csr0 offset and cpuwait
+
+ return 0;
+}
+
+static int create_vpu_video_device(struct vpu_dev *dev)
+{
+ int ret;
+
+ if (!dev)
+ return -EINVAL;
+
+ dev->pvpu_decoder_dev = video_device_alloc();
+ if (!dev->pvpu_decoder_dev) {
+ vpu_err("video device alloc for decoder fail\n");
+ return -ENOMEM;
+ }
+ strlcpy(dev->pvpu_decoder_dev->name,
+ v4l2_videodevice_decoder.name,
+ sizeof(dev->pvpu_decoder_dev->name));
+ dev->pvpu_decoder_dev->fops = v4l2_videodevice_decoder.fops;
+ dev->pvpu_decoder_dev->ioctl_ops = v4l2_videodevice_decoder.ioctl_ops;
+ dev->pvpu_decoder_dev->release = video_device_release;
+ dev->pvpu_decoder_dev->vfl_dir = v4l2_videodevice_decoder.vfl_dir;
+ dev->pvpu_decoder_dev->v4l2_dev = &dev->v4l2_dev;
+ dev->pvpu_decoder_dev->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE |
+ V4L2_CAP_STREAMING;
+
+ video_set_drvdata(dev->pvpu_decoder_dev, dev);
+
+ ret = video_register_device(dev->pvpu_decoder_dev,
+ VFL_TYPE_GRABBER,
+ DECODER_NODE_NUMBER);
+ if (ret) {
+ vpu_err("error: %s unable to register video decoder device\n",
+ __func__
+ );
+ video_device_release(dev->pvpu_decoder_dev);
+ dev->pvpu_decoder_dev = NULL;
+ return ret;
+ }
+
+ return 0;
+}
+
+static int init_vpudev_parameters(struct vpu_dev *dev)
+{
+ mutex_init(&dev->dev_mutex);
+ mutex_init(&dev->cmd_mutex);
+ mutex_init(&dev->fw_flow_mutex);
+ init_completion(&dev->start_cmp);
+ init_completion(&dev->snap_done_cmp);
+ dev->firmware_started = false;
+ dev->need_cleanup_firmware = true;
+ dev->hang_mask = 0;
+ dev->instance_mask = 0;
+
+ dev->fw_is_ready = false;
+
+ //firmware space for M0
+ dev->m0_p_fw_space_vir = ioremap_wc(dev->m0_p_fw_space_phy,
+ dev->m0_boot_size
+ );
+ if (!dev->m0_p_fw_space_vir) {
+ vpu_err("error: failed to remap space for M0 firmware\n");
+ return -ENOMEM;
+ }
+
+ cleanup_firmware_memory(dev);
+
+ dev->m0_rpc_virt = ioremap_wc(dev->m0_rpc_phy,
+ dev->m0_rpc_size
+ );
+ if (!dev->m0_rpc_virt) {
+ vpu_err("error: failed to remap space for rpc shared memory\n");
+ return -ENOMEM;
+ }
+
+ memset_io(dev->m0_rpc_virt, 0, dev->m0_rpc_size);
+
+ return 0;
+}
+
+static int vpu_probe(struct platform_device *pdev)
+{
+ struct vpu_dev *dev;
+ struct resource *res;
+ struct device_node *np = pdev->dev.of_node;
+ int ret;
+
+ dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
+ if (!dev)
+ return -ENOMEM;
+
+ dev->plat_dev = pdev;
+ dev->generic_dev = get_device(&pdev->dev);
+
+ ret = vpu_attach_pm_domains(dev);
+ if (ret)
+ goto err_put_dev;
+
+ ret = vpu_mu_request(dev);
+ if (ret)
+ goto err_det_pm;
+
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ dev->regs_base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(dev->regs_base)) {
+ vpu_err("error: %s could not map regs_base\n", __func__);
+ ret = PTR_ERR(dev->regs_base);
+ goto err_free_mu;
+ }
+
+ ret = parse_dt_info(dev, np);
+ if (ret) {
+ vpu_err("error: %s parse device tree fail\n", __func__);
+ goto err_dev_iounmap;
+ }
+
+ ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
+ if (ret) {
+ vpu_err("error: %s unable to register v4l2 dev\n", __func__);
+ goto err_dev_iounmap;
+ }
+
+ platform_set_drvdata(pdev, dev);
+
+ ret = create_vpu_video_device(dev);
+ if (ret) {
+ vpu_err("error: %s create vpu video device fail\n", __func__);
+ goto err_unreg_v4l2;
+ }
+
+ ret = vpu_sc_check_fuse(dev, formats_compressed_dec, ARRAY_SIZE(formats_compressed_dec));
+ if (ret)
+ goto err_rm_vdev;
+
+ ret = kfifo_alloc(&dev->mu_msg_fifo,
+ sizeof(u_int32) * VPU_MAX_NUM_STREAMS * VID_API_MESSAGE_LIMIT,
+ GFP_KERNEL);
+ if (ret) {
+ vpu_err("error: fail to alloc mu msg fifo\n");
+ goto err_rm_vdev;
+ }
+
+ dev->workqueue = alloc_workqueue("vpu", WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
+ if (!dev->workqueue) {
+ vpu_err("error: %s unable to alloc workqueue\n", __func__);
+ ret = -ENOMEM;
+ goto err_free_fifo;
+ }
+
+ INIT_WORK(&dev->msg_work, vpu_msg_run_work);
+
+ vpu_enable_hw(dev);
+ pm_runtime_enable(&pdev->dev);
+ pm_runtime_get_sync(&pdev->dev);
+
+ ret = init_vpudev_parameters(dev);
+ if (ret) {
+ vpu_err("error: failed to init parameters for vpudev\n");
+ goto err_poweroff;
+ }
+
+ pm_runtime_put_sync(&pdev->dev);
+ device_create_file(&pdev->dev, &dev_attr_precheck_pattern);
+
+ return 0;
+
+err_poweroff:
+ destroy_workqueue(dev->workqueue);
+ vpu_disable_hw(dev);
+ pm_runtime_put_sync(&pdev->dev);
+ pm_runtime_disable(&pdev->dev);
+err_free_fifo:
+ kfifo_free(&dev->mu_msg_fifo);
+err_rm_vdev:
+ if (dev->pvpu_decoder_dev) {
+ video_unregister_device(dev->pvpu_decoder_dev);
+ dev->pvpu_decoder_dev = NULL;
+ }
+err_unreg_v4l2:
+ v4l2_device_unregister(&dev->v4l2_dev);
+err_dev_iounmap:
+ if (dev->regs_base)
+ iounmap(dev->regs_base);
+err_free_mu:
+ vpu_mu_free(dev);
+err_det_pm:
+ vpu_detach_pm_domains(dev);
+err_put_dev:
+ if (dev->generic_dev) {
+ put_device(dev->generic_dev);
+ dev->generic_dev = NULL;
+ }
+
+ devm_kfree(&pdev->dev, dev);
+
+ return ret;
+}
+
+static int vpu_remove(struct platform_device *pdev)
+{
+ struct vpu_dev *dev = platform_get_drvdata(pdev);
+
+ vpu_mu_free(dev);
+
+ device_remove_file(&pdev->dev, &dev_attr_precheck_pattern);
+ debugfs_remove_recursive(dev->debugfs_root);
+ dev->debugfs_root = NULL;
+ dev->debugfs_dbglog = NULL;
+ dev->debugfs_fwlog = NULL;
+ kfifo_free(&dev->mu_msg_fifo);
+ destroy_workqueue(dev->workqueue);
+ if (dev->m0_p_fw_space_vir)
+ iounmap(dev->m0_p_fw_space_vir);
+ if (dev->m0_pfw) {
+ release_firmware(dev->m0_pfw);
+ dev->m0_pfw = NULL;
+ }
+ dev->m0_p_fw_space_vir = NULL;
+ dev->m0_p_fw_space_phy = 0;
+ dev->m0_rpc_virt = NULL;
+ dev->m0_rpc_phy = 0;
+ if (dev->shared_mem.shared_mem_vir)
+ iounmap(dev->shared_mem.shared_mem_vir);
+ dev->shared_mem.shared_mem_vir = NULL;
+ dev->shared_mem.shared_mem_phy = 0;
+
+ vpu_disable_hw(dev);
+ pm_runtime_disable(&pdev->dev);
+
+ if (video_get_drvdata(dev->pvpu_decoder_dev))
+ video_unregister_device(dev->pvpu_decoder_dev);
+
+ v4l2_device_unregister(&dev->v4l2_dev);
+
+ vpu_detach_pm_domains(dev);
+ devm_kfree(&pdev->dev, dev);
+
+ return 0;
+}
+
+static int vpu_runtime_suspend(struct device *dev)
+{
+ return 0;
+}
+
+static int vpu_runtime_resume(struct device *dev)
+{
+ return 0;
+}
+
+static int find_first_available_instance(struct vpu_dev *dev)
+{
+ int strIdx, i;
+
+ if (!dev)
+ return -EINVAL;
+
+ strIdx = (~dev->hang_mask) & (dev->instance_mask);
+
+ for (i = 0; i < VPU_MAX_NUM_STREAMS; i++) {
+ if (CHECK_BIT(strIdx, i)) {
+ strIdx = i;
+ break;
+ }
+ }
+
+ return strIdx;
+}
+
+static void v4l2_vpu_send_snapshot(struct vpu_dev *dev)
+{
+ int strIdx;
+
+ strIdx = find_first_available_instance(dev);
+ if (strIdx >= 0 && strIdx < VPU_MAX_NUM_STREAMS)
+ v4l2_vpu_send_cmd(dev->ctx[strIdx], strIdx, VID_API_CMD_SNAPSHOT, 0, NULL);
+ else
+ vpu_dbg(LVL_WARN, "warning: all path hang, need to reset\n");
+}
+
+static void vpu_dec_cancel_work(struct vpu_dev *vpudev)
+{
+ int i;
+
+ mutex_lock(&vpudev->dev_mutex);
+ cancel_work_sync(&vpudev->msg_work);
+ for (i = 0; i < VPU_MAX_NUM_STREAMS; i++) {
+ struct vpu_ctx *ctx = vpudev->ctx[i];
+
+ if (!ctx)
+ continue;
+ cancel_work_sync(&vpudev->ctx[i]->instance_work);
+ }
+ mutex_unlock(&vpudev->dev_mutex);
+}
+
+
+static void vpu_dec_resume_work(struct vpu_dev *vpudev)
+{
+ int i;
+
+ mutex_lock(&vpudev->dev_mutex);
+ schedule_work(&vpudev->msg_work);
+ for (i = 0; i < VPU_MAX_NUM_STREAMS; i++) {
+ struct vpu_ctx *ctx = vpudev->ctx[i];
+
+ if (!ctx)
+ continue;
+ if (!ctx->ctx_released)
+ queue_work(ctx->instance_wq, &ctx->instance_work);
+ }
+ mutex_unlock(&vpudev->dev_mutex);
+}
+
+static int __maybe_unused vpu_suspend(struct device *dev)
+{
+ struct vpu_dev *vpudev = (struct vpu_dev *)dev_get_drvdata(dev);
+ int ret = 0;
+
+ vpu_dbg(LVL_INFO, "suspend\n");
+ if (vpudev->hang_mask != vpudev->instance_mask) {
+
+ /*if there is an available device, send snapshot command to firmware*/
+ v4l2_vpu_send_snapshot(vpudev);
+ reinit_completion(&vpudev->snap_done_cmp);
+ if (!wait_for_completion_timeout(&vpudev->snap_done_cmp, msecs_to_jiffies(1000))) {
+ vpu_err("error: wait for vpu decoder snapdone event timeout!\n");
+ ret = -1;
+ }
+ }
+
+ vpu_dec_cancel_work(vpudev);
+ vpu_dbg(LVL_INFO, "suspend done\n");
+
+ return ret;
+}
+
+static bool is_vpu_poweroff(struct vpu_dev *vpudev)
+{
+ /* the csr register 'CM0Px_CPUWAIT' will be cleared to '1' after
+ * reset(poweoff then poweron)
+ */
+ if (readl_relaxed(vpudev->csr_base + CSR_CM0Px_CPUWAIT) == 1)
+ return true;
+ else
+ return false;
+}
+
+static int resume_vpu_register(struct vpu_dev *vpudev)
+{
+ if (!vpudev)
+ return -EINVAL;
+
+ vpu_enable_hw(vpudev);
+ vpu_mu_enable_rx(vpudev);
+
+ return 0;
+}
+
+static int resume_from_snapshot(struct vpu_dev *vpudev)
+{
+ int ret = 0;
+
+ enable_csr_reg(vpudev);
+ /*wait for firmware resotre done*/
+ reinit_completion(&vpudev->start_cmp);
+ if (!wait_for_completion_timeout(&vpudev->start_cmp, msecs_to_jiffies(1000))) {
+ vpu_err("error: wait for vpu decoder resume done timeout!\n");
+ ret = -1;
+ }
+
+ return ret;
+}
+
+static int resume_from_vpu_poweroff(struct vpu_dev *vpudev)
+{
+ int ret = 0;
+
+ if (vpudev->hang_mask != vpudev->instance_mask)
+ ret = resume_from_snapshot(vpudev);
+ else
+ vpudev->fw_is_ready = false;
+
+ return ret;
+}
+
+static int __maybe_unused vpu_resume(struct device *dev)
+{
+ struct vpu_dev *vpudev = (struct vpu_dev *)dev_get_drvdata(dev);
+ int ret = 0;
+ u_int32 idx;
+
+ vpu_dbg(LVL_INFO, "resume\n");
+ pm_runtime_get_sync(vpudev->generic_dev);
+
+ resume_vpu_register(vpudev);
+
+ if (vpudev->fw_is_ready == false)
+ goto exit;
+
+ if (is_vpu_poweroff(vpudev))
+ ret = resume_from_vpu_poweroff(vpudev);
+ else if (vpudev->hang_mask != vpudev->instance_mask) {
+ idx = get_reset_index(vpudev);
+ if (idx < VPU_MAX_NUM_STREAMS)
+ swreset_vpu_firmware(vpudev, idx);
+ else
+ ret = -EINVAL;
+ }
+
+ vpu_dec_resume_work(vpudev);
+
+exit:
+ pm_runtime_put_sync(vpudev->generic_dev);
+ vpu_dbg(LVL_INFO, "resume done\n");
+
+ return ret;
+}
+
+static const struct dev_pm_ops vpu_pm_ops = {
+ SET_RUNTIME_PM_OPS(vpu_runtime_suspend, vpu_runtime_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(vpu_suspend, vpu_resume)
+};
+
+static const struct of_device_id vpu_of_match[] = {
+ { .compatible = "nxp,imx8qm-b0-vpudec", },
+ { .compatible = "nxp,imx8qxp-b0-vpudec", },
+ {}
+};
+MODULE_DEVICE_TABLE(of, vpu_of_match);
+
+static struct platform_driver vpu_driver = {
+ .probe = vpu_probe,
+ .remove = vpu_remove,
+ .driver = {
+ .name = "vpu-b0",
+ .of_match_table = vpu_of_match,
+ .pm = &vpu_pm_ops,
+ },
+};
+module_platform_driver(vpu_driver);
+
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_DESCRIPTION("Linux VPU driver for Freescale i.MX/MXC");
+MODULE_LICENSE("GPL");
+
+module_param(vpu_dbg_level_decoder, int, 0644);
+MODULE_PARM_DESC(vpu_dbg_level_decoder, "Debug level (0-3)");
+module_param(vpu_frm_depth, int, 0644);
+MODULE_PARM_DESC(vpu_frm_depth, "maximum frame number in data pool");
+module_param(vpu_log_depth, int, 0644);
+MODULE_PARM_DESC(vpu_log_depth, "maximum log number in queue(0-60)");
+module_param(vpu_frmdbg_ena, int, 0644);
+MODULE_PARM_DESC(vpu_frmdbg_ena, "enable firmware mask instance dbg log (bit N to mask instance N)");
+module_param(vpu_frmdbg_level, int, 0644);
+MODULE_PARM_DESC(vpu_frmdbg_level, "firmware debug level (0-2)");
+module_param(vpu_frmdbg_raw, int, 0644);
+MODULE_PARM_DESC(vpu_frmdbg_raw, "dump dbglog with raw data or not");
+module_param(vpu_max_bufsize, int, 0644);
+MODULE_PARM_DESC(vpu_max_bufsize, "maximun stream buffer size");
+module_param(vpu_dbe_num, int, 0644);
+MODULE_PARM_DESC(vpu_dbe_num, "vpu dbe number(1-2)");
+module_param(vpu_frmcrcdump_ena, int, 0644);
+MODULE_PARM_DESC(vpu_frmcrcdump_ena, "enable frame crc dump(0-1)");
+module_param(stream_buffer_threshold, int, 0644);
+MODULE_PARM_DESC(stream_buffer_threshold, "stream buffer threshold");
+module_param(tsm_mode, int, 0644);
+MODULE_PARM_DESC(tsm_mode, "timestamp manager mode(0 : ai, 1 : fifo)");
+module_param(tsm_buffer_size, int, 0644);
+MODULE_PARM_DESC(tsm_buffer_size, "timestamp manager buffer size");
+module_param(tsm_use_consumed_length, int, 0644);
+MODULE_PARM_DESC(tsm_use_consumed_length, "timestamp manager use consumed length");
+module_param(precheck_show_bytes, int, 0644);
+MODULE_PARM_DESC(precheck_show_bytes, "show the beginning of content");
+module_param(vpu_show_perf_ena, int, 0644);
+MODULE_PARM_DESC(vpu_show_perf_ena, "enable show vpu decode performance(0-1)");
+module_param(vpu_show_perf_idx, int, 0644);
+MODULE_PARM_DESC(vpu_show_perf_idx, "show performance of which instance(bit N to mask instance N)");
+module_param(vpu_show_perf_ent, int, 0644);
+MODULE_PARM_DESC(vpu_show_perf_ent, "show performance of which event(1: decoded, 2: ready)");
+module_param(vpu_datadump_ena, int, 0644);
+MODULE_PARM_DESC(vpu_datadump_ena, "enable dump input frame data (0-1)");
diff --git a/drivers/mxc/vpu_malone/vpu_b0.h b/drivers/mxc/vpu_malone/vpu_b0.h
new file mode 100644
index 000000000000..3855a5eaaa98
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_b0.h
@@ -0,0 +1,514 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file vpu_b0.h
+ *
+ * @brief VPU B0 definition
+ *
+ */
+#ifndef __VPU_B0_H
+#define __VPU_B0_H
+
+#include <linux/version.h>
+#include <linux/irqreturn.h>
+#include <linux/mutex.h>
+#include <linux/videodev2.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-fh.h>
+#include <media/videobuf2-v4l2.h>
+#ifdef CONFIG_IMX_SCU
+#include <linux/firmware/imx/ipc.h>
+#include <linux/firmware/imx/svc/misc.h>
+#else
+#include <soc/imx8/sc/svc/irq/api.h>
+#include <soc/imx8/sc/ipc.h>
+#include <soc/imx8/sc/sci.h>
+#endif
+#include <linux/mx8_mu.h>
+#include <linux/mailbox_client.h>
+#include <media/v4l2-event.h>
+#include <linux/kfifo.h>
+#include "vpu_rpc.h"
+
+extern unsigned int vpu_dbg_level_decoder;
+
+#define v4l2_fh_to_ctx(__fh) \
+ container_of(__fh, struct vpu_ctx, fh)
+#define v4l2_ctrl_to_ctx(__ctrl) \
+ container_of((__ctrl)->handler, struct vpu_ctx, ctrl_handler)
+
+#define MIN_SPACE (SCODE_SIZE + 64)
+#define SCODE_SIZE (4096)
+
+#define VPU_MAX_BUFFER 32
+#define M0FW_FILENAME "vpu/vpu_fw_imx8_dec.bin"
+#define MMAP_BUF_TYPE_SHIFT 28
+#define MMAP_BUF_TYPE_MASK 0xF0000000
+#define DCP_SIZE 0x3000000
+#define MAX_BUFFER_SIZE 0xc00000
+#define UDATA_BUFFER_SIZE 0x1000
+#define MAX_DCP_NUM 2
+#define MAX_MBI_NUM 18 // same with MEDIA_PLAYER_MAX_MBI_UNIT defined in firmware
+#define MAX_TIMEOUT_COUNT 10
+#define VPU_REG_BASE 0x40000000
+#define VPU_MAX_STEP_STRING_LENGTH 40
+#define VPU_DISABLE_BITS (0x7)
+
+#define V4L2_PIX_FMT_NV12_10BIT v4l2_fourcc('N', 'T', '1', '2') /* Y/CbCr 4:2:0 for 10bit */
+#define INVALID_FRAME_DEPTH -1
+#define DECODER_NODE_NUMBER 12 // use /dev/video12 as vpu decoder
+#define DEFAULT_LOG_DEPTH 20
+#define DEFAULT_FRMDBG_ENABLE 0
+#define DEFAULT_FRMDBG_LEVEL 0
+#define VPU_DEC_CMD_DATA_MAX_NUM 16
+#define VPU_DEC_MAX_WIDTH 8188
+#define VPU_DEC_MAX_HEIGTH 8188
+#define VPU_DEC_FMT_DIVX_MASK (1 << 20)
+#define VPU_DEC_FMT_RV_MASK (1 << 21)
+
+#define V4L2_EVENT_DECODE_ERROR (V4L2_EVENT_PRIVATE_START + 1)
+#define V4L2_EVENT_SKIP (V4L2_EVENT_PRIVATE_START + 2)
+
+struct vpu_v4l2_control {
+ uint32_t id;
+ enum v4l2_ctrl_type type;
+ uint32_t minimum;
+ uint32_t maximum;
+ uint32_t step;
+ uint32_t default_value;
+ uint32_t menu_skip_mask;
+ bool is_volatile;
+};
+
+typedef enum{
+ INIT_DONE = 1,
+ RPC_BUF_OFFSET,
+ BOOT_ADDRESS,
+ COMMAND,
+ EVENT
+} MSG_Type;
+
+enum PLAT_TYPE {
+ IMX8QXP = 0,
+ IMX8QM = 1,
+};
+
+enum QUEUE_TYPE {
+ V4L2_SRC = 0,
+ V4L2_DST = 1,
+};
+
+enum vpu_video_standard {
+ VPU_VIDEO_UNDEFINED = 0,
+ VPU_VIDEO_AVC = 1,
+ VPU_VIDEO_VC1 = 2,
+ VPU_VIDEO_MPEG2 = 3,
+ VPU_VIDEO_AVS = 4,
+ VPU_VIDEO_ASP = 5,
+ VPU_VIDEO_JPEG = 6,
+ VPU_VIDEO_RV = 7,
+ VPU_VIDEO_VP6 = 8,
+ VPU_VIDEO_SPK = 9,
+ VPU_VIDEO_VP8 = 10,
+ VPU_VIDEO_AVC_MVC = 11,
+ VPU_VIDEO_HEVC = 12,
+};
+
+typedef enum{
+ EOS_PADDING_TYPE = 1,
+ BUFFLUSH_PADDING_TYPE = 2,
+ BUFABORT_PADDING_TYPE = 3,
+} VPU_PADDING_SCODE_TYPE;
+
+#define VPU_PIX_FMT_AVS v4l2_fourcc('A', 'V', 'S', '0')
+#define VPU_PIX_FMT_ASP v4l2_fourcc('A', 'S', 'P', '0')
+#define VPU_PIX_FMT_RV v4l2_fourcc('R', 'V', '0', '0')
+#define VPU_PIX_FMT_VP6 v4l2_fourcc('V', 'P', '6', '0')
+#define VPU_PIX_FMT_SPK v4l2_fourcc('S', 'P', 'K', '0')
+#define VPU_PIX_FMT_DIV3 v4l2_fourcc('D', 'I', 'V', '3')
+#define VPU_PIX_FMT_DIVX v4l2_fourcc('D', 'I', 'V', 'X')
+#define VPU_PIX_FMT_HEVC v4l2_fourcc('H', 'E', 'V', 'C')
+#define VPU_PIX_FMT_LOGO v4l2_fourcc('L', 'O', 'G', 'O')
+
+#define VPU_PIX_FMT_TILED_8 v4l2_fourcc('Z', 'T', '0', '8')
+#define VPU_PIX_FMT_TILED_10 v4l2_fourcc('Z', 'T', '1', '0')
+
+#define V4L2_CID_USER_RAW_BASE (V4L2_CID_USER_BASE + 0x1100)
+#define V4L2_CID_USER_FRAME_DEPTH (V4L2_CID_USER_BASE + 0x1200)
+#define V4L2_CID_USER_FRAME_DIS_REORDER (V4L2_CID_USER_BASE + 0x1300)
+#define V4L2_CID_USER_TS_THRESHOLD (V4L2_CID_USER_BASE + 0x1101)
+#define V4L2_CID_USER_BS_L_THRESHOLD (V4L2_CID_USER_BASE + 0x1102)
+#define V4L2_CID_USER_BS_H_THRESHOLD (V4L2_CID_USER_BASE + 0x1103)
+
+#define V4L2_CID_USER_FRAME_COLORDESC (V4L2_CID_USER_BASE + 0x1104)
+#define V4L2_CID_USER_FRAME_TRANSFERCHARS (V4L2_CID_USER_BASE + 0x1105)
+#define V4L2_CID_USER_FRAME_MATRIXCOEFFS (V4L2_CID_USER_BASE + 0x1106)
+#define V4L2_CID_USER_FRAME_FULLRANGE (V4L2_CID_USER_BASE + 0x1107)
+#define V4L2_CID_USER_FRAME_VUIPRESENT (V4L2_CID_USER_BASE + 0x1108)
+
+#define V4L2_CID_USER_STREAM_INPUT_MODE (V4L2_CID_USER_BASE + 0x1109)
+
+#define IMX_V4L2_DEC_CMD_START (0x09000000)
+#define IMX_V4L2_DEC_CMD_RESET (IMX_V4L2_DEC_CMD_START + 1)
+
+enum vpu_pixel_format {
+ VPU_HAS_COLOCATED = 0x00000001,
+ VPU_HAS_SPLIT_FLD = 0x00000002,
+ VPU_PF_MASK = ~(VPU_HAS_COLOCATED | VPU_HAS_SPLIT_FLD),
+
+ VPU_IS_TILED = 0x000000100,
+ VPU_HAS_10BPP = 0x00000200,
+
+ VPU_IS_PLANAR = 0x00001000,
+ VPU_IS_SEMIPLANAR = 0x00002000,
+ VPU_IS_PACKED = 0x00004000,
+
+ // Merged definitions using above flags:
+ VPU_PF_UNDEFINED = 0,
+ VPU_PF_YUV420_SEMIPLANAR = 0x00010000 | VPU_IS_SEMIPLANAR,
+ VPU_PF_YUV420_PLANAR = 0x00020000 | VPU_IS_PLANAR,
+ VPU_PF_UYVY = 0x00040000 | VPU_IS_PACKED,
+ VPU_PF_TILED_8BPP = 0x00080000 | VPU_IS_TILED | VPU_IS_SEMIPLANAR,
+ VPU_PF_TILED_10BPP = 0x00100000 | VPU_IS_TILED | VPU_IS_SEMIPLANAR | VPU_HAS_10BPP,
+};
+
+enum ARV_FRAME_TYPE {
+ ARV_8 = 0,
+ ARV_9,
+ ARV_10,
+};
+
+struct VPU_FMT_INFO_ARV {
+ u_int32 data_len;
+ u_int32 slice_num;
+ u_int32 *slice_offset;
+ u_int32 packlen;
+ enum ARV_FRAME_TYPE type;
+};
+
+struct vpu_v4l2_fmt {
+ char *name;
+ unsigned int fourcc;
+ unsigned int num_planes;
+ unsigned int vdec_std;
+ unsigned int disable;
+};
+
+struct vb2_data_req {
+ struct list_head list;
+ struct vb2_buffer *vb2_buf;
+ int id;
+ u_int32 status;
+ bool bfield;
+ bool queued;
+ u_int32 phy_addr[2]; //0 for luma, 1 for chroma
+ u_int32 data_offset[2]; //0 for luma, 1 for chroma
+ u32 seq_tag;
+};
+
+struct queue_data {
+ unsigned int width;
+ unsigned int height;
+ unsigned int stride;
+ unsigned int field;
+ unsigned int num_planes;
+ unsigned int sizeimage[2];
+ unsigned int fourcc;
+ unsigned int vdec_std;
+ int buf_type; // v4l2_buf_type
+ bool vb2_q_inited;
+ struct vb2_queue vb2_q; // vb2 queue
+ struct list_head drv_q; // driver queue
+ struct semaphore drv_q_lock;
+ struct vb2_data_req vb2_reqs[VPU_MAX_BUFFER];
+ enum QUEUE_TYPE type;
+ unsigned long qbuf_count;
+ unsigned long dqbuf_count;
+ unsigned long process_count;
+ bool enable;
+ struct vpu_ctx *ctx;
+};
+
+struct print_buf_desc {
+ u32 start_h_phy;
+ u32 start_h_vir;
+ u32 start_m;
+ u32 bytes;
+ u32 read;
+ u32 write;
+ char buffer[0];
+};
+
+#ifdef CONFIG_IMX_SCU
+struct vpu_imx_sc_msg_misc {
+ struct imx_sc_rpc_msg hdr;
+ u32 word;
+} __packed;
+#endif
+
+struct vpu_sc_chan {
+ struct vpu_dev *dev;
+ char name[20];
+ struct mbox_client cl;
+ struct mbox_chan *ch;
+};
+
+struct vpu_ctx;
+struct vpu_dev {
+ struct device *generic_dev;
+ struct v4l2_device v4l2_dev;
+ struct video_device *pvpu_decoder_dev;
+ struct platform_device *plat_dev;
+ struct firmware *m0_pfw;
+ void *m0_p_fw_space_vir;
+ u_int32 m0_p_fw_space_phy;
+ u_int32 m0_boot_size;
+ void *m0_rpc_virt;
+ u_int32 m0_rpc_phy;
+ u_int32 m0_rpc_size;
+ struct mutex dev_mutex;
+ struct mutex cmd_mutex;
+ struct mutex fw_flow_mutex;
+ bool fw_is_ready;
+ bool firmware_started;
+ bool need_cleanup_firmware;
+ struct completion start_cmp;
+ struct completion snap_done_cmp;
+ struct workqueue_struct *workqueue;
+ struct work_struct msg_work;
+ unsigned long instance_mask;
+ unsigned long hang_mask; //this is used to deal with hang issue to reset firmware
+ struct clk *vpu_clk;
+ void __iomem *mu_base_virtaddr;
+ unsigned int vpu_mu_id;
+ int vpu_mu_init;
+ u_int32 plat_type;
+
+ struct clk *clk_m0;
+ void __iomem *regs_base;
+ void __iomem *csr_base;
+ u_int32 cm_offset;
+
+ struct shared_addr shared_mem;
+ struct vpu_ctx *ctx[VPU_MAX_NUM_STREAMS];
+ struct dentry *debugfs_root;
+ struct dentry *debugfs_dbglog;
+ struct dentry *debugfs_fwlog;
+
+ struct print_buf_desc *print_buf;
+ u8 precheck_pattern[64];
+ int precheck_next[64];
+ int precheck_num;
+ char precheck_content[1024];
+
+ struct kfifo mu_msg_fifo;
+ u_int32 vpu_irq;
+
+ /* reserve for kernel version 5.4 or later */
+ struct vpu_sc_chan sc_chan_tx0;
+ struct vpu_sc_chan sc_chan_tx1;
+ struct vpu_sc_chan sc_chan_rx;
+ struct device *pd_vpu;
+ struct device *pd_dec;
+ struct device *pd_mu;
+ struct device_link *pd_vpu_link;
+ struct device_link *pd_dec_link;
+ struct device_link *pd_mu_link;
+};
+
+struct vpu_statistic {
+ unsigned long cmd[VID_API_CMD_YUV_READY + 2];
+ unsigned long event[VID_API_EVENT_DEC_CFG_INFO + 2];
+ unsigned long current_cmd;
+ unsigned long current_event;
+ struct timespec ts_cmd;
+ struct timespec ts_event;
+ atomic64_t total_dma_size;
+ atomic64_t total_alloc_size;
+};
+
+struct dma_buffer {
+ dma_addr_t dma_phy;
+ void *dma_virt;
+ u_int32 dma_size;
+};
+
+struct vpu_dec_cmd_request {
+ struct list_head list;
+ u32 request;
+ u32 response;
+ bool block;
+ u32 idx;
+ u32 num;
+ u32 data[VPU_DEC_CMD_DATA_MAX_NUM];
+};
+
+struct vpu_dec_perf_time {
+ u_int64 open_time;
+
+ u_int64 first_decoded_time;
+ u_int64 last_decoded_time;
+ u_int64 cur_decoded_interv;
+ u_int64 decoded_fps;
+
+ u_int64 first_ready_time;
+ u_int64 last_ready_time;
+ u_int64 cur_ready_interv;
+ u_int64 ready_fps;
+};
+
+struct vpu_dec_perf_queue {
+ struct list_head list;
+ char str[VPU_MAX_STEP_STRING_LENGTH];
+ u_int64 time;
+};
+
+struct vpu_ctx {
+ struct vpu_dev *dev;
+ struct v4l2_fh fh;
+
+ struct vpu_statistic statistic;
+ atomic64_t total_alloc_size;
+ struct device_attribute dev_attr_instance_command;
+ char command_name[64];
+ struct device_attribute dev_attr_instance_event;
+ char event_name[64];
+ struct device_attribute dev_attr_instance_buffer;
+ char buffer_name[64];
+ struct device_attribute dev_attr_instance_flow;
+ char flow_name[64];
+ struct device_attribute dev_attr_instance_perf;
+ char perf_name[64];
+ struct v4l2_ctrl_handler ctrl_handler;
+ bool ctrl_inited;
+ struct list_head log_q;
+
+ int str_index;
+ struct queue_data q_data[2];
+ struct kfifo msg_fifo;
+ struct mutex instance_mutex;
+ struct work_struct instance_work;
+ struct workqueue_struct *instance_wq;
+ struct completion completion;
+ struct completion stop_cmp;
+ struct completion eos_cmp;
+ MediaIPFW_Video_SeqInfo seqinfo;
+ bool b_dis_reorder;
+ bool b_firstseq;
+ bool wait_rst_done;
+ bool wait_res_change_done;
+ bool seek_flag;
+ bool firmware_stopped;
+ bool firmware_finished;
+ bool eos_stop_received;
+ bool eos_stop_added;
+ bool ctx_released;
+ bool start_code_bypass;
+ STREAM_INPUT_MODE stream_input_mode;
+ bool hang_status;
+ bool fifo_low;
+ bool frame_decoded;
+ bool first_dump_data_flag;
+ bool first_data_flag;
+ u32 req_frame_count;
+ u_int32 mbi_count;
+ u_int32 mbi_size;
+ u_int32 dcp_count;
+ struct dma_buffer dpb_buffer;
+ struct dma_buffer dcp_buffer[MAX_DCP_NUM];
+ struct dma_buffer mbi_buffer[MAX_MBI_NUM];
+ struct dma_buffer stream_buffer;
+ struct dma_buffer udata_buffer;
+ enum ARV_FRAME_TYPE arv_type;
+ u32 beginning;
+
+ struct file *crc_fp;
+ loff_t pos;
+
+ int frm_dis_delay;
+ int frm_dec_delay;
+ int frm_total_num;
+
+ void *tsm;
+ bool tsm_sync_flag;
+ u32 pre_pic_end_addr;
+ long total_qbuf_bytes;
+ long total_write_bytes;
+ long total_consumed_bytes;
+ long total_ts_bytes;
+ u32 extra_size;
+ struct semaphore tsm_lock;
+ s64 output_ts;
+ s64 capture_ts;
+ s64 ts_threshold;
+ u32 bs_l_threshold;
+ u32 bs_h_threshold;
+
+ struct v4l2_fract fixed_frame_interval;
+ struct v4l2_fract frame_interval;
+
+ struct list_head cmd_q;
+ struct vpu_dec_cmd_request *pending;
+ struct mutex cmd_lock;
+
+ struct vpu_dec_perf_time perf_time;
+ int res_change_occu_count;
+ int res_change_send_count;
+ int res_change_done_count;
+
+ struct list_head perf_q;
+ struct mutex perf_lock;
+};
+
+#define LVL_WARN (1 << 0)
+#define LVL_EVENT (1 << 1)
+#define LVL_INFO (1 << 2)
+#define LVL_BIT_CMD (1 << 4)
+#define LVL_BIT_EVT (1 << 5)
+#define LVL_BIT_TS (1 << 6)
+#define LVL_BIT_FRAME_BYTES (1 << 7)
+#define LVL_BIT_WPTR (1 << 8)
+#define LVL_BIT_PIC_ADDR (1 << 9)
+#define LVL_BIT_BUFFER_STAT (1 << 10)
+#define LVL_BIT_BUFFER_DESC (1 << 11)
+#define LVL_BIT_FUNC (1 << 12)
+#define LVL_BIT_FLOW (1 << 13)
+#define LVL_BIT_FRAME_COUNT (1 << 14)
+
+#define vpu_err(fmt, arg...) pr_info("[VPU Decoder] " fmt, ## arg)
+
+#define vpu_dbg(level, fmt, arg...) \
+ do { \
+ if (vpu_dbg_level_decoder & (level)) \
+ pr_info("[VPU Decoder] " fmt, ## arg); \
+ } while (0)
+
+#define V4L2_NXP_BUF_FLAG_CODECCONFIG 0x00200000
+#define V4L2_NXP_BUF_FLAG_TIMESTAMP_INVALID 0x00400000
+
+#define V4L2_NXP_BUF_MASK_FLAGS (V4L2_NXP_BUF_FLAG_CODECCONFIG | \
+ V4L2_NXP_BUF_FLAG_TIMESTAMP_INVALID)
+
+#define VPU_DECODED_EVENT_PERF_MASK (1 << 0)
+#define VPU_READY_EVENT_PERF_MASK (1 << 1)
+
+#define V4L2_NXP_FRAME_VERTICAL_ALIGN 512
+#define V4L2_NXP_FRAME_HORIZONTAL_ALIGN 512
+
+pSTREAM_BUFFER_DESCRIPTOR_TYPE get_str_buffer_desc(struct vpu_ctx *ctx);
+u_int32 got_free_space(u_int32 wptr, u_int32 rptr, u_int32 start, u_int32 end);
+int copy_buffer_to_stream(struct vpu_ctx *ctx, void *buffer, uint32_t length);
+
+#endif
diff --git a/drivers/mxc/vpu_malone/vpu_debug_log.c b/drivers/mxc/vpu_malone/vpu_debug_log.c
new file mode 100644
index 000000000000..9c53de062477
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_debug_log.c
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file vpu-debug_log.c
+ *
+ * copyright here may be changed later
+ *
+ *
+ */
+#include "vpu_debug_log.h"
+
+int init_log_info_queue(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return -EINVAL;
+
+ mutex_lock(&ctx->instance_mutex);
+ INIT_LIST_HEAD(&ctx->log_q);
+ mutex_unlock(&ctx->instance_mutex);
+ return 0;
+}
+
+int create_log_info_queue(struct vpu_ctx *ctx, u_int32 vpu_log_depth)
+{
+ struct vpu_log_info *vpu_info = NULL;
+ u_int32 i;
+
+ if (!ctx)
+ return -EINVAL;
+
+ for (i = 0; i < vpu_log_depth; i++) {
+ vpu_info = kzalloc(sizeof(*vpu_info), GFP_KERNEL);
+ if (!vpu_info)
+ continue;
+
+ atomic64_add(sizeof(*vpu_info), &ctx->statistic.total_alloc_size);
+ list_add_tail(&vpu_info->list, &ctx->log_q);
+ }
+
+ return 0;
+}
+
+int destroy_log_info_queue(struct vpu_ctx *ctx)
+{
+ struct vpu_log_info *vpu_info, *temp_info;
+ u_int32 ret = 0;
+
+ if (!ctx)
+ return -EINVAL;
+
+ mutex_lock(&ctx->instance_mutex);
+ if (list_empty(&ctx->log_q)) {
+ ret = -EINVAL;
+ goto exit;
+ }
+ list_for_each_entry_safe(vpu_info, temp_info, &ctx->log_q, list)
+ if (vpu_info) {
+ list_del_init(&vpu_info->list);
+ kfree(vpu_info);
+ atomic64_sub(sizeof(*vpu_info), &ctx->statistic.total_alloc_size);
+ }
+
+exit:
+ mutex_unlock(&ctx->instance_mutex);
+
+ return ret;
+}
+
+int put_log_info(struct vpu_ctx *ctx, struct vpu_log_info *vpu_info)
+{
+ if (!ctx || !vpu_info)
+ return -EINVAL;
+
+ mutex_lock(&ctx->instance_mutex);
+ list_add_tail(&vpu_info->list, &ctx->log_q);
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+struct vpu_log_info *pop_log_info(struct vpu_ctx *ctx)
+{
+ struct vpu_log_info *vpu_info = NULL;
+
+ if (!ctx)
+ return NULL;
+
+ mutex_lock(&ctx->instance_mutex);
+ if (list_empty(&ctx->log_q))
+ vpu_info = NULL;
+ vpu_info = list_first_entry(&ctx->log_q, struct vpu_log_info, list);
+ if (vpu_info)
+ list_del_init(&vpu_info->list);
+ mutex_unlock(&ctx->instance_mutex);
+ return vpu_info;
+}
+
+int set_log_info(struct vpu_log_info *vpu_info, enum ACTION_TYPE type, u_int32 info, u_int32 info_data)
+{
+ if (!vpu_info)
+ return -EINVAL;
+ if (type >= LOG_RESERVED)
+ return -EINVAL;
+
+ vpu_info->type = type;
+ vpu_info->log_info[type] = info;
+ vpu_info->data = info_data;
+ return 0;
+}
+
+int record_log_info(struct vpu_ctx *ctx, enum ACTION_TYPE type, u_int32 info, u_int32 info_data)
+{
+ struct vpu_log_info *vpu_info = NULL;
+
+ if (!ctx)
+ return -EINVAL;
+
+ vpu_info = pop_log_info(ctx);
+ if (!vpu_info)
+ return -EINVAL;
+ set_log_info(vpu_info, type, info, info_data);
+ put_log_info(ctx, vpu_info);
+
+ return 0;
+}
+
diff --git a/drivers/mxc/vpu_malone/vpu_debug_log.h b/drivers/mxc/vpu_malone/vpu_debug_log.h
new file mode 100644
index 000000000000..df1385ba7588
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_debug_log.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file vpu_debug_log.h
+ *
+ * @brief VPU debug definition
+ *
+ */
+#ifndef _VPU_DEBUG_LOG_H_
+#define _VPU_DEBUG_LOG_H_
+#include "vpu_b0.h"
+enum ACTION_TYPE {
+ LOG_NULL = 0,
+ LOG_EVENT,
+ LOG_COMMAND,
+ LOG_PADDING,
+ LOG_EOS,
+ LOG_UPDATE_STREAM,
+ LOG_RESERVED,
+};
+
+struct vpu_log_info {
+ struct list_head list;
+ enum ACTION_TYPE type;
+ u_int32 log_info[LOG_RESERVED];
+ u_int32 data;
+};
+int init_log_info_queue(struct vpu_ctx *ctx);
+int create_log_info_queue(struct vpu_ctx *ctx, u_int32 vpu_log_depth);
+int destroy_log_info_queue(struct vpu_ctx *ctx);
+int put_log_info(struct vpu_ctx *ctx, struct vpu_log_info *vpu_info);
+struct vpu_log_info *pop_log_info(struct vpu_ctx *ctx);
+int set_log_info(struct vpu_log_info *vpu_info, enum ACTION_TYPE type, u_int32 info, u_int32 info_data);
+int record_log_info(struct vpu_ctx *ctx, enum ACTION_TYPE type, u_int32 info, u_int32 info_data);
+
+#endif
+
diff --git a/drivers/mxc/vpu_malone/vpu_mu.c b/drivers/mxc/vpu_malone/vpu_mu.c
new file mode 100644
index 000000000000..5da28e619859
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_mu.c
@@ -0,0 +1,248 @@
+/*
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ *
+ * @file vpu_mu.c
+ *
+ */
+
+#include "vpu_mu.h"
+
+static void vpu_mu_inq_msg(struct vpu_dev *dev, void *msg)
+{
+ if (&dev->mu_msg_fifo == NULL) {
+ vpu_err("&dev->mu_msg_fifo == NULL\n");
+ return;
+ }
+
+ if (kfifo_in(&dev->mu_msg_fifo, msg, sizeof(u_int32)) != sizeof(u_int32)) {
+ vpu_err("No memory for mu msg fifo\n");
+ return;
+ }
+
+ schedule_work(&dev->msg_work);
+}
+
+static void vpu_mbox_free(struct vpu_dev *dev)
+{
+ if (dev->sc_chan_tx0.ch && !IS_ERR(dev->sc_chan_tx0.ch))
+ mbox_free_channel(dev->sc_chan_tx0.ch);
+ if (dev->sc_chan_tx1.ch && !IS_ERR(dev->sc_chan_tx1.ch))
+ mbox_free_channel(dev->sc_chan_tx1.ch);
+ if (dev->sc_chan_rx.ch && !IS_ERR(dev->sc_chan_rx.ch))
+ mbox_free_channel(dev->sc_chan_rx.ch);
+
+ dev->sc_chan_tx0.ch = NULL;
+ dev->sc_chan_tx1.ch = NULL;
+ dev->sc_chan_rx.ch = NULL;
+}
+
+static void vpu_rx_callback(struct mbox_client *c, void *msg)
+{
+ struct vpu_sc_chan *sc_chan = container_of(c, struct vpu_sc_chan, cl);
+ struct vpu_dev *dev =
+ container_of(sc_chan, struct vpu_dev, sc_chan_rx);
+
+ if (&dev->mu_msg_fifo == NULL) {
+ vpu_err("&dev->mu_msg_fifo == NULL\n");
+ return;
+ }
+
+ vpu_mu_inq_msg(dev, msg);
+}
+
+static int vpu_rtx_channel_request(struct vpu_sc_chan *sc_chan, bool block, struct vpu_dev *vdev)
+{
+ struct device *dev = &vdev->plat_dev->dev;
+ struct mbox_client *cl;
+ int ret = 0;
+
+ /* Normally, use block mode to ensure msg be writed correctly.
+ * Firmware do not separate read tx1 channel until receive tx0.
+ * Hence, when use tx1 must combine with tx0, and flow is tx1 -> tx0 to
+ * ensure firmware read tx1 correctly. Due to tx1 write first, tx1 shall
+ * use non-block mode, otherwise always wait timeout.
+ * In addition, tx0 use block mode then also can ensure tx1 msg be
+ * writed correctly as tx0 and tx1 are considered as a whole in this
+ * case.
+ */
+
+ /* core device id count from 0, mu count from 1 */
+
+ cl = &sc_chan->cl;
+ cl->dev = dev;
+ if (block) {
+ cl->tx_block = true;
+ cl->tx_tout = 1000;
+ } else {
+ cl->tx_block = false;
+ }
+ cl->knows_txdone = false;
+ cl->rx_callback = vpu_rx_callback;
+
+ sc_chan->ch = mbox_request_channel_byname(cl, sc_chan->name);
+ if (IS_ERR(sc_chan->ch)) {
+ ret = PTR_ERR(sc_chan->ch);
+ if (ret != -EPROBE_DEFER)
+ vpu_err("Failed to request mbox chan %s ret %d\n",
+ sc_chan->name, ret);
+ }
+
+ return ret;
+}
+
+static int vpu_rtx_channel_init(struct vpu_dev *vdev)
+{
+ int ret = 0;
+
+ vdev->sc_chan_tx0.dev = vdev;
+ scnprintf(vdev->sc_chan_tx0.name, sizeof(vdev->sc_chan_tx0.name) - 1,
+ "tx0");
+ ret = vpu_rtx_channel_request(&vdev->sc_chan_tx0, true, vdev);
+ if (ret)
+ goto err;
+
+ vdev->sc_chan_tx1.dev = vdev;
+ scnprintf(vdev->sc_chan_tx1.name, sizeof(vdev->sc_chan_tx1.name) - 1,
+ "tx1");
+ ret = vpu_rtx_channel_request(&vdev->sc_chan_tx1, false, vdev);
+ if (ret)
+ goto err;
+
+ vdev->sc_chan_rx.dev = vdev;
+ scnprintf(vdev->sc_chan_rx.name, sizeof(vdev->sc_chan_rx.name) - 1,
+ "rx");
+ ret = vpu_rtx_channel_request(&vdev->sc_chan_rx, true, vdev);
+ if (ret)
+ goto err;
+
+ return ret;
+
+err:
+ vpu_mbox_free(vdev);
+
+ return ret;
+}
+
+int vpu_mu_request(struct vpu_dev *dev)
+{
+ int ret = 0;
+
+ ret = vpu_rtx_channel_init(dev);
+ if (ret)
+ return ret;
+
+ return ret;
+}
+
+void vpu_mu_free(struct vpu_dev *dev)
+{
+ vpu_mbox_free(dev);
+}
+
+void vpu_mu_send_msg(struct vpu_dev *dev, MSG_Type type, u32 value)
+{
+ /* Ensure firmware read tx1 correctly when receive tx0,
+ * need to write tx1 first.
+ */
+
+ if (value != 0xffff)
+ mbox_send_message(dev->sc_chan_tx1.ch, &value);
+ if (type != 0xffff)
+ mbox_send_message(dev->sc_chan_tx0.ch, &type);
+}
+
+u_int32 vpu_mu_receive_msg(struct vpu_dev *dev, void *msg)
+{
+ int ret = 0;
+
+ if (kfifo_len(&dev->mu_msg_fifo) >= sizeof(u_int32)) {
+ ret = kfifo_out(&dev->mu_msg_fifo, msg, sizeof(u_int32));
+ if (ret != sizeof(u_int32))
+ vpu_err("error: kfifo_out mu msg failed\n, ret=%d\n",
+ ret);
+ } else {
+ ret = kfifo_len(&dev->mu_msg_fifo);
+ }
+
+ return ret;
+}
+
+static int vpu_sc_get_fuse(struct imx_sc_ipc *ipc, u_int32 word, u_int32 *fuse)
+{
+ struct vpu_imx_sc_msg_misc msg;
+ struct imx_sc_rpc_msg *hdr = &msg.hdr;
+ int ret;
+
+ hdr->ver = IMX_SC_RPC_VERSION;
+ hdr->svc = IMX_SC_RPC_SVC_MISC;
+ hdr->func = IMX_SC_MISC_FUNC_OTP_FUSE_READ;
+ hdr->size = 2;
+
+ msg.word = word;
+
+ ret = imx_scu_call_rpc(ipc, &msg, true);
+ if (ret)
+ return ret;
+
+ *fuse = msg.word;
+
+ return ret;
+}
+
+int vpu_sc_check_fuse(struct vpu_dev *dev, struct vpu_v4l2_fmt *pformat_table,
+ u_int32 table_size)
+{
+ u_int32 fuse = 0xff;
+ u_int32 val;
+ u_int32 i;
+ int ret = 0;
+ struct imx_sc_ipc *ipcHandle;
+
+ ret = imx_scu_get_handle(&ipcHandle);
+ if (ret) {
+ vpu_err("error: scu get handle fail: %d\n", ret);
+ return ret;
+ }
+
+ vpu_sc_get_fuse(ipcHandle, VPU_DISABLE_BITS, &fuse);
+ if (ret) {
+ vpu_dbg(LVL_WARN, "warning: read value fail: %d\n", ret);
+ return ret;
+ }
+
+ val = (fuse >> 2) & 0x3UL;
+ if (val == 0x1UL) {
+ for (i = 0; i < table_size; i++)
+ if (pformat_table[i].fourcc == VPU_PIX_FMT_HEVC)
+ pformat_table[i].disable = 1;
+ vpu_dbg(LVL_WARN, "H265 is disabled\n");
+ } else if (val == 0x2UL) {
+ for (i = 0; i < table_size; i++)
+ if (pformat_table[i].fourcc == V4L2_PIX_FMT_H264)
+ pformat_table[i].disable = 1;
+ vpu_dbg(LVL_WARN, "H264 is disabled\n");
+ } else if (val == 0x3UL) {
+ for (i = 0; i < table_size; i++)
+ pformat_table[i].disable = 1;
+ vpu_dbg(LVL_WARN, "All decoder disabled\n");
+ }
+
+ return ret;
+}
+
+void vpu_mu_enable_rx(struct vpu_dev *dev)
+{
+
+}
diff --git a/drivers/mxc/vpu_malone/vpu_mu.h b/drivers/mxc/vpu_malone/vpu_mu.h
new file mode 100644
index 000000000000..baee2de228be
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_mu.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ *
+ * @file vpu_mu.h
+ *
+ */
+
+#ifndef _VPU_MU_H_
+#define _VPU_MU_H_
+
+#include <linux/version.h>
+#include <linux/interrupt.h>
+#include <linux/mx8_mu.h>
+#include <linux/workqueue.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/mailbox_client.h>
+#include <linux/pm_domain.h>
+#include <linux/kfifo.h>
+
+#include "vpu_b0.h"
+#include "mediasys_types.h"
+#include "vpu_debug_log.h"
+#include "vpu_rpc.h"
+
+int vpu_mu_request(struct vpu_dev *dev);
+void vpu_mu_free(struct vpu_dev *dev);
+void vpu_mu_send_msg(struct vpu_dev *dev, MSG_Type type, u_int32 value);
+u_int32 vpu_mu_receive_msg(struct vpu_dev *dev, void *msg);
+int vpu_sc_check_fuse(struct vpu_dev *dev, struct vpu_v4l2_fmt *pformat_table,
+ u_int32 table_size);
+void vpu_mu_enable_rx(struct vpu_dev *dev);
+
+#endif
diff --git a/drivers/mxc/vpu_malone/vpu_pm.c b/drivers/mxc/vpu_malone/vpu_pm.c
new file mode 100644
index 000000000000..c9dd401c541d
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_pm.c
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ *
+ * @file vpu_pm.c
+ *
+ */
+
+#include "vpu_pm.h"
+
+int vpu_attach_pm_domains(struct vpu_dev *dev)
+{
+ int ret = 0;
+
+ dev->pd_vpu = dev_pm_domain_attach_by_name(&dev->plat_dev->dev, "vpu");
+ if (IS_ERR(dev->pd_vpu)) {
+ vpu_err("error: %s unable to get vpu power domain\n", __func__);
+ ret = PTR_ERR(dev->pd_vpu);
+ goto err;
+ }
+ dev->pd_vpu_link = device_link_add(&dev->plat_dev->dev, dev->pd_vpu,
+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+ if (IS_ERR(dev->pd_vpu_link)) {
+ vpu_err("error: %s unable to link vpu power domain\n", __func__);
+ ret = PTR_ERR(dev->pd_vpu_link);
+ goto err;
+ }
+
+ dev->pd_dec = dev_pm_domain_attach_by_name(&dev->plat_dev->dev, "vpudec");
+ if (IS_ERR(dev->pd_dec)) {
+ vpu_err("error: %s unable to get vpu dec power domain\n", __func__);
+ ret = PTR_ERR(dev->pd_dec);
+ goto err;
+ }
+ dev->pd_dec_link = device_link_add(&dev->plat_dev->dev, dev->pd_dec,
+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+ if (IS_ERR(dev->pd_dec_link)) {
+ vpu_err("error: %s unable to link vpu dec power domain\n", __func__);
+ ret = PTR_ERR(dev->pd_dec_link);
+ goto err;
+ }
+
+ dev->pd_mu = dev_pm_domain_attach_by_name(&dev->plat_dev->dev, "vpumu0");
+ if (IS_ERR(dev->pd_mu)) {
+ vpu_err("error: %s unable to get vpu mu0 power domain\n", __func__);
+ ret = PTR_ERR(dev->pd_mu);
+ goto err;
+ }
+ dev->pd_mu_link = device_link_add(&dev->plat_dev->dev, dev->pd_mu,
+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+ if (IS_ERR(dev->pd_mu_link)) {
+ vpu_err("error: %s unable to link vpu mu0 power domain\n", __func__);
+ ret = PTR_ERR(dev->pd_mu_link);
+ goto err;
+ }
+
+ return ret;
+err:
+ vpu_detach_pm_domains(dev);
+ return ret;
+}
+
+void vpu_detach_pm_domains(struct vpu_dev *dev)
+{
+ if (dev->pd_vpu_link && !IS_ERR(dev->pd_vpu_link))
+ device_link_del(dev->pd_vpu_link);
+ if (dev->pd_vpu && !IS_ERR(dev->pd_vpu))
+ dev_pm_domain_detach(dev->pd_vpu, true);
+
+ if (dev->pd_dec_link && !IS_ERR(dev->pd_dec_link))
+ device_link_del(dev->pd_dec_link);
+ if (dev->pd_dec && !IS_ERR(dev->pd_dec))
+ dev_pm_domain_detach(dev->pd_dec, true);
+
+ if (dev->pd_mu_link && !IS_ERR(dev->pd_mu_link))
+ device_link_del(dev->pd_mu_link);
+ if (dev->pd_mu && !IS_ERR(dev->pd_mu))
+ dev_pm_domain_detach(dev->pd_mu, true);
+
+ dev->pd_vpu = NULL;
+ dev->pd_vpu_link = NULL;
+ dev->pd_dec = NULL;
+ dev->pd_dec_link = NULL;
+ dev->pd_mu = NULL;
+ dev->pd_mu_link = NULL;
+}
diff --git a/drivers/mxc/vpu_malone/vpu_pm.h b/drivers/mxc/vpu_malone/vpu_pm.h
new file mode 100644
index 000000000000..32284df66605
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_pm.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ *
+ * @file vpu_pm.h
+ *
+ */
+
+#ifndef _VPU_PM_H_
+#define _VPU_PM_H_
+
+#include <linux/version.h>
+#include <linux/pm_domain.h>
+#include <linux/platform_device.h>
+
+#include "vpu_b0.h"
+
+int vpu_attach_pm_domains(struct vpu_dev *dev);
+void vpu_detach_pm_domains(struct vpu_dev *dev);
+
+#endif
diff --git a/drivers/mxc/vpu_malone/vpu_rpc.c b/drivers/mxc/vpu_malone/vpu_rpc.c
new file mode 100644
index 000000000000..adf3c6d61e64
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_rpc.c
@@ -0,0 +1,364 @@
+/*
+ * This file is provided under a dual BSD/GPLv2 license. When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/uaccess.h>
+#include <linux/fs.h>
+#include "vpu_rpc.h"
+
+void rpc_init_shared_memory(struct shared_addr *This,
+ unsigned long long base_phy_addr,
+ void *base_virt_addr,
+ u_int32 total_size)
+{
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ unsigned int phy_addr;
+ unsigned int i;
+ MediaIPFW_Video_BufDesc *pSharedCmdBufDescPtr;
+ MediaIPFW_Video_BufDesc *pSharedMsgBufDescPtr;
+ MediaIPFW_Video_BufDesc *pDebugBufferDesc;
+ MediaIPFW_Video_BufDesc *pEngAccessBufferDesc;
+
+ This->shared_mem_phy = base_phy_addr;
+ This->shared_mem_vir = base_virt_addr;
+
+ pSharedInterface = (pDEC_RPC_HOST_IFACE)This->shared_mem_vir;
+ This->pSharedInterface = pSharedInterface;
+
+ pSharedInterface->FwExecBaseAddr = base_phy_addr;
+ pSharedInterface->FwExecAreaSize = total_size;
+
+ pSharedCmdBufDescPtr = (MediaIPFW_Video_BufDesc *)&pSharedInterface->StreamCmdBufferDesc;
+ pSharedMsgBufDescPtr = (MediaIPFW_Video_BufDesc *)&pSharedInterface->StreamMsgBufferDesc;
+
+ phy_addr = base_phy_addr + sizeof(DEC_RPC_HOST_IFACE);
+ This->cmd_mem_phy = phy_addr;
+ This->cmd_mem_vir = This->shared_mem_vir + sizeof(DEC_RPC_HOST_IFACE);
+
+ pSharedCmdBufDescPtr->uWrPtr = phy_addr;
+ pSharedCmdBufDescPtr->uRdPtr = pSharedCmdBufDescPtr->uWrPtr;
+ pSharedCmdBufDescPtr->uStart = pSharedCmdBufDescPtr->uWrPtr;
+ pSharedCmdBufDescPtr->uEnd = pSharedCmdBufDescPtr->uStart + CMD_SIZE;
+
+ phy_addr += CMD_SIZE;
+ This->msg_mem_phy = phy_addr;
+ This->msg_mem_vir = This->cmd_mem_vir + CMD_SIZE;
+
+ pSharedMsgBufDescPtr->uWrPtr = phy_addr;
+ pSharedMsgBufDescPtr->uRdPtr = pSharedMsgBufDescPtr->uWrPtr;
+ pSharedMsgBufDescPtr->uStart = pSharedMsgBufDescPtr->uWrPtr;
+ pSharedMsgBufDescPtr->uEnd = pSharedMsgBufDescPtr->uStart + MSG_SIZE;
+
+ phy_addr += MSG_SIZE;
+ This->codec_mem_phy = phy_addr;
+ This->codec_mem_vir = This->msg_mem_vir + MSG_SIZE;
+ pSharedInterface->CodecParamTabDesc.pCodecParamArrayBase = This->codec_mem_phy;
+
+ phy_addr += CODEC_SIZE;
+ This->jpeg_mem_phy = phy_addr;
+ This->jpeg_mem_vir = This->codec_mem_vir + CODEC_SIZE;
+ pSharedInterface->JpegParamTabDesc.pJpegParamArrayBase = This->jpeg_mem_phy;
+
+ phy_addr += JPEG_SIZE;
+ This->seq_mem_phy = phy_addr;
+ This->seq_mem_vir = This->jpeg_mem_vir + JPEG_SIZE;
+
+ pSharedInterface->SeqInfoTabDesc.pSeqInfoArrayBase = This->seq_mem_phy;
+
+ phy_addr += SEQ_SIZE;
+ This->pic_mem_phy = phy_addr;
+ This->pic_mem_vir = This->seq_mem_vir + SEQ_SIZE;
+
+ pSharedInterface->PicInfoTabDesc.pPicInfoArrayBase = This->pic_mem_phy;
+
+ phy_addr += PIC_SIZE;
+ This->gop_mem_phy = phy_addr;
+ This->gop_mem_vir = This->pic_mem_vir + PIC_SIZE;
+
+ pSharedInterface->GopInfoTabDesc.pGopInfoArrayBase = This->gop_mem_phy;
+
+ phy_addr += GOP_SIZE;
+ This->qmeter_mem_phy = phy_addr;
+ This->qmeter_mem_vir = This->gop_mem_vir + GOP_SIZE;
+
+ pSharedInterface->QMeterInfoTabDesc.pQMeterInfoArrayBase = This->qmeter_mem_phy;
+
+ phy_addr += QMETER_SIZE;
+ pDebugBufferDesc = &pSharedInterface->DebugBufferDesc;
+ pDebugBufferDesc->uWrPtr = base_phy_addr + M0_PRINT_OFFSET;
+ pDebugBufferDesc->uRdPtr = pDebugBufferDesc->uWrPtr;
+ pDebugBufferDesc->uStart = pDebugBufferDesc->uWrPtr;
+ pDebugBufferDesc->uEnd = pDebugBufferDesc->uStart + DEBUG_SIZE;
+
+ This->dbglog_mem_phy = phy_addr;
+ This->dbglog_mem_vir = This->qmeter_mem_vir + QMETER_SIZE;
+
+ pSharedInterface->DbgLogDesc.uDecStatusLogBase = This->dbglog_mem_phy;
+ pSharedInterface->DbgLogDesc.uDecStatusLogSize = DBGLOG_SIZE;
+ phy_addr += DBGLOG_SIZE;
+
+// phy_addr += sizeof(MediaIPFW_Video_BufDesc);
+ for (i = 0; i < VPU_MAX_NUM_STREAMS; i++) {
+ pEngAccessBufferDesc = &pSharedInterface->EngAccessBufferDesc[i];
+ pEngAccessBufferDesc->uWrPtr = phy_addr;
+ pEngAccessBufferDesc->uRdPtr = pEngAccessBufferDesc->uWrPtr;
+ pEngAccessBufferDesc->uStart = pEngAccessBufferDesc->uWrPtr;
+ pEngAccessBufferDesc->uEnd = pEngAccessBufferDesc->uStart + ENG_SIZE;
+ phy_addr += ENG_SIZE;
+ }
+
+ for (i = 0; i < VPU_MAX_NUM_STREAMS; i++) {
+ pSharedInterface->ptEncryptInfo[i] = phy_addr;
+ phy_addr += sizeof(MediaIPFW_Video_Encrypt_Info);
+ }
+}
+
+void rpc_set_stream_cfg_value(void *Interface, u_int32 str_idx, u_int32 vpu_dbe_num)
+{
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ u_int32 *CurrStrfg;
+
+ pSharedInterface = (pDEC_RPC_HOST_IFACE)Interface;
+ CurrStrfg = &pSharedInterface->StreamConfig[str_idx];
+ *CurrStrfg = 0;
+ //the value should be passed from application
+ VID_STREAM_CONFIG_STRBUFIDX_SET(0, CurrStrfg);
+ VID_STREAM_CONFIG_NOSEQ_SET(FALSE, CurrStrfg);
+ VID_STREAM_CONFIG_DEBLOCK_SET(FALSE, CurrStrfg);
+ VID_STREAM_CONFIG_DERING_SET(FALSE, CurrStrfg);
+ VID_STREAM_CONFIG_PLAY_MODE_SET(MEDIA_PLAYER_API_MODE_CONTINUOUS, CurrStrfg);
+ VID_STREAM_CONFIG_FS_CTRL_MODE_SET(MEDIA_PLAYER_FS_CTRL_MODE_EXTERNAL, CurrStrfg);
+ VID_STREAM_CONFIG_ENABLE_DCP_SET(TRUE, CurrStrfg);
+ VID_STREAM_CONFIG_NUM_STR_BUF_SET(1, CurrStrfg);
+ VID_STREAM_CONFIG_MALONE_USAGE_SET(1, CurrStrfg);
+ VID_STREAM_CONFIG_MULTI_VID_SET(FALSE, CurrStrfg);
+ VID_STREAM_CONFIG_OBFUSC_EN_SET(FALSE, CurrStrfg);
+ VID_STREAM_CONFIG_RC4_EN_SET(FALSE, CurrStrfg);
+ VID_STREAM_CONFIG_MCX_SET(TRUE, CurrStrfg);
+ VID_STREAM_CONFIG_PES_SET(FALSE, CurrStrfg);
+ VID_STREAM_CONFIG_NUM_DBE_SET(vpu_dbe_num, CurrStrfg);
+}
+
+void rpc_set_system_cfg_value(void *Interface, u_int32 regs_base)
+{
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ MEDIAIP_FW_SYSTEM_CONFIG *pSystemCfg;
+
+ pSharedInterface = (pDEC_RPC_HOST_IFACE)Interface;
+ pSystemCfg = &pSharedInterface->sSystemCfg;
+ pSystemCfg->uNumMalones = 1;
+ pSystemCfg->uMaloneBaseAddress[0] = (unsigned int)(regs_base + 0x180000);
+
+ pSystemCfg->uMaloneBaseAddress[0x1] = 0x0;
+ pSystemCfg->uHifOffset[0x0] = 0x1C000;
+ pSystemCfg->uHifOffset[0x1] = 0x0;
+
+ pSystemCfg->uDPVBaseAddr = 0x0;
+ pSystemCfg->uDPVIrqPin = 0x0;
+ pSystemCfg->uPixIfBaseAddr = (unsigned int)(regs_base + 0x180000 + 0x20000);
+ pSystemCfg->uFSLCacheBaseAddr[0] = (unsigned int)(regs_base + 0x60000);
+ pSystemCfg->uFSLCacheBaseAddr[1] = (unsigned int)(regs_base + 0x68000);
+}
+
+u_int32 rpc_MediaIPFW_Video_buffer_space_check(MediaIPFW_Video_BufDesc *pBufDesc,
+ BOOL bFull,
+ u_int32 uSize,
+ u_int32 *puUpdateAddress)
+{
+ u_int32 uPtr1;
+ u_int32 uPtr2;
+ u_int32 uStart;
+ u_int32 uEnd;
+ u_int32 uTemp;
+
+ /* bFull is FALSE when send message, write data */
+ /* bFull is TRUE when process commands, read data */
+ uPtr1 = (bFull) ? pBufDesc->uRdPtr : pBufDesc->uWrPtr;
+ uPtr2 = (bFull) ? pBufDesc->uWrPtr : pBufDesc->uRdPtr;
+
+ if (uPtr1 == uPtr2) {
+ if (bFull)
+ /* No data at all to read */
+ return 0;
+ else {
+ /* wrt pointer equal to read pointer thus the */
+ /* buffer is completely empty for further writes */
+ uStart = pBufDesc->uStart;
+ uEnd = pBufDesc->uEnd;
+ /* The address to be returned in this case is for */
+ /* the updated write pointer. */
+ uTemp = uPtr1 + uSize;
+ if (uTemp >= uEnd)
+ uTemp += (uStart - uEnd);
+ *puUpdateAddress = uTemp;
+ return (uEnd - uStart);
+ }
+ } else if (uPtr1 < uPtr2) {
+ /* return updated rd pointer address */
+ /* In this case if size was too big - we expect the */
+ /* external ftn to compare the size against the */
+ /* space returned.
+ */
+ *puUpdateAddress = uPtr1 + uSize;
+ return (uPtr2 - uPtr1);
+ }
+ /* We know the system has looped!! */
+ uStart = pBufDesc->uStart;
+ uEnd = pBufDesc->uEnd;
+ uTemp = uPtr1 + uSize;
+ if (uTemp >= uEnd)
+ uTemp += (uStart - uEnd);
+ *puUpdateAddress = uTemp;
+ return ((uEnd - uPtr1) + (uPtr2 - uStart));
+}
+
+static void rpc_update_cmd_buffer_ptr(MediaIPFW_Video_BufDesc *pCmdDesc)
+{
+ u_int32 uWritePtr;
+
+ mb();
+ uWritePtr = pCmdDesc->uWrPtr + 4;
+ if (uWritePtr >= pCmdDesc->uEnd)
+ uWritePtr = pCmdDesc->uStart;
+ pCmdDesc->uWrPtr = uWritePtr;
+}
+
+void rpc_send_cmd_buf(struct shared_addr *This,
+ u_int32 idx,
+ u_int32 cmdid,
+ u_int32 cmdnum,
+ u_int32 *local_cmddata)
+{
+ pDEC_RPC_HOST_IFACE pSharedInterface = (pDEC_RPC_HOST_IFACE)This->shared_mem_vir;
+ MediaIPFW_Video_BufDesc *pCmdDesc = &pSharedInterface->StreamCmdBufferDesc;
+ u_int32 *cmddata;
+ u_int32 i;
+ u_int32 *cmdword = (u_int32 *)(This->cmd_mem_vir+pCmdDesc->uWrPtr - pCmdDesc->uStart);
+
+ *cmdword = 0;
+ *cmdword |= ((idx & 0x000000ff) << 24);
+ *cmdword |= ((cmdnum & 0x000000ff) << 16);
+ *cmdword |= ((cmdid & 0x00003fff) << 0);
+ rpc_update_cmd_buffer_ptr(pCmdDesc);
+
+ for (i = 0; i < cmdnum; i++) {
+ cmddata = (u_int32 *)(This->cmd_mem_vir+pCmdDesc->uWrPtr - pCmdDesc->uStart);
+ *cmddata = local_cmddata[i];
+ rpc_update_cmd_buffer_ptr(pCmdDesc);
+ }
+}
+
+u_int32 rpc_MediaIPFW_Video_message_check(struct shared_addr *This)
+{
+ u_int32 uSpace;
+ u_int32 uIgnore;
+ pDEC_RPC_HOST_IFACE pSharedInterface = (pDEC_RPC_HOST_IFACE)This->shared_mem_vir;
+ MediaIPFW_Video_BufDesc *pMsgDesc = &pSharedInterface->StreamMsgBufferDesc;
+ u_int32 msgword;
+ u_int32 msgnum;
+
+ uSpace = rpc_MediaIPFW_Video_buffer_space_check(pMsgDesc, TRUE, 0, &uIgnore);
+ uSpace = (uSpace >> 2);
+ if (uSpace) {
+ /* get current msgword word */
+ msgword = *((u_int32 *)(This->msg_mem_vir+pMsgDesc->uRdPtr - pMsgDesc->uStart));
+ /* Find the number of additional words */
+ msgnum = ((msgword & 0x00ff0000) >> 16);
+
+ /*
+ * * Check the number of message words against
+ * * 1) a limit - some sort of maximum or at least
+ * * the size of the SW buffer the message is read into
+ * * 2) The space reported (where space is write ptr - read ptr in 32bit words)
+ * * It must be less than space (as opposed to <=) because
+ * * the message itself is not included in msgword
+ */
+ if (msgnum < VID_API_MESSAGE_LIMIT) {
+ if (msgnum < uSpace)
+ return API_MSG_AVAILABLE;
+ else
+ return API_MSG_INCOMPLETE;
+ } else
+ return API_MSG_BUFFER_ERROR;
+ }
+ return API_MSG_UNAVAILABLE;
+}
+
+static void rpc_update_msg_buffer_ptr(MediaIPFW_Video_BufDesc *pMsgDesc)
+{
+ u_int32 uReadPtr;
+
+ mb();
+ uReadPtr = pMsgDesc->uRdPtr + 4;
+ if (uReadPtr >= pMsgDesc->uEnd)
+ uReadPtr = pMsgDesc->uStart;
+ pMsgDesc->uRdPtr = uReadPtr;
+}
+
+void rpc_receive_msg_buf(struct shared_addr *This, struct event_msg *msg)
+{
+ unsigned int i;
+ pDEC_RPC_HOST_IFACE pSharedInterface = (pDEC_RPC_HOST_IFACE)This->shared_mem_vir;
+ MediaIPFW_Video_BufDesc *pMsgDesc = &pSharedInterface->StreamMsgBufferDesc;
+ u_int32 msgword = *((u_int32 *)(This->msg_mem_vir+pMsgDesc->uRdPtr - pMsgDesc->uStart));
+
+ msg->idx = ((msgword & 0xff000000) >> 24);
+ msg->msgnum = ((msgword & 0x00ff0000) >> 16);
+ msg->msgid = ((msgword & 0x00003fff) >> 0);
+ rpc_update_msg_buffer_ptr(pMsgDesc);
+
+ for (i = 0; i < msg->msgnum; i++) {
+ msg->msgdata[i] = *((u_int32 *)(This->msg_mem_vir+pMsgDesc->uRdPtr - pMsgDesc->uStart));
+ rpc_update_msg_buffer_ptr(pMsgDesc);
+ }
+}
diff --git a/drivers/mxc/vpu_malone/vpu_rpc.h b/drivers/mxc/vpu_malone/vpu_rpc.h
new file mode 100644
index 000000000000..36fbae8f8f63
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_rpc.h
@@ -0,0 +1,118 @@
+/*
+ * This file is provided under a dual BSD/GPLv2 license. When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __VPU_IPC_H
+#define __VPU_IPC_H
+
+#include "mediasys_types.h"
+
+#define CMD_SIZE 25600
+#define MSG_SIZE 25600
+#define CODEC_SIZE 0x1000
+#define JPEG_SIZE 0x1000
+#define SEQ_SIZE 0x1000
+#define GOP_SIZE 0x1000
+#define PIC_SIZE 0x1000
+#define QMETER_SIZE 0x1000
+#define DBGLOG_SIZE 0x10000
+#define DEBUG_SIZE 0x80000
+#define ENG_SIZE 0x1000
+#define LOCAL_MSG_NUM VID_API_MESSAGE_LIMIT
+#define M0_PRINT_OFFSET 0x180000
+
+struct shared_addr {
+ pDEC_RPC_HOST_IFACE pSharedInterface;
+ unsigned long long shared_mem_phy;
+ void *shared_mem_vir;
+ unsigned long long cmd_mem_phy;
+ void *cmd_mem_vir;
+ unsigned long long msg_mem_phy;
+ void *msg_mem_vir;
+ unsigned long long codec_mem_phy;
+ void *codec_mem_vir;
+ unsigned long long jpeg_mem_phy;
+ void *jpeg_mem_vir;
+ unsigned long long seq_mem_phy;
+ void *seq_mem_vir;
+ unsigned long long pic_mem_phy;
+ void *pic_mem_vir;
+ unsigned long long gop_mem_phy;
+ void *gop_mem_vir;
+ unsigned long long qmeter_mem_phy;
+ void *qmeter_mem_vir;
+ unsigned long long dbglog_mem_phy;
+ void *dbglog_mem_vir;
+};
+
+struct event_msg {
+ u_int32 idx;
+ u_int32 msgnum;
+ u_int32 msgid;
+ u_int32 msgdata[LOCAL_MSG_NUM];
+};
+
+void rpc_init_shared_memory(struct shared_addr *This,
+ unsigned long long base_phy_addr,
+ void *base_virt_addr,
+ u_int32 total_size);
+void rpc_set_system_cfg_value(void *Interface, u_int32 regs_base);
+void rpc_set_stream_cfg_value(void *Interface, u_int32 str_idx, u_int32 vpu_dbe_num);
+void rpc_send_cmd_buf(struct shared_addr *This,
+ u_int32 idx,
+ u_int32 cmdid,
+ u_int32 cmdnum,
+ u_int32 *local_cmddata);
+void rpc_receive_msg_buf(struct shared_addr *This, struct event_msg *msg);
+
+#endif
diff --git a/drivers/mxc/vpu_malone/vpu_ts.c b/drivers/mxc/vpu_malone/vpu_ts.c
new file mode 100644
index 000000000000..ac9eff844f4b
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_ts.c
@@ -0,0 +1,619 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ * Module Name: TimeStamp.c
+ *
+ * Description: include TimeStamp stratege for VPU / SW video decoder plugin
+ *
+ * Portability: This code is written for Linux OS and Gstreamer
+ */
+
+#include <linux/slab.h>
+#include <linux/string.h>
+
+#include "vpu_ts.h"
+
+int debug_level;
+
+static void tsm_free_received_entry(TSMRecivedCtl *rctl,
+ TSMReceivedEntry *entry)
+{
+ entry->next = rctl->free;
+ rctl->free = entry;
+}
+
+
+static TSMReceivedEntry *tsm_new_received_entry(TSMRecivedCtl *rctl)
+{
+ TSMReceivedEntry *ret = NULL;
+
+ if (rctl->free) {
+ ret = rctl->free;
+ rctl->free = ret->next;
+ } else {
+ TSMReceivedEntryMemory *p = kzalloc(sizeof(TSMReceivedEntryMemory), GFP_KERNEL);
+
+ if (p) {
+ int i;
+
+ for (i = 1; i < TSM_RECEIVED_NUNBER; i++) {
+ TSMReceivedEntry *e = &p->entrys[i];
+
+ tsm_free_received_entry(rctl, e);
+ };
+ p->next = rctl->memory;
+ rctl->memory = p;
+ ret = p->entrys;
+ }
+ }
+ return ret;
+}
+
+
+void TSManagerReceive2(void *handle, TSM_TIMESTAMP timestamp, int size)
+{
+#define CLEAR_TSM_RENTRY(entry)\
+ do { \
+ (entry)->used = 0; \
+ (entry)->subentry = 0; \
+ (entry)->next = NULL; \
+ } while (0)
+ TSManager *tsm = (TSManager *) handle;
+
+ TSM_VERBOSE("receive2 %u:%02u:%02u.%09u size %d\n",
+ TSM_TIME_H(timestamp),
+ TSM_TIME_M(timestamp),
+ TSM_TIME_S(timestamp),
+ TSM_TIME_NS(timestamp),
+ size);
+
+ if (tsm) {
+ if (size > 0) {
+ TSMRecivedCtl *rctl = &tsm->rctl;
+ TSMReceivedEntry *e = tsm_new_received_entry(rctl);
+
+ if (e) {
+ CLEAR_TSM_RENTRY(e);
+ if ((rctl->tail) && (rctl->tail->ts == timestamp))
+ e->subentry = 1;
+ e->ts = timestamp;
+ e->size = size;
+ if (rctl->tail) {
+ rctl->tail->next = e;
+ rctl->tail = e;
+ } else
+ rctl->head = rctl->tail = e;
+ }
+ rctl->cnt++;
+ } else
+ TSManagerReceive(handle, timestamp);
+ }
+}
+
+
+static TSM_TIMESTAMP TSManagerGetLastTimeStamp(TSMRecivedCtl *rctl,
+ int size, int use)
+{
+ TSM_TIMESTAMP ts = TSM_TIMESTAMP_NONE;
+ TSMReceivedEntry *e;
+
+ while ((size > 0) && (e = rctl->head)) {
+ if (TSM_TS_IS_VALID(e->ts))
+ ts = ((e->used) ? (TSM_TIMESTAMP_NONE) : (e->ts));
+
+ TSM_VERBOSE("ts get: %u:%02u:%02u.%09u\n",
+ TSM_TIME_H(ts),
+ TSM_TIME_M(ts),
+ TSM_TIME_S(ts),
+ TSM_TIME_NS(ts));
+
+ if (use)
+ e->used = 1;
+ if (size >= e->size) {
+ rctl->head = e->next;
+ if (rctl->head == NULL)
+ rctl->tail = NULL;
+ else {
+ if (rctl->head->subentry)
+ rctl->head->used = e->used;
+ }
+ size -= e->size;
+ rctl->cnt--;
+ tsm_free_received_entry(rctl, e);
+ } else {
+ e->size -= size;
+ size = 0;
+ }
+ }
+ return ts;
+}
+
+
+void TSManagerFlush2(void *handle, int size)
+{
+ TSManager *tsm = (TSManager *) handle;
+
+ if (tsm)
+ TSManagerGetLastTimeStamp(&tsm->rctl, size, 0);
+}
+
+
+/*======================================================================================
+FUNCTION: mfw_gst_receive_ts
+
+DESCRIPTION: Check timestamp and do frame dropping if enabled
+
+ARGUMENTS PASSED: pTimeStamp_Object - TimeStamp Manager to handle related timestamp
+ timestamp - time stamp of the input buffer which has video data.
+RETURN VALUE: None
+PRE-CONDITIONS: None
+POST-CONDITIONS: None
+IMPORTANT NOTES: None
+=======================================================================================*/
+static void _TSManagerReceive(void *handle, TSM_TIMESTAMP timestamp, void *key)
+{
+ TSManager *tsm = (TSManager *) handle;
+
+ if (tsm) {
+ if (TSM_TS_IS_VALID(timestamp) && (tsm->rx_cnt))
+ tsm->valid_ts_received = 1;
+ tsm->rx_cnt++;
+ if (tsm->cnt < tsm->ts_buf_size - 1) {
+ tsm->cnt++;
+ if (tsm->mode == MODE_AI) {
+ if (TSM_TS_IS_VALID(timestamp)) {
+ if (tsm->first_rx) {
+ tsm->last_ts_received = timestamp;
+ tsm->first_rx = 0;
+ } else {
+ if (tsm->suspicious_ts) {
+ if (timestamp >= tsm->suspicious_ts)
+ tsm->last_ts_received = timestamp;
+ tsm->suspicious_ts = 0;
+ }
+ if ((timestamp > tsm->last_ts_received)
+ && (timestamp - tsm->last_ts_received > tsm->discont_threshold)) {
+ tsm->suspicious_ts = timestamp;
+ timestamp = TSM_TIMESTAMP_NONE;
+ }
+ }
+ }
+
+ if (TSM_TS_IS_VALID(timestamp)) { // && (TSM_ABS(timestamp, tsm->last_ts_sent)<TSM_SECOND*10))
+ tsm->ts_buf[tsm->rx].ts = timestamp;
+ tsm->ts_buf[tsm->rx].age = tsm->age + TSM_PLUS_AGE(tsm);
+ tsm->ts_buf[tsm->rx].key = key;
+ tsm->last_ts_received = timestamp;
+#ifdef DEBUG
+ //printf("age should %lld %lld\n", tsm->age, tsm->ts_buf[tsm->rx].age);
+ //printf("++++++ distance = %d tx=%d, rx=%d, invalid count=%d\n", TSM_DISTANCE(tsm), tsm->tx, tsm->rx,tsm->invalid_ts_count);
+#endif
+ tsm->rx = ((tsm->rx + 1) % tsm->ts_buf_size);
+ } else
+ tsm->invalid_ts_count++;
+ } else if (tsm->mode == MODE_FIFO) {
+ tsm->ts_buf[tsm->rx].ts = timestamp;
+ tsm->rx = ((tsm->rx + 1) % tsm->ts_buf_size);
+ }
+ TSM_LOG("++Receive %d:%u:%02u:%02u.%09u, invalid:%d, size:%d key %p\n",
+ tsm->rx_cnt,
+ TSM_TIME_H(timestamp),
+ TSM_TIME_M(timestamp),
+ TSM_TIME_S(timestamp),
+ TSM_TIME_NS(timestamp),
+ tsm->invalid_ts_count,
+ tsm->cnt,
+ key);
+ } else
+ TSM_ERROR("Too many timestamps recieved!! (cnt=%d)\n", tsm->cnt);
+ }
+}
+
+void TSManagerValid2(void *handle, int size, void *key)
+{
+ TSManager *tsm = (TSManager *) handle;
+
+ TSM_VERBOSE("valid2 size %d\n", size);
+
+ if (tsm) {
+ TSM_TIMESTAMP ts;
+
+ ts = TSManagerGetLastTimeStamp(&tsm->rctl, size, 1);
+ TSM_VERBOSE("TSManagerGetLastTimeStamp: %u:%02u:%02u.%09u\n",
+ TSM_TIME_H(ts),
+ TSM_TIME_M(ts),
+ TSM_TIME_S(ts),
+ TSM_TIME_NS(ts));
+ _TSManagerReceive(tsm, ts, key);
+ }
+}
+
+void TSManagerReceive(void *handle, TSM_TIMESTAMP timestamp)
+{
+ _TSManagerReceive(handle, timestamp, TSM_KEY_NONE);
+}
+
+
+/*======================================================================================
+FUNCTION: TSManagerSend
+
+DESCRIPTION: Check timestamp and do frame dropping if enabled
+
+ARGUMENTS PASSED: pTimeStamp_Object - TimeStamp Manager to handle related timestamp
+ ptimestamp - returned timestamp to use at render
+
+RETURN VALUE: None
+PRE-CONDITIONS: None
+POST-CONDITIONS: None
+IMPORTANT NOTES: None
+=======================================================================================*/
+static TSM_TIMESTAMP _TSManagerSend2(void *handle, void *key, int send)
+{
+ TSManager *tsm = (TSManager *) handle;
+ int i;
+ int index = -1;
+ int isValidTs = 0;
+ TSM_TIMESTAMP ts0 = 0, tstmp = TSM_TIMESTAMP_NONE;
+ unsigned long long age = 0;
+ TSM_TIMESTAMP half_interval;
+
+ if (tsm == NULL)
+ return tstmp;
+
+ i = tsm->tx;
+ half_interval = TSM_ADAPTIVE_INTERVAL (tsm) >> 1;
+
+ if (tsm) {
+ if (send)
+ tsm->tx_cnt++;
+ else {
+ tsm->cnt++;
+ tsm->invalid_ts_count++;
+ }
+ if (tsm->cnt > 0) {
+ if (send)
+ tsm->cnt--;
+
+ if (tsm->mode == MODE_AI) {
+ if (tsm->first_tx == 0)
+ tstmp = tsm->last_ts_sent + TSM_ADAPTIVE_INTERVAL(tsm);
+ else
+ tstmp = tsm->last_ts_sent;
+
+ while (i != tsm->rx) {
+ if (index >= 0) {
+ if (tsm->ts_buf[i].ts < ts0) {
+ ts0 = tsm->ts_buf[i].ts;
+ age = tsm->ts_buf[i].age;
+ index = i;
+ }
+ } else {
+ ts0 = tsm->ts_buf[i].ts;
+ age = tsm->ts_buf[i].age;
+ index = i;
+ }
+ if ((TSM_KEY_IS_VALID(key)) && (key == tsm->ts_buf[i].key))
+ break;
+ i = ((i + 1) % tsm->ts_buf_size);
+ }
+ if (index >= 0) {
+ if ((tsm->invalid_ts_count) && (ts0 >= ((tstmp) + half_interval))
+ && (age > tsm->age)) {
+ /* use calculated ts0 */
+ if (send)
+ tsm->invalid_ts_count--;
+ } else {
+ if (send) {
+ if (index != tsm->tx)
+ tsm->ts_buf[index] = tsm->ts_buf[tsm->tx];
+
+ tsm->tx = ((tsm->tx + 1) % tsm->ts_buf_size);
+ }
+#if 0
+ if (ts0 >= ((tstmp) + half_interval))
+ tstmp = tstmp;
+ else
+ tstmp = ts0;
+#else
+ tstmp = ts0;
+#endif
+ isValidTs = 1;
+ }
+ } else {
+ if (send)
+ tsm->invalid_ts_count--;
+ }
+
+ if (tsm->first_tx == 0) {
+ if (tstmp > tsm->last_ts_sent)
+ ts0 = (tstmp - tsm->last_ts_sent);
+ else {
+ ts0 = 0;
+ //reset the timestamp to last frame only when new frames's timestamp is earlier than one frame.
+ if (tstmp + TSM_ADAPTIVE_INTERVAL(tsm) * 3 / 2 < tsm->last_ts_sent)
+ tstmp = tsm->last_ts_sent;
+ }
+
+ if (ts0 > TSM_ADAPTIVE_INTERVAL(tsm) * 3 / 2) {
+ TSM_WARNING("Jitter1:%u:%02u:%02u.%09u %u:%02u:%02u.%09u\n",
+ TSM_TIME_H(ts0),
+ TSM_TIME_M(ts0),
+ TSM_TIME_S(ts0),
+ TSM_TIME_NS(ts0),
+ TSM_TIME_H(TSM_ADAPTIVE_INTERVAL(tsm) * 3 / 2),
+ TSM_TIME_M(TSM_ADAPTIVE_INTERVAL(tsm) * 3 / 2),
+ TSM_TIME_S(TSM_ADAPTIVE_INTERVAL(tsm) * 3 / 2),
+ TSM_TIME_NS(TSM_ADAPTIVE_INTERVAL(tsm) * 3 / 2));
+ } else if (ts0 == 0)
+ TSM_WARNING("Jitter:%u:%02u:%02u.%09u\n",
+ TSM_TIME_H(ts0),
+ TSM_TIME_M(ts0),
+ TSM_TIME_S(ts0),
+ TSM_TIME_NS(ts0));
+
+ if (send) {
+ if (isValidTs && ts0 > TSM_ADAPTIVE_INTERVAL(tsm) * 2)
+ ts0 = TSM_ADAPTIVE_INTERVAL(tsm) * 2;
+ if ((ts0 <= TSM_ADAPTIVE_INTERVAL(tsm) * 2) || (tsm->big_cnt > 3)) {
+ tsm->big_cnt = 0;
+ tsm->dur_history_total -=
+ tsm->dur_history_buf[tsm->dur_history_tx];
+ tsm->dur_history_buf[tsm->dur_history_tx] = ts0;
+ tsm->dur_history_tx =
+ ((tsm->dur_history_tx + 1) % TSM_HISTORY_SIZE);
+ tsm->dur_history_total += ts0;
+ } else
+ tsm->big_cnt++;
+ }
+ }
+ if (send) {
+ tsm->last_ts_sent = tstmp;
+ tsm->age++;
+ tsm->first_tx = 0;
+ }
+ } else if (tsm->mode == MODE_FIFO) {
+ tstmp = tsm->ts_buf[tsm->tx].ts;
+ if (send)
+ tsm->tx = ((tsm->tx + 1) % tsm->ts_buf_size);
+
+ ts0 = tstmp - tsm->last_ts_sent;
+ if (send)
+ tsm->last_ts_sent = tstmp;
+ }
+
+ if (send) {
+ TSM_LOG("--Send %d:%u:%02u:%02u.%09u, int:%u:%02u:%02u.%09u, avg:%u:%02u:%02u.%09u inkey %p\n",
+ tsm->tx_cnt,
+ TSM_TIME_H(tstmp),
+ TSM_TIME_M(tstmp),
+ TSM_TIME_S(tstmp),
+ TSM_TIME_NS(tstmp),
+ TSM_TIME_H(ts0),
+ TSM_TIME_M(ts0),
+ TSM_TIME_S(ts0),
+ TSM_TIME_NS(ts0),
+ TSM_TIME_H(TSM_ADAPTIVE_INTERVAL(tsm)),
+ TSM_TIME_M(TSM_ADAPTIVE_INTERVAL(tsm)),
+ TSM_TIME_S(TSM_ADAPTIVE_INTERVAL(tsm)),
+ TSM_TIME_NS(TSM_ADAPTIVE_INTERVAL(tsm)),
+ key);
+ }
+ } else {
+ if (tsm->valid_ts_received == 0) {
+ if (tsm->first_tx)
+ tstmp = tsm->last_ts_sent;
+ else
+ tstmp = tsm->last_ts_sent + TSM_ADAPTIVE_INTERVAL(tsm);
+
+ if (send) {
+ tsm->first_tx = 0;
+ tsm->last_ts_sent = tstmp;
+ }
+ }
+ TSM_ERROR("Too many timestamps send!!\n");
+ }
+ if (send == 0) {
+ tsm->cnt--;
+ tsm->invalid_ts_count--;
+ }
+ }
+
+ return tstmp;
+}
+
+
+TSM_TIMESTAMP TSManagerSend2(void *handle, void *key)
+{
+ return _TSManagerSend2(handle, key, 1);
+}
+
+
+TSM_TIMESTAMP TSManagerQuery2(void *handle, void *key)
+{
+ return _TSManagerSend2(handle, key, 0);
+}
+
+
+TSM_TIMESTAMP TSManagerSend(void *handle)
+{
+ return TSManagerSend2(handle, TSM_KEY_NONE);
+}
+
+
+TSM_TIMESTAMP TSManagerQuery(void *handle)
+{
+ return TSManagerQuery2(handle, TSM_KEY_NONE);
+}
+
+
+void resyncTSManager(void *handle, TSM_TIMESTAMP synctime, TSMGR_MODE mode)
+{
+ TSManager *tsm = (TSManager *) handle;
+
+ if (tsm) {
+ TSMRecivedCtl *rctl = &tsm->rctl;
+ TSMReceivedEntry *e = rctl->head;
+
+ while ((e = rctl->head)) {
+ rctl->head = e->next;
+ tsm_free_received_entry(rctl, e);
+ };
+ rctl->cnt = 0;
+
+ rctl->tail = NULL;
+
+ tsm->first_tx = 1;
+ tsm->first_rx = 1;
+ tsm->suspicious_ts = 0;
+
+ if (TSM_TS_IS_VALID(synctime))
+ tsm->last_ts_sent = synctime;
+
+ tsm->tx = tsm->rx = 0;
+ tsm->invalid_ts_count = 0;
+ tsm->mode = mode;
+ tsm->age = 0;
+ tsm->rx_cnt = tsm->tx_cnt = tsm->cnt = 0;
+ tsm->valid_ts_received = 0;
+ tsm->big_cnt = 0;
+ }
+}
+
+
+/*======================================================================================
+FUNCTION: mfw_gst_init_ts
+
+DESCRIPTION: alloc and initialize timestamp strcture
+
+ARGUMENTS PASSED: ppTimeStamp_Object - pointer of TimeStamp Manager to handle related timestamp
+
+RETURN VALUE: TimeStamp structure pointer
+PRE-CONDITIONS: None
+POST-CONDITIONS: None
+IMPORTANT NOTES: None
+=======================================================================================*/
+void *createTSManager(int ts_buf_size)
+{
+ TSManager *tsm = (TSManager *) kzalloc(sizeof(TSManager), GFP_KERNEL);
+
+ if (tsm) {
+ memset(tsm, 0, sizeof(TSManager));
+ if (ts_buf_size <= 0)
+ ts_buf_size = TSM_DEFAULT_TS_BUFFER_SIZE;
+
+ tsm->ts_buf_size = ts_buf_size;
+ tsm->ts_buf = kzalloc(sizeof(TSMControl) * ts_buf_size, GFP_KERNEL);
+
+ if (tsm->ts_buf == NULL)
+ goto fail;
+
+ resyncTSManager(tsm, (TSM_TIMESTAMP) 0, MODE_AI);
+
+ tsm->dur_history_tx = 0;
+ TSM_BUFFER_SET(tsm->dur_history_buf, TSM_DEFAULT_INTERVAL,
+ TSM_HISTORY_SIZE);
+ tsm->dur_history_total = TSM_DEFAULT_INTERVAL << TSM_HISTORY_POWER;
+
+ tsm->discont_threshold = 10000000000LL; // 10s
+ }
+ return tsm;
+fail:
+ if (tsm) {
+ if (tsm->ts_buf)
+ kfree(tsm->ts_buf);
+ kfree(tsm);
+ tsm = NULL;
+ }
+ return tsm;
+}
+
+
+void destroyTSManager(void *handle)
+{
+ TSManager *tsm = (TSManager *) handle;
+
+ if (tsm) {
+ TSMRecivedCtl *rctl = &tsm->rctl;
+ TSMReceivedEntryMemory *rmem;
+
+ if (tsm->ts_buf)
+ kfree(tsm->ts_buf);
+
+ while ((rmem = rctl->memory)) {
+ rctl->memory = rmem->next;
+ kfree(rmem);
+ }
+ kfree(tsm);
+ tsm = NULL;
+ }
+}
+
+
+void setTSManagerFrameRate(void *handle, int fps_n, int fps_d)
+//void setTSManagerFrameRate(void * handle, float framerate)
+{
+ TSManager *tsm = (TSManager *) handle;
+ TSM_TIMESTAMP ts;
+
+ if ((fps_n > 0) && (fps_d > 0) && (fps_n / fps_d <= 80))
+ ts = TSM_SECOND * fps_d / fps_n;
+ else
+ ts = TSM_DEFAULT_INTERVAL;
+ // TSM_TIMESTAMP ts = TSM_SECOND / framerate;
+
+ if (tsm) {
+ TSM_BUFFER_SET(tsm->dur_history_buf, ts, TSM_HISTORY_SIZE);
+ tsm->dur_history_total = (ts << TSM_HISTORY_POWER);
+ TSM_LOG("Set frame intrval:%u:%02u:%02u.%09u\n",
+ TSM_TIME_H(ts),
+ TSM_TIME_M(ts),
+ TSM_TIME_S(ts),
+ TSM_TIME_NS(ts));
+ }
+}
+
+TSM_TIMESTAMP getTSManagerFrameInterval(void *handle)
+{
+ TSManager *tsm = (TSManager *) handle;
+ TSM_TIMESTAMP ts = 0;
+
+ if (tsm)
+ ts = TSM_ADAPTIVE_INTERVAL(tsm);
+
+ return ts;
+}
+
+
+TSM_TIMESTAMP getTSManagerPosition(void *handle)
+{
+ TSManager *tsm = (TSManager *) handle;
+ TSM_TIMESTAMP ts = 0;
+
+ if (tsm)
+ ts = tsm->last_ts_sent;
+
+ return ts;
+}
+
+
+int getTSManagerPreBufferCnt(void *handle)
+{
+ int i = 0;
+ TSManager *tsm = (TSManager *) handle;
+
+ if (tsm)
+ i = tsm->rctl.cnt;
+
+ return i;
+}
diff --git a/drivers/mxc/vpu_malone/vpu_ts.h b/drivers/mxc/vpu_malone/vpu_ts.h
new file mode 100644
index 000000000000..e51e4d62ecfd
--- /dev/null
+++ b/drivers/mxc/vpu_malone/vpu_ts.h
@@ -0,0 +1,252 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ * Module Name: TimeStamp.h
+ *
+ * Description: include TimeStamp stratege for VPU / SW video decoder plugin
+ *
+ * Portability: This code is written for Linux OS and Gstreamer
+ */
+
+#ifndef _TIMESTAMP_H_
+#define _TIMESTAMP_H_
+
+
+/**
+ * GST_CLOCK_TIME_NONE:
+ *
+ * Constant to define an undefined clock time.
+ */
+
+typedef long long TSM_TIMESTAMP;
+
+typedef enum {
+ MODE_AI,
+ MODE_FIFO,
+} TSMGR_MODE;
+
+#define TSM_TIMESTAMP_NONE ((long long)(-1))
+#define TSM_KEY_NONE ((void *)0)
+
+enum {
+ DEBUG_LEVEL_ERROR = 1,
+ DEBUG_LEVEL_WARNING,
+ DEBUG_LEVEL_LOG,
+ DEBUG_LEVEL_VERBOSE,
+};
+
+#define TSM_MESSAGE(level, fmt, ...) \
+ do { \
+ if (debug_level >= (level)) { \
+ pr_info("TSM:"fmt, ##__VA_ARGS__); \
+ } \
+ } while (0)
+
+#define TSM_ERROR(...) TSM_MESSAGE(DEBUG_LEVEL_ERROR, ##__VA_ARGS__)
+#define TSM_WARNING(...) TSM_MESSAGE(DEBUG_LEVEL_WARNING, ##__VA_ARGS__)
+#define TSM_LOG(...) TSM_MESSAGE(DEBUG_LEVEL_LOG, ##__VA_ARGS__)
+#define TSM_VERBOSE(...) TSM_MESSAGE(DEBUG_LEVEL_VERBOSE, ##__VA_ARGS__)
+
+#define TSM_HISTORY_POWER 5
+#define TSM_HISTORY_SIZE (1 << TSM_HISTORY_POWER)
+#define TSM_ADAPTIVE_INTERVAL(tsm) \
+ (tsm->dur_history_total >> TSM_HISTORY_POWER)
+
+#define TSM_SECOND ((TSM_TIMESTAMP)1000000000)
+#define TSM_DEFAULT_INTERVAL (TSM_SECOND/30)
+#define TSM_DEFAULT_TS_BUFFER_SIZE (128)
+
+#define TSM_TS_IS_VALID(ts) \
+ ((ts) != TSM_TIMESTAMP_NONE)
+
+#define TSM_KEY_IS_VALID(key) \
+ ((key) != TSM_KEY_NONE)
+
+#define TSM_DISTANCE(tsm)\
+ (((tsm->rx) >= (tsm->tx))?((tsm->rx)-(tsm->tx)):(tsm->ts_buf_size-(tsm->tx)+(tsm->rx)))
+
+#define TSM_PLUS_AGE(tsm)\
+ (TSM_DISTANCE(tsm)+tsm->invalid_ts_count+2)
+
+#define TSM_ABS(ts0, ts1)\
+ (((ts0) > (ts1))?((ts0)-(ts1)):((ts1)-(ts0)))
+
+#define TSM_TIME_H(t) \
+ (TSM_TS_IS_VALID(t) ? \
+ (unsigned int) (((TSM_TIMESTAMP)(t)) / (TSM_SECOND * 60 * 60)) : 99)
+#define TSM_TIME_M(t) \
+ (TSM_TS_IS_VALID(t) ? \
+ (unsigned int) ((((TSM_TIMESTAMP)(t)) / (TSM_SECOND * 60)) % 60) : 99)
+#define TSM_TIME_S(t) \
+ (TSM_TS_IS_VALID(t) ? \
+ (unsigned int) ((((TSM_TIMESTAMP)(t)) / TSM_SECOND) % 60) : 99)
+#define TSM_TIME_NS(t) \
+ (TSM_TS_IS_VALID(t) ? \
+ (unsigned int) (((TSM_TIMESTAMP)(t)) % TSM_SECOND) : 999999999)
+
+#define TSM_BUFFER_SET(buf, value, size) \
+ do { \
+ int i; \
+ for (i = 0; i < (size); i++) { \
+ (buf)[i] = (value); \
+ } \
+ } while (0)
+
+#define TSM_RECEIVED_NUNBER 512
+
+typedef struct {
+ TSM_TIMESTAMP ts;
+ unsigned long long age;
+ void *key;
+} TSMControl;
+
+typedef struct _TSMReceivedEntry {
+ TSM_TIMESTAMP ts;
+ struct _TSMReceivedEntry *next;
+ unsigned int used:1;
+ unsigned int subentry:1;
+ int size;
+} TSMReceivedEntry;
+
+typedef struct _TSMReceivedEntryMemory {
+ struct _TSMReceivedEntryMemory *next;
+ TSMReceivedEntry entrys[TSM_RECEIVED_NUNBER];
+} TSMReceivedEntryMemory;
+
+typedef struct {
+ TSMReceivedEntry *head;
+ TSMReceivedEntry *tail;
+ TSMReceivedEntry *free;
+ TSMReceivedEntryMemory *memory;
+ int cnt;
+} TSMRecivedCtl;
+
+typedef struct _TSManager {
+ int first_tx;
+ int first_rx;
+ int rx; //timestamps received
+ int tx; //timestamps transferred
+ TSM_TIMESTAMP last_ts_sent; //last time stamp sent
+ TSM_TIMESTAMP last_ts_received;
+ TSM_TIMESTAMP suspicious_ts;
+
+ TSM_TIMESTAMP discont_threshold;
+
+ unsigned int invalid_ts_count;
+ TSMGR_MODE mode;
+ int ts_buf_size;
+ int dur_history_tx;
+ TSM_TIMESTAMP dur_history_total;
+ TSM_TIMESTAMP dur_history_buf[TSM_HISTORY_SIZE];
+ TSMControl *ts_buf;
+ unsigned long long age;
+ int tx_cnt;
+ int rx_cnt;
+ int cnt;
+ int valid_ts_received:1;
+ int big_cnt;
+
+ TSMRecivedCtl rctl;
+} TSManager;
+
+/**
+ * GST_CLOCK_TIME_IS_VALID:
+ * @time: clock time to validate
+ *
+ * Tests if a given #GstClockTime represents a valid defined time.
+ */
+
+/*!
+ * This function receive timestamp into timestamp manager.
+ *
+ * @param handle handle of timestamp manager.
+ *
+ * @param timestamp timestamp received
+ *
+ * @return
+ */
+void TSManagerReceive(void *handle, TSM_TIMESTAMP timestamp);
+void TSManagerReceive2(void *handle, TSM_TIMESTAMP timestamp, int size);
+void TSManagerFlush2(void *handle, int size);
+void TSManagerValid2(void *handle, int size, void *key);
+/*!
+ * This function send the timestamp for next output frame.
+ *
+ * @param handle handle of timestamp manager.
+ *
+ * @return timestamp for next output frame.
+ */
+TSM_TIMESTAMP TSManagerSend(void *handle);
+TSM_TIMESTAMP TSManagerSend2(void *handle, void *key);
+TSM_TIMESTAMP TSManagerQuery2(void *handle, void *key);
+TSM_TIMESTAMP TSManagerQuery(void *handle);
+/*!
+ * This function resync timestamp handler when reset and seek
+ *
+ * @param handle handle of timestamp manager.
+ *
+ * @param synctime the postion time needed to set, if value invalid, position keeps original
+ *
+ * @param mode playing mode (AI or FIFO)
+ *
+ * @return
+ */
+void resyncTSManager(void *handle, TSM_TIMESTAMP synctime, TSMGR_MODE mode);
+/*!
+ * This function create and reset timestamp handler
+ *
+ * @param ts_buf_size time stamp queue buffer size
+ *
+ * @return
+ */
+void *createTSManager(int ts_buf_size);
+/*!
+ * This function destroy timestamp handler
+ *
+ * @param handle handle of timestamp manager.
+ *
+ * @return
+ */
+void destroyTSManager(void *handle);
+/*!
+ * This function set history buffer frame interval by fps_n and fps_d
+ *
+ * @param handle handle of timestamp manager.
+ *
+ * @param framerate the framerate to be set
+ *
+ * @return
+ */
+void setTSManagerFrameRate(void *handle, int fps_n, int fps_d);
+// void setTSManagerFrameRate(void * handle, float framerate);
+/*!
+ * This function set the current calculated Frame Interval
+ *
+ * @param handle handle of timestamp manager.
+ *
+ * @return
+ */
+TSM_TIMESTAMP getTSManagerFrameInterval(void *handle);
+/*!
+ * This function get the current time stamp postion
+ *
+ * @param handle handle of timestamp manager.
+ *
+ * @return
+ */
+TSM_TIMESTAMP getTSManagerPosition(void *handle);
+int getTSManagerPreBufferCnt(void *handle);
+
+
+#endif /*_TIMESTAMP_H_ */
diff --git a/drivers/mxc/vpu_windsor/Kconfig b/drivers/mxc/vpu_windsor/Kconfig
new file mode 100644
index 000000000000..11562a6475c6
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/Kconfig
@@ -0,0 +1,25 @@
+#
+# Codec configuration
+#
+
+menu "MXC VPU(Video Processing Unit) WINDSOR ENCODER support"
+
+config MXC_VPU_WINDSOR
+ tristate "Support for MXC VPU(Video Processing Unit) WINDSOR ENCODER"
+ depends on MEDIA_SUPPORT
+ depends on VIDEO_DEV
+ depends on VIDEO_V4L2
+ select VIDEOBUF2_DMA_CONTIG
+ select VIDEOBUF2_VMALLOC
+ default y
+ ---help---
+ The VPU codec device provides codec function for H.264 etc.
+
+config MXC_VPU_WINDSOR_DEBUG
+ bool "MXC VPU WINDSOR ENCODER debugging"
+ depends on MXC_VPU_WINDSOR != n
+ help
+ This is an option for the developers; most people should
+ say N here. This enables MXC VPU WINDSOR Encoder driver debugging.
+
+endmenu
diff --git a/drivers/mxc/vpu_windsor/Makefile b/drivers/mxc/vpu_windsor/Makefile
new file mode 100644
index 000000000000..5d315aa30712
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/Makefile
@@ -0,0 +1,17 @@
+##
+## Makefile for the VPU and M0 driver
+##
+
+EXTRA_CFLAGS += $(DEFINES)
+
+obj-$(CONFIG_MXC_VPU_WINDSOR) = vpu-windsor.o
+vpu-windsor-objs = vpu_encoder_b0.o \
+ vpu_encoder_ctrl.o \
+ vpu_event_msg.o \
+ vpu_encoder_mem.o \
+ vpu_encoder_rpc.o \
+ vpu_encoder_mu.o \
+ vpu_encoder_pm.o
+
+clean:
+ rm -rf $(vpu-windsor-objs)
diff --git a/drivers/mxc/vpu_windsor/mediasys_types.h b/drivers/mxc/vpu_windsor/mediasys_types.h
new file mode 100644
index 000000000000..c348beaff20e
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/mediasys_types.h
@@ -0,0 +1,712 @@
+/*
+ * This file is provided under a dual BSD/GPLv2 license. When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _MEDIASYS_TYPES_H_
+#define _MEDIASYS_TYPES_H_
+
+typedef unsigned int u_int32;
+typedef unsigned char u_int8;
+typedef unsigned long u_int64;
+typedef unsigned int BOOL;
+typedef int int32;
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+#define VID_API_NUM_STREAMS 8
+#define VID_API_MAX_BUF_PER_STR 3
+#define VID_API_MAX_NUM_MVC_VIEWS 4
+#define MEDIAIP_MAX_NUM_MALONES 2
+#define MEDIAIP_MAX_NUM_MALONE_IRQ_PINS 2
+#define MEDIAIP_MAX_NUM_WINDSORS 1
+#define MEDIAIP_MAX_NUM_WINDSOR_IRQ_PINS 2
+#define MEDIAIP_MAX_NUM_CMD_IRQ_PINS 2
+#define MEDIAIP_MAX_NUM_MSG_IRQ_PINS 1
+#define MEDIAIP_MAX_NUM_TIMER_IRQ_PINS 4
+#define MEDIAIP_MAX_NUM_TIMER_IRQ_SLOTS 4
+#define VID_API_COMMAND_LIMIT 64
+#define VID_API_MESSAGE_LIMIT 256
+
+#define API_CMD_AVAILABLE 0x0
+#define API_CMD_INCOMPLETE 0x1
+#define API_CMD_BUFFER_ERROR 0x2
+#define API_CMD_UNAVAILABLE 0x3
+#define API_MSG_AVAILABLE 0x0
+#define API_MSG_INCOMPLETE 0x1
+#define API_MSG_BUFFER_ERROR 0x2
+#define API_MSG_UNAVAILABLE 0x3
+#define MEDIAIP_ENC_USER_DATA_WORDS 16
+#define MEDIAIP_MAX_NUM_WINDSOR_SRC_FRAMES 0x6
+#define MEDIAIP_MAX_NUM_WINDSOR_REF_FRAMES 0x3
+
+typedef enum {
+ GTB_ENC_CMD_NOOP = 0x0,
+ GTB_ENC_CMD_STREAM_START,
+ GTB_ENC_CMD_FRAME_ENCODE,
+ GTB_ENC_CMD_FRAME_SKIP,
+ GTB_ENC_CMD_STREAM_STOP,
+ GTB_ENC_CMD_PARAMETER_UPD,
+ GTB_ENC_CMD_TERMINATE,
+ GTB_ENC_CMD_SNAPSHOT,
+ GTB_ENC_CMD_ROLL_SNAPSHOT,
+ GTB_ENC_CMD_LOCK_SCHEDULER,
+ GTB_ENC_CMD_UNLOCK_SCHEDULER,
+ GTB_ENC_CMD_CONFIGURE_CODEC,
+ GTB_ENC_CMD_DEAD_MARK,
+ GTB_ENC_CMD_FIRM_RESET,
+ GTB_ENC_CMD_RESERVED
+} GTB_ENC_CMD;
+
+typedef enum {
+ VID_API_EVENT_UNDEFINED = 0x0,
+ VID_API_ENC_EVENT_RESET_DONE = 0x1,
+ VID_API_ENC_EVENT_START_DONE,
+ VID_API_ENC_EVENT_STOP_DONE,
+ VID_API_ENC_EVENT_TERMINATE_DONE,
+ VID_API_ENC_EVENT_FRAME_INPUT_DONE,
+ VID_API_ENC_EVENT_FRAME_DONE,
+ VID_API_ENC_EVENT_FRAME_RELEASE,
+ VID_API_ENC_EVENT_PARA_UPD_DONE,
+ VID_API_ENC_EVENT_MEM_REQUEST,
+ VID_API_ENC_EVENT_FIRMWARE_XCPT,
+ VID_API_ENC_EVENT_RESERVED
+} ENC_TB_API_ENC_EVENT;
+
+typedef enum {
+ MEDIAIP_ENC_PIC_TYPE_B_FRAME = 0,
+ MEDIAIP_ENC_PIC_TYPE_P_FRAME,
+ MEDIAIP_ENC_PIC_TYPE_I_FRAME,
+ MEDIAIP_ENC_PIC_TYPE_IDR_FRAME,
+ MEDIAIP_ENC_PIC_TYPE_BI_FRAME
+
+} MEDIAIP_ENC_PIC_TYPE, *pMEDIAIP_ENC_PIC_TYPE;
+
+typedef struct {
+ u_int32 uMemPhysAddr;
+ u_int32 uMemVirtAddr;
+ u_int32 uMemSize;
+} MEDIAIP_ENC_MEM_RESOURCE, *pMEDIAIP_ENC_MEM_RESOURCE;
+
+typedef struct {
+ u_int32 uEncFrmSize;
+ u_int32 uEncFrmNum;
+ u_int32 uRefFrmSize;
+ u_int32 uRefFrmNum;
+ u_int32 uActBufSize;
+} MEDIAIP_ENC_MEM_REQ_DATA, *pMEDIAIP_ENC_MEM_REQ_DATA;
+
+typedef struct {
+ MEDIAIP_ENC_MEM_RESOURCE tEncFrameBuffers[MEDIAIP_MAX_NUM_WINDSOR_SRC_FRAMES];
+ MEDIAIP_ENC_MEM_RESOURCE tRefFrameBuffers[MEDIAIP_MAX_NUM_WINDSOR_REF_FRAMES];
+ MEDIAIP_ENC_MEM_RESOURCE tActFrameBufferArea;
+} MEDIAIP_ENC_MEM_POOL, *pMEDIAIP_ENC_MEM_POOL;
+
+///////////////////////////////////////////
+// MEDIAIP_ENC_PIC_TYPE
+
+typedef struct {
+ u_int32 uFrameID;
+ u_int32 uPicEncodDone;
+ MEDIAIP_ENC_PIC_TYPE ePicType;
+ u_int32 uSkippedFrame;
+ u_int32 uErrorFlag;
+ u_int32 uPSNR;
+ u_int32 uFlushDone;
+ u_int32 uMBy;
+ u_int32 uMBx;
+ u_int32 uFrameSize;
+ u_int32 uFrameEncTtlCycles;
+ u_int32 uFrameEncTtlFrmCycles;
+ u_int32 uFrameEncTtlSlcCycles;
+ u_int32 uFrameEncTtlEncCycles;
+ u_int32 uFrameEncTtlHmeCycles;
+ u_int32 uFrameEncTtlDsaCycles;
+ u_int32 uFrameEncFwCycles;
+ u_int32 uFrameCrc;
+ u_int32 uNumInterrupts_1;
+ u_int32 uNumInterrupts_2;
+ u_int32 uH264POC;
+ u_int32 uRefInfo;
+ u_int32 uPicNum;
+ u_int32 uPicActivity;
+ u_int32 uSceneChange;
+ u_int32 uMBStats;
+ u_int32 uEncCacheCount0;
+ u_int32 uEncCacheCount1;
+ u_int32 uMtlWrStrbCnt;
+ u_int32 uMtlRdStrbCnt;
+ u_int32 uStrBuffWrPtr;
+ u_int32 uDiagnosticEvents;
+
+ u_int32 uProcIaccTotRdCnt;
+ u_int32 uProcDaccTotRdCnt;
+ u_int32 uProcDaccTotWrCnt;
+ u_int32 uProcDaccRegRdCnt;
+ u_int32 uProcDaccRegWrCnt;
+ u_int32 uProcDaccRngRdCnt;
+ u_int32 uProcDaccRngWrCnt;
+
+} MEDIAIP_ENC_PIC_INFO, *pMEDIAIP_ENC_PIC_INFO;
+
+typedef enum {
+ MEDIAIP_PLAYMODE_CONNECTIVITY = 0,
+ MEDIAIP_PLAYMODE_BROADCAST,
+ MEDIAIP_PLAYMODE_BROADCAST_DSS,
+ MEDIAIP_PLAYMODE_LAST = MEDIAIP_PLAYMODE_BROADCAST_DSS
+
+} MEDIA_IP_PLAYMODE;
+
+typedef struct {
+ u_int32 wptr;
+ u_int32 rptr;
+ u_int32 start;
+ u_int32 end;
+
+} BUFFER_DESCRIPTOR_TYPE, *pBUFFER_DESCRIPTOR_TYPE;
+
+typedef struct {
+ u_int32 uWrPtr;
+ u_int32 uRdPtr;
+ u_int32 uStart;
+ u_int32 uEnd;
+ u_int32 uLo;
+ u_int32 uHi;
+
+} MediaIPFW_Video_BufDesc;
+
+typedef struct {
+ u_int32 uCfgCookie;
+
+ u_int32 uNumMalones;
+ u_int32 uMaloneBaseAddress[MEDIAIP_MAX_NUM_MALONES];
+ u_int32 uHifOffset[MEDIAIP_MAX_NUM_MALONES];
+ u_int32 uMaloneIrqPin[MEDIAIP_MAX_NUM_MALONES][MEDIAIP_MAX_NUM_MALONE_IRQ_PINS];
+ u_int32 uMaloneIrqTarget[MEDIAIP_MAX_NUM_MALONES][MEDIAIP_MAX_NUM_MALONE_IRQ_PINS];
+
+ u_int32 uNumWindsors;
+ u_int32 uWindsorBaseAddress[MEDIAIP_MAX_NUM_WINDSORS];
+ u_int32 uWindsorIrqPin[MEDIAIP_MAX_NUM_WINDSORS][MEDIAIP_MAX_NUM_WINDSOR_IRQ_PINS];
+ u_int32 uWindsorIrqTarget[MEDIAIP_MAX_NUM_WINDSORS][MEDIAIP_MAX_NUM_WINDSOR_IRQ_PINS];
+
+ u_int32 uCmdIrqPin[MEDIAIP_MAX_NUM_CMD_IRQ_PINS];
+ u_int32 uCmdIrqTarget[MEDIAIP_MAX_NUM_CMD_IRQ_PINS];
+
+ u_int32 uMsgIrqPin[MEDIAIP_MAX_NUM_MSG_IRQ_PINS];
+ u_int32 uMsgIrqTarget[MEDIAIP_MAX_NUM_MSG_IRQ_PINS];
+
+ u_int32 uSysClkFreq;
+ u_int32 uNumTimers;
+ u_int32 uTimerBaseAddr;
+ u_int32 uTimerIrqPin[MEDIAIP_MAX_NUM_TIMER_IRQ_PINS];
+ u_int32 uTimerIrqTarget[MEDIAIP_MAX_NUM_TIMER_IRQ_PINS];
+ u_int32 uTimerSlots[MEDIAIP_MAX_NUM_TIMER_IRQ_SLOTS];
+
+ u_int32 uGICBaseAddr;
+ u_int32 uUartBaseAddr;
+
+ u_int32 uDPVBaseAddr;
+ u_int32 uDPVIrqPin;
+ u_int32 uDPVIrqTarget;
+
+ u_int32 uPixIfBaseAddr;
+
+ u_int32 pal_trace_level;
+ u_int32 pal_trace_destination;
+
+ u_int32 pal_trace_level1;
+ u_int32 pal_trace_destination1;
+
+ u_int32 uHeapBase;
+ u_int32 uHeapSize;
+
+ u_int32 uFSLCacheBaseAddr[2];
+
+} MEDIAIP_FW_SYSTEM_CONFIG, *pMEDIAIP_FW_SYSTEM_CONFIG;
+
+typedef struct {
+ u_int32 uFrameID;
+ u_int32 uLumaBase;
+ u_int32 uChromaBase;
+ u_int32 uParamIdx;
+ u_int32 uKeyFrame;
+} MEDIAIP_ENC_YUV_BUFFER_DESC, *pMEDIAIP_ENC_YUV_BUFFER_DESC;
+
+typedef struct {
+ u_int32 use_ame;
+
+ u_int32 cme_mvx_max;
+ u_int32 cme_mvy_max;
+ u_int32 ame_prefresh_y0;
+ u_int32 ame_prefresh_y1;
+ u_int32 fme_min_sad;
+ u_int32 cme_min_sad;
+
+ u_int32 fme_pred_int_weight;
+ u_int32 fme_pred_hp_weight;
+ u_int32 fme_pred_qp_weight;
+ u_int32 fme_cost_weight;
+ u_int32 fme_act_thold;
+ u_int32 fme_sad_thold;
+ u_int32 fme_zero_sad_thold;
+
+ u_int32 fme_lrg_mvx_lmt;
+ u_int32 fme_lrg_mvy_lmt;
+ u_int32 fme_force_mode;
+ u_int32 fme_force4mvcost;
+ u_int32 fme_force2mvcost;
+
+ u_int32 h264_inter_thrd;
+
+ u_int32 i16x16_mode_cost;
+ u_int32 i4x4_mode_lambda;
+ u_int32 i8x8_mode_lambda;
+
+ u_int32 inter_mod_mult;
+ u_int32 inter_sel_mult;
+ u_int32 inter_bid_cost;
+ u_int32 inter_bwd_cost;
+ u_int32 inter_4mv_cost;
+ int32 one_mv_i16_cost;
+ int32 one_mv_i4x4_cost;
+ int32 one_mv_i8x8_cost;
+ int32 two_mv_i16_cost;
+ int32 two_mv_i4x4_cost;
+ int32 two_mv_i8x8_cost;
+ int32 four_mv_i16_cost;
+ int32 four_mv_i4x4_cost;
+ int32 four_mv_i8x8_cost;
+
+ u_int32 intra_pred_enab;
+ u_int32 intra_chr_pred;
+ u_int32 intra16_pred;
+ u_int32 intra4x4_pred;
+ u_int32 intra8x8_pred;
+
+ u_int32 cb_base;
+ u_int32 cb_size;
+ u_int32 cb_head_room;
+
+ u_int32 mem_page_width;
+ u_int32 mem_page_height;
+ u_int32 mem_total_size;
+ u_int32 mem_chunk_phys_addr;
+ u_int32 mem_chunk_virt_addr;
+ u_int32 mem_chunk_size;
+ u_int32 mem_y_stride;
+ u_int32 mem_uv_stride;
+
+ u_int32 split_wr_enab;
+ u_int32 split_wr_req_size;
+ u_int32 split_rd_enab;
+ u_int32 split_rd_req_size;
+
+} MEDIAIP_ENC_CALIB_PARAMS, *pMEDIAIP_ENC_CALIB_PARAMS;
+
+typedef struct {
+ u_int32 ParamChange;
+
+ u_int32 start_frame; // These variables are for debugging purposes only
+ u_int32 end_frame;
+
+ u_int32 userdata_enable;
+ u_int32 userdata_id[4];
+ u_int32 userdata_message[MEDIAIP_ENC_USER_DATA_WORDS];
+ u_int32 userdata_length;
+
+ u_int32 h264_profile_idc;
+ u_int32 h264_level_idc;
+ u_int32 h264_au_delimiter; // Enable the use of Access Unit Delimiters
+ u_int32 h264_seq_end_code; // Enable the use of Sequence End Codes
+ u_int32 h264_recovery_points; // Enable the use of Recovery Points (must be with a fixed GOP structure)
+ u_int32 h264_vui_parameters; // Enable the use of VUI parameters (for rate control purposes)
+ u_int32 h264_aspect_ratio_present;
+ u_int32 h264_aspect_ratio_sar_width;
+ u_int32 h264_aspect_ratio_sar_height;
+ u_int32 h264_overscan_present;
+ u_int32 h264_video_type_present;
+ u_int32 h264_video_format;
+ u_int32 h264_video_full_range;
+ u_int32 h264_video_colour_descriptor;
+ u_int32 h264_video_colour_primaries;
+ u_int32 h264_video_transfer_char;
+ u_int32 h264_video_matrix_coeff;
+ u_int32 h264_chroma_loc_info_present;
+ u_int32 h264_chroma_loc_type_top;
+ u_int32 h264_chroma_loc_type_bot;
+ u_int32 h264_timing_info_present;
+ u_int32 h264_buffering_period_present;
+ u_int32 h264_low_delay_hrd_flag;
+
+ u_int32 aspect_ratio;
+ u_int32 test_mode; // Automated firmware test mode
+ u_int32 dsa_test_mode; // Automated test mode for the DSA.
+ u_int32 fme_test_mode; // Automated test mode for the fme
+
+ u_int32 cbr_row_mode; //0: FW mode; 1: HW mode
+ u_int32 windsor_mode; //0: normal mode; 1: intra only mode; 2: intra+0MV mode
+ u_int32 encode_mode; // H264, VC1, MPEG2, DIVX
+ u_int32 frame_width; // display width
+ u_int32 frame_height; // display height
+ u_int32 enc_frame_width; // encoding width, should be 16-pix align
+ u_int32 enc_frame_height; // encoding height, should be 16-pix aligned for progressive and 32-pix aligned for interlace
+ u_int32 frame_rate_num;
+ u_int32 frame_rate_den;
+
+ u_int32 vi_field_source; // vi input source is frame or field
+ u_int32 vi_frame_width;
+ u_int32 vi_frame_height;
+ u_int32 crop_frame_width;
+ u_int32 crop_frame_height;
+ u_int32 crop_x_start_posn;
+ u_int32 crop_y_start_posn;
+ u_int32 mode422;
+ u_int32 mode_yuy2;
+ u_int32 dsa_luma_en;
+ u_int32 dsa_chroma_en;
+ u_int32 dsa_ext_hfilt_en;
+ u_int32 dsa_di_en;
+ u_int32 dsa_di_top_ref;
+ u_int32 dsa_vertf_disable; // disable the vertical filter.
+ u_int32 dsa_disable_pwb;
+ u_int32 dsa_hor_phase;
+ u_int32 dsa_ver_phase;
+
+ u_int32 dsa_iac_enable; // IAC / DSA cannot operate independently in FW so this variable controls
+ u_int32 iac_sc_threshold;
+ u_int32 iac_vm_threshold;
+ u_int32 iac_skip_mode;
+ u_int32 iac_grp_width;
+ u_int32 iac_grp_height;
+
+ u_int32 rate_control_mode;
+ u_int32 rate_control_resolution;
+ u_int32 buffer_size;
+ u_int32 buffer_level_init;
+ u_int32 buffer_I_bit_budget;
+
+ u_int32 top_field_first;
+
+ u_int32 intra_lum_qoffset;
+ u_int32 intra_chr_qoffset;
+ u_int32 inter_lum_qoffset;
+ u_int32 inter_chr_qoffset;
+ u_int32 use_def_scaling_mtx;
+
+ u_int32 inter_8x8_enab;
+ u_int32 inter_4x4_enab;
+
+ u_int32 fme_enable_qpel;
+ u_int32 fme_enable_hpel;
+ u_int32 fme_nozeromv; // can force the FME not to do the (0,0) search.
+ u_int32 fme_predmv_en;
+ u_int32 fme_pred_2mv4mv;
+ u_int32 fme_smallsadthresh;
+
+ u_int32 ame_en_lmvc;
+ u_int32 ame_x_mult;
+ u_int32 cme_enable_4mv; // Enable the use of 4MV partitioning
+ u_int32 cme_enable_1mv;
+ u_int32 hme_enable_16x8mv;
+ u_int32 hme_enable_8x16mv;
+ u_int32 cme_mv_weight; // CME motion vector decisions are made by combining these
+ u_int32 cme_mv_cost; // cost and weight variables
+ u_int32 ame_mult_mv;
+ u_int32 ame_shift_mv;
+
+ u_int32 hme_forceto1mv_en;
+ u_int32 hme_2mv_cost; // the cost of choosing a 2MV mode over 1MV.
+ u_int32 hme_pred_mode;
+ u_int32 hme_sc_rnge;
+ u_int32 hme_sw_rnge;
+
+ // for windsor pes , add by fulin
+ u_int32 output_format; // 0: output ES; 1: output PES
+ u_int32 timestamp_enab; // 0: have timestamps in all frame; 1: have timestamps in I and P frame; 2: have timestamps only in I frame
+ u_int32 initial_PTS_enab; // if enabled , use following value,else compute by fw
+ u_int32 initial_PTS; // the initial value of PTS in the first frame (ms)
+
+} MEDIAIP_ENC_CONFIG_PARAMS, *pMEDIAIP_ENC_CONFIG_PARAMS;
+
+typedef struct {
+ u_int32 ParamChange;
+
+ u_int32 gop_length;
+
+ u_int32 rate_control_bitrate;
+ u_int32 rate_control_bitrate_min;
+ u_int32 rate_control_bitrate_max;
+ u_int32 rate_control_content_models;
+ u_int32 rate_control_iframe_maxsize; // Maximum size of I frame generated by BPM in comparison to ideal (/4)
+ u_int32 rate_control_qp_init;
+ u_int32 rate_control_islice_qp;
+ u_int32 rate_control_pslice_qp;
+ u_int32 rate_control_bslice_qp;
+
+ u_int32 adaptive_quantization; // Enable the use of activity measures from VIPP in QP assignment
+ u_int32 aq_variance;
+ u_int32 cost_optimization; // Enable picture/frame level adjustments of the cost parameters by FW.
+ u_int32 fdlp_mode; // Frequency-domain low-pass filter control, 0: off, 1-4: specific, 5: adaptive
+ u_int32 enable_isegbframes; // Enable the use of B frames in the first segment of a GOP
+ u_int32 enable_adaptive_keyratio; // Enable the use of an adaptive I to P/B ratio (aims to reduce distortion)
+ u_int32 keyratio_imin; // Clamps applied to picture size ratios
+ u_int32 keyratio_imax;
+ u_int32 keyratio_pmin;
+ u_int32 keyratio_pmax;
+ u_int32 keyratio_bmin;
+ u_int32 keyratio_bmax;
+ int32 keyratio_istep;
+ int32 keyratio_pstep;
+ int32 keyratio_bstep;
+
+ u_int32 enable_paff; // Enable Picture Adaptive Frame/Field
+ u_int32 enable_b_frame_ref; // Enable B frame as references
+ u_int32 enable_adaptive_gop; // Enable an adaptive GOP structure
+ u_int32 enable_closed_gop; // Enable a closed GOP structure
+ // i.e. if enabled, the first consecutive B frames following
+ // an I frame in each GOP will be intra or backwards only coded
+ // and do not rely on previous reference pictures.
+ u_int32 open_gop_refresh_freq; // Controls the insertion of closed GOP's (or IDR GOP's in H.264)
+ u_int32 enable_adaptive_sc; // Enable adaptive scene change GOP structure (0:off, 1:adaptive, 2:IDR)
+ u_int32 enable_fade_detection; // Enable fade detection and associated motion estimation restrictions
+ int32 fade_detection_threshold; // Threshold at which the activity slope indicates a possible fading event
+ u_int32 enable_repeat_b; // Enalbe the repeated B frame mode at CBR
+ u_int32 enable_low_delay_b; // Use low delay-b frames with an IPPPP style GOP
+
+} MEDIAIP_ENC_STATIC_PARAMS, *pMEDIAIP_ENC_STATIC_PARAMS;
+
+typedef struct {
+ u_int32 ParamChange;
+
+ u_int32 rows_per_slice;
+
+ u_int32 mbaff_enable; // Macroblock adaptive frame/field enable
+ u_int32 dbf_enable; // Enable the deblocking filter
+
+ u_int32 field_source; // progressive/interlaced control
+ u_int32 gop_b_length; // Number of B frames between anchor frames
+ // (only to be changed at a GOP segment boundary)
+ u_int32 mb_group_size; // Number of macroblocks normally assigned to a group
+ // (implications for performance, interrupts and rate control)
+
+ u_int32 cbr_rows_per_group;
+
+ u_int32 skip_enable; // Enable the use of skipped macroblocks
+
+ u_int32 pts_bits_0_to_31; // TO BE REMOVED...
+ u_int32 pts_bit_32;
+
+ u_int32 rm_expsv_cff;
+ u_int32 const_ipred;
+ int32 chr_qp_offset;
+ u_int32 intra_mb_qp_offset;
+
+ u_int32 h264_cabac_init_method;
+ u_int32 h264_cabac_init_idc;
+ u_int32 h264_cabac_enable; // Main and stream
+
+ int32 alpha_c0_offset_div2;
+ int32 beta_offset_div2;
+
+ u_int32 intra_prefresh_y0; // for setting intra limits for prog refresh.
+ u_int32 intra_prefresh_y1;
+
+ u_int32 dbg_dump_rec_src;
+
+} MEDIAIP_ENC_DYN_PARAMS, *pMEDIAIP_ENC_DYN_PARAMS;
+
+typedef struct {
+ MEDIAIP_ENC_CALIB_PARAMS Calib;
+ MEDIAIP_ENC_CONFIG_PARAMS Config;
+ MEDIAIP_ENC_STATIC_PARAMS Static;
+ MEDIAIP_ENC_DYN_PARAMS Dynamic;
+} MEDIAIP_ENC_EXPERT_MODE_PARAM, *pMEDIAIP_ENC_EXPERT_MODE_PARAM;
+
+typedef enum {
+ MEDIAIP_ENC_FMT_H264 = 0,
+ MEDIAIP_ENC_FMT_VC1,
+ MEDIAIP_ENC_FMT_MPEG2,
+ MEDIAIP_ENC_FMT_MPEG4SP,
+ MEDIAIP_ENC_FMT_H263,
+ MEDIAIP_ENC_FMT_MPEG1,
+ MEDIAIP_ENC_FMT_SHORT_HEADER,
+ MEDIAIP_ENC_FMT_NULL
+
+} MEDIAIP_ENC_FMT;
+
+typedef enum {
+ MEDIAIP_ENC_PROF_MPEG2_SP = 0,
+ MEDIAIP_ENC_PROF_MPEG2_MP,
+ MEDIAIP_ENC_PROF_MPEG2_HP,
+ MEDIAIP_ENC_PROF_H264_BP,
+ MEDIAIP_ENC_PROF_H264_MP,
+ MEDIAIP_ENC_PROF_H264_HP,
+ MEDIAIP_ENC_PROF_MPEG4_SP,
+ MEDIAIP_ENC_PROF_MPEG4_ASP,
+ MEDIAIP_ENC_PROF_VC1_SP,
+ MEDIAIP_ENC_PROF_VC1_MP,
+ MEDIAIP_ENC_PROF_VC1_AP
+
+} MEDIAIP_ENC_PROFILE;
+
+typedef enum {
+ MEDIAIP_ENC_BITRATECONTROLMODE_VBR = 0x00000001,
+ MEDIAIP_ENC_BITRATECONTROLMODE_CBR = 0x00000002,
+ MEDIAIP_ENC_BITRATECONTROLMODE_CONSTANT_QP = 0x00000004 /* Only in debug mode */
+
+} MEDIAIP_ENC_BITRATE_MODE, *pMEDIAIP_ENC_BITRATE_MODE;
+
+typedef struct {
+ MEDIAIP_ENC_FMT eCodecMode;
+ MEDIAIP_ENC_PROFILE eProfile;
+ u_int32 uLevel;
+
+ MEDIAIP_ENC_MEM_RESOURCE tEncMemDesc;
+
+ u_int32 uFrameRate;
+ u_int32 uSrcStride;
+ u_int32 uSrcWidth;
+ u_int32 uSrcHeight;
+ u_int32 uSrcOffset_x;
+ u_int32 uSrcOffset_y;
+ u_int32 uSrcCropWidth;
+ u_int32 uSrcCropHeight;
+ u_int32 uOutWidth;
+ u_int32 uOutHeight;
+ u_int32 uIFrameInterval;
+ u_int32 uGopBLength;
+ u_int32 uLowLatencyMode;
+
+ MEDIAIP_ENC_BITRATE_MODE eBitRateMode;
+ u_int32 uTargetBitrate;
+ u_int32 uMaxBitRate;
+ u_int32 uMinBitRate;
+ u_int32 uInitSliceQP;
+
+} MEDIAIP_ENC_PARAM, *pMEDIAIP_ENC_PARAM;
+
+typedef struct {
+ u_int32 uFrameID;
+ u_int32 uErrorFlag; //Error type
+ u_int32 uMBy;
+ u_int32 uMBx;
+ u_int32 uReserved[12];
+
+} ENC_ENCODING_STATUS, *pENC_ENCODING_STATUS;
+
+typedef struct {
+ u_int32 uFrameID;
+ u_int32 uDsaCyle;
+ u_int32 uMBy;
+ u_int32 uMBx;
+ u_int32 uReserved[4];
+
+} ENC_DSA_STATUS_t, *pENC_DSA_STATUS_t;
+
+typedef struct {
+ u_int32 pEncYUVBufferDesc;
+ u_int32 pEncStreamBufferDesc;
+ u_int32 pEncExpertModeParam;
+ u_int32 pEncParam;
+ u_int32 pEncMemPool;
+ /* Status information for master to read */
+ u_int32 pEncEncodingStatus;
+ u_int32 pEncDSAStatus;
+} MEDIA_ENC_API_CONTROL_INTERFACE, *pMEDIA_ENC_API_CONTROL_INTERFACE;
+
+typedef struct {
+ u_int32 FwExecBaseAddr;
+ u_int32 FwExecAreaSize;
+ BUFFER_DESCRIPTOR_TYPE StreamCmdBufferDesc;
+ BUFFER_DESCRIPTOR_TYPE StreamMsgBufferDesc;
+ u_int32 StreamCmdIntEnable[VID_API_NUM_STREAMS];
+ u_int32 FWVersion;
+ u_int32 uMVDFWOffset;
+ u_int32 uMaxEncoderStreams;
+ u_int32 pEncCtrlInterface[VID_API_NUM_STREAMS];
+ MEDIAIP_FW_SYSTEM_CONFIG sSystemCfg;
+ u_int32 uApiVersion;
+ BUFFER_DESCRIPTOR_TYPE DebugBufferDesc;
+} ENC_RPC_HOST_IFACE, *pENC_RPC_HOST_IFACE;
+
+#define SCB_XREG_SLV_BASE 0x00000000
+#define SCB_SCB_BLK_CTRL 0x00070000
+#define SCB_BLK_CTRL_XMEM_RESET_SET 0x00000090
+#define SCB_BLK_CTRL_CACHE_RESET_SET 0x000000A0
+#define SCB_BLK_CTRL_CACHE_RESET_CLR 0x000000A4
+#define SCB_BLK_CTRL_SCB_CLK_ENABLE_SET 0x00000100
+
+#define XMEM_CONTROL 0x00041000
+
+#define DEC_MFD_XREG_SLV_BASE 0x00180000
+
+#define MFD_HIF 0x0001C000
+#define MFD_HIF_MSD_REG_INTERRUPT_STATUS 0x00000018
+#define MFD_SIF 0x0001D000
+#define MFD_SIF_CTRL_STATUS 0x000000F0
+#define MFD_SIF_INTR_STATUS 0x000000F4
+#define MFD_MCX 0x00020800
+#define MFD_MCX_OFF 0x00000020
+
+#define MFD_BLK_CTRL 0x00030000
+#define MFD_BLK_CTRL_MFD_SYS_RESET_SET 0x00000000
+#define MFD_BLK_CTRL_MFD_SYS_RESET_CLR 0x00000004
+#define MFD_BLK_CTRL_MFD_SYS_CLOCK_ENABLE_SET 0x00000100
+#define MFD_BLK_CTRL_MFD_SYS_CLOCK_ENABLE_CLR 0x00000104
+
+#define CSR_CM0Px_ADDR_OFFSET 0x00000000
+#define CSR_CM0Px_CPUWAIT 0x00000004
+
+#endif
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_b0.c b/drivers/mxc/vpu_windsor/vpu_encoder_b0.c
new file mode 100644
index 000000000000..1bc49719a12b
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_b0.c
@@ -0,0 +1,5898 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file vpu_encoder_b0.c
+ *
+ * copyright here may be changed later
+ *
+ *
+ */
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/module.h>
+#include <linux/videodev2.h>
+#include <linux/firmware.h>
+#include <linux/interrupt.h>
+#include <linux/file.h>
+#include <linux/of_platform.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/of_device.h>
+#include <linux/slab.h>
+#include <linux/platform_data/dma-imx.h>
+#include <linux/miscdevice.h>
+#include <linux/fs.h>
+#include <linux/pm_runtime.h>
+#include <linux/mx8_mu.h>
+#include <linux/uaccess.h>
+#include <linux/version.h>
+
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-ioctl.h>
+#include <media/v4l2-mem2mem.h>
+#include <media/videobuf2-v4l2.h>
+#include <media/videobuf2-dma-contig.h>
+#include <media/videobuf2-vmalloc.h>
+
+#include "vpu_encoder_b0.h"
+#include "vpu_encoder_ctrl.h"
+#include "vpu_encoder_config.h"
+#include "vpu_event_msg.h"
+#include "vpu_encoder_mem.h"
+#include "vpu_encoder_mu.h"
+#include "vpu_encoder_pm.h"
+
+#define VPU_ENC_DRIVER_VERSION "1.0.1"
+
+struct vpu_frame_info {
+ struct list_head list;
+ MEDIAIP_ENC_PIC_INFO info;
+ u32 bytesleft;
+ u32 wptr;
+ u32 rptr;
+ u32 start;
+ u32 end;
+ bool eos;
+ bool is_start;
+ unsigned long index;
+ struct queue_data *queue;
+ s64 timestamp;
+};
+
+unsigned int vpu_dbg_level_encoder = LVL_ERR | LVL_WARN | LVL_ALL;
+static unsigned int reset_on_hang;
+static unsigned int show_detail_index = VPU_DETAIL_INDEX_DFT;
+static unsigned long debug_firmware_bitmap;
+
+#define ITEM_NAME(name) \
+ [name] = #name
+
+static char *cmd2str[] = {
+ ITEM_NAME(GTB_ENC_CMD_NOOP),
+ ITEM_NAME(GTB_ENC_CMD_STREAM_START),
+ ITEM_NAME(GTB_ENC_CMD_FRAME_ENCODE),
+ ITEM_NAME(GTB_ENC_CMD_FRAME_SKIP),
+ ITEM_NAME(GTB_ENC_CMD_STREAM_STOP),
+ ITEM_NAME(GTB_ENC_CMD_PARAMETER_UPD),
+ ITEM_NAME(GTB_ENC_CMD_TERMINATE),
+ ITEM_NAME(GTB_ENC_CMD_SNAPSHOT),
+ ITEM_NAME(GTB_ENC_CMD_ROLL_SNAPSHOT),
+ ITEM_NAME(GTB_ENC_CMD_LOCK_SCHEDULER),
+ ITEM_NAME(GTB_ENC_CMD_UNLOCK_SCHEDULER),
+ ITEM_NAME(GTB_ENC_CMD_CONFIGURE_CODEC),
+ ITEM_NAME(GTB_ENC_CMD_DEAD_MARK),
+ ITEM_NAME(GTB_ENC_CMD_FIRM_RESET),
+ ITEM_NAME(GTB_ENC_CMD_RESERVED)
+};
+
+static char *event2str[] = {
+ ITEM_NAME(VID_API_EVENT_UNDEFINED),
+ ITEM_NAME(VID_API_ENC_EVENT_RESET_DONE),
+ ITEM_NAME(VID_API_ENC_EVENT_START_DONE),
+ ITEM_NAME(VID_API_ENC_EVENT_STOP_DONE),
+ ITEM_NAME(VID_API_ENC_EVENT_TERMINATE_DONE),
+ ITEM_NAME(VID_API_ENC_EVENT_FRAME_INPUT_DONE),
+ ITEM_NAME(VID_API_ENC_EVENT_FRAME_DONE),
+ ITEM_NAME(VID_API_ENC_EVENT_FRAME_RELEASE),
+ ITEM_NAME(VID_API_ENC_EVENT_PARA_UPD_DONE),
+ ITEM_NAME(VID_API_ENC_EVENT_MEM_REQUEST),
+ ITEM_NAME(VID_API_ENC_EVENT_FIRMWARE_XCPT),
+ ITEM_NAME(VID_API_ENC_EVENT_RESERVED)
+};
+
+static int wait_for_start_done(struct core_device *core, int resume);
+static void wait_for_stop_done(struct vpu_ctx *ctx);
+static int sw_reset_firmware(struct core_device *core, int resume);
+static int enable_fps_sts(struct vpu_attr *attr);
+static int disable_fps_sts(struct vpu_attr *attr);
+static int configure_codec(struct vpu_ctx *ctx);
+static struct vpu_frame_info *get_idle_frame(struct queue_data *queue);
+static void put_frame_idle(struct vpu_frame_info *frame);
+static int inc_frame(struct queue_data *queue);
+static void dec_frame(struct vpu_frame_info *frame);
+static int submit_input_and_encode(struct vpu_ctx *ctx);
+static int process_stream_output(struct vpu_ctx *ctx);
+static u32 get_ptr(u32 ptr);
+
+static char *get_event_str(u32 event)
+{
+ if (event >= VID_API_ENC_EVENT_RESERVED)
+ return "UNKNOWN EVENT";
+ return event2str[event];
+}
+
+static char *get_cmd_str(u32 cmdid)
+{
+ if (cmdid >= GTB_ENC_CMD_RESERVED)
+ return "UNKNOWN CMD";
+ return cmd2str[cmdid];
+}
+
+static void vpu_log_event(u_int32 uEvent, u_int32 ctxid)
+{
+ if (uEvent >= VID_API_ENC_EVENT_RESERVED)
+ vpu_err("reveive event: 0x%X, ctx id:%d\n",
+ uEvent, ctxid);
+ else
+ vpu_dbg(LVL_EVT, "recevie event: %s, ctx id:%d\n",
+ event2str[uEvent], ctxid);
+}
+
+static void vpu_log_cmd(u_int32 cmdid, u_int32 ctxid)
+{
+ if (cmdid >= GTB_ENC_CMD_RESERVED)
+ vpu_err("send cmd: 0x%X, ctx id:%d\n",
+ cmdid, ctxid);
+ else
+ vpu_dbg(LVL_CMD, "send cmd: %s ctx id:%d\n",
+ cmd2str[cmdid], ctxid);
+}
+
+static void count_event(struct vpu_ctx *ctx, u32 event)
+{
+ struct vpu_attr *attr;
+
+ WARN_ON(!ctx);
+
+ attr = get_vpu_ctx_attr(ctx);
+ if (!attr)
+ return;
+
+ if (event < VID_API_ENC_EVENT_RESERVED)
+ attr->statistic.event[event]++;
+ else
+ attr->statistic.event[VID_API_ENC_EVENT_RESERVED]++;
+
+ attr->statistic.current_event = event;
+ getrawmonotonic(&attr->statistic.ts_event);
+}
+
+static void count_cmd(struct vpu_attr *attr, u32 cmdid)
+{
+ WARN_ON(!attr);
+
+ if (cmdid < GTB_ENC_CMD_RESERVED)
+ attr->statistic.cmd[cmdid]++;
+ else
+ attr->statistic.cmd[GTB_ENC_CMD_RESERVED]++;
+ attr->statistic.current_cmd = cmdid;
+ getrawmonotonic(&attr->statistic.ts_cmd);
+}
+
+static void count_yuv_input(struct vpu_ctx *ctx)
+{
+ struct vpu_attr *attr = NULL;
+
+ WARN_ON(!ctx);
+
+ attr = get_vpu_ctx_attr(ctx);
+ if (!attr)
+ return;
+
+ attr->statistic.yuv_count++;
+}
+
+static void count_h264_output(struct vpu_ctx *ctx)
+{
+ struct vpu_attr *attr = NULL;
+
+ WARN_ON(!ctx);
+
+ attr = get_vpu_ctx_attr(ctx);
+ if (!attr)
+ return;
+
+ attr->statistic.h264_count++;
+}
+
+static void count_encoded_frame(struct vpu_ctx *ctx)
+{
+ struct vpu_attr *attr = NULL;
+
+ WARN_ON(!ctx);
+
+ attr = get_vpu_ctx_attr(ctx);
+ if (!attr)
+ return;
+
+ attr->statistic.encoded_count++;
+}
+
+static void count_timestamp_overwrite(struct vpu_ctx *ctx)
+{
+ struct vpu_attr *attr = NULL;
+
+ WARN_ON(!ctx);
+
+ attr = get_vpu_ctx_attr(ctx);
+ if (!attr)
+ return;
+
+ attr->statistic.timestamp_overwrite++;
+}
+
+static void write_vpu_reg(struct vpu_dev *dev, u32 val, off_t reg)
+{
+ writel(val, dev->regs_base + reg);
+}
+
+static u32 read_vpu_reg(struct vpu_dev *dev, off_t reg)
+{
+ return readl(dev->regs_base + reg);
+}
+
+/*
+ * v4l2 ioctl() operation
+ *
+ */
+static struct vpu_v4l2_fmt formats_compressed_enc[] = {
+ {
+ .name = "H264 Encoded Stream",
+ .fourcc = V4L2_PIX_FMT_H264,
+ .num_planes = 1,
+ .venc_std = VPU_VIDEO_AVC,
+ .is_yuv = 0,
+ },
+};
+
+static struct vpu_v4l2_fmt formats_yuv_enc[] = {
+ {
+ .name = "4:2:0 2 Planes Y/CbCr",
+ .fourcc = V4L2_PIX_FMT_NV12,
+ .num_planes = 2,
+ .venc_std = VPU_PF_YUV420_SEMIPLANAR,
+ .is_yuv = 1,
+ },
+};
+
+static void vpu_ctx_send_cmd(struct vpu_ctx *ctx, uint32_t cmdid,
+ uint32_t cmdnum, uint32_t *local_cmddata);
+
+#define GET_CTX_RPC(ctx, func) \
+ func(&ctx->core_dev->shared_mem, ctx->str_index)
+
+pMEDIAIP_ENC_YUV_BUFFER_DESC get_rpc_yuv_buffer_desc(struct vpu_ctx *ctx)
+{
+ return GET_CTX_RPC(ctx, rpc_get_yuv_buffer_desc);
+}
+
+pBUFFER_DESCRIPTOR_TYPE get_rpc_stream_buffer_desc(struct vpu_ctx *ctx)
+{
+ return GET_CTX_RPC(ctx, rpc_get_stream_buffer_desc);
+}
+
+pMEDIAIP_ENC_EXPERT_MODE_PARAM get_rpc_expert_mode_param(struct vpu_ctx *ctx)
+{
+ return GET_CTX_RPC(ctx, rpc_get_expert_mode_param);
+}
+
+pMEDIAIP_ENC_PARAM get_rpc_enc_param(struct vpu_ctx *ctx)
+{
+ return GET_CTX_RPC(ctx, rpc_get_enc_param);
+}
+
+pMEDIAIP_ENC_MEM_POOL get_rpc_mem_pool(struct vpu_ctx *ctx)
+{
+ return GET_CTX_RPC(ctx, rpc_get_mem_pool);
+}
+
+pENC_ENCODING_STATUS get_rpc_encoding_status(struct vpu_ctx *ctx)
+{
+ if (!ctx || !ctx->core_dev)
+ return NULL;
+ return GET_CTX_RPC(ctx, rpc_get_encoding_status);
+}
+
+pENC_DSA_STATUS_t get_rpc_dsa_status(struct vpu_ctx *ctx)
+{
+ if (!ctx || !ctx->core_dev)
+ return NULL;
+ return GET_CTX_RPC(ctx, rpc_get_dsa_status);
+}
+
+static int vpu_enc_v4l2_ioctl_querycap(struct file *file,
+ void *fh,
+ struct v4l2_capability *cap)
+{
+ vpu_log_func();
+ strlcpy(cap->driver, "vpu encoder", sizeof(cap->driver));
+ strlcpy(cap->card, "vpu encoder", sizeof(cap->card));
+ strlcpy(cap->bus_info, "platform:", sizeof(cap->bus_info));
+ cap->version = KERNEL_VERSION(0, 0, 1);
+ cap->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE |
+ V4L2_CAP_STREAMING |
+ V4L2_CAP_VIDEO_CAPTURE_MPLANE |
+ V4L2_CAP_VIDEO_OUTPUT_MPLANE;
+ cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_enum_fmt_vid_cap(struct file *file,
+ void *fh,
+ struct v4l2_fmtdesc *f)
+{
+ struct vpu_v4l2_fmt *fmt;
+
+ vpu_log_func();
+
+ if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
+ return -EINVAL;
+
+ if (f->index >= ARRAY_SIZE(formats_compressed_enc))
+ return -EINVAL;
+
+ fmt = &formats_compressed_enc[f->index];
+ strlcpy(f->description, fmt->name, sizeof(f->description));
+ f->pixelformat = fmt->fourcc;
+ f->flags |= V4L2_FMT_FLAG_COMPRESSED;
+ return 0;
+}
+static int vpu_enc_v4l2_ioctl_enum_fmt_vid_out(struct file *file,
+ void *fh,
+ struct v4l2_fmtdesc *f)
+{
+ struct vpu_v4l2_fmt *fmt;
+
+ vpu_log_func();
+
+ if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
+ return -EINVAL;
+
+ if (f->index >= ARRAY_SIZE(formats_yuv_enc))
+ return -EINVAL;
+
+ fmt = &formats_yuv_enc[f->index];
+ strlcpy(f->description, fmt->name, sizeof(f->description));
+ f->pixelformat = fmt->fourcc;
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_enum_framesizes(struct file *file, void *fh,
+ struct v4l2_frmsizeenum *fsize)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct vpu_dev *vdev = ctx->dev;
+
+ if (!fsize)
+ return -EINVAL;
+
+ if (fsize->index)
+ return -EINVAL;
+
+ if (!vdev)
+ return -EINVAL;
+
+ vpu_log_func();
+ fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
+ fsize->stepwise.max_width = vdev->supported_size.max_width;
+ fsize->stepwise.max_height = vdev->supported_size.max_height;
+ fsize->stepwise.min_width = vdev->supported_size.min_width;
+ fsize->stepwise.min_height = vdev->supported_size.min_height;
+ fsize->stepwise.step_width = vdev->supported_size.step_width;
+ fsize->stepwise.step_height = vdev->supported_size.step_height;
+
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_enum_frameintervals(struct file *file, void *fh,
+ struct v4l2_frmivalenum *fival)
+{
+ u32 framerate;
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct vpu_dev *vdev = ctx->dev;
+
+
+ if (!fival)
+ return -EINVAL;
+ if (!vdev)
+ return -EINVAL;
+
+ vpu_log_func();
+ framerate = vdev->supported_fps.min +
+ fival->index * vdev->supported_fps.step;
+ if (framerate > vdev->supported_fps.max)
+ return -EINVAL;
+
+ fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+ fival->discrete.numerator = 1;
+ fival->discrete.denominator = framerate;
+
+ return 0;
+}
+
+static struct queue_data *get_queue_by_v4l2_type(struct vpu_ctx *ctx, u32 type)
+{
+ struct queue_data *queue = NULL;
+
+ if (!ctx)
+ return NULL;
+
+ switch (type) {
+ case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
+ queue = &ctx->q_data[V4L2_SRC];
+ break;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
+ queue = &ctx->q_data[V4L2_DST];
+ break;
+ default:
+ vpu_err("unsupport v4l2 buf type : %d\n", type);
+ break;
+ }
+
+ return queue;
+}
+
+static int vpu_enc_v4l2_ioctl_g_fmt(struct file *file,
+ void *fh,
+ struct v4l2_format *f)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
+ struct queue_data *q_data;
+ unsigned int i;
+
+ q_data = get_queue_by_v4l2_type(ctx, f->type);
+ if (!q_data)
+ return -EINVAL;
+ vpu_dbg(LVL_FUNC, "%s(), %s\n", __func__, q_data->desc);
+
+ if (!q_data->current_fmt) {
+ vpu_err("%s's current fmt is NULL\n", q_data->desc);
+ return -EINVAL;
+ }
+
+ pix_mp->pixelformat = q_data->current_fmt->fourcc;
+ pix_mp->num_planes = q_data->current_fmt->num_planes;
+ pix_mp->width = q_data->width;
+ pix_mp->height = q_data->height;
+ pix_mp->field = V4L2_FIELD_ANY;
+ for (i = 0; i < pix_mp->num_planes; i++)
+ pix_mp->plane_fmt[i].sizeimage = q_data->sizeimage[i];
+
+ if (V4L2_TYPE_IS_OUTPUT(f->type))
+ pix_mp->colorspace = V4L2_COLORSPACE_REC709;
+ else
+ pix_mp->plane_fmt[0].bytesperline = q_data->width;
+
+ return 0;
+}
+
+u32 cpu_phy_to_mu(struct core_device *dev, u32 addr)
+{
+ return addr - dev->m0_p_fw_space_phy;
+}
+
+static int initialize_enc_param(struct vpu_ctx *ctx)
+{
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ mutex_lock(&ctx->instance_mutex);
+
+ param->eCodecMode = MEDIAIP_ENC_FMT_H264;
+ param->tEncMemDesc.uMemPhysAddr = 0;
+ param->tEncMemDesc.uMemVirtAddr = 0;
+ param->tEncMemDesc.uMemSize = 0;
+ param->uSrcStride = VPU_ENC_WIDTH_DEFAULT;
+ param->uSrcWidth = VPU_ENC_WIDTH_DEFAULT;
+ param->uSrcHeight = VPU_ENC_HEIGHT_DEFAULT;
+ param->uSrcOffset_x = 0;
+ param->uSrcOffset_y = 0;
+ param->uSrcCropWidth = VPU_ENC_WIDTH_DEFAULT;
+ param->uSrcCropHeight = VPU_ENC_HEIGHT_DEFAULT;
+ param->uOutWidth = VPU_ENC_WIDTH_DEFAULT;
+ param->uOutHeight = VPU_ENC_HEIGHT_DEFAULT;
+ param->uFrameRate = VPU_ENC_FRAMERATE_DEFAULT;
+ param->uMinBitRate = BITRATE_LOW_THRESHOLD;
+
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static int check_stepwise(u32 val, u32 min, u32 max, u32 step)
+{
+ if (val < min)
+ return -EINVAL;
+ if (val > max)
+ return -EINVAL;
+ if ((val - min) % step)
+ return -EINVAL;
+
+ return 0;
+}
+
+static int check_size(struct vpu_dev *vdev, u32 width, u32 height)
+{
+ int ret;
+
+ if (!vdev)
+ return -EINVAL;
+
+ ret = check_stepwise(width,
+ vdev->supported_size.min_width,
+ vdev->supported_size.max_width,
+ vdev->supported_size.step_width);
+ if (ret) {
+ vpu_err("Unsupported frame size : %dx%d\n", width, height);
+ return -EINVAL;
+ }
+ ret = check_stepwise(height,
+ vdev->supported_size.min_height,
+ vdev->supported_size.max_height,
+ vdev->supported_size.step_height);
+ if (ret) {
+ vpu_err("Unsupported frame size : %dx%d\n", width, height);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int valid_crop_info(struct queue_data *queue, struct v4l2_rect *rect)
+{
+ struct vpu_ctx *ctx;
+ u32 MIN_WIDTH;
+ u32 MIN_HEIGHT;
+
+ if (!queue || !rect || !queue->ctx)
+ return -EINVAL;
+
+ ctx = queue->ctx;
+ MIN_WIDTH = ctx->dev->supported_size.min_width;
+ MIN_HEIGHT = ctx->dev->supported_size.min_height;
+
+ if (rect->left > queue->width - MIN_WIDTH ||
+ rect->top > queue->height - MIN_HEIGHT) {
+ rect->left = 0;
+ rect->top = 0;
+ rect->width = queue->width;
+ rect->height = queue->height;
+ return 0;
+ }
+
+ rect->width = min(rect->width, queue->width - rect->left);
+ if (rect->width)
+ rect->width = max_t(u32, rect->width, MIN_WIDTH);
+ else
+ rect->width = queue->width;
+ rect->height = min(rect->height, queue->height - rect->top);
+ if (rect->height)
+ rect->height = max_t(u32, rect->height, MIN_HEIGHT);
+ else
+ rect->height = queue->height;
+
+ return 0;
+}
+
+static int check_v4l2_fmt(struct vpu_dev *dev, struct v4l2_format *f)
+{
+ int ret = -EINVAL;
+
+ switch (f->type) {
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ case V4L2_BUF_TYPE_VIDEO_OUTPUT:
+ ret = check_size(dev, f->fmt.pix.width, f->fmt.pix.height);
+ break;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
+ case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
+ ret = check_size(dev, f->fmt.pix_mp.width,
+ f->fmt.pix_mp.height);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static struct vpu_v4l2_fmt *find_fmt_by_fourcc(struct vpu_v4l2_fmt *fmts,
+ unsigned int size,
+ u32 fourcc)
+{
+ unsigned int i;
+
+ if (!fmts || !size)
+ return NULL;
+
+ for (i = 0; i < size; i++) {
+ if (fmts[i].fourcc == fourcc)
+ return &fmts[i];
+ }
+
+ return NULL;
+}
+
+static char *cvrt_fourcc_to_str(u32 pixelformat)
+{
+ static char str[5];
+
+ str[0] = pixelformat & 0xff;
+ str[1] = (pixelformat >> 8) & 0xff;
+ str[2] = (pixelformat >> 16) & 0xff;
+ str[3] = (pixelformat >> 24) & 0xff;
+ str[4] = '\0';
+
+ return str;
+}
+
+static int set_yuv_queue_fmt(struct queue_data *q_data, struct v4l2_format *f)
+{
+ struct vpu_v4l2_fmt *fmt = NULL;
+ struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
+ int i;
+
+ if (!q_data || !f)
+ return -EINVAL;
+
+ fmt = find_fmt_by_fourcc(q_data->supported_fmts, q_data->fmt_count,
+ pix_mp->pixelformat);
+ if (!fmt) {
+ vpu_err("unsupport yuv fmt : %s\n",
+ cvrt_fourcc_to_str(pix_mp->pixelformat));
+ return -EINVAL;
+ }
+
+ q_data->width = pix_mp->width;
+ q_data->height = pix_mp->height;
+ q_data->rect.left = 0;
+ q_data->rect.top = 0;
+ q_data->rect.width = pix_mp->width;
+ q_data->rect.height = pix_mp->height;
+ q_data->sizeimage[0] = pix_mp->width * pix_mp->height;
+ q_data->sizeimage[1] = pix_mp->width * pix_mp->height / 2;
+ pix_mp->num_planes = fmt->num_planes;
+ for (i = 0; i < pix_mp->num_planes; i++)
+ pix_mp->plane_fmt[i].sizeimage = q_data->sizeimage[i];
+
+ q_data->current_fmt = fmt;
+
+ return 0;
+}
+
+static u32 get_enc_minimum_sizeimage(u32 width, u32 height)
+{
+ const u32 THRESHOLD = 256 * 1024;
+ u32 sizeimage;
+
+ sizeimage = width * height / 2;
+ if (sizeimage < THRESHOLD)
+ sizeimage = THRESHOLD;
+
+ return sizeimage;
+}
+
+static int set_enc_queue_fmt(struct queue_data *q_data, struct v4l2_format *f)
+{
+ struct vpu_v4l2_fmt *fmt = NULL;
+ struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
+ u32 sizeimage;
+
+ if (!q_data || !f)
+ return -EINVAL;
+
+ fmt = find_fmt_by_fourcc(q_data->supported_fmts, q_data->fmt_count,
+ pix_mp->pixelformat);
+ if (!fmt) {
+ vpu_err("unsupport encode fmt : %s\n",
+ cvrt_fourcc_to_str(pix_mp->pixelformat));
+ return -EINVAL;
+ }
+
+ q_data->width = pix_mp->width;
+ q_data->height = pix_mp->height;
+ sizeimage = get_enc_minimum_sizeimage(pix_mp->width, pix_mp->height);
+ q_data->sizeimage[0] = max(sizeimage, pix_mp->plane_fmt[0].sizeimage);
+ pix_mp->plane_fmt[0].sizeimage = q_data->sizeimage[0];
+
+ q_data->current_fmt = fmt;
+
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_s_fmt(struct file *file,
+ void *fh,
+ struct v4l2_format *f)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ int ret = 0;
+ struct queue_data *q_data;
+ pMEDIAIP_ENC_PARAM pEncParam;
+ struct vpu_attr *attr;
+
+ attr = get_vpu_ctx_attr(ctx);
+ pEncParam = &attr->param;
+ q_data = get_queue_by_v4l2_type(ctx, f->type);
+ if (!q_data)
+ return -EINVAL;
+ vpu_dbg(LVL_FUNC, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ ctx->core_dev->id, ctx->str_index);
+
+ ret = check_v4l2_fmt(ctx->dev, f);
+ if (ret)
+ return ret;
+
+ mutex_lock(&ctx->instance_mutex);
+ if (V4L2_TYPE_IS_OUTPUT(f->type))
+ ret = set_yuv_queue_fmt(q_data, f);
+ else
+ ret = set_enc_queue_fmt(q_data, f);
+ mutex_unlock(&ctx->instance_mutex);
+
+ return ret;
+}
+
+static int vpu_enc_v4l2_ioctl_g_parm(struct file *file, void *fh,
+ struct v4l2_streamparm *parm)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct vpu_attr *attr = NULL;
+ pMEDIAIP_ENC_PARAM param = NULL;
+
+ if (!parm || !ctx)
+ return -EINVAL;
+
+ attr = get_vpu_ctx_attr(ctx);
+ param = &attr->param;
+
+ vpu_log_func();
+ parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
+ parm->parm.capture.capturemode = V4L2_CAP_TIMEPERFRAME;
+ parm->parm.capture.timeperframe.numerator = 1;
+ parm->parm.capture.timeperframe.denominator = param->uFrameRate;
+ parm->parm.capture.readbuffers = 0;
+
+ return 0;
+}
+
+static int find_proper_framerate(struct vpu_dev *dev, struct v4l2_fract *fival)
+{
+ u32 min_delta = INT_MAX;
+ struct v4l2_fract target_fival = {0, 0};
+ u32 framerate;
+
+ if (!fival || !dev)
+ return -EINVAL;
+
+ framerate = dev->supported_fps.min;
+
+ while (framerate <= dev->supported_fps.max) {
+ u32 delta;
+
+ delta = abs(fival->numerator * framerate -
+ fival->denominator);
+ if (!delta)
+ return 0;
+ if (delta < min_delta) {
+ target_fival.numerator = 1;
+ target_fival.denominator = framerate;
+ min_delta = delta;
+ }
+
+ framerate += dev->supported_fps.step;
+ }
+ if (!target_fival.numerator || !target_fival.denominator)
+ return -EINVAL;
+
+ fival->numerator = target_fival.numerator;
+ fival->denominator = target_fival.denominator;
+
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_s_parm(struct file *file, void *fh,
+ struct v4l2_streamparm *parm)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct vpu_attr *attr = NULL;
+ struct v4l2_fract fival;
+ int ret;
+
+ if (!parm || !ctx)
+ return -EINVAL;
+
+ vpu_log_func();
+ attr = get_vpu_ctx_attr(ctx);
+
+ fival.numerator = parm->parm.capture.timeperframe.numerator;
+ fival.denominator = parm->parm.capture.timeperframe.denominator;
+ if (!fival.numerator || !fival.denominator)
+ return -EINVAL;
+
+ ret = find_proper_framerate(ctx->dev, &fival);
+ if (ret) {
+ vpu_err("Unsupported FPS : %d / %d\n",
+ fival.numerator, fival.denominator);
+ return ret;
+ }
+
+ mutex_lock(&ctx->instance_mutex);
+ attr->param.uFrameRate = fival.denominator / fival.numerator;
+ mutex_unlock(&ctx->instance_mutex);
+
+ parm->parm.capture.timeperframe.numerator = fival.numerator;
+ parm->parm.capture.timeperframe.denominator = fival.denominator;
+
+ return 0;
+}
+
+static int vpu_enc_queue_expbuf(struct queue_data *queue,
+ struct v4l2_exportbuffer *buf)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_expbuf(&queue->vb2_q, buf);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_enc_queue_reqbufs(struct queue_data *queue,
+ struct v4l2_requestbuffers *reqbuf)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_reqbufs(&queue->vb2_q, reqbuf);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_enc_queue_querybuf(struct queue_data *queue,
+ struct v4l2_buffer *buf)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_querybuf(&queue->vb2_q, buf);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_enc_queue_qbuf(struct queue_data *queue,
+ struct v4l2_buffer *buf)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
+ ret = vb2_qbuf(&queue->vb2_q, queue->ctx->dev->v4l2_dev.mdev, buf);
+#else
+ ret = vb2_qbuf(&queue->vb2_q, buf);
+#endif
+ }
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_enc_queue_dqbuf(struct queue_data *queue,
+ struct v4l2_buffer *buf, bool nonblocking)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_dqbuf(&queue->vb2_q, buf, nonblocking);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_enc_queue_enable(struct queue_data *queue,
+ enum v4l2_buf_type type)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_streamon(&queue->vb2_q, type);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static void clear_queue(struct queue_data *queue)
+{
+ struct vpu_frame_info *frame;
+ struct vpu_frame_info *tmp;
+ struct vb2_data_req *p_data_req;
+ struct vb2_data_req *p_temp;
+ struct vb2_buffer *vb;
+
+ if (!queue)
+ return;
+
+ list_for_each_entry_safe(frame, tmp, &queue->frame_q, list) {
+ vpu_dbg(LVL_INFO, "drop frame\n");
+ put_frame_idle(frame);
+ }
+
+ list_for_each_entry_safe(frame, tmp, &queue->frame_idle, list)
+ dec_frame(frame);
+
+ list_for_each_entry_safe(p_data_req, p_temp, &queue->drv_q, list) {
+ vpu_dbg(LVL_DEBUG, "%s(%d) - list_del(%p)\n", __func__,
+ p_data_req->sequence, p_data_req);
+ list_del(&p_data_req->list);
+ }
+ list_for_each_entry(vb, &queue->vb2_q.queued_list, queued_entry) {
+ if (vb->state == VB2_BUF_STATE_ACTIVE)
+ vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
+ }
+
+ INIT_LIST_HEAD(&queue->drv_q);
+ INIT_LIST_HEAD(&queue->frame_q);
+ INIT_LIST_HEAD(&queue->frame_idle);
+}
+
+static int vpu_enc_queue_disable(struct queue_data *queue,
+ enum v4l2_buf_type type)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_streamoff(&queue->vb2_q, type);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_enc_queue_release(struct queue_data *queue)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited) {
+ clear_queue(queue);
+ vb2_queue_release(&queue->vb2_q);
+ }
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_enc_queue_mmap(struct queue_data *queue,
+ struct vm_area_struct *vma)
+{
+ int ret = -EINVAL;
+
+ down(&queue->drv_q_lock);
+ if (queue->vb2_q_inited)
+ ret = vb2_mmap(&queue->vb2_q, vma);
+ up(&queue->drv_q_lock);
+
+ return ret;
+}
+
+static int vpu_enc_v4l2_ioctl_expbuf(struct file *file,
+ void *fh,
+ struct v4l2_exportbuffer *buf)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+
+ q_data = get_queue_by_v4l2_type(ctx, buf->type);
+ if (!q_data)
+ return -EINVAL;
+ vpu_dbg(LVL_FUNC, "%s(), %s\n", __func__, q_data->desc);
+
+ return vpu_enc_queue_expbuf(q_data, buf);
+}
+
+static int vpu_enc_v4l2_ioctl_subscribe_event(struct v4l2_fh *fh,
+ const struct v4l2_event_subscription *sub
+ )
+{
+ vpu_log_func();
+
+ switch (sub->type) {
+ case V4L2_EVENT_EOS:
+ return v4l2_event_subscribe(fh, sub, 0, NULL);
+ case V4L2_EVENT_SOURCE_CHANGE:
+ return v4l2_src_change_event_subscribe(fh, sub);
+ default:
+ return -EINVAL;
+ }
+}
+
+static int vpu_enc_v4l2_ioctl_reqbufs(struct file *file,
+ void *fh,
+ struct v4l2_requestbuffers *reqbuf)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ int ret;
+
+ q_data = get_queue_by_v4l2_type(ctx, reqbuf->type);
+ if (!q_data)
+ return -EINVAL;
+ vpu_dbg(LVL_FUNC, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ ctx->core_dev->id, ctx->str_index);
+
+ ret = vpu_enc_queue_reqbufs(q_data, reqbuf);
+
+ return ret;
+}
+
+static int vpu_enc_v4l2_ioctl_querybuf(struct file *file,
+ void *fh,
+ struct v4l2_buffer *buf)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ unsigned int i;
+ int ret;
+
+ q_data = get_queue_by_v4l2_type(ctx, buf->type);
+ if (!q_data)
+ return -EINVAL;
+ vpu_dbg(LVL_FUNC, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ ctx->core_dev->id, ctx->str_index);
+
+ ret = vpu_enc_queue_querybuf(q_data, buf);
+ if (ret)
+ return ret;
+
+ if (buf->memory == V4L2_MEMORY_MMAP) {
+ if (V4L2_TYPE_IS_MULTIPLANAR(buf->type)) {
+ for (i = 0; i < buf->length; i++)
+ buf->m.planes[i].m.mem_offset |= (q_data->type << MMAP_BUF_TYPE_SHIFT);
+ } else
+ buf->m.offset |= (q_data->type << MMAP_BUF_TYPE_SHIFT);
+ }
+
+ return ret;
+}
+
+static struct vb2_buffer *cvrt_v4l2_to_vb2_buffer(struct vb2_queue *vq,
+ struct v4l2_buffer *buf)
+{
+ if (!vq || !buf)
+ return NULL;
+
+ if (buf->index >= vq->num_buffers)
+ return NULL;
+
+ return vq->bufs[buf->index];
+}
+
+static u32 get_v4l2_plane_payload(struct v4l2_plane *plane)
+{
+ return plane->bytesused - plane->data_offset;
+}
+
+static void set_v4l2_plane_payload(struct v4l2_plane *plane, u32 size)
+{
+ plane->bytesused = plane->data_offset + size;
+}
+
+static int is_valid_output_mplane_buf(struct queue_data *q_data,
+ struct vpu_v4l2_fmt *fmt,
+ struct v4l2_buffer *buf)
+{
+ int i;
+
+ for (i = 0; i < fmt->num_planes; i++) {
+ u32 bytesused = get_v4l2_plane_payload(&buf->m.planes[i]);
+
+ if (!bytesused) {
+ set_v4l2_plane_payload(&buf->m.planes[i],
+ q_data->sizeimage[i]);
+ continue;
+ }
+ if (fmt->is_yuv && bytesused != q_data->sizeimage[i])
+ return 0;
+ }
+
+ return 1;
+}
+
+static int is_valid_output_buf(struct queue_data *q_data,
+ struct vpu_v4l2_fmt *fmt,
+ struct v4l2_buffer *buf)
+{
+ if (!buf->bytesused) {
+ buf->bytesused = q_data->sizeimage[0];
+ return 1;
+ }
+ if (fmt->is_yuv && buf->bytesused != q_data->sizeimage[0])
+ return 0;
+
+ return 1;
+}
+
+static int precheck_qbuf(struct queue_data *q_data, struct v4l2_buffer *buf)
+{
+ struct vb2_buffer *vb = NULL;
+ struct vpu_v4l2_fmt *fmt;
+ int ret;
+
+ if (!q_data || !buf)
+ return -EINVAL;
+
+ if (!q_data->current_fmt)
+ return -EINVAL;
+
+ vb = cvrt_v4l2_to_vb2_buffer(&q_data->vb2_q, buf);
+ if (!vb) {
+ vpu_err("invalid v4l2 buffer index:%d\n", buf->index);
+ return -EINVAL;
+ }
+ if (vb->state != VB2_BUF_STATE_DEQUEUED) {
+ vpu_err("invalid buffer state:%d\n", vb->state);
+ return -EINVAL;
+ }
+
+ if (!V4L2_TYPE_IS_OUTPUT(buf->type))
+ return 0;
+
+ fmt = q_data->current_fmt;
+ if (V4L2_TYPE_IS_MULTIPLANAR(buf->type))
+ ret = is_valid_output_mplane_buf(q_data, fmt, buf);
+ else
+ ret = is_valid_output_buf(q_data, fmt, buf);
+ if (!ret)
+ return -EINVAL;
+
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_qbuf(struct file *file,
+ void *fh,
+ struct v4l2_buffer *buf)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ int ret;
+
+ q_data = get_queue_by_v4l2_type(ctx, buf->type);
+ if (!q_data)
+ return -EINVAL;
+ vpu_dbg(LVL_FUNC, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ ctx->core_dev->id, ctx->str_index);
+
+ ret = precheck_qbuf(q_data, buf);
+ if (ret < 0)
+ return ret;
+
+ ret = vpu_enc_queue_qbuf(q_data, buf);
+ if (ret)
+ return ret;
+
+ if (V4L2_TYPE_IS_OUTPUT(buf->type)) {
+ mutex_lock(&ctx->dev->dev_mutex);
+ mutex_lock(&ctx->instance_mutex);
+ if (!test_bit(VPU_ENC_STATUS_CONFIGURED, &ctx->status))
+ set_bit(VPU_ENC_STATUS_DATA_READY, &ctx->status);
+ configure_codec(ctx);
+ mutex_unlock(&ctx->instance_mutex);
+ mutex_unlock(&ctx->dev->dev_mutex);
+
+ submit_input_and_encode(ctx);
+ count_yuv_input(ctx);
+ } else {
+ process_stream_output(ctx);
+ }
+
+ return ret;
+}
+
+static void notify_eos(struct vpu_ctx *ctx)
+{
+ const struct v4l2_event ev = {
+ .type = V4L2_EVENT_EOS
+ };
+
+ mutex_lock(&ctx->instance_mutex);
+ if (!test_bit(VPU_ENC_STATUS_CLOSED, &ctx->status) &&
+ !test_and_set_bit(VPU_ENC_STATUS_EOS_SEND, &ctx->status))
+ v4l2_event_queue_fh(&ctx->fh, &ev);
+ mutex_unlock(&ctx->instance_mutex);
+}
+
+static int send_eos(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return -EINVAL;
+
+ if (!test_bit(VPU_ENC_STATUS_START_SEND, &ctx->status)) {
+ notify_eos(ctx);
+ return 0;
+ }
+
+ if (!test_and_set_bit(VPU_ENC_STATUS_STOP_SEND, &ctx->status)) {
+ vpu_dbg(LVL_INFO, "stop stream\n");
+ vpu_ctx_send_cmd(ctx, GTB_ENC_CMD_STREAM_STOP, 0, NULL);
+ }
+
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_dqbuf(struct file *file,
+ void *fh,
+ struct v4l2_buffer *buf)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ int ret;
+
+ q_data = get_queue_by_v4l2_type(ctx, buf->type);
+ if (!q_data)
+ return -EINVAL;
+ vpu_dbg(LVL_FUNC, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ ctx->core_dev->id, ctx->str_index);
+
+ ret = vpu_enc_queue_dqbuf(q_data, buf, file->f_flags & O_NONBLOCK);
+
+ if (buf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
+ if (!ret)
+ count_h264_output(ctx);
+ buf->flags = q_data->vb2_reqs[buf->index].buffer_flags;
+ }
+
+ return ret;
+}
+
+static bool format_is_support(struct vpu_v4l2_fmt *format_table,
+ unsigned int table_size,
+ struct v4l2_format *f)
+{
+ unsigned int i;
+
+ for (i = 0; i < table_size; i++) {
+ if (format_table[i].fourcc == f->fmt.pix_mp.pixelformat)
+ return true;
+ }
+ return false;
+}
+
+static int vpu_enc_v4l2_ioctl_try_fmt(struct file *file,
+ void *fh,
+ struct v4l2_format *f)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
+ struct queue_data *q_data;
+
+ q_data = get_queue_by_v4l2_type(ctx, f->type);
+ if (!q_data)
+ return -EINVAL;
+ vpu_dbg(LVL_FUNC, "%s(), %s\n", __func__, q_data->desc);
+
+ if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+ pix_mp->field = V4L2_FIELD_ANY;
+ pix_mp->colorspace = V4L2_COLORSPACE_REC709;
+ }
+ if (!format_is_support(q_data->supported_fmts, q_data->fmt_count, f))
+ return -EINVAL;
+
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_g_selection(struct file *file, void *fh,
+ struct v4l2_selection *s)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *src = &ctx->q_data[V4L2_SRC];
+
+ if (s->target != V4L2_SEL_TGT_CROP && s->target != V4L2_SEL_TGT_COMPOSE)
+ return -EINVAL;
+
+ vpu_log_func();
+ s->r = src->rect;
+
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_s_selection(struct file *file, void *fh,
+ struct v4l2_selection *s)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *src = &ctx->q_data[V4L2_SRC];
+ struct vpu_dev *dev = ctx->dev;
+
+ if (s->target != V4L2_SEL_TGT_CROP && s->target != V4L2_SEL_TGT_COMPOSE)
+ return -EINVAL;
+
+ vpu_log_func();
+ src->rect.left = ALIGN(s->r.left, dev->supported_size.step_width);
+ src->rect.top = ALIGN(s->r.top, dev->supported_size.step_height);
+ src->rect.width = ALIGN(s->r.width, dev->supported_size.step_width);
+ src->rect.height = ALIGN(s->r.height, dev->supported_size.step_height);
+ valid_crop_info(src, &src->rect);
+
+ return 0;
+}
+
+static int response_stop_stream(struct vpu_ctx *ctx)
+{
+ struct queue_data *queue;
+
+ if (!ctx)
+ return -EINVAL;
+
+ queue = &ctx->q_data[V4L2_SRC];
+
+ down(&queue->drv_q_lock);
+ if (!list_empty(&queue->drv_q))
+ goto exit;
+
+ if (!test_bit(VPU_ENC_FLAG_WRITEABLE, &queue->rw_flag))
+ goto exit;
+ if (test_and_clear_bit(VPU_ENC_STATUS_STOP_REQ, &ctx->status))
+ send_eos(ctx);
+exit:
+ up(&queue->drv_q_lock);
+
+ return 0;
+}
+
+static int request_eos(struct vpu_ctx *ctx)
+{
+ WARN_ON(!ctx);
+
+ set_bit(VPU_ENC_STATUS_STOP_REQ, &ctx->status);
+ response_stop_stream(ctx);
+
+ return 0;
+}
+
+static int set_core_force_release(struct core_device *core)
+{
+ int i;
+
+ if (!core)
+ return -EINVAL;
+
+ for (i = 0; i < core->supported_instance_count; i++) {
+ if (!core->ctx[i])
+ continue;
+ set_bit(VPU_ENC_STATUS_FORCE_RELEASE, &core->ctx[i]->status);
+ }
+
+ return 0;
+}
+
+static void clear_start_status(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return;
+
+ clear_bit(VPU_ENC_STATUS_CONFIGURED, &ctx->status);
+ clear_bit(VPU_ENC_STATUS_START_SEND, &ctx->status);
+ clear_bit(VPU_ENC_STATUS_START_DONE, &ctx->status);
+}
+
+static void clear_stop_status(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return;
+
+ clear_bit(VPU_ENC_STATUS_STOP_REQ, &ctx->status);
+ clear_bit(VPU_ENC_STATUS_STOP_SEND, &ctx->status);
+ clear_bit(VPU_ENC_STATUS_STOP_DONE, &ctx->status);
+ clear_bit(VPU_ENC_STATUS_EOS_SEND, &ctx->status);
+}
+
+static void reset_core_on_hang(struct core_device *core)
+{
+ int ret;
+ int i;
+
+ for (i = 0; i < core->supported_instance_count; i++)
+ clear_start_status(core->ctx[i]);
+
+ ret = sw_reset_firmware(core, 1);
+ if (ret)
+ vpu_err("reset core[%d] on hang fail\n", core->id);
+}
+
+static int set_core_hang(struct core_device *core)
+{
+ core->hang = true;
+
+ if (reset_on_hang)
+ reset_core_on_hang(core);
+
+ return 0;
+}
+
+static void clear_core_hang(struct core_device *core)
+{
+ if (!core)
+ return;
+
+ core->hang = false;
+}
+
+static void wait_for_stop_done(struct vpu_ctx *ctx)
+{
+ int ret;
+
+ WARN_ON(!ctx);
+
+ if (!test_bit(VPU_ENC_STATUS_START_SEND, &ctx->status))
+ return;
+ if (test_bit(VPU_ENC_STATUS_STOP_DONE, &ctx->status))
+ return;
+
+ ret = wait_for_completion_timeout(&ctx->stop_cmp,
+ msecs_to_jiffies(500));
+ if (!ret)
+ vpu_err("wait for stop done timeout\n");
+}
+
+static int vpu_enc_v4l2_ioctl_encoder_cmd(struct file *file,
+ void *fh,
+ struct v4l2_encoder_cmd *cmd
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+
+ vpu_dbg(LVL_FUNC, "%s(), cmd = %d, (%d, %d)\n", __func__, cmd->cmd,
+ ctx->core_dev->id, ctx->str_index);
+ switch (cmd->cmd) {
+ case V4L2_ENC_CMD_START:
+ break;
+ case V4L2_ENC_CMD_STOP:
+ request_eos(ctx);
+ break;
+ case V4L2_ENC_CMD_PAUSE:
+ break;
+ case V4L2_ENC_CMD_RESUME:
+ break;
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_streamon(struct file *file,
+ void *fh,
+ enum v4l2_buf_type i
+ )
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct vpu_attr *attr;
+ struct queue_data *q_data;
+ int ret;
+
+ q_data = get_queue_by_v4l2_type(ctx, i);
+ if (!q_data)
+ return -EINVAL;
+ vpu_dbg(LVL_FUNC, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ ctx->core_dev->id, ctx->str_index);
+
+ attr = get_vpu_ctx_attr(ctx);
+ if (attr) {
+ attr->ts_start[V4L2_SRC] = 0;
+ attr->ts_start[V4L2_DST] = 0;
+ }
+
+ ret = vpu_enc_queue_enable(q_data, i);
+ if (ret)
+ return ret;
+
+ if (V4L2_TYPE_IS_OUTPUT(i)) {
+ mutex_lock(&ctx->dev->dev_mutex);
+ mutex_lock(&ctx->instance_mutex);
+ set_bit(VPU_ENC_STATUS_OUTPUT_READY, &ctx->status);
+ configure_codec(ctx);
+ mutex_unlock(&ctx->instance_mutex);
+ mutex_unlock(&ctx->dev->dev_mutex);
+ }
+
+ return 0;
+}
+
+static int vpu_enc_v4l2_ioctl_streamoff(struct file *file,
+ void *fh,
+ enum v4l2_buf_type i)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh);
+ struct queue_data *q_data;
+ int ret;
+
+ q_data = get_queue_by_v4l2_type(ctx, i);
+ if (!q_data)
+ return -EINVAL;
+
+ vpu_dbg(LVL_FUNC, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ ctx->core_dev->id, ctx->str_index);
+
+ request_eos(ctx);
+ wait_for_stop_done(ctx);
+
+ ret = vpu_enc_queue_disable(q_data, i);
+
+ return ret;
+}
+
+static const struct v4l2_ioctl_ops vpu_enc_v4l2_ioctl_ops = {
+ .vidioc_querycap = vpu_enc_v4l2_ioctl_querycap,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0)
+ .vidioc_enum_fmt_vid_cap = vpu_enc_v4l2_ioctl_enum_fmt_vid_cap,
+ .vidioc_enum_fmt_vid_out = vpu_enc_v4l2_ioctl_enum_fmt_vid_out,
+#else
+ .vidioc_enum_fmt_vid_cap_mplane = vpu_enc_v4l2_ioctl_enum_fmt_vid_cap,
+ .vidioc_enum_fmt_vid_out_mplane = vpu_enc_v4l2_ioctl_enum_fmt_vid_out,
+#endif
+ .vidioc_enum_framesizes = vpu_enc_v4l2_ioctl_enum_framesizes,
+ .vidioc_enum_frameintervals = vpu_enc_v4l2_ioctl_enum_frameintervals,
+ .vidioc_g_fmt_vid_cap_mplane = vpu_enc_v4l2_ioctl_g_fmt,
+ .vidioc_g_fmt_vid_out_mplane = vpu_enc_v4l2_ioctl_g_fmt,
+ .vidioc_try_fmt_vid_cap_mplane = vpu_enc_v4l2_ioctl_try_fmt,
+ .vidioc_try_fmt_vid_out_mplane = vpu_enc_v4l2_ioctl_try_fmt,
+ .vidioc_s_fmt_vid_cap_mplane = vpu_enc_v4l2_ioctl_s_fmt,
+ .vidioc_s_fmt_vid_out_mplane = vpu_enc_v4l2_ioctl_s_fmt,
+ .vidioc_g_parm = vpu_enc_v4l2_ioctl_g_parm,
+ .vidioc_s_parm = vpu_enc_v4l2_ioctl_s_parm,
+ .vidioc_expbuf = vpu_enc_v4l2_ioctl_expbuf,
+ .vidioc_g_selection = vpu_enc_v4l2_ioctl_g_selection,
+ .vidioc_s_selection = vpu_enc_v4l2_ioctl_s_selection,
+ .vidioc_encoder_cmd = vpu_enc_v4l2_ioctl_encoder_cmd,
+ .vidioc_subscribe_event = vpu_enc_v4l2_ioctl_subscribe_event,
+ .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
+ .vidioc_reqbufs = vpu_enc_v4l2_ioctl_reqbufs,
+ .vidioc_querybuf = vpu_enc_v4l2_ioctl_querybuf,
+ .vidioc_qbuf = vpu_enc_v4l2_ioctl_qbuf,
+ .vidioc_dqbuf = vpu_enc_v4l2_ioctl_dqbuf,
+ .vidioc_streamon = vpu_enc_v4l2_ioctl_streamon,
+ .vidioc_streamoff = vpu_enc_v4l2_ioctl_streamoff,
+};
+
+static void vpu_core_send_cmd(struct core_device *core, u32 idx,
+ u32 cmdid, u32 cmdnum, u32 *local_cmddata)
+{
+ WARN_ON(!core || idx >= VID_API_NUM_STREAMS);
+
+ vpu_log_cmd(cmdid, idx);
+ count_cmd(&core->attr[idx], cmdid);
+
+ mutex_lock(&core->cmd_mutex);
+ rpc_send_cmd_buf_encoder(&core->shared_mem, idx, cmdid, cmdnum,
+ local_cmddata);
+ mb();
+ vpu_enc_mu_send_msg(core, COMMAND, 0xffff);
+ mutex_unlock(&core->cmd_mutex);
+}
+
+static void vpu_ctx_send_cmd(struct vpu_ctx *ctx, uint32_t cmdid,
+ uint32_t cmdnum, uint32_t *local_cmddata)
+{
+ vpu_core_send_cmd(ctx->core_dev, ctx->str_index,
+ cmdid, cmdnum, local_cmddata);
+}
+
+static void set_core_fw_status(struct core_device *core, bool status)
+{
+ core->fw_is_ready = status;
+}
+
+static int reset_vpu_core_dev(struct core_device *core_dev)
+{
+ if (!core_dev)
+ return -EINVAL;
+
+ set_core_fw_status(core_dev, false);
+ core_dev->firmware_started = false;
+
+ return 0;
+}
+
+static int sw_reset_firmware(struct core_device *core, int resume)
+{
+ int ret = 0;
+
+ WARN_ON(!core);
+
+ vpu_dbg(LVL_INFO, "core[%d] sw reset firmware\n", core->id);
+
+ kfifo_reset(&core->mu_msg_fifo);
+
+ init_completion(&core->start_cmp);
+ vpu_core_send_cmd(core, 0, GTB_ENC_CMD_FIRM_RESET, 0, NULL);
+ ret = wait_for_start_done(core, resume);
+ if (ret) {
+ set_core_hang(core);
+ return -EINVAL;
+ }
+ core->reset_times++;
+
+ return 0;
+}
+
+static int process_core_hang(struct core_device *core)
+{
+ int ret;
+ int i;
+ int instance_count = 0;
+
+ if (!core->hang)
+ return 0;
+
+ for (i = 0; i < core->supported_instance_count; i++) {
+ if (core->ctx[i])
+ instance_count++;
+ }
+
+ if (instance_count)
+ return -EBUSY;
+
+ ret = sw_reset_firmware(core, 0);
+ if (ret)
+ return ret;
+
+ clear_core_hang(core);
+ return 0;
+}
+
+static void show_codec_configure(pMEDIAIP_ENC_PARAM param)
+{
+ if (!param)
+ return;
+
+ vpu_dbg(LVL_INFO, "Encoder Parameter:\n");
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Codec Mode", param->eCodecMode);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Profile", param->eProfile);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Level", param->uLevel);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Mem Phys Addr", param->tEncMemDesc.uMemPhysAddr);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Mem Virt Addr", param->tEncMemDesc.uMemVirtAddr);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Mem Size", param->tEncMemDesc.uMemSize);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Frame Rate", param->uFrameRate);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Source Stride", param->uSrcStride);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Source Width", param->uSrcWidth);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Source Height", param->uSrcHeight);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Source Offset x", param->uSrcOffset_x);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Source Offset y", param->uSrcOffset_y);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Source Crop Width", param->uSrcCropWidth);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Source Crop Height", param->uSrcCropHeight);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Out Width", param->uOutWidth);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Out Height", param->uOutHeight);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "I Frame Interval", param->uIFrameInterval);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "GOP Length", param->uGopBLength);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Low Latency Mode", param->uLowLatencyMode);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Bitrate Mode", param->eBitRateMode);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Target Bitrate", param->uTargetBitrate);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Min Bitrate", param->uMinBitRate);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "Max Bitrate", param->uMaxBitRate);
+ vpu_dbg(LVL_INFO, "\t%20s:%16d\n",
+ "QP", param->uInitSliceQP);
+}
+
+static void show_firmware_version(struct core_device *core_dev,
+ unsigned int level)
+{
+ pENC_RPC_HOST_IFACE pSharedInterface;
+
+ if (!core_dev)
+ return;
+
+ pSharedInterface = core_dev->shared_mem.pSharedInterface;
+
+ vpu_dbg(level, "vpu encoder core[%d] firmware version is %d.%d.%d\n",
+ core_dev->id,
+ (pSharedInterface->FWVersion & 0x00ff0000) >> 16,
+ (pSharedInterface->FWVersion & 0x0000ff00) >> 8,
+ pSharedInterface->FWVersion & 0x000000ff);
+}
+
+static void update_encode_size(struct vpu_ctx *ctx)
+{
+ struct queue_data *src = NULL;
+ struct queue_data *dst = NULL;
+ struct vpu_attr *attr;
+ pMEDIAIP_ENC_PARAM pEncParam;
+
+ if (!ctx)
+ return;
+
+ attr = get_vpu_ctx_attr(ctx);
+ if (!attr)
+ return;
+
+ src = &ctx->q_data[V4L2_SRC];
+ dst = &ctx->q_data[V4L2_DST];
+ pEncParam = &attr->param;
+
+ pEncParam->uSrcStride = src->width;
+ pEncParam->uSrcWidth = src->width;
+ pEncParam->uSrcHeight = src->height;
+ pEncParam->uSrcOffset_x = src->rect.left;
+ pEncParam->uSrcOffset_y = src->rect.top;
+ pEncParam->uSrcCropWidth = src->rect.width;
+ pEncParam->uSrcCropHeight = src->rect.height;
+ pEncParam->uOutWidth = min(dst->width, src->rect.width);
+ pEncParam->uOutHeight = min(dst->height, src->rect.height);
+}
+
+static void init_ctx_seq_info(struct vpu_ctx *ctx)
+{
+ int i;
+
+ if (!ctx)
+ return;
+
+ ctx->sequence = 0;
+ for (i = 0; i < ARRAY_SIZE(ctx->timestams); i++)
+ ctx->timestams[i] = VPU_ENC_INVALID_TIMESTAMP;
+}
+
+static void fill_ctx_seq(struct vpu_ctx *ctx, struct vb2_data_req *p_data_req)
+{
+ u_int32 idx;
+
+ WARN_ON(!ctx || !p_data_req);
+
+ p_data_req->sequence = ctx->sequence++;
+ idx = p_data_req->sequence % VPU_ENC_SEQ_CAPACITY;
+ if (ctx->timestams[idx] != VPU_ENC_INVALID_TIMESTAMP) {
+ count_timestamp_overwrite(ctx);
+ vpu_dbg(LVL_FRAME, "[%d.%d][%d] overwrite timestamp\n",
+ ctx->core_dev->id, ctx->str_index,
+ p_data_req->sequence);
+ }
+ ctx->timestams[idx] = p_data_req->vb2_buf->timestamp;
+}
+
+static s64 get_ctx_seq_timestamp(struct vpu_ctx *ctx, u32 sequence)
+{
+ s64 timestamp;
+ u_int32 idx;
+
+ WARN_ON(!ctx);
+
+ idx = sequence % VPU_ENC_SEQ_CAPACITY;
+ timestamp = ctx->timestams[idx];
+ ctx->timestams[idx] = VPU_ENC_INVALID_TIMESTAMP;
+
+ return timestamp;
+}
+
+static void fill_vb_sequence(struct vb2_buffer *vb, u32 sequence)
+{
+ struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
+
+ vbuf->sequence = sequence;
+}
+
+static struct vb2_data_req *find_vb2_data_by_sequence(struct queue_data *queue,
+ u32 sequence)
+{
+ int i;
+
+ for (i = 0; i < queue->vb2_q.num_buffers; i++) {
+ if (!queue->vb2_reqs[i].vb2_buf)
+ continue;
+ if (queue->vb2_reqs[i].sequence == sequence)
+ return &queue->vb2_reqs[i];
+ }
+
+ return NULL;
+}
+
+static void update_stream_desc_rptr(struct vpu_ctx *ctx, u32 rptr)
+{
+ pBUFFER_DESCRIPTOR_TYPE stream_buffer_desc;
+
+ stream_buffer_desc = get_rpc_stream_buffer_desc(ctx);
+ stream_buffer_desc->rptr = rptr;
+}
+
+static int do_configure_codec(struct vpu_ctx *ctx)
+{
+ pBUFFER_DESCRIPTOR_TYPE pEncStrBuffDesc = NULL;
+ pMEDIAIP_ENC_EXPERT_MODE_PARAM pEncExpertModeParam = NULL;
+ pMEDIAIP_ENC_PARAM enc_param;
+ struct vpu_attr *attr;
+
+ if (!ctx || !ctx->core_dev)
+ return -EINVAL;
+
+ attr = get_vpu_ctx_attr(ctx);
+ if (!attr)
+ return -EINVAL;
+
+ if (vpu_enc_alloc_stream(ctx))
+ return -ENOMEM;
+
+ update_encode_size(ctx);
+
+ enc_param = get_rpc_enc_param(ctx);
+ pEncStrBuffDesc = get_rpc_stream_buffer_desc(ctx);
+
+ pEncStrBuffDesc->start = ctx->encoder_stream.phy_addr;
+ pEncStrBuffDesc->wptr = pEncStrBuffDesc->start;
+ pEncStrBuffDesc->rptr = pEncStrBuffDesc->start;
+ pEncStrBuffDesc->end = ctx->encoder_stream.phy_addr +
+ ctx->encoder_stream.size;
+
+ vpu_dbg(LVL_DEBUG,
+ "pEncStrBuffDesc:start=%x, wptr=0x%x, rptr=%x, end=%x\n",
+ pEncStrBuffDesc->start,
+ pEncStrBuffDesc->wptr,
+ pEncStrBuffDesc->rptr,
+ pEncStrBuffDesc->end);
+
+ pEncExpertModeParam = get_rpc_expert_mode_param(ctx);
+ pEncExpertModeParam->Calib.mem_chunk_phys_addr = 0;
+ pEncExpertModeParam->Calib.mem_chunk_virt_addr = 0;
+ pEncExpertModeParam->Calib.mem_chunk_size = 0;
+ pEncExpertModeParam->Calib.cb_base = ctx->encoder_stream.phy_addr;
+ pEncExpertModeParam->Calib.cb_size = ctx->encoder_stream.size;
+
+ show_firmware_version(ctx->core_dev, LVL_INFO);
+ clear_stop_status(ctx);
+ memcpy(enc_param, &attr->param, sizeof(attr->param));
+ vpu_ctx_send_cmd(ctx, GTB_ENC_CMD_CONFIGURE_CODEC, 0, NULL);
+
+ show_codec_configure(enc_param);
+
+ return 0;
+}
+
+static int check_vpu_ctx_is_ready(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return false;
+
+ if (!test_bit(VPU_ENC_STATUS_OUTPUT_READY, &ctx->status))
+ return false;
+ if (!test_bit(VPU_ENC_STATUS_DATA_READY, &ctx->status))
+ return false;
+
+ return true;
+}
+
+static int configure_codec(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return -EINVAL;
+
+ if (!check_vpu_ctx_is_ready(ctx))
+ return 0;
+
+ if (ctx->core_dev->snapshot)
+ return 0;
+
+ if (test_bit(VPU_ENC_STATUS_SNAPSHOT, &ctx->status))
+ return 0;
+
+ if (!test_and_set_bit(VPU_ENC_STATUS_CONFIGURED, &ctx->status)) {
+ do_configure_codec(ctx);
+ clear_bit(VPU_ENC_STATUS_OUTPUT_READY, &ctx->status);
+ clear_bit(VPU_ENC_STATUS_DATA_READY, &ctx->status);
+ }
+
+ return 0;
+}
+
+static void dump_vb2_data(struct vb2_buffer *vb)
+{
+#ifdef DUMP_DATA
+ const int DATA_NUM = 10;
+ char *read_data;
+ u_int32 read_idx;
+ char data_str[1024];
+ int num = 0;
+
+ if (!vb)
+ return;
+
+ read_data = vb2_plane_vaddr(vb, 0);
+ num = scnprintf(data_str, sizeof(data_str),
+ "transfer data from virt 0x%p: ", read_data);
+ for (read_idx = 0; read_idx < DATA_NUM; read_idx++)
+ num += scnprintf(data_str + num, sizeof(data_str) - num,
+ " 0x%x", read_data[read_idx]);
+
+ vpu_dbg(LVL_DEBUG, "%s\n", data_str);
+#endif
+}
+
+static u32 get_vb2_plane_phy_addr(struct vb2_buffer *vb, unsigned int plane_no)
+{
+ dma_addr_t *dma_addr;
+
+ dma_addr = vb2_plane_cookie(vb, plane_no);
+ return *dma_addr + vb->planes[plane_no].data_offset;
+}
+
+static void record_start_time(struct vpu_ctx *ctx, enum QUEUE_TYPE type)
+{
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ struct timespec ts;
+
+ if (!attr)
+ return;
+
+ if (attr->ts_start[type])
+ return;
+
+ getrawmonotonic(&ts);
+ attr->ts_start[type] = ts.tv_sec * MSEC_PER_SEC +
+ ts.tv_nsec / NSEC_PER_MSEC;
+}
+
+static bool update_yuv_addr(struct vpu_ctx *ctx)
+{
+ bool bGotAFrame = FALSE;
+
+ struct vb2_data_req *p_data_req;
+ struct queue_data *This = &ctx->q_data[V4L2_SRC];
+
+ pMEDIAIP_ENC_YUV_BUFFER_DESC desc;
+
+ desc = get_rpc_yuv_buffer_desc(ctx);
+
+ if (list_empty(&This->drv_q))
+ return bGotAFrame;
+
+ p_data_req = list_first_entry(&This->drv_q, typeof(*p_data_req), list);
+
+ dump_vb2_data(p_data_req->vb2_buf);
+
+ desc->uLumaBase = get_vb2_plane_phy_addr(p_data_req->vb2_buf, 0);
+ desc->uChromaBase = get_vb2_plane_phy_addr(p_data_req->vb2_buf, 1);
+
+ if (desc->uLumaBase != 0)
+ bGotAFrame = TRUE;
+
+ /*
+ * keeps increasing,
+ * so just a frame input count rather than a Frame buffer ID
+ */
+ desc->uFrameID = p_data_req->sequence;
+ if (test_and_clear_bit(VPU_ENC_STATUS_KEY_FRAME, &ctx->status))
+ desc->uKeyFrame = 1;
+ else
+ desc->uKeyFrame = 0;
+ list_del(&p_data_req->list);
+
+ return bGotAFrame;
+}
+
+static void get_kmp_next(const u8 *p, int *next, int size)
+{
+ int k = -1;
+ int j = 0;
+
+ next[0] = -1;
+ while (j < size - 1) {
+ if (k == -1 || p[j] == p[k]) {
+ ++k;
+ ++j;
+ next[j] = k;
+ } else {
+ k = next[k];
+ }
+ }
+}
+
+static int kmp_search(u8 *s, int s_len, const u8 *p, int p_len, int *next)
+{
+ int i = 0;
+ int j = 0;
+
+ while (i < s_len && j < p_len) {
+ if (j == -1 || s[i] == p[j]) {
+ i++;
+ j++;
+ } else {
+ j = next[j];
+ }
+ }
+ if (j == p_len)
+ return i - j;
+ else
+ return -1;
+}
+
+static int get_stuff_data_size(u8 *data, int size)
+{
+ const u8 pattern[] = VPU_STRM_END_PATTERN;
+ int next[] = VPU_STRM_END_PATTERN;
+ int index;
+
+ if (size < ARRAY_SIZE(pattern))
+ return 0;
+
+ get_kmp_next(pattern, next, ARRAY_SIZE(pattern));
+ index = kmp_search(data, size, pattern, ARRAY_SIZE(pattern), next);
+ if (index < 0)
+ return 0;
+ vpu_dbg(LVL_DEBUG, "find end_of_stream nal\n");
+ return size - index;
+}
+
+static void count_strip_info(struct vpu_strip_info *info, u32 bytes)
+{
+ if (!info)
+ return;
+
+ info->count++;
+ info->total += bytes;
+ if (info->max < bytes)
+ info->max = bytes;
+}
+
+static void strip_stuff_data_on_tail(struct vpu_ctx *ctx, struct vb2_buffer *vb)
+{
+ u8 *ptr = vb2_plane_vaddr(vb, 0);
+ unsigned long bytesused = vb2_get_plane_payload(vb, 0);
+ int count = VPU_TAIL_SERACH_SIZE;
+ int stuff_size;
+
+ if (count > bytesused)
+ count = bytesused;
+
+ if (!count)
+ return;
+
+ stuff_size = get_stuff_data_size(ptr + bytesused - count, count);
+ if (stuff_size) {
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+
+ if (attr)
+ count_strip_info(&attr->statistic.strip_sts.eos,
+ stuff_size);
+
+ vpu_dbg(LVL_DEBUG, "strip %d bytes stuff data\n", stuff_size);
+ vb2_set_plane_payload(vb, 0, bytesused - stuff_size);
+ }
+}
+
+static int check_enc_rw_flag(int flag)
+{
+ int ret = -EINVAL;
+
+ switch (flag) {
+ case VPU_ENC_FLAG_WRITEABLE:
+ case VPU_ENC_FLAG_READABLE:
+ ret = 0;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static void set_queue_rw_flag(struct queue_data *queue, int flag)
+{
+ if (!queue)
+ return;
+
+ if (check_enc_rw_flag(flag))
+ return;
+
+ set_bit(flag, &queue->rw_flag);
+}
+
+static void clear_queue_rw_flag(struct queue_data *queue, int flag)
+{
+ if (!queue)
+ return;
+
+ if (check_enc_rw_flag(flag))
+ return;
+
+ clear_bit(flag, &queue->rw_flag);
+}
+
+u32 get_free_space(struct vpu_ctx *ctx)
+{
+ pBUFFER_DESCRIPTOR_TYPE desc = get_rpc_stream_buffer_desc(ctx);
+ u32 start = get_ptr(desc->start);
+ u32 end = get_ptr(desc->end);
+ u32 wptr = get_ptr(desc->wptr);
+ u32 rptr = get_ptr(desc->rptr);
+
+ if (rptr > wptr)
+ return (rptr - wptr);
+ else if (rptr < wptr)
+ return (end - start + rptr - wptr);
+ else
+ return (end - start);
+
+}
+
+bool check_stream_buffer_for_coded_picture(struct vpu_ctx *ctx)
+{
+ if (get_free_space(ctx) < ctx->cpb_size)
+ return false;
+
+ return true;
+}
+
+static int submit_input_and_encode(struct vpu_ctx *ctx)
+{
+ struct queue_data *queue;
+
+ if (!ctx)
+ return -EINVAL;
+
+ queue = &ctx->q_data[V4L2_SRC];
+
+ down(&queue->drv_q_lock);
+
+ if (!test_bit(VPU_ENC_FLAG_WRITEABLE, &queue->rw_flag))
+ goto exit;
+
+ if (list_empty(&queue->drv_q))
+ goto exit;
+
+ if (!check_stream_buffer_for_coded_picture(ctx))
+ goto exit;
+
+ if (test_bit(VPU_ENC_STATUS_STOP_SEND, &ctx->status))
+ goto exit;
+ if (!test_bit(VPU_ENC_STATUS_START_DONE, &ctx->status))
+ goto exit;
+
+ if (update_yuv_addr(ctx)) {
+ vpu_ctx_send_cmd(ctx, GTB_ENC_CMD_FRAME_ENCODE, 0, NULL);
+ clear_queue_rw_flag(queue, VPU_ENC_FLAG_WRITEABLE);
+ record_start_time(ctx, V4L2_SRC);
+ }
+exit:
+ up(&queue->drv_q_lock);
+
+ return 0;
+}
+
+static void add_rptr(struct vpu_frame_info *frame, u32 length)
+{
+ WARN_ON(!frame);
+
+ frame->rptr += length;
+ if (frame->rptr >= frame->end)
+ frame->rptr -= (frame->end - frame->start);
+}
+
+static void report_frame_type(struct vb2_data_req *p_data_req,
+ struct vpu_frame_info *frame)
+{
+ WARN_ON(!p_data_req || !frame);
+
+ switch (frame->info.ePicType) {
+ case MEDIAIP_ENC_PIC_TYPE_IDR_FRAME:
+ case MEDIAIP_ENC_PIC_TYPE_I_FRAME:
+ p_data_req->buffer_flags = V4L2_BUF_FLAG_KEYFRAME;
+ break;
+ case MEDIAIP_ENC_PIC_TYPE_P_FRAME:
+ p_data_req->buffer_flags = V4L2_BUF_FLAG_PFRAME;
+ break;
+ case MEDIAIP_ENC_PIC_TYPE_B_FRAME:
+ p_data_req->buffer_flags = V4L2_BUF_FLAG_BFRAME;
+ break;
+ default:
+ break;
+ }
+}
+
+static u32 calc_frame_length(struct vpu_frame_info *frame)
+{
+ u32 length;
+ u32 buffer_size;
+
+ WARN_ON(!frame);
+
+ if (frame->eos)
+ return 0;
+
+ buffer_size = frame->end - frame->start;
+ if (!buffer_size)
+ return 0;
+
+ length = (buffer_size + frame->wptr - frame->rptr) % buffer_size;
+
+ return length;
+}
+
+static u32 get_ptr(u32 ptr)
+{
+ return (ptr | 0x80000000);
+}
+
+static void *get_rptr_virt(struct vpu_ctx *ctx, struct vpu_frame_info *frame)
+{
+ WARN_ON(!ctx || !frame);
+
+ return ctx->encoder_stream.virt_addr + frame->rptr - frame->start;
+}
+
+static int find_nal_begin(u8 *data, u32 size)
+{
+ const u8 pattern[] = VPU_STRM_BEGIN_PATTERN;
+ int next[] = VPU_STRM_BEGIN_PATTERN;
+ u32 len;
+ int index;
+
+ len = ARRAY_SIZE(pattern);
+ get_kmp_next(pattern, next, len);
+ index = kmp_search(data, size, pattern, len, next);
+ if (index > 0 && data[index - 1] == 0)
+ index--;
+
+ return index;
+}
+
+static int find_frame_start_and_skip(struct vpu_ctx *ctx,
+ struct vpu_frame_info *frame, int skip)
+{
+ u32 length;
+ u32 bytesskiped = 0;
+ u8 *data = get_rptr_virt(ctx, frame);
+ int index;
+
+ length = frame->bytesleft;
+ if (frame->rptr + length <= frame->end) {
+ index = find_nal_begin(data, length);
+ if (index >= 0)
+ bytesskiped += index;
+ else
+ bytesskiped += length;
+ } else {
+ u32 size = frame->end - frame->rptr;
+
+ index = find_nal_begin(data, size);
+ if (index >= 0) {
+ bytesskiped += index;
+ } else {
+ bytesskiped += size;
+
+ data = ctx->encoder_stream.virt_addr;
+ size = length - size;
+ index = find_nal_begin(data, size);
+ if (index >= 0)
+ bytesskiped += index;
+ else
+ bytesskiped += size;
+ }
+ }
+
+ if (skip && bytesskiped) {
+ add_rptr(frame, bytesskiped);
+ frame->bytesleft -= bytesskiped;
+ }
+
+ return bytesskiped;
+}
+
+static int transfer_stream_output(struct vpu_ctx *ctx,
+ struct vpu_frame_info *frame,
+ struct vb2_data_req *p_data_req)
+{
+ struct vb2_buffer *vb = NULL;
+ u32 length;
+ void *pdst;
+
+ WARN_ON(!ctx || !frame || !p_data_req);
+
+ length = frame->bytesleft;
+
+ vb = p_data_req->vb2_buf;
+ if (length > vb->planes[0].length)
+ length = vb->planes[0].length;
+ vb2_set_plane_payload(vb, 0, length);
+
+ pdst = vb2_plane_vaddr(vb, 0);
+ if (frame->rptr + length <= frame->end) {
+ memcpy(pdst, get_rptr_virt(ctx, frame), length);
+ frame->bytesleft -= length;
+ add_rptr(frame, length);
+ } else {
+ u32 offset = frame->end - frame->rptr;
+
+ memcpy(pdst, get_rptr_virt(ctx, frame), offset);
+ frame->bytesleft -= offset;
+ add_rptr(frame, offset);
+ length -= offset;
+ memcpy(pdst + offset, get_rptr_virt(ctx, frame), length);
+ frame->bytesleft -= length;
+ add_rptr(frame, length);
+ }
+ report_frame_type(p_data_req, frame);
+ if (frame->bytesleft)
+ return 0;
+
+ strip_stuff_data_on_tail(ctx, p_data_req->vb2_buf);
+
+ return 0;
+}
+
+static int append_empty_end_frame(struct vb2_data_req *p_data_req)
+{
+ struct vb2_buffer *vb = NULL;
+ const u8 pattern[] = VPU_STRM_END_PATTERN;
+ void *pdst;
+
+ WARN_ON(!p_data_req);
+
+ vb = p_data_req->vb2_buf;
+ pdst = vb2_plane_vaddr(vb, 0);
+ memcpy(pdst, pattern, ARRAY_SIZE(pattern));
+
+ vb2_set_plane_payload(vb, 0, ARRAY_SIZE(pattern));
+ p_data_req->buffer_flags = V4L2_BUF_FLAG_LAST;
+
+ vpu_dbg(LVL_INFO, "append the last frame\n");
+
+ return 0;
+}
+
+static bool is_valid_frame_read_pos(u32 ptr, struct vpu_frame_info *frame)
+{
+ if (ptr < frame->start || ptr >= frame->end)
+ return false;
+ if (ptr >= frame->rptr && ptr < frame->wptr)
+ return true;
+ if (frame->rptr > frame->wptr) {
+ if (ptr >= frame->rptr || ptr < frame->wptr)
+ return true;
+ }
+
+ return false;
+}
+static int precheck_frame(struct vpu_ctx *ctx, struct vpu_frame_info *frame)
+{
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ u32 length;
+ int bytesskiped;
+ u32 rptr;
+
+ if (frame->eos)
+ return 0;
+ if (!frame->is_start)
+ return 0;
+
+ add_rptr(frame, 0);
+ frame->is_start = false;
+ rptr = get_ptr(frame->info.uStrBuffWrPtr);
+ if (rptr == frame->end)
+ rptr = frame->start;
+
+ if (is_valid_frame_read_pos(rptr, frame)) {
+ if (rptr != frame->rptr) {
+ vpu_dbg(LVL_DEBUG, "frame skip %d bytes\n",
+ rptr - frame->rptr);
+ count_strip_info(&attr->statistic.strip_sts.fw,
+ rptr - frame->rptr);
+ }
+ frame->rptr = rptr;
+ } else {
+ vpu_err("[%ld]wrong uStrBuffWrPtr:0x%x\n", frame->index, rptr);
+ }
+
+ length = calc_frame_length(frame);
+ if (!length || length < frame->bytesleft) {
+ vpu_err("[%d][%d]'s frame[%ld] invalid, want %d but %d, drop\n",
+ ctx->core_dev->id, ctx->str_index,
+ frame->index, frame->bytesleft, length);
+ vpu_err("uStrBuffWrPtr = 0x%x, uFrameSize = 0x%x\n",
+ frame->info.uStrBuffWrPtr, frame->info.uFrameSize);
+ add_rptr(frame, length);
+ return -EINVAL;
+ }
+
+ bytesskiped = find_frame_start_and_skip(ctx, frame, 0);
+ if (!bytesskiped)
+ return 0;
+
+ if (attr)
+ count_strip_info(&attr->statistic.strip_sts.begin, bytesskiped);
+
+ return 0;
+}
+
+static int inc_frame(struct queue_data *queue)
+{
+ struct vpu_frame_info *frame = NULL;
+
+ if (!queue)
+ return -EINVAL;
+
+ frame = vzalloc(sizeof(*frame));
+ if (!frame)
+ return -EINVAL;
+
+ frame->queue = queue;
+ list_add_tail(&frame->list, &queue->frame_idle);
+ atomic64_inc(&queue->frame_count);
+
+ vpu_dbg(LVL_DEBUG, "++ frame : %lld\n",
+ atomic64_read(&queue->frame_count));
+
+ return 0;
+}
+
+static void dec_frame(struct vpu_frame_info *frame)
+{
+ if (!frame)
+ return;
+ list_del_init(&frame->list);
+ if (frame->queue) {
+ atomic64_dec(&frame->queue->frame_count);
+
+ vpu_dbg(LVL_DEBUG, "-- frame : %lld\n",
+ atomic64_read(&frame->queue->frame_count));
+ }
+ VPU_SAFE_RELEASE(frame, vfree);
+}
+
+static struct vpu_frame_info *get_idle_frame(struct queue_data *queue)
+{
+ struct vpu_frame_info *frame = NULL;
+
+ if (!queue)
+ return NULL;
+
+ if (list_empty(&queue->frame_idle))
+ inc_frame(queue);
+ frame = list_first_entry(&queue->frame_idle,
+ struct vpu_frame_info, list);
+ if (frame)
+ list_del_init(&frame->list);
+
+ return frame;
+}
+
+static void put_frame_idle(struct vpu_frame_info *frame)
+{
+ struct queue_data *queue;
+
+ if (!frame)
+ return;
+
+ list_del_init(&frame->list);
+ memset(&frame->info, 0, sizeof(frame->info));
+ frame->bytesleft = 0;
+ frame->wptr = 0;
+ frame->rptr = 0;
+ frame->start = 0;
+ frame->end = 0;
+ frame->eos = false;
+ frame->is_start = false;
+ frame->index = 0;
+ frame->timestamp = VPU_ENC_INVALID_TIMESTAMP;
+ queue = frame->queue;
+ if (queue && atomic64_read(&queue->frame_count) <= FRAME_COUNT_THD)
+ list_add_tail(&frame->list, &queue->frame_idle);
+ else
+ dec_frame(frame);
+}
+
+static bool process_frame_done(struct queue_data *queue)
+{
+ struct vpu_ctx *ctx;
+ struct vb2_data_req *p_data_req = NULL;
+ struct vpu_frame_info *frame = NULL;
+ pBUFFER_DESCRIPTOR_TYPE stream_buffer_desc;
+
+ WARN_ON(!queue || !queue->ctx);
+
+ ctx = queue->ctx;
+
+ stream_buffer_desc = get_rpc_stream_buffer_desc(ctx);
+
+ if (list_empty(&queue->frame_q))
+ return false;
+
+ frame = list_first_entry(&queue->frame_q, typeof(*frame), list);
+ if (!frame)
+ return false;
+
+ frame->rptr = get_ptr(stream_buffer_desc->rptr);
+
+ if (precheck_frame(ctx, frame)) {
+ update_stream_desc_rptr(ctx, frame->rptr);
+ put_frame_idle(frame);
+ frame = NULL;
+ return true;
+ }
+
+ if (list_empty(&queue->drv_q))
+ return false;
+
+ p_data_req = list_first_entry(&queue->drv_q, typeof(*p_data_req), list);
+
+ if (frame->eos)
+ append_empty_end_frame(p_data_req);
+ else
+ transfer_stream_output(ctx, frame, p_data_req);
+
+ update_stream_desc_rptr(ctx, frame->rptr);
+ if (!frame->eos) {
+ fill_vb_sequence(p_data_req->vb2_buf, frame->info.uFrameID);
+ p_data_req->vb2_buf->timestamp = frame->timestamp;
+ }
+ if (!frame->bytesleft) {
+ put_frame_idle(frame);
+ frame = NULL;
+ }
+ list_del(&p_data_req->list);
+
+ if (p_data_req->vb2_buf->state == VB2_BUF_STATE_ACTIVE)
+ vb2_buffer_done(p_data_req->vb2_buf, VB2_BUF_STATE_DONE);
+ else
+ vpu_err("vb2_buf's state is invalid(%d\n)",
+ p_data_req->vb2_buf->state);
+
+ return true;
+}
+
+static int process_stream_output(struct vpu_ctx *ctx)
+{
+ struct queue_data *queue = NULL;
+
+ if (!ctx)
+ return -EINVAL;
+
+ queue = &ctx->q_data[V4L2_DST];
+
+ down(&queue->drv_q_lock);
+ while (1) {
+ if (!process_frame_done(queue))
+ break;
+ }
+ up(&queue->drv_q_lock);
+
+ submit_input_and_encode(ctx);
+
+ return 0;
+}
+
+static void show_enc_pic_info(MEDIAIP_ENC_PIC_INFO *pEncPicInfo)
+{
+#ifdef TB_REC_DBG
+ vpu_dbg(LVL_DEBUG, " - Frame ID : 0x%x\n",
+ pEncPicInfo->uFrameID);
+
+ switch (pEncPicInfo->ePicType) {
+ case MEDIAIP_ENC_PIC_TYPE_IDR_FRAME:
+ vpu_dbg(LVL_DEBUG, " - Picture Type : IDR picture\n");
+ break;
+ case MEDIAIP_ENC_PIC_TYPE_I_FRAME:
+ vpu_dbg(LVL_DEBUG, " - Picture Type : I picture\n");
+ break;
+ case MEDIAIP_ENC_PIC_TYPE_P_FRAME:
+ vpu_dbg(LVL_DEBUG, " - Picture Type : P picture\n");
+ break;
+ case MEDIAIP_ENC_PIC_TYPE_B_FRAME:
+ vpu_dbg(LVL_DEBUG, " - Picture Type : B picture\n");
+ break;
+ default:
+ vpu_dbg(LVL_DEBUG, " - Picture Type : BI picture\n");
+ break;
+ }
+ vpu_dbg(LVL_DEBUG, " - Skipped frame : 0x%x\n",
+ pEncPicInfo->uSkippedFrame);
+ vpu_dbg(LVL_DEBUG, " - Frame size : 0x%x\n",
+ pEncPicInfo->uFrameSize);
+ vpu_dbg(LVL_DEBUG, " - Frame CRC : 0x%x\n",
+ pEncPicInfo->uFrameCrc);
+#endif
+}
+
+static int handle_event_start_done(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return -EINVAL;
+
+ down(&ctx->q_data[V4L2_SRC].drv_q_lock);
+ set_bit(VPU_ENC_STATUS_START_DONE, &ctx->status);
+ set_queue_rw_flag(&ctx->q_data[V4L2_SRC], VPU_ENC_FLAG_WRITEABLE);
+ up(&ctx->q_data[V4L2_SRC].drv_q_lock);
+ submit_input_and_encode(ctx);
+
+ enable_fps_sts(get_vpu_ctx_attr(ctx));
+
+ return 0;
+}
+
+static int handle_event_mem_request(struct vpu_ctx *ctx,
+ MEDIAIP_ENC_MEM_REQ_DATA *req_data)
+{
+ int ret;
+
+ if (!ctx || !req_data)
+ return -EINVAL;
+
+ ret = vpu_enc_alloc_mem(ctx, req_data, get_rpc_mem_pool(ctx));
+ if (ret) {
+ vpu_err("fail to alloc encoder memory\n");
+ return ret;
+ }
+ vpu_ctx_send_cmd(ctx, GTB_ENC_CMD_STREAM_START, 0, NULL);
+ set_bit(VPU_ENC_STATUS_START_SEND, &ctx->status);
+
+ return 0;
+}
+
+static bool check_stream_buffer_desc(struct vpu_ctx *ctx,
+ pBUFFER_DESCRIPTOR_TYPE stream_buffer_desc)
+{
+ u32 start;
+ u32 end;
+ u32 rptr;
+ u32 wptr;
+
+ if (!stream_buffer_desc)
+ return false;
+ start = get_ptr(stream_buffer_desc->start);
+ end = get_ptr(stream_buffer_desc->end);
+ rptr = get_ptr(stream_buffer_desc->rptr);
+ wptr = get_ptr(stream_buffer_desc->wptr);
+
+ if (rptr < start || rptr > end ||
+ wptr < start || wptr > end ||
+ end <= start ||
+ end - start != ctx->encoder_stream.size) {
+ vpu_err("stream buffer desc is invalid, s:%x,e:%x,r:%x,w:%x\n",
+ start, end, rptr, wptr);
+ return false;
+ }
+
+ return true;
+}
+
+static int handle_event_frame_done(struct vpu_ctx *ctx,
+ MEDIAIP_ENC_PIC_INFO *pEncPicInfo)
+{
+ struct queue_data *queue;
+ struct vpu_frame_info *frame;
+ pBUFFER_DESCRIPTOR_TYPE stream_buffer_desc;
+ s64 timestamp;
+
+ if (!ctx || !pEncPicInfo)
+ return -EINVAL;
+
+ vpu_dbg(LVL_DEBUG, "Frame done(%d) - uFrameID = %d\n",
+ pEncPicInfo->uPicEncodDone, pEncPicInfo->uFrameID);
+
+ queue = &ctx->q_data[V4L2_DST];
+ if (!pEncPicInfo->uPicEncodDone) {
+ vpu_err("Pic Encoder Not Done\n");
+ return -EINVAL;
+ }
+
+ stream_buffer_desc = get_rpc_stream_buffer_desc(ctx);
+ if (!check_stream_buffer_desc(ctx, stream_buffer_desc))
+ return -EINVAL;
+
+ show_enc_pic_info(pEncPicInfo);
+ record_start_time(ctx, V4L2_DST);
+
+ timestamp = get_ctx_seq_timestamp(ctx, pEncPicInfo->uFrameID);
+
+ down(&queue->drv_q_lock);
+ frame = get_idle_frame(queue);
+ if (frame) {
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+
+ memcpy(&frame->info, pEncPicInfo, sizeof(frame->info));
+ frame->bytesleft = frame->info.uFrameSize;
+ frame->wptr = get_ptr(stream_buffer_desc->wptr);
+ frame->rptr = get_ptr(stream_buffer_desc->rptr);
+ frame->start = get_ptr(stream_buffer_desc->start);
+ frame->end = get_ptr(stream_buffer_desc->end);
+ frame->eos = false;
+ frame->is_start = true;
+ frame->timestamp = timestamp;
+ if (attr)
+ frame->index = attr->statistic.encoded_count;
+
+ list_add_tail(&frame->list, &queue->frame_q);
+ } else {
+ vpu_err("fail to alloc memory for frame info\n");
+ }
+ up(&queue->drv_q_lock);
+ count_encoded_frame(ctx);
+
+ /* Sync the write pointer to the local view of it */
+ process_stream_output(ctx);
+
+ return 0;
+}
+
+static int handle_event_frame_release(struct vpu_ctx *ctx, u_int32 *uFrameID)
+{
+ struct queue_data *This = &ctx->q_data[V4L2_SRC];
+ struct vb2_data_req *p_data_req = NULL;
+
+ if (!ctx || !uFrameID)
+ return -EINVAL;
+
+ This = &ctx->q_data[V4L2_SRC];
+ vpu_dbg(LVL_DEBUG, "Frame release - uFrameID = %d\n", *uFrameID);
+ p_data_req = find_vb2_data_by_sequence(This, *uFrameID);
+ if (!p_data_req) {
+ vpu_err("uFrameID[%d] is invalid\n", *uFrameID);
+ return -EINVAL;
+ }
+ if (p_data_req->vb2_buf->state == VB2_BUF_STATE_ACTIVE)
+ vb2_buffer_done(p_data_req->vb2_buf, VB2_BUF_STATE_DONE);
+
+ return 0;
+}
+
+static int handle_event_stop_done(struct vpu_ctx *ctx)
+{
+ struct queue_data *queue;
+ struct vpu_frame_info *frame;
+
+ WARN_ON(!ctx);
+ queue = &ctx->q_data[V4L2_DST];
+
+ disable_fps_sts(get_vpu_ctx_attr(ctx));
+
+ set_bit(VPU_ENC_STATUS_STOP_DONE, &ctx->status);
+ notify_eos(ctx);
+
+ down(&queue->drv_q_lock);
+ frame = get_idle_frame(queue);
+ if (frame) {
+ frame->eos = true;
+ list_add_tail(&frame->list, &queue->frame_q);
+ } else {
+ vpu_err("fail to alloc memory for last frame\n");
+ }
+ up(&queue->drv_q_lock);
+
+ process_stream_output(ctx);
+
+ clear_start_status(ctx);
+ init_ctx_seq_info(ctx);
+ complete(&ctx->stop_cmp);
+
+ return 0;
+}
+
+static void vpu_enc_event_handler(struct vpu_ctx *ctx,
+ u_int32 uEvent, u_int32 *event_data)
+{
+ vpu_log_event(uEvent, ctx->str_index);
+ count_event(ctx, uEvent);
+ vpu_enc_check_mem_overstep(ctx);
+
+ switch (uEvent) {
+ case VID_API_ENC_EVENT_START_DONE:
+ handle_event_start_done(ctx);
+ break;
+ case VID_API_ENC_EVENT_MEM_REQUEST:
+ handle_event_mem_request(ctx,
+ (MEDIAIP_ENC_MEM_REQ_DATA *)event_data);
+ break;
+ case VID_API_ENC_EVENT_PARA_UPD_DONE:
+ break;
+ case VID_API_ENC_EVENT_FRAME_DONE:
+ handle_event_frame_done(ctx,
+ (MEDIAIP_ENC_PIC_INFO *)event_data);
+ break;
+ case VID_API_ENC_EVENT_FRAME_RELEASE:
+ handle_event_frame_release(ctx, (u_int32 *)event_data);
+ break;
+ case VID_API_ENC_EVENT_STOP_DONE:
+ handle_event_stop_done(ctx);
+ break;
+ case VID_API_ENC_EVENT_FRAME_INPUT_DONE:
+ down(&ctx->q_data[V4L2_SRC].drv_q_lock);
+ set_queue_rw_flag(&ctx->q_data[V4L2_SRC],
+ VPU_ENC_FLAG_WRITEABLE);
+ up(&ctx->q_data[V4L2_SRC].drv_q_lock);
+ response_stop_stream(ctx);
+ submit_input_and_encode(ctx);
+ break;
+ case VID_API_ENC_EVENT_TERMINATE_DONE:
+ break;
+ case VID_API_ENC_EVENT_RESET_DONE:
+ break;
+ case VID_API_ENC_EVENT_FIRMWARE_XCPT:
+ vpu_err("firmware exception:%s\n", (char *)event_data);
+ break;
+ default:
+ vpu_err("........unknown event : 0x%x\n", uEvent);
+ break;
+ }
+}
+
+static void get_core_supported_instance_count(struct core_device *core)
+{
+ pENC_RPC_HOST_IFACE iface;
+
+ iface = core->shared_mem.pSharedInterface;
+ core->supported_instance_count =
+ min_t(u32, iface->uMaxEncoderStreams, VID_API_NUM_STREAMS);
+}
+
+static int re_configure_codecs(struct core_device *core)
+{
+ int i;
+
+ for (i = 0; i < core->supported_instance_count; i++) {
+ struct vpu_ctx *ctx = core->ctx[i];
+ struct queue_data *queue;
+
+ if (!ctx || !test_bit(VPU_ENC_STATUS_INITIALIZED, &ctx->status))
+ continue;
+
+ mutex_lock(&ctx->instance_mutex);
+ queue = &ctx->q_data[V4L2_SRC];
+ if (!list_empty(&queue->drv_q)) {
+ vpu_dbg(LVL_INFO,
+ "re configure codec for core[%d]\n", core->id);
+ configure_codec(ctx);
+ submit_input_and_encode(ctx);
+ }
+ mutex_unlock(&ctx->instance_mutex);
+ }
+
+ return 0;
+}
+
+static int wait_for_start_done(struct core_device *core, int resume)
+{
+ int ret;
+
+ if (!core)
+ return -EINVAL;
+
+ ret = wait_for_completion_timeout(&core->start_cmp,
+ msecs_to_jiffies(1000));
+ if (!ret) {
+ vpu_err("error: wait for core[%d] %s done timeout!\n",
+ core->id, resume ? "resume" : "start");
+ return -EINVAL;
+ }
+
+ if (resume)
+ re_configure_codecs(core);
+
+ return 0;
+}
+
+static void vpu_core_start_done(struct core_device *core)
+{
+ if (!core)
+ return;
+
+ get_core_supported_instance_count(core);
+ core->firmware_started = true;
+ complete(&core->start_cmp);
+
+ show_firmware_version(core, LVL_ALL);
+}
+
+static struct vpu_ctx *get_ctx_by_index(struct core_device *core, int index)
+{
+ struct vpu_ctx *ctx = NULL;
+
+ if (!core)
+ return NULL;
+
+ if (index < 0 || index >= core->supported_instance_count)
+ return NULL;
+
+ ctx = core->ctx[index];
+ if (!ctx)
+ return NULL;
+
+ if (!test_bit(VPU_ENC_STATUS_INITIALIZED, &ctx->status)) {
+ vpu_err("core[%d]'s ctx[%d] is not initialized\n",
+ core->id, index);
+ return NULL;
+ }
+
+ if (test_bit(VPU_ENC_STATUS_CLOSED, &ctx->status)) {
+ vpu_err("core[%d]'s ctx[%d] is closed\n",
+ core->id, index);
+ return NULL;
+ }
+
+ return ctx;
+}
+
+static int process_ctx_msg(struct vpu_ctx *ctx, struct msg_header *header)
+{
+ int ret = 0;
+ struct vpu_event_msg *msg = NULL;
+ u32 *pdata = NULL;
+
+ if (!ctx || !header)
+ return -EINVAL;
+
+ if (ctx->ctx_released)
+ return -EINVAL;
+
+ msg = get_idle_msg(ctx);
+ if (!msg) {
+ vpu_err("get idle msg fail\n");
+ return -ENOMEM;
+ }
+
+ msg->idx = header->idx;
+ msg->msgid = header->msgid;
+ msg->number = header->msgnum;
+ pdata = msg->data;
+ ret = 0;
+ if (msg->number > ARRAY_SIZE(msg->data)) {
+ ret = alloc_msg_ext_buffer(msg, header->msgnum);
+ pdata = msg->ext_data;
+ }
+ rpc_read_msg_array(&ctx->core_dev->shared_mem, pdata, msg->number);
+ if (ret) {
+ put_idle_msg(ctx, msg);
+ return ret;
+ }
+
+ push_back_event_msg(ctx, msg);
+
+ return ret;
+}
+
+static int process_msg(struct core_device *core)
+{
+ struct msg_header header;
+ struct vpu_ctx *ctx = NULL;
+ int ret;
+
+ ret = rpc_get_msg_header(&core->shared_mem, &header);
+ if (ret)
+ return ret;
+
+ if (header.idx >= ARRAY_SIZE(core->ctx)) {
+ vpu_err("msg idx(%d) is out of range\n", header.idx);
+ return -EINVAL;
+ }
+
+ mutex_lock(&core->vdev->dev_mutex);
+ ctx = get_ctx_by_index(core, header.idx);
+ if (ctx != NULL) {
+ process_ctx_msg(ctx, &header);
+ queue_work(ctx->instance_wq, &ctx->instance_work);
+ } else {
+ vpu_err("msg[%d] of ctx[%d] is missed\n",
+ header.msgid, header.idx);
+ rpc_read_msg_array(&core->shared_mem, NULL, header.msgnum);
+ }
+ mutex_unlock(&core->vdev->dev_mutex);
+
+ return 0;
+}
+
+static void vpu_enc_fw_init(struct core_device *core_dev)
+{
+ u32 mu_addr;
+
+ vpu_dbg(LVL_ALL, "enable mu for core[%d]\n", core_dev->id);
+
+ rpc_init_shared_memory_encoder(&core_dev->shared_mem,
+ cpu_phy_to_mu(core_dev, core_dev->m0_rpc_phy),
+ core_dev->m0_rpc_virt, core_dev->rpc_buf_size,
+ &core_dev->rpc_actual_size);
+ rpc_set_system_cfg_value_encoder(core_dev->shared_mem.pSharedInterface,
+ core_dev->vdev->reg_rpc_system, core_dev->id);
+
+ if (core_dev->rpc_actual_size > core_dev->rpc_buf_size)
+ vpu_err("rpc actual size(0x%x) > (0x%x), may occur overlay\n",
+ core_dev->rpc_actual_size, core_dev->rpc_buf_size);
+
+ mu_addr = cpu_phy_to_mu(core_dev, core_dev->m0_rpc_phy + core_dev->rpc_buf_size);
+ rpc_set_print_buffer(&core_dev->shared_mem, mu_addr, core_dev->print_buf_size);
+ core_dev->print_buf = core_dev->m0_rpc_virt + core_dev->rpc_buf_size;
+
+ mu_addr = cpu_phy_to_mu(core_dev, core_dev->m0_rpc_phy);
+ vpu_enc_mu_send_msg(core_dev, RPC_BUF_OFFSET, mu_addr);
+ vpu_enc_mu_send_msg(core_dev, BOOT_ADDRESS, core_dev->m0_p_fw_space_phy);
+ vpu_enc_mu_send_msg(core_dev, INIT_DONE, 2);
+}
+
+extern u_int32 rpc_MediaIPFW_Video_message_check_encoder(struct shared_addr *This);
+
+static void vpu_enc_receive_msg_event(struct core_device *core_dev)
+{
+ struct shared_addr *This = &core_dev->shared_mem;
+
+ while (rpc_MediaIPFW_Video_message_check_encoder(This) == API_MSG_AVAILABLE)
+ process_msg(core_dev);
+
+ if (rpc_MediaIPFW_Video_message_check_encoder(This) == API_MSG_BUFFER_ERROR)
+ vpu_err("MSG num is too big to handle\n");
+}
+
+static void vpu_enc_handle_msg_data(struct core_device *core_dev, u_int32 data)
+{
+ if (data == 0xaa)
+ vpu_enc_fw_init(core_dev);
+ else if (data == 0x55)
+ vpu_core_start_done(core_dev);
+ else if (data == 0xA5)
+ complete(&core_dev->snap_done_cmp);
+ else
+ vpu_enc_receive_msg_event(core_dev);
+}
+
+static void vpu_enc_msg_run_work(struct work_struct *work)
+{
+ struct core_device *dev = container_of(work, struct core_device, msg_work);
+ u_int32 data;
+
+ while (vpu_enc_mu_receive_msg(dev, &data) >= sizeof(u_int32))
+ vpu_enc_handle_msg_data(dev, data);
+}
+
+static void vpu_enc_msg_instance_work(struct work_struct *work)
+{
+ struct vpu_ctx *ctx = container_of(work, struct vpu_ctx, instance_work);
+ struct vpu_event_msg *msg;
+
+ while (1) {
+ msg = pop_event_msg(ctx);
+ if (!msg)
+ break;
+ if (msg->ext_data)
+ vpu_enc_event_handler(ctx, msg->msgid, msg->ext_data);
+ else
+ vpu_enc_event_handler(ctx, msg->msgid, msg->data);
+
+ put_idle_msg(ctx, msg);
+ }
+}
+
+static int vpu_queue_setup(struct vb2_queue *vq,
+ unsigned int *buf_count,
+ unsigned int *plane_count,
+ unsigned int psize[],
+ struct device *allocators[])
+{
+ struct queue_data *This = (struct queue_data *)vq->drv_priv;
+
+ vpu_dbg(LVL_BUF, "%s(), %s, (%d, %d)\n", __func__, This->desc,
+ This->ctx->core_dev->id, This->ctx->str_index);
+
+ if (V4L2_TYPE_IS_OUTPUT(vq->type)) {
+ if (vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+ *plane_count = 2;
+ psize[0] = This->sizeimage[0];//check alignment
+ psize[1] = This->sizeimage[1];//check colocated_size
+ } else {
+ psize[0] = This->sizeimage[0] + This->sizeimage[1];
+ *plane_count = 1;
+ }
+ if (*buf_count < MIN_BUFFER_COUNT)
+ *buf_count = MIN_BUFFER_COUNT;
+ } else {
+ *plane_count = 1;
+ psize[0] = This->sizeimage[0];//check alignment
+ }
+
+ if (*buf_count > VPU_MAX_BUFFER)
+ *buf_count = VPU_MAX_BUFFER;
+ if (*buf_count < 1)
+ *buf_count = 1;
+
+ return 0;
+}
+
+static int vpu_buf_prepare(struct vb2_buffer *vb)
+{
+ struct vb2_queue *vq = vb->vb2_queue;
+ struct queue_data *q_data = (struct queue_data *)vq->drv_priv;
+
+ vpu_dbg(LVL_BUF, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ q_data->ctx->core_dev->id, q_data->ctx->str_index);
+
+ return 0;
+}
+
+
+static int vpu_start_streaming(struct vb2_queue *q, unsigned int count)
+{
+ struct queue_data *q_data = (struct queue_data *)q->drv_priv;
+
+ vpu_dbg(LVL_BUF, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ q_data->ctx->core_dev->id, q_data->ctx->str_index);
+
+ return 0;
+}
+
+static void vpu_stop_streaming(struct vb2_queue *q)
+{
+ struct queue_data *q_data = (struct queue_data *)q->drv_priv;
+
+ vpu_dbg(LVL_BUF, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ q_data->ctx->core_dev->id, q_data->ctx->str_index);
+ clear_queue(q_data);
+}
+
+static void vpu_buf_queue(struct vb2_buffer *vb)
+{
+ struct vb2_queue *vq = vb->vb2_queue;
+ struct queue_data *This = (struct queue_data *)vq->drv_priv;
+ struct vb2_data_req *data_req;
+ struct vpu_ctx *ctx = This->ctx;
+
+ vpu_dbg(LVL_BUF, "%s(), %s, (%d, %d)\n", __func__, This->desc,
+ This->ctx->core_dev->id, This->ctx->str_index);
+
+ data_req = &This->vb2_reqs[vb->index];
+ data_req->vb2_buf = vb;
+ if (V4L2_TYPE_IS_OUTPUT(vq->type)) {
+ fill_ctx_seq(ctx, data_req);
+ fill_vb_sequence(vb, data_req->sequence);
+ }
+ list_add_tail(&data_req->list, &This->drv_q);
+}
+
+static bool is_enc_dma_buf(struct vb2_buffer *vb)
+{
+ struct vb2_queue *vq = vb->vb2_queue;
+
+ if (vb->memory != V4L2_MEMORY_MMAP)
+ return false;
+
+ if (vq->mem_ops != &vb2_dma_contig_memops)
+ return false;
+
+ return true;
+}
+
+static int vpu_enc_buf_init(struct vb2_buffer *vb)
+{
+ struct vb2_queue *vq = vb->vb2_queue;
+ struct queue_data *queue = vq->drv_priv;
+ struct vpu_ctx *ctx = queue->ctx;
+ int i;
+
+ vpu_dbg(LVL_BUF, "%s(), %s, (%d, %d)\n", __func__, queue->desc,
+ ctx->core_dev->id, ctx->str_index);
+ if (!is_enc_dma_buf(vb))
+ return 0;
+
+ for (i = 0; i < vb->num_planes; i++)
+ vpu_enc_add_dma_size(get_vpu_ctx_attr(ctx),
+ vb->planes[i].length);
+
+ return 0;
+}
+
+static void vpu_enc_buf_cleanup(struct vb2_buffer *vb)
+{
+ struct vb2_queue *vq = vb->vb2_queue;
+ struct queue_data *queue = vq->drv_priv;
+ struct vpu_ctx *ctx = queue->ctx;
+ int i;
+
+ vpu_dbg(LVL_BUF, "%s(), %s, (%d, %d)\n", __func__, queue->desc,
+ ctx->core_dev->id, ctx->str_index);
+
+ if (!is_enc_dma_buf(vb))
+ return;
+
+ for (i = 0; i < vb->num_planes; i++)
+ vpu_enc_sub_dma_size(get_vpu_ctx_attr(ctx),
+ vb->planes[i].length);
+}
+
+static void vpu_prepare(struct vb2_queue *q)
+{
+ struct queue_data *q_data = (struct queue_data *)q->drv_priv;
+
+ vpu_dbg(LVL_BUF, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ q_data->ctx->core_dev->id, q_data->ctx->str_index);
+}
+
+static void vpu_finish(struct vb2_queue *q)
+{
+ struct queue_data *q_data = (struct queue_data *)q->drv_priv;
+
+ vpu_dbg(LVL_BUF, "%s(), %s, (%d, %d)\n", __func__, q_data->desc,
+ q_data->ctx->core_dev->id, q_data->ctx->str_index);
+}
+
+static struct vb2_ops vpu_enc_v4l2_qops = {
+ .queue_setup = vpu_queue_setup,
+ .buf_init = vpu_enc_buf_init,
+ .buf_cleanup = vpu_enc_buf_cleanup,
+ .wait_prepare = vpu_prepare,
+ .wait_finish = vpu_finish,
+ .buf_prepare = vpu_buf_prepare,
+ .start_streaming = vpu_start_streaming,
+ .stop_streaming = vpu_stop_streaming,
+ .buf_queue = vpu_buf_queue,
+};
+
+static void init_vb2_queue(struct queue_data *This, unsigned int type,
+ struct vpu_ctx *ctx,
+ const struct vb2_mem_ops *mem_ops,
+ gfp_t gfp_flags)
+{
+ struct vb2_queue *vb2_q = &This->vb2_q;
+ int ret;
+
+ vpu_log_func();
+
+ // initialze driver queue
+ INIT_LIST_HEAD(&This->drv_q);
+ INIT_LIST_HEAD(&This->frame_q);
+ INIT_LIST_HEAD(&This->frame_idle);
+ atomic64_set(&This->frame_count, 0);
+ // initialize vb2 queue
+ vb2_q->type = type;
+ vb2_q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
+ vb2_q->gfp_flags = gfp_flags;
+ vb2_q->ops = &vpu_enc_v4l2_qops;
+ vb2_q->drv_priv = This;
+ if (mem_ops)
+ vb2_q->mem_ops = mem_ops;
+ else
+ vb2_q->mem_ops = &vb2_dma_contig_memops;
+ vb2_q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
+ vb2_q->dev = &ctx->dev->plat_dev->dev;
+ ret = vb2_queue_init(vb2_q);
+ if (ret)
+ vpu_err("%s vb2_queue_init() failed (%d)!\n",
+ __func__,
+ ret
+ );
+ else
+ This->vb2_q_inited = true;
+}
+
+static void vpu_enc_init_output_queue(struct vpu_ctx *ctx,
+ struct queue_data *q)
+{
+ WARN_ON(!ctx);
+ WARN_ON(!q);
+
+ vpu_log_func();
+
+ init_vb2_queue(q,
+ V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
+ ctx,
+ &vb2_dma_contig_memops,
+ GFP_DMA32);
+ q->type = V4L2_SRC;
+ sema_init(&q->drv_q_lock, 1);
+ q->ctx = ctx;
+
+ q->supported_fmts = formats_yuv_enc;
+ q->fmt_count = ARRAY_SIZE(formats_yuv_enc);
+ q->current_fmt = &formats_yuv_enc[0];
+
+ q->width = VPU_ENC_WIDTH_DEFAULT;
+ q->height = VPU_ENC_HEIGHT_DEFAULT;
+ q->rect.left = 0;
+ q->rect.top = 0;
+ q->rect.width = VPU_ENC_WIDTH_DEFAULT;
+ q->rect.height = VPU_ENC_HEIGHT_DEFAULT;
+ scnprintf(q->desc, sizeof(q->desc), "OUTPUT");
+}
+
+static void vpu_enc_init_capture_queue(struct vpu_ctx *ctx,
+ struct queue_data *q)
+{
+ WARN_ON(!ctx);
+ WARN_ON(!q);
+
+ vpu_log_func();
+
+ init_vb2_queue(q,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
+ ctx,
+ &vb2_vmalloc_memops, 0);
+ q->type = V4L2_DST;
+ sema_init(&q->drv_q_lock, 1);
+ q->ctx = ctx;
+
+ q->supported_fmts = formats_compressed_enc;
+ q->fmt_count = ARRAY_SIZE(formats_compressed_enc);
+ q->current_fmt = &formats_compressed_enc[0];
+
+ q->width = VPU_ENC_WIDTH_DEFAULT;
+ q->height = VPU_ENC_HEIGHT_DEFAULT;
+ scnprintf(q->desc, sizeof(q->desc), "CAPTURE");
+}
+
+static void vpu_enc_init_queue_data(struct vpu_ctx *ctx)
+{
+ vpu_enc_init_output_queue(ctx, &ctx->q_data[V4L2_SRC]);
+ vpu_enc_init_capture_queue(ctx, &ctx->q_data[V4L2_DST]);
+}
+
+static void vpu_enc_release_queue_data(struct vpu_ctx *ctx)
+{
+ vpu_enc_queue_release(&ctx->q_data[V4L2_SRC]);
+ vpu_enc_queue_release(&ctx->q_data[V4L2_DST]);
+}
+
+static void vpu_ctx_power_on(struct vpu_ctx *ctx)
+{
+ if (!ctx || !ctx->core_dev)
+ return;
+
+ if (ctx->power_status)
+ return;
+ pm_runtime_get_sync(ctx->core_dev->generic_dev);
+ ctx->power_status = true;
+}
+
+static void vpu_ctx_power_off(struct vpu_ctx *ctx)
+{
+ if (!ctx || !ctx->core_dev)
+ return;
+
+ if (!ctx->power_status)
+ return;
+ pm_runtime_put_sync(ctx->core_dev->generic_dev);
+ ctx->power_status = false;
+}
+
+static int set_vpu_fw_addr(struct vpu_dev *dev, struct core_device *core_dev)
+{
+ off_t reg_fw_base;
+
+ if (!dev || !core_dev)
+ return -EINVAL;
+
+ vpu_enc_mu_enable_rx(core_dev);
+ reg_fw_base = core_dev->reg_csr_base;
+ write_vpu_reg(dev, core_dev->m0_p_fw_space_phy, reg_fw_base + CSR_CM0Px_ADDR_OFFSET);
+ write_vpu_reg(dev, 0x0, reg_fw_base + CSR_CM0Px_CPUWAIT);
+
+ return 0;
+}
+
+static void cleanup_firmware_memory(struct core_device *core_dev)
+{
+ memset_io(core_dev->m0_p_fw_space_vir, 0, core_dev->fw_buf_size);
+}
+
+static int vpu_firmware_download(struct vpu_dev *This, u_int32 core_id)
+{
+ const struct firmware *m0_pfw = NULL;
+ const u8 *image;
+ unsigned int FW_Size = 0;
+ int ret = 0;
+ struct core_device *core_dev = &This->core_dev[core_id];
+ char *p = This->core_dev[core_id].m0_p_fw_space_vir;
+
+ vpu_log_func();
+
+ ret = request_firmware(&m0_pfw, M0FW_FILENAME, This->generic_dev);
+ if (ret) {
+ vpu_err("%s() request fw %s failed(%d)\n",
+ __func__, M0FW_FILENAME, ret);
+
+ return ret;
+ }
+ vpu_dbg(LVL_DEBUG, "%s() request fw %s got size(%ld)\n",
+ __func__, M0FW_FILENAME, m0_pfw->size);
+
+ image = m0_pfw->data;
+ FW_Size = min_t(u32, m0_pfw->size, This->core_dev[core_id].fw_buf_size);
+ This->core_dev[core_id].fw_actual_size = FW_Size;
+
+ cleanup_firmware_memory(core_dev);
+ memcpy(core_dev->m0_p_fw_space_vir, image, FW_Size);
+ p[16] = This->plat_type;
+ p[17] = core_id + 1;
+ p[18] = 1;
+ set_vpu_fw_addr(This, &This->core_dev[core_id]);
+
+ release_firmware(m0_pfw);
+ m0_pfw = NULL;
+
+ return ret;
+}
+
+static int download_vpu_firmware(struct vpu_dev *dev,
+ struct core_device *core_dev)
+{
+ int ret = 0;
+
+ if (!dev || !core_dev)
+ return -EINVAL;
+
+ if (core_dev->fw_is_ready)
+ return 0;
+
+ vpu_dbg(LVL_INFO, "download firmware for core[%d]\n", core_dev->id);
+ init_completion(&core_dev->start_cmp);
+ ret = vpu_firmware_download(dev, core_dev->id);
+ if (ret) {
+ vpu_err("error: vpu_firmware_download fail\n");
+ goto exit;
+ }
+ wait_for_start_done(core_dev, 0);
+ if (!core_dev->firmware_started) {
+ vpu_err("core[%d] start firmware failed\n", core_dev->id);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ set_core_fw_status(core_dev, true);
+ clear_core_hang(core_dev);
+exit:
+ return ret;
+}
+
+static bool is_valid_ctx(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return false;
+ if (!ctx->dev || !ctx->core_dev)
+ return false;
+ if (ctx->str_index >= ARRAY_SIZE(ctx->core_dev->ctx))
+ return false;
+
+ return true;
+}
+
+static void free_instance(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return;
+
+ if (is_valid_ctx(ctx))
+ ctx->core_dev->ctx[ctx->str_index] = NULL;
+ VPU_SAFE_RELEASE(ctx, kfree);
+}
+
+static u32 count_free_core_slot(struct core_device *core)
+{
+ u32 count = 0;
+ int i;
+
+ for (i = 0; i < core->supported_instance_count; i++) {
+ if (!core->ctx[i])
+ count++;
+ }
+
+ return count;
+}
+
+static struct core_device *find_proper_core(struct vpu_dev *dev)
+{
+ struct core_device *core = NULL;
+ u32 maximum = 0;
+ u32 count;
+ int i;
+ int ret;
+
+ for (i = 0; i < dev->core_num; i++) {
+ struct core_device *core_dev = &dev->core_dev[i];
+
+ ret = process_core_hang(core_dev);
+ if (ret)
+ continue;
+
+ ret = download_vpu_firmware(dev, core_dev);
+ if (ret)
+ continue;
+
+ if (core_dev->supported_instance_count == 0)
+ continue;
+
+ count = count_free_core_slot(core_dev);
+ if (count == core_dev->supported_instance_count)
+ return core_dev;
+
+ if (maximum < count) {
+ core = core_dev;
+ maximum = count;
+ }
+ }
+
+ return core;
+}
+
+static int request_instance(struct core_device *core, struct vpu_ctx *ctx)
+{
+ int found = 0;
+ int idx;
+
+ if (!core || !ctx)
+ return -EINVAL;
+
+ for (idx = 0; idx < core->supported_instance_count; idx++) {
+ if (!core->ctx[idx]) {
+ found = 1;
+ ctx->core_dev = core;
+ ctx->str_index = idx;
+ ctx->dev = core->vdev;
+ break;
+ }
+ }
+
+ if (!found) {
+ vpu_err("cann't request any instance\n");
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+static int construct_vpu_ctx(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return -EINVAL;
+
+ ctx->ctrl_inited = false;
+ mutex_init(&ctx->instance_mutex);
+ ctx->ctx_released = false;
+
+ return 0;
+}
+
+static struct vpu_ctx *create_and_request_instance(struct vpu_dev *dev)
+{
+ struct core_device *core = NULL;
+ struct vpu_ctx *ctx = NULL;
+ int ret;
+
+ if (!dev)
+ return NULL;
+
+ core = find_proper_core(dev);
+ if (!core)
+ return NULL;
+
+ ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+ if (!ctx)
+ return NULL;
+
+ ret = request_instance(core, ctx);
+ if (ret < 0) {
+ VPU_SAFE_RELEASE(ctx, kfree);
+ return NULL;
+ }
+
+ construct_vpu_ctx(ctx);
+ vpu_ctx_power_on(ctx);
+ vpu_dbg(LVL_INFO, "request encoder instance : %d.%d\n",
+ ctx->core_dev->id, ctx->str_index);
+
+ return ctx;
+}
+
+static int init_vpu_ctx_fh(struct vpu_ctx *ctx, struct vpu_dev *dev)
+{
+ if (!ctx || !dev)
+ return -EINVAL;
+
+ mutex_lock(&ctx->instance_mutex);
+
+ v4l2_fh_init(&ctx->fh, dev->pvpu_encoder_dev);
+ v4l2_fh_add(&ctx->fh);
+ ctx->fh.ctrl_handler = &ctx->ctrl_handler;
+ clear_bit(VPU_ENC_STATUS_CLOSED, &ctx->status);
+
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static void uninit_vpu_ctx_fh(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return;
+
+ mutex_lock(&ctx->instance_mutex);
+
+ set_bit(VPU_ENC_STATUS_CLOSED, &ctx->status);
+ v4l2_fh_del(&ctx->fh);
+ v4l2_fh_exit(&ctx->fh);
+
+ mutex_unlock(&ctx->instance_mutex);
+}
+
+static void cancel_vpu_ctx(struct vpu_ctx *ctx)
+{
+ cancel_work_sync(&ctx->instance_work);
+ cleanup_ctx_msg_queue(ctx);
+}
+
+static void uninit_vpu_ctx(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return;
+
+ clear_bit(VPU_ENC_STATUS_INITIALIZED, &ctx->status);
+ cancel_vpu_ctx(ctx);
+ if (ctx->instance_wq) {
+ destroy_workqueue(ctx->instance_wq);
+ ctx->instance_wq = NULL;
+ }
+ mutex_lock(&ctx->instance_mutex);
+ vpu_enc_free_stream(ctx);
+
+ ctx->ctx_released = true;
+ mutex_unlock(&ctx->instance_mutex);
+}
+
+static int init_vpu_ctx(struct vpu_ctx *ctx)
+{
+ INIT_WORK(&ctx->instance_work, vpu_enc_msg_instance_work);
+ ctx->instance_wq = alloc_workqueue("vpu_instance",
+ WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
+ if (!ctx->instance_wq) {
+ vpu_err("error: unable to alloc workqueue for ctx\n");
+ return -ENOMEM;
+ }
+
+ init_ctx_msg_queue(ctx);
+
+ vpu_enc_init_queue_data(ctx);
+ init_completion(&ctx->stop_cmp);
+
+ set_bit(VPU_ENC_STATUS_INITIALIZED, &ctx->status);
+ ctx->core_dev->ctx[ctx->str_index] = ctx;
+
+ return 0;
+}
+
+static int show_encoder_param(struct vpu_attr *attr,
+ pMEDIAIP_ENC_PARAM param, char *buf, u32 size)
+{
+ int num = 0;
+
+ num += scnprintf(buf + num, size - num,
+ "encoder param:[setting/take effect]\n");
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Codec Mode",
+ attr->param.eCodecMode, param->eCodecMode);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Profile",
+ attr->param.eProfile, param->eProfile);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Level",
+ attr->param.uLevel, param->uLevel);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Frame Rate",
+ attr->param.uFrameRate, param->uFrameRate);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Source Stride",
+ attr->param.uSrcStride, param->uSrcStride);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Source Width",
+ attr->param.uSrcWidth, param->uSrcWidth);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Source Height",
+ attr->param.uSrcHeight, param->uSrcHeight);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Source Offset x",
+ attr->param.uSrcOffset_x, param->uSrcOffset_x);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Source Offset y",
+ attr->param.uSrcOffset_y, param->uSrcOffset_y);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Source Crop Width",
+ attr->param.uSrcCropWidth, param->uSrcCropWidth);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Source Crop Height",
+ attr->param.uSrcCropHeight,
+ param->uSrcCropHeight);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Out Width",
+ attr->param.uOutWidth, param->uOutWidth);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Out Height",
+ attr->param.uOutHeight, param->uOutHeight);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "I Frame Interval",
+ attr->param.uIFrameInterval,
+ param->uIFrameInterval);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Bframes",
+ attr->param.uGopBLength, param->uGopBLength);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Low Latency Mode",
+ attr->param.uLowLatencyMode,
+ param->uLowLatencyMode);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Bitrate Mode",
+ attr->param.eBitRateMode, param->eBitRateMode);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Target Bitrate",
+ attr->param.uTargetBitrate,
+ param->uTargetBitrate);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Min Bitrate",
+ attr->param.uMinBitRate, param->uMinBitRate);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "Max Bitrate",
+ attr->param.uMaxBitRate, param->uMaxBitRate);
+ num += scnprintf(buf + num, size - num,
+ "\t%-18s:%10d;%10d\n", "QP",
+ attr->param.uInitSliceQP,
+ param->uInitSliceQP);
+
+ return num;
+}
+
+static int show_queue_buffer_info(struct queue_data *queue, char *buf, u32 size)
+{
+ int i;
+ int num = 0;
+
+ for (i = 0; i < queue->vb2_q.num_buffers; i++) {
+ struct vb2_buffer *vb = queue->vb2_q.bufs[i];
+
+ num += scnprintf(buf + num, size - num, " %d", vb->state);
+ }
+
+ return num;
+}
+
+static int show_cmd_event(struct vpu_statistic *statistic, int i,
+ char *buf, u32 size)
+{
+ int num = 0;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "\t(%2d) ", i);
+
+ if (i <= GTB_ENC_CMD_RESERVED)
+ num += scnprintf(buf + num, PAGE_SIZE - num, "%-28s:%12ld;",
+ get_cmd_str(i), statistic->cmd[i]);
+ else
+ num += scnprintf(buf + num, PAGE_SIZE - num, "%-28s:%12s;",
+ "", "");
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, " ");
+ if (i <= VID_API_ENC_EVENT_RESERVED)
+ num += scnprintf(buf + num, PAGE_SIZE - num, "%-34s:%12ld;",
+ get_event_str(i), statistic->event[i]);
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "\n");
+
+ return num;
+}
+
+static int show_cmd_event_infos(struct vpu_statistic *statistic,
+ char *buf, u32 size)
+{
+ int num = 0;
+ int i;
+ int count;
+
+ num += scnprintf(buf + num, size - num, "command/event:\n");
+
+ count = max((int)GTB_ENC_CMD_RESERVED, (int)VID_API_ENC_EVENT_RESERVED);
+ for (i = 0; i <= count; i++)
+ num += show_cmd_event(statistic, i, buf + num, size - num);
+
+ num += scnprintf(buf + num, size - num, "current status:\n");
+ num += scnprintf(buf + num, size - num,
+ "\t%-10s:%36s;%10ld.%06ld\n", "commond",
+ get_cmd_str(statistic->current_cmd),
+ statistic->ts_cmd.tv_sec,
+ statistic->ts_cmd.tv_nsec / 1000);
+ num += scnprintf(buf + num, size - num,
+ "\t%-10s:%36s;%10ld.%06ld\n", "event",
+ get_event_str(statistic->current_event),
+ statistic->ts_event.tv_sec,
+ statistic->ts_event.tv_nsec / 1000);
+
+ return num;
+}
+
+static int show_single_fps_info(struct vpu_fps_sts *fps, char *buf, u32 size)
+{
+ const u32 COEF = VPU_FPS_COEF;
+ int num = 0;
+
+ num += scnprintf(buf + num, size - num, "%3ld.", fps->fps / COEF);
+ num += scnprintf(buf + num, size - num, "%02ld", fps->fps % COEF);
+ if (fps->thd)
+ num += scnprintf(buf + num, size - num, "(%ds)", fps->thd);
+ else
+ num += scnprintf(buf + num, size - num, "(avg)");
+
+ return num;
+}
+
+static int show_fps_info(struct vpu_fps_sts *fps, int count,
+ char *buf, u32 size)
+{
+ int i;
+ int num = 0;
+
+ for (i = 0; i < count; i++) {
+ if (i > 0)
+ num += scnprintf(buf + num, size - num, " ");
+ num += show_single_fps_info(&fps[i], buf + num, size - num);
+ }
+
+ return num;
+}
+
+static int show_frame_sts(struct vpu_statistic *statistic, char *buf, u32 size)
+{
+ int num = 0;
+
+ num += scnprintf(buf + num, size - num,
+ "frame count:\n");
+ num += scnprintf(buf + num, size - num, "\t%-24s:%ld\n",
+ "dbuf input yuv count", statistic->yuv_count);
+ num += scnprintf(buf + num, size - num, "\t%-24s:%ld\n",
+ "encode frame count", statistic->encoded_count);
+ num += scnprintf(buf + num, size - num, "\t%-24s:%ld\n",
+ "dqbuf output h264 count", statistic->h264_count);
+
+ num += scnprintf(buf + num, size - num, "\t%-24s:", "actual fps:");
+ num += show_fps_info(statistic->fps, ARRAY_SIZE(statistic->fps),
+ buf + num, PAGE_SIZE - num);
+ num += scnprintf(buf + num, size - num, "\n");
+ num += scnprintf(buf + num, size - num, "\t%-24s:%ld\n",
+ "timestamp overwrite", statistic->timestamp_overwrite);
+
+ return num;
+}
+
+static int show_strip_info(struct vpu_statistic *statistic, char *buf, u32 size)
+{
+ int num = 0;
+
+ num += scnprintf(buf + num, size - num,
+ "strip data frame count:\n");
+ num += scnprintf(buf + num, size - num,
+ "\t fw :%16ld (max : %ld; total : %ld)\n",
+ statistic->strip_sts.fw.count,
+ statistic->strip_sts.fw.max,
+ statistic->strip_sts.fw.total);
+ num += scnprintf(buf + num, size - num,
+ "\t begin :%16ld (max : %ld; total : %ld)\n",
+ statistic->strip_sts.begin.count,
+ statistic->strip_sts.begin.max,
+ statistic->strip_sts.begin.total);
+ num += scnprintf(buf + num, size - num,
+ "\t eos :%16ld (max : %ld; total : %ld)\n",
+ statistic->strip_sts.eos.count,
+ statistic->strip_sts.eos.max,
+ statistic->strip_sts.eos.total);
+
+ return num;
+}
+
+static int show_v4l2_buf_status(struct vpu_ctx *ctx, char *buf, u32 size)
+{
+ int num = 0;
+
+ num += scnprintf(buf + num, size - num, "V4L2 Buffer Status: ");
+ num += scnprintf(buf + num, size - num, "(");
+ num += scnprintf(buf + num, size - num,
+ " %d:dequeued,", VB2_BUF_STATE_DEQUEUED);
+ num += scnprintf(buf + num, size - num,
+ " %d:active,", VB2_BUF_STATE_ACTIVE);
+ num += scnprintf(buf + num, size - num,
+ " %d:done,", VB2_BUF_STATE_DONE);
+ num += scnprintf(buf + num, size - num,
+ " %d:error", VB2_BUF_STATE_ERROR);
+ num += scnprintf(buf + num, size - num - num, ")\n");
+ num += scnprintf(buf + num, size - num, "\tOUTPUT:");
+ num += show_queue_buffer_info(&ctx->q_data[V4L2_SRC],
+ buf + num,
+ size - num);
+ num += scnprintf(buf + num, size - num, " CAPTURE:");
+ num += show_queue_buffer_info(&ctx->q_data[V4L2_DST],
+ buf + num,
+ size - num);
+ num += scnprintf(buf + num, size - num, "\n");
+
+ return num;
+}
+
+static int show_instance_status(struct vpu_ctx *ctx, char *buf, u32 size)
+{
+ int num = 0;
+
+ num += scnprintf(buf + num, size - num, "instance status:\n");
+ num += scnprintf(buf + num, size - num,
+ "\t%-13s:0x%lx\n", "status", ctx->status);
+ num += scnprintf(buf + num, size - num,
+ "\t%-13s:%d\n", "frozen count", ctx->frozen_count);
+
+ return num;
+}
+
+static int show_instance_stream_buffer_desc(struct vpu_ctx *ctx,
+ char *buf, u32 size)
+{
+ pBUFFER_DESCRIPTOR_TYPE stream_buffer_desc;
+ int num = 0;
+
+ stream_buffer_desc = get_rpc_stream_buffer_desc(ctx);
+ num += scnprintf(buf + num, size - num,
+ "\t%-13s:0x%x\n", "start",
+ get_ptr(stream_buffer_desc->start));
+ num += scnprintf(buf + num, size - num,
+ "\t%-13s:0x%x\n", "end",
+ get_ptr(stream_buffer_desc->end));
+ num += scnprintf(buf + num, size - num,
+ "\t%-13s:0x%x\n", "rptr",
+ get_ptr(stream_buffer_desc->rptr));
+ num += scnprintf(buf + num, size - num,
+ "\t%-13s:0x%x\n", "wptr",
+ get_ptr(stream_buffer_desc->wptr));
+ return num;
+}
+
+static int show_instance_others(struct vpu_attr *attr, char *buf, u32 size)
+{
+ int num = 0;
+ struct vpu_ctx *ctx = NULL;
+ struct vpu_dev *vpudev = attr->core->vdev;
+
+ num += scnprintf(buf + num, size - num, "others:\n");
+ if (attr->ts_start[V4L2_SRC] && attr->ts_start[V4L2_DST]) {
+ unsigned long latency;
+
+ latency = attr->ts_start[V4L2_DST] - attr->ts_start[V4L2_SRC];
+ num += scnprintf(buf + num, size - num,
+ "\tlatency(ms) :%ld\n", latency);
+ }
+
+ num += scnprintf(buf + num, size - num,
+ "\ttotal dma size :%lld\n",
+ atomic64_read(&attr->total_dma_size));
+ num += scnprintf(buf + num, size - num,
+ "\ttotal event msg obj count :%ld\n",
+ attr->msg_count);
+ num += scnprintf(buf + num, size - num,
+ "\ttotal msg ext data count :%lld\n",
+ get_total_ext_data_number());
+
+ mutex_lock(&vpudev->dev_mutex);
+ ctx = get_vpu_attr_ctx(attr);
+ if (ctx) {
+ num += scnprintf(buf + num, size - num,
+ "\ttotal frame obj count :%lld\n",
+ atomic64_read(&ctx->q_data[V4L2_DST].frame_count));
+
+ if (test_bit(VPU_ENC_STATUS_HANG, &ctx->status))
+ num += scnprintf(buf + num, size - num, "<hang>\n");
+ } else {
+ num += scnprintf(buf + num, size - num,
+ "<instance has been released>\n");
+ }
+ mutex_unlock(&vpudev->dev_mutex);
+
+ return num;
+}
+
+static ssize_t show_instance_info(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_attr *vpu_attr;
+ struct vpu_dev *vpudev;
+ struct vpu_statistic *statistic;
+ struct vpu_ctx *ctx;
+ pMEDIAIP_ENC_PARAM param;
+ int num = 0;
+
+ vpu_attr = container_of(attr, struct vpu_attr, dev_attr);
+ vpudev = vpu_attr->core->vdev;
+
+ num += scnprintf(buf + num, PAGE_SIZE,
+ "pid: %d; tgid: %d\n", vpu_attr->pid, vpu_attr->tgid);
+
+ param = rpc_get_enc_param(&vpu_attr->core->shared_mem, vpu_attr->index);
+ num += show_encoder_param(vpu_attr, param, buf + num, PAGE_SIZE - num);
+
+ statistic = &vpu_attr->statistic;
+ num += show_cmd_event_infos(statistic, buf + num, PAGE_SIZE - num);
+ num += show_frame_sts(statistic, buf + num, PAGE_SIZE - num);
+ num += show_strip_info(statistic, buf + num, PAGE_SIZE - num);
+
+ mutex_lock(&vpudev->dev_mutex);
+ ctx = get_vpu_attr_ctx(vpu_attr);
+ if (ctx) {
+ num += show_v4l2_buf_status(ctx, buf + num, PAGE_SIZE - num);
+ num += show_instance_status(ctx, buf + num, PAGE_SIZE - num);
+ num += show_instance_stream_buffer_desc(ctx,
+ buf + num,
+ PAGE_SIZE - num);
+ }
+ mutex_unlock(&vpudev->dev_mutex);
+
+ num += show_instance_others(vpu_attr, buf + num, PAGE_SIZE - num);
+
+ return num;
+}
+
+static ssize_t show_core_info(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct core_device *core = NULL;
+ char *fw = NULL;
+ int num = 0;
+
+ core = container_of(attr, struct core_device, core_attr);
+ fw = core->m0_p_fw_space_vir;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "core[%d] info:\n", core->id);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "vpu mu id : %d\n", core->vpu_mu_id);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "irq : %d\n", core->irq);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "reg mu mcu : 0x%08x 0x%08x\n",
+ core->reg_base, core->reg_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "reg csr : 0x%08x 0x%08x\n",
+ core->reg_csr_base, core->reg_csr_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "fw space phy : 0x%08x\n", core->m0_p_fw_space_phy);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "fw space size : 0x%08x\n", core->fw_buf_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "fw actual size : 0x%08x\n", core->fw_actual_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "rpc phy : 0x%08x\n", core->m0_rpc_phy);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "rpc buf size : 0x%08x\n", core->rpc_buf_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "rpc actual size : 0x%08x\n", core->rpc_actual_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "print buf phy : 0x%08x\n",
+ core->m0_rpc_phy + core->rpc_buf_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "print buf size : 0x%08x\n", core->print_buf_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "max instance num: %d\n",
+ core->supported_instance_count);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "fw_is_ready : %d\n", core->fw_is_ready);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "firmware_started: %d\n", core->firmware_started);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "hang : %d\n", core->hang);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "reset times : %ld\n", core->reset_times);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "heartbeat : %02x\n", core->vdev->heartbeat);
+ if (core->fw_is_ready) {
+ pENC_RPC_HOST_IFACE iface = core->shared_mem.pSharedInterface;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "firmware version: %d.%d.%d\n",
+ (iface->FWVersion & 0x00ff0000) >> 16,
+ (iface->FWVersion & 0x0000ff00) >> 8,
+ iface->FWVersion & 0x000000ff);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "fw info : 0x%02x 0x%02x\n", fw[16], fw[17]);
+ }
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "driver version : %s\n", VPU_ENC_DRIVER_VERSION);
+
+ return num;
+}
+
+static int show_vb2_memory(struct vb2_buffer *vb, char *buf, u32 size)
+{
+ int num = 0;
+ int i;
+
+ for (i = 0; i < vb->num_planes; i++) {
+ num += scnprintf(buf + num, size - num, "0x%8x 0x%x",
+ get_vb2_plane_phy_addr(vb, i),
+ vb->planes[i].length);
+ if (i == vb->num_planes - 1)
+ num += scnprintf(buf + num, size - num, "\n");
+ else
+ num += scnprintf(buf + num, size - num, "; ");
+ }
+
+ return num;
+}
+
+static int show_queue_memory(struct queue_data *queue, char *buf, u32 size,
+ char *prefix)
+{
+ int num = 0;
+ int i;
+
+ num += scnprintf(buf + num, size - num, "%s%4s v4l2buf :\n", prefix,
+ queue->type == V4L2_SRC ? "YUV" : "H264");
+
+ for (i = 0; i < queue->vb2_q.num_buffers; i++) {
+ struct vb2_buffer *vb = queue->vb2_q.bufs[i];
+
+ num += scnprintf(buf + num, size - num, "%s%18s", prefix, "");
+ num += show_vb2_memory(vb, buf + num, size - num);
+ }
+
+ return num;
+}
+
+static int show_ctx_memory_details(struct vpu_ctx *ctx, char *buf, u32 size,
+ char *prefix)
+{
+ int num = 0;
+ int i;
+
+ if (!ctx)
+ return 0;
+
+ num += scnprintf(buf + num, size - num, "%smemory details:\n", prefix);
+ num += scnprintf(buf + num, size - num, "%sencFrames :\n", prefix);
+ for (i = 0; i < MEDIAIP_MAX_NUM_WINDSOR_SRC_FRAMES; i++) {
+ num += scnprintf(buf + num, size - num, "%s%14s", prefix, "");
+ num += scnprintf(buf + num, size - num, "[%d] 0x%8llx 0x%x\n",
+ i,
+ ctx->encFrame[i].phy_addr,
+ ctx->encFrame[i].size);
+ }
+
+ num += scnprintf(buf + num, size - num, "%srefFrames :\n", prefix);
+ for (i = 0; i < MEDIAIP_MAX_NUM_WINDSOR_REF_FRAMES; i++) {
+ num += scnprintf(buf + num, size - num, "%s%14s", prefix, "");
+ num += scnprintf(buf + num, size - num, "[%d] 0x%8llx 0x%x\n",
+ i,
+ ctx->refFrame[i].phy_addr,
+ ctx->refFrame[i].size);
+ }
+
+ num += scnprintf(buf + num, size - num, "%sactFrames :\n", prefix);
+ num += scnprintf(buf + num, size - num, "%s%18s", prefix, "");
+ num += scnprintf(buf + num, size - num, "0x%8llx 0x%x\n",
+ ctx->actFrame.phy_addr, ctx->actFrame.size);
+
+ num += scnprintf(buf + num, size - num, "%sencoderStream:\n", prefix);
+ num += scnprintf(buf + num, size - num, "%s%18s", prefix, "");
+ num += scnprintf(buf + num, size - num, "0x%8llx 0x%x\n",
+ ctx->encoder_stream.phy_addr, ctx->encoder_stream.size);
+
+ for (i = 0; i < ARRAY_SIZE(ctx->q_data); i++) {
+ struct queue_data *queue = &ctx->q_data[i];
+
+ if (queue->vb2_q.memory != V4L2_MEMORY_MMAP)
+ continue;
+ if (queue->vb2_q.mem_ops != &vb2_dma_contig_memops)
+ continue;
+
+ num += show_queue_memory(queue, buf + num, size - num, prefix);
+ }
+
+ return num;
+}
+
+static ssize_t show_memory_info(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_dev *vdev = dev_get_drvdata(dev);
+ unsigned long total_dma_size = 0;
+ int num = 0;
+ int i;
+ int j;
+ int core_id = (show_detail_index >> 8) & 0xff;
+ int ctx_id = show_detail_index & 0xff;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "dma memory usage:\n");
+ for (i = 0; i < vdev->core_num; i++) {
+ struct core_device *core = &vdev->core_dev[i];
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "core[%d]\n", i);
+
+ for (j = 0; j < ARRAY_SIZE(core->attr); j++) {
+ struct vpu_attr *attr = &core->attr[j];
+ unsigned long size;
+
+ size = atomic64_read(&attr->total_dma_size);
+ total_dma_size += size;
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t[%d] : %ld\n", j, size);
+ if (core_id != i || ctx_id != j)
+ continue;
+ mutex_lock(&vdev->dev_mutex);
+ num += show_ctx_memory_details(core->ctx[j],
+ buf + num,
+ PAGE_SIZE - num,
+ "\t\t");
+ mutex_unlock(&vdev->dev_mutex);
+ }
+ }
+
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "total dma : %ld\n", total_dma_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "total reserved memory : %ld\n",
+ vdev->reserved_mem.bytesused);
+ show_detail_index = VPU_DETAIL_INDEX_DFT;
+
+ return num;
+}
+
+static ssize_t store_memory_info_index(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ long val = VPU_DETAIL_INDEX_DFT;
+
+ if (!kstrtol(buf, 0, &val))
+ show_detail_index = val;
+
+ return count;
+}
+DEVICE_ATTR(meminfo, 0664, show_memory_info, store_memory_info_index);
+
+static ssize_t show_buffer_info(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_dev *vdev = dev_get_drvdata(dev);
+ int num = 0;
+ int i;
+ int j;
+
+ mutex_lock(&vdev->dev_mutex);
+ num += scnprintf(buf + num, PAGE_SIZE - num, "vpu encoder buffers:\t");
+ num += scnprintf(buf + num, PAGE_SIZE - num, "(");
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ " %d:dequeued,", VB2_BUF_STATE_DEQUEUED);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ " %d:active,", VB2_BUF_STATE_ACTIVE);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ " %d:done,", VB2_BUF_STATE_DONE);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ " %d:error", VB2_BUF_STATE_ERROR);
+ num += scnprintf(buf + num, PAGE_SIZE - num, ")\n");
+
+ for (i = 0; i < vdev->core_num; i++) {
+ struct core_device *core = &vdev->core_dev[i];
+
+ if (!core->supported_instance_count)
+ continue;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "core[%d]\n", i);
+ for (j = 0; j < core->supported_instance_count; j++) {
+ struct vpu_ctx *ctx = core->ctx[j];
+
+ if (!ctx)
+ continue;
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t[%d]: ", j);
+ num += scnprintf(buf + num,
+ PAGE_SIZE - num, "OUTPUT:");
+ num += show_queue_buffer_info(&ctx->q_data[V4L2_SRC],
+ buf + num,
+ PAGE_SIZE - num);
+ num += scnprintf(buf + num,
+ PAGE_SIZE - num, " CAPTURE:");
+ num += show_queue_buffer_info(&ctx->q_data[V4L2_DST],
+ buf + num,
+ PAGE_SIZE - num);
+ num += scnprintf(buf + num, PAGE_SIZE - num, "\n");
+ }
+ }
+ mutex_unlock(&vdev->dev_mutex);
+
+ return num;
+}
+DEVICE_ATTR(buffer, 0444, show_buffer_info, NULL);
+
+static ssize_t show_fpsinfo(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_dev *vdev = dev_get_drvdata(dev);
+ int num = 0;
+ int i;
+ int j;
+
+ for (i = 0; i < vdev->core_num; i++) {
+ struct core_device *core = &vdev->core_dev[i];
+
+ if (!core->supported_instance_count)
+ continue;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num, "core[%d]\n", i);
+ for (j = 0; j < core->supported_instance_count; j++) {
+ struct vpu_attr *attr = &core->attr[j];
+
+ if (!attr->created)
+ continue;
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "\t[%d]", j);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ " %3d(setting) ",
+ attr->param.uFrameRate);
+ num += show_fps_info(attr->statistic.fps,
+ ARRAY_SIZE(attr->statistic.fps),
+ buf + num, PAGE_SIZE - num);
+ num += scnprintf(buf + num, PAGE_SIZE - num, "\n");
+ }
+ }
+
+ return num;
+}
+DEVICE_ATTR(fpsinfo, 0444, show_fpsinfo, NULL);
+
+static ssize_t show_vpuinfo(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct vpu_dev *vdev = dev_get_drvdata(dev);
+ int num = 0;
+
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "core number : %d\n", vdev->core_num);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "platform type : %d\n", vdev->plat_type);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "reg-vpu : 0x%8x 0x%08x\n",
+ vdev->reg_vpu_base, vdev->reg_vpu_size);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "reg-rpc-system : 0x%08x\n",
+ vdev->reg_rpc_system);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "reserved-memory : 0x%08lx 0x%08lx\n",
+ vdev->reserved_mem.phy_addr, vdev->reserved_mem.size);
+ num += scnprintf(buf + num, PAGE_SIZE - num, "supported resolution :");
+ num += scnprintf(buf + num, PAGE_SIZE - num, " %dx%d(min);",
+ vdev->supported_size.min_width,
+ vdev->supported_size.min_height);
+ num += scnprintf(buf + num, PAGE_SIZE - num, " %dx%d(step);",
+ vdev->supported_size.step_width,
+ vdev->supported_size.step_height);
+ num += scnprintf(buf + num, PAGE_SIZE - num, " %dx%d(max)\n",
+ vdev->supported_size.max_width,
+ vdev->supported_size.max_height);
+ num += scnprintf(buf + num, PAGE_SIZE - num,
+ "supported frame rate : %d(min); %d(step); %d(max)\n",
+ vdev->supported_fps.min,
+ vdev->supported_fps.step,
+ vdev->supported_fps.max);
+
+ return num;
+}
+DEVICE_ATTR(vpuinfo, 0444, show_vpuinfo, NULL);
+
+static void reset_statistic(struct vpu_attr *attr)
+{
+ if (!attr)
+ return;
+
+ memset(&attr->statistic, 0, sizeof(attr->statistic));
+ attr->statistic.current_cmd = GTB_ENC_CMD_NOOP;
+ attr->statistic.current_event = VID_API_EVENT_UNDEFINED;
+}
+
+static int init_vpu_attr_fps_sts(struct vpu_attr *attr)
+{
+ const unsigned int THDS[] = VPU_FPS_STS_THDS;
+ int i;
+
+ for (i = 0; i < VPU_FPS_STS_CNT; i++) {
+ if (i < ARRAY_SIZE(THDS))
+ attr->statistic.fps[i].thd = THDS[i];
+ else
+ attr->statistic.fps[i].thd = 0;
+ }
+
+ return 0;
+}
+
+static int enable_fps_sts(struct vpu_attr *attr)
+{
+ int i;
+ struct vpu_statistic *sts = &attr->statistic;
+
+ sts->fps_sts_enable = true;
+
+ for (i = 0; i < VPU_FPS_STS_CNT; i++) {
+ getrawmonotonic(&sts->fps[i].ts);
+ sts->fps[i].frame_number = sts->encoded_count;
+ }
+
+ return 0;
+}
+
+static int disable_fps_sts(struct vpu_attr *attr)
+{
+ attr->statistic.fps_sts_enable = false;
+
+ return 0;
+}
+
+static int init_vpu_attr(struct vpu_attr *attr)
+{
+ if (!attr || !attr->core)
+ return -EINVAL;
+
+ reset_statistic(attr);
+ memset(&attr->param, 0, sizeof(attr->param));
+ attr->pid = current->pid;
+ attr->tgid = current->tgid;
+ if (!attr->created) {
+ device_create_file(attr->core->generic_dev, &attr->dev_attr);
+ attr->created = true;
+ }
+
+ init_vpu_attr_fps_sts(attr);
+
+ return 0;
+}
+
+static int release_instance(struct vpu_ctx *ctx)
+{
+ struct vpu_dev *dev;
+
+ if (!ctx || !ctx->dev)
+ return -EINVAL;
+
+ if (!test_bit(VPU_ENC_STATUS_CLOSED, &ctx->status))
+ return 0;
+ if (!test_bit(VPU_ENC_STATUS_FORCE_RELEASE, &ctx->status)) {
+ if (test_bit(VPU_ENC_STATUS_START_SEND, &ctx->status) &&
+ !test_bit(VPU_ENC_STATUS_STOP_DONE, &ctx->status))
+ return -EINVAL;
+ }
+
+ dev = ctx->dev;
+
+ uninit_vpu_ctx(ctx);
+ vpu_enc_free_ctrls(ctx);
+ vpu_enc_release_queue_data(ctx);
+ vpu_enc_free_mem(ctx, get_rpc_mem_pool(ctx));
+
+ vpu_ctx_power_off(ctx);
+ free_instance(ctx);
+
+ return 0;
+}
+
+static int try_to_release_idle_instance(struct vpu_dev *dev)
+{
+ int i;
+ int j;
+
+ if (!dev)
+ return -EINVAL;
+
+ for (i = 0; i < dev->core_num; i++) {
+ if (dev->core_dev[i].hang)
+ set_core_force_release(&dev->core_dev[i]);
+ for (j = 0; j < dev->core_dev[i].supported_instance_count; j++)
+ release_instance(dev->core_dev[i].ctx[j]);
+ }
+
+ return 0;
+}
+
+struct vpu_attr *get_vpu_ctx_attr(struct vpu_ctx *ctx)
+{
+ WARN_ON(!ctx || !ctx->core_dev);
+
+ if (ctx->str_index >= ctx->core_dev->supported_instance_count)
+ return NULL;
+
+ return &ctx->core_dev->attr[ctx->str_index];
+}
+
+struct vpu_ctx *get_vpu_attr_ctx(struct vpu_attr *attr)
+{
+ WARN_ON(!attr || !attr->core);
+
+ if (attr->index >= attr->core->supported_instance_count)
+ return NULL;
+
+ return attr->core->ctx[attr->index];
+}
+
+static int vpu_enc_v4l2_open(struct file *filp)
+{
+ struct video_device *vdev = video_devdata(filp);
+ struct vpu_dev *dev = video_get_drvdata(vdev);
+ struct vpu_ctx *ctx = NULL;
+ int ret;
+
+ vpu_log_func();
+
+ mutex_lock(&dev->dev_mutex);
+ try_to_release_idle_instance(dev);
+
+ pm_runtime_get_sync(dev->generic_dev);
+ ctx = create_and_request_instance(dev);
+ pm_runtime_put_sync(dev->generic_dev);
+ if (!ctx) {
+ mutex_unlock(&dev->dev_mutex);
+ vpu_err("failed to create encoder ctx\n");
+ return -ENOMEM;
+ }
+
+ init_vpu_attr(get_vpu_ctx_attr(ctx));
+ ret = init_vpu_ctx(ctx);
+ if (ret) {
+ mutex_unlock(&dev->dev_mutex);
+ vpu_err("init vpu ctx fail\n");
+ goto error;
+ }
+
+ initialize_enc_param(ctx);
+ vpu_enc_setup_ctrls(ctx);
+
+ init_vpu_ctx_fh(ctx, dev);
+ init_ctx_seq_info(ctx);
+ filp->private_data = &ctx->fh;
+ mutex_unlock(&dev->dev_mutex);
+
+ return 0;
+error:
+ mutex_lock(&dev->dev_mutex);
+ set_bit(VPU_ENC_STATUS_FORCE_RELEASE, &ctx->status);
+ VPU_SAFE_RELEASE(ctx, release_instance);
+ mutex_unlock(&dev->dev_mutex);
+ return ret;
+}
+
+static int vpu_enc_v4l2_release(struct file *filp)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(filp->private_data);
+ struct vpu_dev *dev = ctx->dev;
+
+ vpu_log_func();
+
+ request_eos(ctx);
+ wait_for_stop_done(ctx);
+
+ mutex_lock(&dev->dev_mutex);
+
+ uninit_vpu_ctx_fh(ctx);
+ filp->private_data = NULL;
+
+ VPU_SAFE_RELEASE(ctx, release_instance);
+ mutex_unlock(&dev->dev_mutex);
+
+ return 0;
+}
+
+static unsigned int vpu_enc_v4l2_poll(struct file *filp, poll_table *wait)
+{
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(filp->private_data);
+ struct vb2_queue *src_q, *dst_q;
+ unsigned int rc = 0;
+
+ vpu_dbg(LVL_FUNC, "%s(), event: 0x%lx\n", __func__,
+ (unsigned long)poll_requested_events(wait));
+
+ poll_wait(filp, &ctx->fh.wait, wait);
+
+ if (v4l2_event_pending(&ctx->fh)) {
+ vpu_dbg(LVL_DEBUG, "%s() v4l2_event_pending\n", __func__);
+ rc |= POLLPRI;
+ }
+
+ src_q = &ctx->q_data[V4L2_SRC].vb2_q;
+ dst_q = &ctx->q_data[V4L2_DST].vb2_q;
+
+ if ((!src_q->streaming || list_empty(&src_q->queued_list))
+ && (!dst_q->streaming || list_empty(&dst_q->queued_list))) {
+ rc |= POLLERR;
+ return rc;
+ }
+
+ poll_wait(filp, &src_q->done_wq, wait);
+ if (!list_empty(&src_q->done_list))
+ rc |= POLLOUT | POLLWRNORM;
+ poll_wait(filp, &dst_q->done_wq, wait);
+ if (!list_empty(&dst_q->done_list))
+ rc |= POLLIN | POLLRDNORM;
+
+ return rc;
+}
+
+static int vpu_enc_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+ long ret = -EPERM;
+ unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
+ struct queue_data *q_data;
+ enum QUEUE_TYPE type;
+
+ struct vpu_ctx *ctx = v4l2_fh_to_ctx(filp->private_data);
+
+ vpu_log_func();
+
+ if (ctx) {
+ type = offset >> MMAP_BUF_TYPE_SHIFT;
+ q_data = &ctx->q_data[type];
+
+ offset &= ~MMAP_BUF_TYPE_MASK;
+ offset = offset >> PAGE_SHIFT;
+ vma->vm_pgoff = offset;
+ ret = vpu_enc_queue_mmap(q_data, vma);
+ }
+
+ return ret;
+}
+
+static const struct v4l2_file_operations vpu_enc_v4l2_fops = {
+ .owner = THIS_MODULE,
+ .open = vpu_enc_v4l2_open,
+ .unlocked_ioctl = video_ioctl2,
+ .release = vpu_enc_v4l2_release,
+ .poll = vpu_enc_v4l2_poll,
+ .mmap = vpu_enc_v4l2_mmap,
+};
+
+static struct video_device vpu_enc_v4l2_videodevice = {
+ .name = "vpu encoder",
+ .fops = &vpu_enc_v4l2_fops,
+ .ioctl_ops = &vpu_enc_v4l2_ioctl_ops,
+ .vfl_dir = VFL_DIR_M2M,
+};
+
+static void vpu_enc_setup(struct vpu_dev *This)
+{
+ const off_t offset = SCB_XREG_SLV_BASE + SCB_SCB_BLK_CTRL;
+ uint32_t read_data = 0;
+
+ vpu_log_func();
+
+ write_vpu_reg(This, 0x1, offset + SCB_BLK_CTRL_SCB_CLK_ENABLE_SET);
+ write_vpu_reg(This, 0xffffffff, 0x70190);
+ write_vpu_reg(This, 0xffffffff, offset + SCB_BLK_CTRL_XMEM_RESET_SET);
+ write_vpu_reg(This, 0xE, offset + SCB_BLK_CTRL_SCB_CLK_ENABLE_SET);
+ write_vpu_reg(This, 0x7, offset + SCB_BLK_CTRL_CACHE_RESET_SET);
+ write_vpu_reg(This, 0x102, XMEM_CONTROL);
+
+ read_data = read_vpu_reg(This, 0x70108);
+ vpu_dbg(LVL_IRQ, "%s read_data=%x\n", __func__, read_data);
+}
+
+static void vpu_enc_reset(struct vpu_dev *This)
+{
+ const off_t offset = SCB_XREG_SLV_BASE + SCB_SCB_BLK_CTRL;
+
+ vpu_log_func();
+ write_vpu_reg(This, 0x7, offset + SCB_BLK_CTRL_CACHE_RESET_CLR);
+}
+
+static int vpu_enc_enable_hw(struct vpu_dev *This)
+{
+ vpu_log_func();
+ vpu_enc_setup(This);
+
+ This->hw_enable = true;
+
+ return 0;
+}
+
+static void vpu_enc_disable_hw(struct vpu_dev *This)
+{
+ This->hw_enable = false;
+ vpu_enc_reset(This);
+ if (This->regs_base) {
+ iounmap(This->regs_base);
+ This->regs_base = NULL;
+ }
+}
+
+static int parse_core_info(struct core_device *core, struct device_node *np)
+{
+ int ret;
+ u32 val;
+
+ WARN_ON(!core || !np);
+
+ ret = of_property_read_u32_index(np, "reg", 0, &val);
+ if (ret) {
+ vpu_err("find reg for core[%d] fail\n", core->id);
+ return ret;
+ }
+ core->reg_base = val;
+
+ ret = of_property_read_u32_index(np, "reg", 1, &val);
+ if (ret) {
+ vpu_err("find reg for core[%d] fail\n", core->id);
+ return ret;
+ }
+ core->reg_size = val;
+
+ ret = of_property_read_u32_index(np, "reg-csr", 0, &val);
+ if (ret) {
+ vpu_err("find reg-csr for core[%d] fail\n", core->id);
+ return ret;
+ }
+ core->reg_csr_base = val;
+
+ ret = of_property_read_u32_index(np, "reg-csr", 1, &val);
+ if (ret) {
+ vpu_err("find reg-csr for core[%d] fail\n", core->id);
+ return ret;
+ }
+ core->reg_csr_size = val;
+
+ ret = of_irq_get(np, 0);
+ if (ret < 0) {
+ vpu_err("get irq for core[%d] fail\n", core->id);
+ return -EINVAL;
+ }
+ core->irq = ret;
+
+ ret = of_property_read_u32(np, "fsl,vpu_ap_mu_id", &val);
+ if (!ret)
+ core->vpu_mu_id = val;
+
+ ret = of_property_read_u32(np, "fw-buf-size", &val);
+ if (ret) {
+ vpu_err("find fw-buf-size for core[%d] fail\n", core->id);
+ core->fw_buf_size = M0_BOOT_SIZE_DEFAULT;
+ } else {
+ core->fw_buf_size = val;
+ }
+ core->fw_buf_size = max_t(u32, core->fw_buf_size, M0_BOOT_SIZE_MIN);
+
+ ret = of_property_read_u32(np, "rpc-buf-size", &val);
+ if (ret) {
+ vpu_err("find rpc-buf-size for core[%d] fail\n", core->id);
+ core->rpc_buf_size = RPC_SIZE_DEFAULT;
+ } else {
+ core->rpc_buf_size = val;
+ }
+ core->rpc_buf_size = max_t(u32, core->rpc_buf_size, RPC_SIZE_MIN);
+
+ ret = of_property_read_u32(np, "print-buf-size", &val);
+ if (ret) {
+ vpu_err("find print-buf-size for core[%d] fail\n", core->id);
+ core->print_buf_size = PRINT_SIZE_DEFAULT;
+ } else {
+ core->print_buf_size = val;
+ }
+ core->print_buf_size = max_t(u32, core->print_buf_size, PRINT_SIZE_MIN);
+
+ return 0;
+}
+
+static int parse_dt_cores(struct vpu_dev *dev, struct device_node *np)
+{
+ char core_name[64];
+ struct device_node *node = NULL;
+ struct core_device *core = NULL;
+ int i;
+ int ret;
+
+ dev->core_num = 0;
+ for (i = 0; i < VPU_ENC_MAX_CORE_NUM; i++) {
+ scnprintf(core_name, sizeof(core_name), "core%d", i);
+ node = of_find_node_by_name(np, core_name);
+ if (!node) {
+ vpu_dbg(LVL_INFO, "can't find %s\n", core_name);
+ break;
+ }
+
+ core = &dev->core_dev[i];
+ core->id = i;
+ ret = parse_core_info(core, node);
+ of_node_put(node);
+ node = NULL;
+ if (ret) {
+ vpu_err("parse core[%d] fail\n", i);
+ break;
+ }
+ }
+ if (i == 0)
+ return -EINVAL;
+
+ dev->core_num = i;
+
+ return 0;
+}
+
+static int parse_dt_info(struct vpu_dev *dev, struct device_node *np)
+{
+ int ret;
+ struct device_node *reserved_node = NULL;
+ struct resource reserved_fw;
+ struct resource reserved_rpc;
+ struct resource reserved_mem;
+ u32 fw_total_size = 0;
+ u32 rpc_total_size = 0;
+ u32 val;
+ u32 i;
+
+ if (!dev || !np)
+ return -EINVAL;
+
+ ret = of_property_read_u32_index(np, "reg-rpc-system", 0, &val);
+ if (ret) {
+ vpu_err("get reg-rpc-system fail\n");
+ return -EINVAL;
+ }
+ dev->reg_rpc_system = val;
+
+ reserved_node = of_parse_phandle(np, "boot-region", 0);
+ if (!reserved_node) {
+ vpu_err("error: boot-region of_parse_phandle error\n");
+ return -ENODEV;
+ }
+ if (of_address_to_resource(reserved_node, 0, &reserved_fw)) {
+ vpu_err("error: boot-region of_address_to_resource error\n");
+ return -EINVAL;
+ }
+
+ reserved_node = of_parse_phandle(np, "rpc-region", 0);
+ if (!reserved_node) {
+ vpu_err("error: rpc-region of_parse_phandle error\n");
+ return -ENODEV;
+ }
+ if (of_address_to_resource(reserved_node, 0, &reserved_rpc)) {
+ vpu_err("error: rpc-region of_address_to_resource error\n");
+ return -EINVAL;
+ }
+
+ reserved_node = of_parse_phandle(np, "reserved-region", 0);
+ if (!reserved_node) {
+ vpu_err("error: rpc-region of_parse_phandle error\n");
+ return -ENODEV;
+ }
+ if (of_address_to_resource(reserved_node, 0, &reserved_mem)) {
+ vpu_err("error: rpc-region of_address_to_resource error\n");
+ return -EINVAL;
+ }
+ dev->reserved_mem.phy_addr = reserved_mem.start;
+ dev->reserved_mem.size = resource_size(&reserved_mem);
+
+ ret = parse_dt_cores(dev, np);
+ if (ret) {
+ vpu_err("parse cores from dt fail\n");
+ return ret;
+ }
+
+ fw_total_size = 0;
+ rpc_total_size = 0;
+ for (i = 0; i < dev->core_num; i++) {
+ struct core_device *core = &dev->core_dev[i];
+
+ core->m0_p_fw_space_phy = reserved_fw.start + fw_total_size;
+ core->m0_rpc_phy = reserved_rpc.start + rpc_total_size;
+ fw_total_size += core->fw_buf_size;
+ rpc_total_size += core->rpc_buf_size;
+ rpc_total_size += core->print_buf_size;
+ }
+
+ if (fw_total_size > resource_size(&reserved_fw)) {
+ vpu_err("boot-region's size(0x%llx) is less than wanted:0x%x\n",
+ resource_size(&reserved_fw), fw_total_size);
+ return -EINVAL;
+ }
+ if (rpc_total_size > resource_size(&reserved_rpc)) {
+ vpu_err("rpc-region's size(0x%llx) is less than wanted:0x%x\n",
+ resource_size(&reserved_rpc), rpc_total_size);
+ return -EINVAL;
+ }
+
+ dev->supported_size.min_width = VPU_ENC_WIDTH_MIN;
+ dev->supported_size.max_width = VPU_ENC_WIDTH_MAX;
+ dev->supported_size.step_width = VPU_ENC_WIDTH_STEP;
+ dev->supported_size.min_height = VPU_ENC_HEIGHT_MIN;
+ dev->supported_size.max_height = VPU_ENC_HEIGHT_MAX;
+ dev->supported_size.step_height = VPU_ENC_HEIGHT_STEP;
+
+ dev->supported_fps.min = VPU_ENC_FRAMERATE_MIN;
+ dev->supported_fps.max = VPU_ENC_FRAMERATE_MAX;
+ dev->supported_fps.step = VPU_ENC_FRAMERATE_STEP;
+
+ ret = of_property_read_u32_index(np, "resolution-max", 0, &val);
+ if (!ret)
+ dev->supported_size.max_width = val;
+
+ ret = of_property_read_u32_index(np, "resolution-max", 1, &val);
+ if (!ret)
+ dev->supported_size.max_height = val;
+
+ ret = of_property_read_u32_index(np, "fps-max", 0, &val);
+ if (!ret)
+ dev->supported_fps.max = val;
+
+ return 0;
+}
+
+static int create_vpu_video_device(struct vpu_dev *dev)
+{
+ int ret;
+
+ dev->pvpu_encoder_dev = video_device_alloc();
+ if (!dev->pvpu_encoder_dev) {
+ vpu_err("alloc vpu encoder video device fail\n");
+ return -ENOMEM;
+ }
+
+ strlcpy(dev->pvpu_encoder_dev->name,
+ vpu_enc_v4l2_videodevice.name,
+ sizeof(dev->pvpu_encoder_dev->name));
+ dev->pvpu_encoder_dev->fops = vpu_enc_v4l2_videodevice.fops;
+ dev->pvpu_encoder_dev->ioctl_ops = vpu_enc_v4l2_videodevice.ioctl_ops;
+ dev->pvpu_encoder_dev->release = video_device_release;
+ dev->pvpu_encoder_dev->vfl_dir = vpu_enc_v4l2_videodevice.vfl_dir;
+ dev->pvpu_encoder_dev->v4l2_dev = &dev->v4l2_dev;
+ dev->pvpu_encoder_dev->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE |
+ V4L2_CAP_STREAMING |
+ V4L2_CAP_VIDEO_CAPTURE_MPLANE |
+ V4L2_CAP_VIDEO_OUTPUT_MPLANE;
+
+ video_set_drvdata(dev->pvpu_encoder_dev, dev);
+
+ ret = video_register_device(dev->pvpu_encoder_dev,
+ VFL_TYPE_GRABBER,
+ ENCODER_NODE_NUMBER);
+ if (ret) {
+ vpu_err("unable to register video encoder device\n");
+ video_device_release(dev->pvpu_encoder_dev);
+ dev->pvpu_encoder_dev = NULL;
+ return ret;
+ }
+
+ return 0;
+}
+
+static int init_vpu_attrs(struct core_device *core)
+{
+ int i;
+
+ WARN_ON(!core);
+
+ for (i = 0; i < ARRAY_SIZE(core->attr); i++) {
+ struct vpu_attr *attr = &core->attr[i];
+
+ attr->core = core;
+ attr->index = i;
+ scnprintf(attr->name, sizeof(attr->name) - 1, "instance.%d.%d",
+ core->id, attr->index);
+ sysfs_attr_init(&attr->dev_attr.attr);
+ attr->dev_attr.attr.name = attr->name;
+ attr->dev_attr.attr.mode = VERIFY_OCTAL_PERMISSIONS(0444);
+ attr->dev_attr.show = show_instance_info;
+
+ atomic64_set(&attr->total_dma_size, 0);
+
+ attr->created = false;
+ }
+
+ return 0;
+}
+
+static int release_vpu_attrs(struct core_device *core)
+{
+ int i;
+
+ WARN_ON(!core);
+
+ for (i = 0; i < ARRAY_SIZE(core->attr); i++) {
+ struct vpu_attr *attr = &core->attr[i];
+
+ if (!attr->created)
+ continue;
+ device_remove_file(attr->core->generic_dev, &attr->dev_attr);
+ }
+
+ return 0;
+}
+
+static int is_ctx_frozen(struct vpu_ctx *ctx)
+{
+ int is_frozen = 1;
+ int i;
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+
+ for (i = 0; i < GTB_ENC_CMD_RESERVED; i++) {
+ if (attr->statistic.cmd[i] != ctx->sts.cmd[i])
+ is_frozen = 0;
+ ctx->sts.cmd[i] = attr->statistic.cmd[i];
+ }
+
+ for (i = 0; i < VID_API_ENC_EVENT_RESERVED; i++) {
+ if (attr->statistic.event[i] != ctx->sts.event[i])
+ is_frozen = 0;
+ ctx->sts.event[i] = attr->statistic.event[i];
+ }
+
+ if (ctx->sts.cmd[GTB_ENC_CMD_FRAME_ENCODE] ==
+ ctx->sts.event[VID_API_ENC_EVENT_FRAME_DONE])
+ is_frozen = 0;
+
+ if (ctx->sts.cmd[GTB_ENC_CMD_CONFIGURE_CODEC] >
+ ctx->sts.event[VID_API_ENC_EVENT_MEM_REQUEST])
+ is_frozen = 1;
+ if (ctx->sts.cmd[GTB_ENC_CMD_STREAM_START] >
+ ctx->sts.event[VID_API_ENC_EVENT_START_DONE])
+ is_frozen = 1;
+ if (ctx->sts.cmd[GTB_ENC_CMD_STREAM_STOP] >
+ ctx->sts.event[VID_API_ENC_EVENT_STOP_DONE])
+ is_frozen = 1;
+
+ return is_frozen;
+}
+
+static bool check_vpu_ctx_is_hang(struct vpu_ctx *ctx)
+{
+ if (is_ctx_frozen(ctx))
+ ctx->frozen_count++;
+ else
+ ctx->frozen_count = 0;
+
+ if (ctx->frozen_count > VPU_ENC_HANG_THD) {
+ set_bit(VPU_ENC_STATUS_HANG, &ctx->status);
+ ctx->frozen_count = VPU_ENC_HANG_THD;
+ } else if (ctx->frozen_count == 0) {
+ clear_bit(VPU_ENC_STATUS_HANG, &ctx->status);
+ }
+
+ if (test_bit(VPU_ENC_STATUS_HANG, &ctx->status))
+ return true;
+
+ return false;
+}
+
+static void check_vpu_core_is_hang(struct core_device *core)
+{
+ int i;
+ unsigned int instance_count = 0;
+ unsigned int hang_count = 0;
+
+ for (i = 0; i < core->supported_instance_count; i++) {
+ if (!core->ctx[i])
+ continue;
+
+ if (check_vpu_ctx_is_hang(core->ctx[i]))
+ hang_count++;
+ instance_count++;
+ }
+
+ if (!instance_count)
+ return;
+ if (hang_count == instance_count)
+ set_core_hang(core);
+ else
+ clear_core_hang(core);
+}
+
+static void handle_vpu_core_watchdog(struct core_device *core)
+{
+ if (!core->fw_is_ready)
+ return;
+ if (core->suspend)
+ return;
+ if (core->snapshot)
+ return;
+
+ check_vpu_core_is_hang(core);
+}
+
+static unsigned long get_timestamp_ns(struct timespec *ts)
+{
+ if (!ts)
+ return 0;
+
+ return ts->tv_sec * NSEC_PER_SEC + ts->tv_nsec;
+}
+
+static void calc_rt_fps(struct vpu_fps_sts *fps,
+ unsigned long number, struct timespec *ts)
+{
+ unsigned long delta_num;
+ unsigned long delta_ts;
+
+ if (!fps || !ts)
+ return;
+
+ fps->times++;
+ if (fps->times < fps->thd)
+ return;
+
+ if (number >= fps->frame_number) {
+ delta_num = number - fps->frame_number;
+ delta_ts = get_timestamp_ns(ts) - get_timestamp_ns(&fps->ts);
+ if (!delta_ts)
+ return;
+ fps->fps = delta_num * NSEC_PER_SEC * VPU_FPS_COEF / delta_ts;
+ }
+ fps->times = 0;
+ if (fps->thd) {
+ fps->frame_number = number;
+ memcpy(&fps->ts, ts, sizeof(fps->ts));
+ }
+}
+
+static void statistic_fps_info(struct vpu_statistic *sts)
+{
+ unsigned long encoded_count = sts->encoded_count;
+ struct timespec ts;
+ int i;
+
+ if (!sts->fps_sts_enable)
+ return;
+ getrawmonotonic(&ts);
+ for (i = 0; i < VPU_FPS_STS_CNT; i++)
+ calc_rt_fps(&sts->fps[i], encoded_count, &ts);
+}
+
+static void print_firmware_debug(char *ptr, u32 size)
+{
+ u32 total = 0;
+ u32 len;
+
+ while (total < size) {
+ len = min_t(u32, size - total, 256);
+ total += len;
+ }
+}
+
+static void handle_core_firmware_debug(struct core_device *core)
+{
+ char *ptr;
+ u32 rptr;
+ u32 wptr;
+
+ if (!core || !core->print_buf)
+ return;
+
+ if (!test_bit(core->id, &debug_firmware_bitmap))
+ return;
+
+ rptr = core->print_buf->read;
+ wptr = core->print_buf->write;
+ if (rptr == wptr)
+ return;
+
+ ptr = core->print_buf->buffer;
+ if (rptr > wptr) {
+ print_firmware_debug(ptr + rptr, core->print_buf->bytes - rptr);
+ rptr = 0;
+ }
+ if (rptr < wptr) {
+ print_firmware_debug(ptr + rptr, wptr - rptr);
+ rptr = wptr;
+ }
+ if (rptr >= core->print_buf->bytes)
+ rptr = 0;
+ core->print_buf->read = rptr;
+}
+
+static void handle_core_minors(struct core_device *core)
+{
+ int i;
+
+ for (i = 0; i < core->supported_instance_count; i++)
+ statistic_fps_info(&core->attr[i].statistic);
+
+ handle_core_firmware_debug(core);
+}
+
+static void vpu_enc_watchdog_handler(struct work_struct *work)
+{
+ struct delayed_work *dwork;
+ struct vpu_dev *vdev;
+ int i;
+
+ if (!work)
+ return;
+
+ dwork = to_delayed_work(work);
+ vdev = container_of(dwork, struct vpu_dev, watchdog);
+
+ mutex_lock(&vdev->dev_mutex);
+ for (i = 0; i < vdev->core_num; i++)
+ handle_vpu_core_watchdog(&vdev->core_dev[i]);
+ mutex_unlock(&vdev->dev_mutex);
+
+ for (i = 0; i < vdev->core_num; i++)
+ handle_core_minors(&vdev->core_dev[i]);
+
+ vdev->heartbeat++;
+ schedule_delayed_work(&vdev->watchdog,
+ msecs_to_jiffies(VPU_WATCHDOG_INTERVAL_MS));
+}
+
+static int init_vpu_core_dev(struct core_device *core_dev)
+{
+ int ret = 0;
+
+ if (!core_dev)
+ return -EINVAL;
+
+ mutex_init(&core_dev->cmd_mutex);
+ init_completion(&core_dev->start_cmp);
+ init_completion(&core_dev->snap_done_cmp);
+
+ core_dev->workqueue = alloc_workqueue("vpu",
+ WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
+ if (!core_dev->workqueue) {
+ vpu_err("%s unable to alloc workqueue\n", __func__);
+ ret = -ENOMEM;
+ return ret;
+ }
+
+ INIT_WORK(&core_dev->msg_work, vpu_enc_msg_run_work);
+
+ ret = vpu_enc_mu_request(core_dev);
+ if (ret)
+ goto err_des_work;
+
+ ret = kfifo_alloc(&core_dev->mu_msg_fifo,
+ sizeof(u32) * VID_API_NUM_STREAMS * VID_API_MESSAGE_LIMIT,
+ GFP_KERNEL);
+ if (ret) {
+ vpu_err("error: fail to alloc mu msg fifo\n");
+ goto err_free_mu;
+ }
+
+ //firmware space for M0
+ core_dev->m0_p_fw_space_vir =
+ ioremap_wc(core_dev->m0_p_fw_space_phy, core_dev->fw_buf_size);
+ if (!core_dev->m0_p_fw_space_vir) {
+ vpu_err("failed to remap space for M0 firmware\n");
+ ret = -EINVAL;
+ goto err_free_fifo;
+ }
+
+ cleanup_firmware_memory(core_dev);
+
+ core_dev->m0_rpc_virt =
+ ioremap_wc(core_dev->m0_rpc_phy,
+ core_dev->rpc_buf_size + core_dev->print_buf_size);
+ if (!core_dev->m0_rpc_virt) {
+ vpu_err("failed to remap space for shared memory\n");
+ ret = -EINVAL;
+ goto err_free_fifo;
+ }
+
+ memset_io(core_dev->m0_rpc_virt, 0, core_dev->rpc_buf_size);
+
+ reset_vpu_core_dev(core_dev);
+
+ init_vpu_attrs(core_dev);
+
+ scnprintf(core_dev->name, sizeof(core_dev->name) - 1,
+ "core.%d", core_dev->id);
+ sysfs_attr_init(&core_dev->core_attr.attr);
+ core_dev->core_attr.attr.name = core_dev->name;
+ core_dev->core_attr.attr.mode = VERIFY_OCTAL_PERMISSIONS(0444);
+ core_dev->core_attr.show = show_core_info;
+ device_create_file(core_dev->generic_dev, &core_dev->core_attr);
+
+ return ret;
+
+err_free_fifo:
+ kfifo_free(&core_dev->mu_msg_fifo);
+err_free_mu:
+ vpu_enc_mu_free(core_dev);
+err_des_work:
+ if (core_dev->workqueue) {
+ destroy_workqueue(core_dev->workqueue);
+ core_dev->workqueue = NULL;
+ }
+ return ret;
+}
+
+static int uninit_vpu_core_dev(struct core_device *core_dev)
+{
+ if (!core_dev)
+ return -EINVAL;
+
+ vpu_enc_mu_free(core_dev);
+ kfifo_free(&core_dev->mu_msg_fifo);
+
+ if (core_dev->core_attr.attr.name)
+ device_remove_file(core_dev->generic_dev, &core_dev->core_attr);
+ release_vpu_attrs(core_dev);
+ if (core_dev->workqueue) {
+ cancel_work_sync(&core_dev->msg_work);
+ destroy_workqueue(core_dev->workqueue);
+ core_dev->workqueue = NULL;
+ }
+
+ if (core_dev->m0_p_fw_space_vir) {
+ iounmap(core_dev->m0_p_fw_space_vir);
+ core_dev->m0_p_fw_space_vir = NULL;
+ }
+ core_dev->m0_p_fw_space_phy = 0;
+
+ if (core_dev->m0_rpc_virt) {
+ iounmap(core_dev->m0_rpc_virt);
+ core_dev->m0_rpc_virt = NULL;
+ }
+ core_dev->m0_rpc_phy = 0;
+
+ if (core_dev->mu_base_virtaddr)
+ core_dev->mu_base_virtaddr = NULL;
+
+ if (core_dev->generic_dev) {
+ put_device(core_dev->generic_dev);
+ core_dev->generic_dev = NULL;
+ }
+
+ return 0;
+}
+
+static void init_vpu_enc_watchdog(struct vpu_dev *vdev)
+{
+ if (!vdev)
+ return;
+
+ INIT_DELAYED_WORK(&vdev->watchdog, vpu_enc_watchdog_handler);
+ schedule_delayed_work(&vdev->watchdog,
+ msecs_to_jiffies(VPU_WATCHDOG_INTERVAL_MS));
+}
+
+static const struct of_device_id vpu_enc_of_match[];
+static int vpu_enc_probe(struct platform_device *pdev)
+{
+ struct vpu_dev *dev;
+ struct device_node *np = pdev->dev.of_node;
+ const struct of_device_id *dev_id = NULL;
+ struct resource *res = NULL;
+ u_int32 i;
+ int ret;
+
+ if (!np) {
+ vpu_err("error: %s of_node is NULL\n", __func__);
+ return -EINVAL;
+ }
+
+ dev_id = of_match_device(vpu_enc_of_match, &pdev->dev);
+ if (!dev_id) {
+ vpu_err("unmatch vpu encoder device\n");
+ return -EINVAL;
+ }
+ vpu_dbg(LVL_INFO, "probe %s\n", dev_id->compatible);
+
+ if (vpu_enc_sc_check_fuse())
+ return -EINVAL;
+
+ dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
+ if (!dev)
+ return -ENOMEM;
+ dev->plat_type = *(enum PLAT_TYPE *)dev_id->data;
+ dev->plat_dev = pdev;
+ dev->generic_dev = get_device(&pdev->dev);
+
+ ret = vpu_enc_attach_pm_domains(dev);
+ if (ret)
+ goto error_put_dev;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+ if (!res) {
+ ret = -EINVAL;
+ goto error_det_pm;
+ }
+
+ dev->reg_vpu_base = res->start;
+ dev->reg_vpu_size = resource_size(res);
+
+ ret = parse_dt_info(dev, np);
+ if (ret) {
+ vpu_err("parse device tree fail\n");
+ goto error_det_pm;
+ }
+
+ dev->regs_base = ioremap(dev->reg_vpu_base, dev->reg_vpu_size);
+ if (!dev->regs_base) {
+ vpu_err("%s could not map regs_base\n", __func__);
+ ret = PTR_ERR(dev->regs_base);
+ goto error_det_pm;
+ }
+
+ ret = vpu_enc_init_reserved_memory(&dev->reserved_mem);
+ if (ret) {
+ vpu_err("%s couldn't init reserved memory\n", __func__);
+ goto error_iounmap;
+ }
+
+ ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
+ if (ret) {
+ vpu_err("%s unable to register v4l2 dev\n", __func__);
+ goto error_reserved_mem;
+ }
+
+ platform_set_drvdata(pdev, dev);
+
+ ret = create_vpu_video_device(dev);
+ if (ret) {
+ vpu_err("create vpu video device fail\n");
+ goto error_unreg_v4l2;
+ }
+
+ pm_runtime_enable(&pdev->dev);
+ pm_runtime_get_sync(&pdev->dev);
+
+ vpu_enc_enable_hw(dev);
+
+ mutex_init(&dev->dev_mutex);
+ for (i = 0; i < dev->core_num; i++) {
+ dev->core_dev[i].id = i;
+ dev->core_dev[i].generic_dev = get_device(dev->generic_dev);
+ dev->core_dev[i].vdev = dev;
+ ret = init_vpu_core_dev(&dev->core_dev[i]);
+ if (ret)
+ break;
+ }
+
+ if (i < dev->core_num) {
+ if (i == 0)
+ goto error_init_core;
+ else
+ vpu_err("error: core[%d] init failed\n", i);
+ }
+
+ dev->core_num = i;
+
+ pm_runtime_put_sync(&pdev->dev);
+
+ device_create_file(&pdev->dev, &dev_attr_meminfo);
+ device_create_file(&pdev->dev, &dev_attr_buffer);
+ device_create_file(&pdev->dev, &dev_attr_fpsinfo);
+ device_create_file(&pdev->dev, &dev_attr_vpuinfo);
+ init_vpu_enc_watchdog(dev);
+ vpu_dbg(LVL_INFO, "VPU Encoder registered\n");
+
+ return 0;
+
+error_init_core:
+ for (i = 0; i < dev->core_num; i++)
+ uninit_vpu_core_dev(&dev->core_dev[i]);
+
+ vpu_enc_disable_hw(dev);
+ pm_runtime_put_sync(&pdev->dev);
+ pm_runtime_disable(&pdev->dev);
+
+ if (dev->pvpu_encoder_dev) {
+ video_unregister_device(dev->pvpu_encoder_dev);
+ dev->pvpu_encoder_dev = NULL;
+ }
+error_unreg_v4l2:
+ v4l2_device_unregister(&dev->v4l2_dev);
+error_reserved_mem:
+ vpu_enc_release_reserved_memory(&dev->reserved_mem);
+error_iounmap:
+ if (dev->regs_base) {
+ iounmap(dev->regs_base);
+ dev->regs_base = NULL;
+ }
+error_det_pm:
+ vpu_enc_detach_pm_domains(dev);
+error_put_dev:
+ if (dev->generic_dev) {
+ put_device(dev->generic_dev);
+ dev->generic_dev = NULL;
+ }
+ devm_kfree(&pdev->dev, dev);
+
+ return ret;
+}
+
+static int vpu_enc_remove(struct platform_device *pdev)
+{
+ struct vpu_dev *dev = platform_get_drvdata(pdev);
+ u_int32 i;
+
+ cancel_delayed_work_sync(&dev->watchdog);
+ device_remove_file(&pdev->dev, &dev_attr_vpuinfo);
+ device_remove_file(&pdev->dev, &dev_attr_fpsinfo);
+ device_remove_file(&pdev->dev, &dev_attr_buffer);
+ device_remove_file(&pdev->dev, &dev_attr_meminfo);
+
+ pm_runtime_get_sync(&pdev->dev);
+ for (i = 0; i < dev->core_num; i++)
+ uninit_vpu_core_dev(&dev->core_dev[i]);
+
+ vpu_enc_disable_hw(dev);
+ pm_runtime_put_sync(&pdev->dev);
+ pm_runtime_disable(&pdev->dev);
+
+ if (video_get_drvdata(dev->pvpu_encoder_dev))
+ video_unregister_device(dev->pvpu_encoder_dev);
+
+ v4l2_device_unregister(&dev->v4l2_dev);
+ vpu_enc_detach_pm_domains(dev);
+ vpu_enc_release_reserved_memory(&dev->reserved_mem);
+ if (dev->regs_base) {
+ iounmap(dev->regs_base);
+ dev->regs_base = NULL;
+ }
+ if (dev->generic_dev) {
+ put_device(dev->generic_dev);
+ dev->generic_dev = NULL;
+ }
+
+ devm_kfree(&pdev->dev, dev);
+
+ return 0;
+}
+
+static int vpu_enc_runtime_suspend(struct device *dev)
+{
+ return 0;
+}
+
+static int vpu_enc_runtime_resume(struct device *dev)
+{
+ return 0;
+}
+
+static int is_vpu_enc_poweroff(struct core_device *core)
+{
+ /* the csr register 'CM0Px_CPUWAIT' will be cleared to '1' after
+ * reset(poweoff then poweron)
+ */
+ if (read_vpu_reg(core->vdev, core->reg_csr_base + CSR_CM0Px_CPUWAIT) == 1)
+ return 1;
+ else
+ return 0;
+}
+
+static int is_need_shapshot(struct vpu_ctx *ctx)
+{
+ if (!test_bit(VPU_ENC_STATUS_INITIALIZED, &ctx->status))
+ return 0;
+ if (!test_bit(VPU_ENC_STATUS_CONFIGURED, &ctx->status))
+ return 0;
+ if (test_bit(VPU_ENC_STATUS_CLOSED, &ctx->status))
+ return 0;
+ if (test_bit(VPU_ENC_STATUS_STOP_SEND, &ctx->status))
+ return 0;
+ if (test_bit(VPU_ENC_STATUS_STOP_DONE, &ctx->status))
+ return 0;
+
+ return 1;
+}
+
+static int vpu_enc_snapshot(struct vpu_ctx *ctx)
+{
+ int ret;
+
+ if (!ctx)
+ return -EINVAL;
+
+ vpu_dbg(LVL_INFO, "core[%d] snapshot\n", ctx->core_dev->id);
+ vpu_ctx_send_cmd(ctx, GTB_ENC_CMD_SNAPSHOT, 0, NULL);
+ ret = wait_for_completion_timeout(&ctx->core_dev->snap_done_cmp,
+ msecs_to_jiffies(1000));
+ if (!ret)
+ vpu_err("error:wait for snapdone event timeout!\n");
+ else
+ ctx->core_dev->snapshot = true;
+
+ return 0;
+}
+
+static int resume_from_snapshot(struct core_device *core)
+{
+ int ret = 0;
+
+ if (!core)
+ return -EINVAL;
+ if (!core->snapshot)
+ return 0;
+
+ vpu_dbg(LVL_INFO, "core[%d] resume from snapshot\n", core->id);
+
+ init_completion(&core->start_cmp);
+ set_vpu_fw_addr(core->vdev, core);
+ ret = wait_for_start_done(core, 1);
+ if (ret) {
+ set_core_force_release(core);
+ reset_vpu_core_dev(core);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int re_download_firmware(struct core_device *core)
+{
+ if (!core)
+ return -EINVAL;
+
+ vpu_dbg(LVL_INFO, "re download firmware for core[%d]\n", core->id);
+
+ reset_vpu_core_dev(core);
+ return download_vpu_firmware(core->vdev, core);
+}
+
+static int suspend_instance(struct vpu_ctx *ctx)
+{
+ int ret = 0;
+
+ if (!ctx)
+ return 0;
+
+ if (test_bit(VPU_ENC_STATUS_STOP_REQ, &ctx->status) ||
+ test_bit(VPU_ENC_STATUS_STOP_SEND, &ctx->status))
+ wait_for_stop_done(ctx);
+
+ mutex_lock(&ctx->instance_mutex);
+ if (!ctx->core_dev->snapshot && is_need_shapshot(ctx))
+ ret = vpu_enc_snapshot(ctx);
+ set_bit(VPU_ENC_STATUS_SNAPSHOT, &ctx->status);
+ mutex_unlock(&ctx->instance_mutex);
+
+ return ret;
+}
+
+static int resume_instance(struct vpu_ctx *ctx)
+{
+ if (!ctx)
+ return 0;
+
+ clear_bit(VPU_ENC_STATUS_SNAPSHOT, &ctx->status);
+
+ return 0;
+}
+
+static int suspend_core(struct core_device *core)
+{
+ int i;
+ int ret = 0;
+
+ WARN_ON(!core);
+
+ core->snapshot = false;
+
+ if (!core->fw_is_ready)
+ return 0;
+
+ for (i = 0; i < core->supported_instance_count; i++) {
+ if (!core->ctx[i])
+ continue;
+ ret = suspend_instance(core->ctx[i]);
+ if (ret)
+ return ret;
+ }
+
+ for (i = 0; i < core->supported_instance_count; i++)
+ vpu_ctx_power_off(core->ctx[i]);
+
+ core->suspend = true;
+
+ return 0;
+}
+
+static int resume_core(struct core_device *core)
+{
+ int ret = 0;
+ u32 instance_count = 0;
+ int i;
+
+ WARN_ON(!core);
+
+ if (!core->suspend)
+ return 0;
+
+ for (i = 0; i < core->supported_instance_count; i++) {
+ if (!core->ctx[i])
+ continue;
+ instance_count++;
+ vpu_ctx_power_on(core->ctx[i]);
+ resume_instance(core->ctx[i]);
+ }
+
+ if (is_vpu_enc_poweroff(core)) {
+ if (!core->vdev->hw_enable)
+ vpu_enc_enable_hw(core->vdev);
+ if (core->snapshot)
+ ret = resume_from_snapshot(core);
+ else if (instance_count)
+ ret = re_download_firmware(core);
+ else
+ reset_vpu_core_dev(core);
+ } else {
+ if (core->snapshot || instance_count)
+ ret = sw_reset_firmware(core, 1);
+ }
+
+ core->snapshot = false;
+ core->suspend = false;
+
+ return ret;
+}
+
+static void vpu_enc_cancel_work(struct vpu_dev *vpudev)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < vpudev->core_num; i++) {
+ struct core_device *core = &vpudev->core_dev[i];
+
+ if (!core->fw_is_ready)
+ continue;
+ cancel_work_sync(&core->msg_work);
+ for (j = 0; j < core->supported_instance_count; j++) {
+ struct vpu_ctx *ctx = core->ctx[j];
+
+ if (!ctx)
+ continue;
+ cancel_work_sync(&ctx->instance_work);
+ }
+ }
+ cancel_delayed_work_sync(&vpudev->watchdog);
+}
+
+static void vpu_enc_resume_work(struct vpu_dev *vpudev)
+{
+ int i;
+ int j;
+
+ for (i = 0; i < vpudev->core_num; i++) {
+ struct core_device *core = &vpudev->core_dev[i];
+
+ if (!core->fw_is_ready)
+ continue;
+ queue_work(core->workqueue, &core->msg_work);
+ for (j = 0; j < core->supported_instance_count; j++) {
+ struct vpu_ctx *ctx = core->ctx[j];
+
+ if (!ctx)
+ continue;
+ queue_work(ctx->instance_wq, &ctx->instance_work);
+ }
+ }
+ schedule_delayed_work(&vpudev->watchdog,
+ msecs_to_jiffies(VPU_WATCHDOG_INTERVAL_MS));
+}
+
+static int __maybe_unused vpu_enc_suspend(struct device *dev)
+{
+ struct vpu_dev *vpudev = (struct vpu_dev *)dev_get_drvdata(dev);
+ int i;
+ int ret = 0;
+
+ vpu_dbg(LVL_INFO, "suspend\n");
+
+ mutex_lock(&vpudev->dev_mutex);
+ pm_runtime_get_sync(dev);
+ for (i = 0; i < vpudev->core_num; i++) {
+ ret = suspend_core(&vpudev->core_dev[i]);
+ if (ret)
+ break;
+ }
+ vpu_enc_cancel_work(vpudev);
+ pm_runtime_put_sync(dev);
+ mutex_unlock(&vpudev->dev_mutex);
+
+ vpu_dbg(LVL_INFO, "suspend done\n");
+
+ return ret;
+}
+
+static int __maybe_unused vpu_enc_resume(struct device *dev)
+{
+ struct vpu_dev *vpudev = (struct vpu_dev *)dev_get_drvdata(dev);
+ int i;
+ int ret = 0;
+
+ vpu_dbg(LVL_INFO, "resume\n");
+
+ mutex_lock(&vpudev->dev_mutex);
+ pm_runtime_get_sync(dev);
+ vpudev->hw_enable = false;
+ for (i = 0; i < vpudev->core_num; i++) {
+ ret = resume_core(&vpudev->core_dev[i]);
+ if (ret)
+ break;
+ }
+ vpudev->hw_enable = true;
+ vpu_enc_resume_work(vpudev);
+ pm_runtime_put_sync(dev);
+ mutex_unlock(&vpudev->dev_mutex);
+
+ vpu_dbg(LVL_INFO, "resume done\n");
+
+ return ret;
+}
+
+static const struct dev_pm_ops vpu_enc_pm_ops = {
+ SET_RUNTIME_PM_OPS(vpu_enc_runtime_suspend, vpu_enc_runtime_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(vpu_enc_suspend, vpu_enc_resume)
+};
+
+static enum PLAT_TYPE supported_plat_types[PLAT_TYPE_RESERVED] = {
+ [IMX8QXP] = IMX8QXP,
+ [IMX8QM] = IMX8QM,
+};
+
+static const struct of_device_id vpu_enc_of_match[] = {
+ { .compatible = "nxp,imx8qm-b0-vpuenc",
+ .data = (void *)&supported_plat_types[IMX8QM]
+ },
+ { .compatible = "nxp,imx8qxp-b0-vpuenc",
+ .data = (void *)&supported_plat_types[IMX8QXP]
+ },
+ {}
+};
+MODULE_DEVICE_TABLE(of, vpu_enc_of_match);
+
+static struct platform_driver vpu_enc_driver = {
+ .probe = vpu_enc_probe,
+ .remove = vpu_enc_remove,
+ .driver = {
+ .name = "vpu-b0-encoder",
+ .of_match_table = vpu_enc_of_match,
+ .pm = &vpu_enc_pm_ops,
+ },
+};
+module_platform_driver(vpu_enc_driver);
+
+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
+MODULE_DESCRIPTION("Linux VPU driver for Freescale i.MX/MXC");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(VPU_ENC_DRIVER_VERSION);
+
+module_param(vpu_dbg_level_encoder, int, 0644);
+MODULE_PARM_DESC(vpu_dbg_level_encoder, "Debug level (0-4)");
+
+module_param(reset_on_hang, int, 0644);
+MODULE_PARM_DESC(reset_on_hang, "reset on hang (0-1)");
+
+module_param(show_detail_index, int, 0644);
+MODULE_PARM_DESC(show_detail_index, "show memory detail info index");
+
+module_param(debug_firmware_bitmap, long, 0644);
+MODULE_PARM_DESC(debug_firmware_bitmap, "firmware debug info switch");
+
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_b0.h b/drivers/mxc/vpu_windsor/vpu_encoder_b0.h
new file mode 100644
index 000000000000..fe334511e20d
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_b0.h
@@ -0,0 +1,511 @@
+/*
+ * Copyright 2018 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file vpu_encoder_b0.h
+ *
+ * @brief VPU ENCODER B0 definition
+ *
+ */
+#ifndef __VPU_ENCODER_B0_H__
+#define __VPU_ENCODER_B0_H__
+
+#include <linux/irqreturn.h>
+#include <linux/mutex.h>
+#include <linux/videodev2.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-fh.h>
+#include <media/videobuf2-v4l2.h>
+#ifdef CONFIG_IMX_SCU
+#include <linux/firmware/imx/ipc.h>
+#include <linux/firmware/imx/svc/misc.h>
+#else
+#include <soc/imx8/sc/svc/irq/api.h>
+#include <soc/imx8/sc/ipc.h>
+#include <soc/imx8/sc/sci.h>
+#endif
+#include <linux/mx8_mu.h>
+#include <media/v4l2-event.h>
+#include <linux/mailbox_client.h>
+#include <linux/kfifo.h>
+
+#include "vpu_encoder_rpc.h"
+#include "vpu_encoder_config.h"
+
+extern unsigned int vpu_dbg_level_encoder;
+
+#define v4l2_fh_to_ctx(__fh) \
+ container_of(__fh, struct vpu_ctx, fh)
+#define v4l2_ctrl_to_ctx(__ctrl) \
+ container_of((__ctrl)->handler, struct vpu_ctx, ctrl_handler)
+
+#define VPU_ENC_MAX_CORE_NUM 2
+#define VPU_MAX_BUFFER 32
+#define M0FW_FILENAME "vpu/vpu_fw_imx8_enc.bin"
+#define MMAP_BUF_TYPE_SHIFT 28
+#define MMAP_BUF_TYPE_MASK 0xF0000000
+#define M0_BOOT_SIZE_DEFAULT 0x1000000
+#define M0_BOOT_SIZE_MIN 0x100000
+#define RPC_SIZE_DEFAULT 0x80000
+#define RPC_SIZE_MIN 0x20000
+#define PRINT_SIZE_DEFAULT 0x80000
+#define PRINT_SIZE_MIN 0x20000
+#define STREAM_SIZE 0x300000
+
+#define MIN_BUFFER_COUNT 3
+#define BITRATE_COEF 1024
+#define BITRATE_LOW_THRESHOLD (16)
+#define BITRATE_HIGH_THRESHOLD (240 * 1024)
+#define BITRATE_DEFAULT_TARGET (2 * 1024)
+#define BITRATE_DEFAULT_PEAK (8 * 1024)
+#define GOP_H_THRESHOLD 300
+#define GOP_L_THRESHOLD 1
+#define GOP_DEFAULT 30
+#define BFRAMES_H_THRESHOLD 4
+#define BFRAMES_L_THRESHOLD 0
+#define BFRAMES_DEFAULT 2
+#define QP_MAX 51
+#define QP_MIN 0
+#define QP_DEFAULT 25
+#define CPB_CTRL_UNIT 1024
+#define CPB_COUNT 3
+
+#define VPU_DISABLE_BITS 0x7
+#define VPU_ENCODER_MASK 0x1
+
+#define ENCODER_NODE_NUMBER 13 //use /dev/video13 as encoder node
+struct vpu_v4l2_control {
+ uint32_t id;
+ enum v4l2_ctrl_type type;
+ uint32_t minimum;
+ uint32_t maximum;
+ uint32_t step;
+ uint32_t default_value;
+ uint32_t menu_skip_mask;
+ bool is_volatile;
+};
+
+typedef enum{
+ INIT_DONE = 1,
+ RPC_BUF_OFFSET,
+ BOOT_ADDRESS,
+ COMMAND,
+ EVENT
+} MSG_Type;
+
+enum PLAT_TYPE {
+ IMX8QXP = 0,
+ IMX8QM = 1,
+ IMX8DM,
+ IMX8DX,
+ PLAT_TYPE_RESERVED
+};
+
+enum QUEUE_TYPE {
+ V4L2_SRC = 0,
+ V4L2_DST = 1,
+};
+
+enum vpu_video_standard {
+ VPU_VIDEO_UNDEFINED = 0,
+ VPU_VIDEO_AVC = 1,
+ VPU_VIDEO_VC1 = 2,
+ VPU_VIDEO_MPEG2 = 3,
+ VPU_VIDEO_AVS = 4,
+ VPU_VIDEO_ASP = 5,
+ VPU_VIDEO_JPEG = 6,
+ VPU_VIDEO_RV8 = 7,
+ VPU_VIDEO_RV9 = 8,
+ VPU_VIDEO_VP6 = 9,
+ VPU_VIDEO_SPK = 10,
+ VPU_VIDEO_VP8 = 11,
+ VPU_VIDEO_AVC_MVC = 12,
+ VPU_VIDEO_HEVC = 13,
+ VPU_VIDEO_VP9 = 14,
+};
+
+#define VPU_PIX_FMT_AVS v4l2_fourcc('A', 'V', 'S', '0')
+#define VPU_PIX_FMT_ASP v4l2_fourcc('A', 'S', 'P', '0')
+#define VPU_PIX_FMT_RV8 v4l2_fourcc('R', 'V', '8', '0')
+#define VPU_PIX_FMT_RV9 v4l2_fourcc('R', 'V', '9', '0')
+#define VPU_PIX_FMT_VP6 v4l2_fourcc('V', 'P', '6', '0')
+#define VPU_PIX_FMT_SPK v4l2_fourcc('S', 'P', 'K', '0')
+#define VPU_PIX_FMT_HEVC v4l2_fourcc('H', 'E', 'V', 'C')
+#define VPU_PIX_FMT_VP9 v4l2_fourcc('V', 'P', '9', '0')
+#define VPU_PIX_FMT_LOGO v4l2_fourcc('L', 'O', 'G', 'O')
+
+#define VPU_PIX_FMT_TILED_8 v4l2_fourcc('Z', 'T', '0', '8')
+#define VPU_PIX_FMT_TILED_10 v4l2_fourcc('Z', 'T', '1', '0')
+
+enum vpu_pixel_format {
+ VPU_HAS_COLOCATED = 0x00000001,
+ VPU_HAS_SPLIT_FLD = 0x00000002,
+ VPU_PF_MASK = ~(VPU_HAS_COLOCATED | VPU_HAS_SPLIT_FLD),
+
+ VPU_IS_TILED = 0x000000100,
+ VPU_HAS_10BPP = 0x00000200,
+
+ VPU_IS_PLANAR = 0x00001000,
+ VPU_IS_SEMIPLANAR = 0x00002000,
+ VPU_IS_PACKED = 0x00004000,
+
+ // Merged definitions using above flags:
+ VPU_PF_UNDEFINED = 0,
+ VPU_PF_YUV420_SEMIPLANAR = 0x00010000 | VPU_IS_SEMIPLANAR,
+ VPU_PF_YUV420_PLANAR = 0x00020000 | VPU_IS_PLANAR,
+ VPU_PF_UYVY = 0x00040000 | VPU_IS_PACKED,
+ VPU_PF_TILED_8BPP = 0x00080000 | VPU_IS_TILED | VPU_IS_SEMIPLANAR,
+ VPU_PF_TILED_10BPP = 0x00100000 | VPU_IS_TILED | VPU_IS_SEMIPLANAR | VPU_HAS_10BPP,
+};
+
+struct vpu_ctx;
+struct core_device;
+struct vpu_dev;
+struct vpu_v4l2_fmt {
+ char *name;
+ unsigned int fourcc;
+ unsigned int num_planes;
+ unsigned int venc_std;
+ unsigned int is_yuv;
+};
+
+struct vb2_data_req {
+ struct list_head list;
+ struct vb2_buffer *vb2_buf;
+ u_int32 sequence;
+ u_int32 buffer_flags;
+};
+
+enum ENC_RW_FLAG {
+ VPU_ENC_FLAG_WRITEABLE,
+ VPU_ENC_FLAG_READABLE
+};
+
+struct queue_data {
+ unsigned int width;
+ unsigned int height;
+ unsigned int sizeimage[VB2_MAX_PLANES];
+ struct v4l2_rect rect;
+ int buf_type; // v4l2_buf_type
+ bool vb2_q_inited;
+ struct vb2_queue vb2_q; // vb2 queue
+ struct list_head drv_q; // driver queue
+ struct semaphore drv_q_lock;
+ struct vb2_data_req vb2_reqs[VPU_MAX_BUFFER];
+ enum QUEUE_TYPE type;
+ struct vpu_v4l2_fmt *supported_fmts;
+ unsigned int fmt_count;
+ struct vpu_v4l2_fmt *current_fmt;
+ unsigned long rw_flag;
+ struct list_head frame_q;
+ atomic64_t frame_count;
+ struct list_head frame_idle;
+ struct vpu_ctx *ctx;
+ char desc[64];
+};
+
+struct vpu_strip_info {
+ unsigned long count;
+ unsigned long max;
+ unsigned long total;
+};
+
+struct vpu_fps_sts {
+ unsigned int thd;
+ unsigned int times;
+ unsigned long frame_number;
+ struct timespec ts;
+ unsigned long fps;
+};
+
+struct vpu_statistic {
+ unsigned long cmd[GTB_ENC_CMD_RESERVED + 1];
+ unsigned long event[VID_API_ENC_EVENT_RESERVED + 1];
+ unsigned long current_cmd;
+ unsigned long current_event;
+ struct timespec ts_cmd;
+ struct timespec ts_event;
+ unsigned long yuv_count;
+ unsigned long encoded_count;
+ unsigned long h264_count;
+ struct {
+ struct vpu_strip_info fw;
+ struct vpu_strip_info begin;
+ struct vpu_strip_info eos;
+ } strip_sts;
+ bool fps_sts_enable;
+ struct vpu_fps_sts fps[VPU_FPS_STS_CNT];
+ unsigned long timestamp_overwrite;
+};
+
+struct vpu_attr {
+ struct device_attribute dev_attr;
+ char name[64];
+ u32 index;
+ struct core_device *core;
+
+ pid_t pid;
+ pid_t tgid;
+
+ struct vpu_statistic statistic;
+ MEDIAIP_ENC_PARAM param;
+
+ unsigned long ts_start[2];
+ unsigned long msg_count;
+ atomic64_t total_dma_size;
+
+ bool created;
+};
+
+struct print_buf_desc {
+ u32 start_h_phy;
+ u32 start_h_vir;
+ u32 start_m;
+ u32 bytes;
+ u32 read;
+ u32 write;
+ char buffer[0];
+};
+
+#ifdef CONFIG_IMX_SCU
+struct vpu_sc_msg_misc {
+ struct imx_sc_rpc_msg hdr;
+ u32 word;
+} __packed;
+#endif
+
+struct vpu_sc_chan {
+ struct core_device *dev;
+ char name[20];
+ struct mbox_client cl;
+ struct mbox_chan *ch;
+};
+
+struct core_device {
+ void *m0_p_fw_space_vir;
+ u_int32 m0_p_fw_space_phy;
+ u32 fw_buf_size;
+ u32 fw_actual_size;
+ void *m0_rpc_virt;
+ u_int32 m0_rpc_phy;
+ u32 rpc_buf_size;
+ u32 print_buf_size;
+ u32 rpc_actual_size;
+ struct print_buf_desc *print_buf;
+
+ struct mutex cmd_mutex;
+ bool fw_is_ready;
+ bool firmware_started;
+ struct completion start_cmp;
+ struct completion snap_done_cmp;
+ struct workqueue_struct *workqueue;
+ struct work_struct msg_work;
+ void __iomem *mu_base_virtaddr;
+ unsigned int vpu_mu_id;
+ int vpu_mu_init;
+
+ u32 supported_instance_count;
+ struct vpu_ctx *ctx[VID_API_NUM_STREAMS];
+ struct vpu_attr attr[VID_API_NUM_STREAMS];
+ struct shared_addr shared_mem;
+ u32 id;
+ u32 reg_base;
+ u32 reg_size;
+ u32 reg_csr_base;
+ u32 reg_csr_size;
+ int irq;
+ struct device *generic_dev;
+ struct vpu_dev *vdev;
+ bool snapshot;
+ bool suspend;
+ bool hang;
+ struct device_attribute core_attr;
+ char name[64];
+ unsigned long reset_times;
+
+ struct kfifo mu_msg_fifo;
+
+ /* reserve for kernel version 5.4 or later */
+ struct vpu_sc_chan sc_chan_tx0;
+ struct vpu_sc_chan sc_chan_tx1;
+ struct vpu_sc_chan sc_chan_rx;
+};
+
+struct vpu_enc_mem_item {
+ struct list_head list;
+ void *virt_addr;
+ unsigned long phy_addr;
+ unsigned long size;
+ unsigned long offset;
+};
+
+struct vpu_enc_mem_info {
+ void *virt_addr;
+ unsigned long phy_addr;
+ unsigned long size;
+ unsigned long bytesused;
+ struct list_head memorys;
+ struct mutex lock;
+};
+
+struct vpu_dev {
+ struct device *generic_dev;
+ struct v4l2_device v4l2_dev;
+ struct video_device *pvpu_encoder_dev;
+ struct platform_device *plat_dev;
+ struct clk *clk_m0;
+ u32 reg_vpu_base;
+ u32 reg_vpu_size;
+ u32 reg_rpc_system;
+ void __iomem *regs_base;
+ struct mutex dev_mutex;
+ struct core_device core_dev[VPU_ENC_MAX_CORE_NUM];
+ u_int32 plat_type;
+ u_int32 core_num;
+ bool hw_enable;
+
+ struct delayed_work watchdog;
+ u8 heartbeat;
+
+ struct {
+ u32 min_width;
+ u32 max_width;
+ u32 step_width;
+ u32 min_height;
+ u32 max_height;
+ u32 step_height;
+ } supported_size;
+ struct {
+ u32 min;
+ u32 max;
+ u32 step;
+ } supported_fps;
+ struct vpu_enc_mem_info reserved_mem;
+
+ /* reserve for kernel version 5.4 or later */
+ struct device *pd_vpu;
+ struct device *pd_enc1;
+ struct device *pd_enc2;
+ struct device *pd_mu1;
+ struct device *pd_mu2;
+ struct device_link *pd_vpu_link;
+ struct device_link *pd_enc1_link;
+ struct device_link *pd_enc2_link;
+ struct device_link *pd_mu1_link;
+ struct device_link *pd_mu2_link;
+};
+
+struct buffer_addr {
+ void *virt_addr;
+ dma_addr_t phy_addr;
+ u_int32 size;
+};
+
+enum {
+ VPU_ENC_STATUS_INITIALIZED,
+ VPU_ENC_STATUS_OUTPUT_READY = 18,
+ VPU_ENC_STATUS_DATA_READY = 19,
+ VPU_ENC_STATUS_SNAPSHOT = 20,
+ VPU_ENC_STATUS_FORCE_RELEASE = 21,
+ VPU_ENC_STATUS_EOS_SEND = 22,
+ VPU_ENC_STATUS_START_SEND = 23,
+ VPU_ENC_STATUS_START_DONE = 24,
+ VPU_ENC_STATUS_STOP_REQ = 25,
+ VPU_ENC_STATUS_STOP_SEND = 26,
+ VPU_ENC_STATUS_STOP_DONE = 27,
+ VPU_ENC_STATUS_CLOSED = 28,
+ VPU_ENC_STATUS_CONFIGURED = 29,
+ VPU_ENC_STATUS_HANG = 30,
+ VPU_ENC_STATUS_KEY_FRAME = 31
+};
+
+struct vpu_ctx {
+ struct vpu_dev *dev;
+ struct v4l2_fh fh;
+
+ struct v4l2_ctrl_handler ctrl_handler;
+ bool ctrl_inited;
+
+ int str_index;
+ unsigned long status;
+ struct queue_data q_data[2];
+ struct mutex instance_mutex;
+ struct work_struct instance_work;
+ struct workqueue_struct *instance_wq;
+ bool ctx_released;
+ struct buffer_addr encoder_stream;
+ struct buffer_addr encFrame[MEDIAIP_MAX_NUM_WINDSOR_SRC_FRAMES];
+ struct buffer_addr refFrame[MEDIAIP_MAX_NUM_WINDSOR_REF_FRAMES];
+ struct buffer_addr actFrame;
+ struct buffer_addr enc_buffer;
+ MEDIAIP_ENC_MEM_REQ_DATA mem_req;
+ struct core_device *core_dev;
+
+ struct completion stop_cmp;
+ bool power_status;
+
+ struct list_head msg_q;
+ struct list_head idle_q;
+
+ struct vpu_statistic sts;
+ unsigned int frozen_count;
+ u_int32 sequence;
+ s64 timestams[VPU_ENC_SEQ_CAPACITY];
+ u32 cpb_size;
+};
+
+#define LVL_ERR (1 << 0)
+#define LVL_WARN (1 << 1)
+#define LVL_ALL (1 << 2)
+#define LVL_IRQ (1 << 3)
+#define LVL_INFO (1 << 4)
+#define LVL_CMD (1 << 5)
+#define LVL_EVT (1 << 6)
+#define LVL_DEBUG (1 << 7)
+#define LVL_CTRL (1 << 8)
+#define LVL_RPC (1 << 9)
+#define LVL_MSG (1 << 10)
+#define LVL_MEM (1 << 11)
+#define LVL_BUF (1 << 12)
+#define LVL_FRAME (1 << 13)
+#define LVL_FUNC (1 << 16)
+
+#ifndef TAG
+#define TAG "[VPU Encoder] "
+#endif
+
+#define vpu_dbg(level, fmt, arg...) \
+ do { \
+ if ((vpu_dbg_level_encoder & (level)) || ((level) & LVL_ERR)) \
+ pr_info(TAG""fmt, ## arg); \
+ } while (0)
+
+#define vpu_err(fmt, arg...) vpu_dbg(LVL_ERR, fmt, ##arg)
+#define vpu_log_func() vpu_dbg(LVL_FUNC, "%s()\n", __func__)
+
+u32 cpu_phy_to_mu(struct core_device *dev, u32 addr);
+struct vpu_attr *get_vpu_ctx_attr(struct vpu_ctx *ctx);
+struct vpu_ctx *get_vpu_attr_ctx(struct vpu_attr *attr);
+
+#ifndef VPU_SAFE_RELEASE
+#define VPU_SAFE_RELEASE(p, func) \
+ do {\
+ if (p) {\
+ func(p);\
+ p = NULL;\
+ } \
+ } while (0)
+#endif
+
+#endif
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_config.h b/drivers/mxc/vpu_windsor/vpu_encoder_config.h
new file mode 100644
index 000000000000..d83da319313d
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_config.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#ifndef _VPU_ENCODER_CONFIG_H
+#define _VPU_ENCODER_CONFIG_H
+
+#define VPU_ENC_WIDTH_MAX 1920
+#define VPU_ENC_HEIGHT_MAX 1920
+#define VPU_ENC_WIDTH_MIN 64
+#define VPU_ENC_HEIGHT_MIN 48
+#define VPU_ENC_WIDTH_STEP 16
+#define VPU_ENC_HEIGHT_STEP 2
+#define VPU_ENC_FRAMERATE_MAX 120
+#define VPU_ENC_FRAMERATE_MIN 1
+#define VPU_ENC_FRAMERATE_STEP 1
+
+#define VPU_ENC_WIDTH_DEFAULT 1920
+#define VPU_ENC_HEIGHT_DEFAULT 1080
+#define VPU_ENC_FRAMERATE_DEFAULT 30
+
+#define VPU_MEM_PATTERN 0x5a5a5a5a
+
+#define VPU_TAIL_SERACH_SIZE 16
+#define VPU_STRM_END_PATTERN {0x0, 0x0, 0x1, 0xb}
+#define VPU_STRM_BEGIN_PATTERN {0x0, 0x0, 0x1}
+
+#define MSG_DATA_DEFAULT_SIZE 256
+#define MSG_COUNT_THD 16
+#define FRAME_COUNT_THD 16
+
+#define VPU_WATCHDOG_INTERVAL_MS 1000
+#define VPU_ENC_HANG_THD 15
+
+#define VPU_FPS_STS_CNT 3
+#define VPU_FPS_STS_THDS {1, 3, 0}
+#define VPU_FPS_COEF 100
+
+#define VPU_DETAIL_INDEX_DFT 0xffff
+
+#define VPU_MU_MAX_ADDRESS 0x40000000
+#define VPU_ENC_SEQ_CAPACITY 32
+#define VPU_ENC_INVALID_TIMESTAMP 0
+
+#endif
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_ctrl.c b/drivers/mxc/vpu_windsor/vpu_encoder_ctrl.c
new file mode 100644
index 000000000000..bd43587c5c2a
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_ctrl.c
@@ -0,0 +1,644 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*!
+ * @file vpu_encoder_ctrl.c
+ *
+ * copyright here may be changed later
+ *
+ */
+
+#define TAG "[VPU Encoder Ctrl]\t "
+#include <media/v4l2-ctrls.h>
+
+#include "vpu_encoder_b0.h"
+#include "vpu_encoder_ctrl.h"
+
+// H264 level is maped like level 5.1 to uLevel 51, except level 1b to uLevel 14
+const u_int32 h264_level[] = {
+ [V4L2_MPEG_VIDEO_H264_LEVEL_1_0] = 10,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_1B] = 14,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_1_1] = 11,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_1_2] = 12,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_1_3] = 13,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_2_0] = 20,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_2_1] = 21,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_2_2] = 22,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_3_0] = 30,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_3_1] = 31,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_3_2] = 32,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_4_0] = 40,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_4_1] = 41,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_4_2] = 42,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_5_0] = 50,
+ [V4L2_MPEG_VIDEO_H264_LEVEL_5_1] = 51
+};
+
+static int set_h264_profile(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ mutex_lock(&ctx->instance_mutex);
+ switch (ctrl->val) {
+ case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
+ vpu_dbg(LVL_CTRL, "set h264 profile baseline\n");
+ param->eProfile = MEDIAIP_ENC_PROF_H264_BP;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
+ vpu_dbg(LVL_CTRL, "set h264 profile main\n");
+ param->eProfile = MEDIAIP_ENC_PROF_H264_MP;
+ break;
+ case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
+ vpu_dbg(LVL_CTRL, "set h264 profile high\n");
+ param->eProfile = MEDIAIP_ENC_PROF_H264_HP;
+ break;
+ default:
+ vpu_err("not support H264 profile %d, set to main\n",
+ ctrl->val);
+ param->eProfile = MEDIAIP_ENC_PROF_H264_MP;
+ break;
+ }
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static int set_h264_level(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ mutex_lock(&ctx->instance_mutex);
+ param->uLevel = h264_level[ctrl->val];
+ mutex_unlock(&ctx->instance_mutex);
+
+ vpu_dbg(LVL_CTRL, "set h264 level to %d (%d)\n",
+ ctrl->val, h264_level[ctrl->val]);
+
+ return 0;
+}
+
+static int set_bitrate_mode(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ mutex_lock(&ctx->instance_mutex);
+ switch (ctrl->val) {
+ case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR:
+ vpu_dbg(LVL_CTRL, "set bitrate mode VBR\n");
+ param->eBitRateMode =
+ MEDIAIP_ENC_BITRATECONTROLMODE_CONSTANT_QP;
+ break;
+ case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR:
+ vpu_dbg(LVL_CTRL, "set bitrate mode CBR\n");
+ param->eBitRateMode = MEDIAIP_ENC_BITRATECONTROLMODE_CBR;
+ break;
+ default:
+ vpu_err("not support bitrate mode %d, set to cbr\n",
+ ctrl->val);
+ param->eBitRateMode = MEDIAIP_ENC_BITRATECONTROLMODE_CBR;
+ break;
+ }
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static int set_bitrate(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ vpu_dbg(LVL_CTRL, "set bitrate %d\n", ctrl->val);
+ mutex_lock(&ctx->instance_mutex);
+ param->uTargetBitrate = ctrl->val / BITRATE_COEF;
+ if (param->uMaxBitRate < param->uTargetBitrate)
+ param->uMaxBitRate = param->uTargetBitrate;
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static int set_bitrate_peak(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ vpu_dbg(LVL_CTRL, "set peak bitrate %d\n", ctrl->val);
+ mutex_lock(&ctx->instance_mutex);
+ param->uMaxBitRate = ctrl->val / BITRATE_COEF;
+ if (param->uTargetBitrate > param->uMaxBitRate)
+ param->uTargetBitrate = param->uMaxBitRate;
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static int set_gop_size(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ vpu_dbg(LVL_CTRL, "set gop size %d\n", ctrl->val);
+ mutex_lock(&ctx->instance_mutex);
+ param->uIFrameInterval = ctrl->val;
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static int set_i_period(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ vpu_dbg(LVL_CTRL, "set iframe interval %d\n", ctrl->val);
+ mutex_lock(&ctx->instance_mutex);
+ param->uIFrameInterval = ctrl->val;
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static int get_gop_size(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ vpu_dbg(LVL_CTRL, "get gop size\n");
+ ctrl->val = param->uIFrameInterval;
+
+ return 0;
+}
+
+static int set_b_frames(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ vpu_dbg(LVL_CTRL, "set bframes %d\n", ctrl->val);
+ mutex_lock(&ctx->instance_mutex);
+ param->uGopBLength = ctrl->val;
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static int set_qp(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ vpu_dbg(LVL_CTRL, "set qp %d\n", ctrl->val);
+ mutex_lock(&ctx->instance_mutex);
+ param->uInitSliceQP = ctrl->val;
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static int get_min_buffers_for_output(struct v4l2_ctrl *ctrl)
+{
+ vpu_dbg(LVL_CTRL, "get min buffers for output\n");
+
+ ctrl->val = MIN_BUFFER_COUNT;
+
+ return 0;
+}
+
+static int set_display_re_ordering(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+ pMEDIAIP_ENC_PARAM param = &attr->param;
+
+ vpu_dbg(LVL_CTRL, "set lowlatencymode %d\n", ctrl->val);
+ mutex_lock(&ctx->instance_mutex);
+ if (ctrl->val)
+ param->uLowLatencyMode = 1;
+ else
+ param->uLowLatencyMode = 0;
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+static int set_force_key_frame(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+
+ vpu_dbg(LVL_CTRL, "force key frame\n");
+ set_bit(VPU_ENC_STATUS_KEY_FRAME, &ctx->status);
+
+ return 0;
+}
+
+static int set_h264_cpb_size(struct v4l2_ctrl *ctrl)
+{
+ struct vpu_ctx *ctx = v4l2_ctrl_to_ctx(ctrl);
+
+ ctx->cpb_size = ctrl->val * CPB_CTRL_UNIT;
+
+ return 0;
+}
+
+static int add_ctrl_h264_profile(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_h264_profile_ops = {
+ .s_ctrl = set_h264_profile,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrl_handler,
+ &ctrl_h264_profile_ops,
+ V4L2_CID_MPEG_VIDEO_H264_PROFILE,
+ V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
+ 0xa,
+ V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE);
+ if (!ctrl) {
+ vpu_err("add ctrl h264 profile fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_h264_level(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_h264_level_ops = {
+ .s_ctrl = set_h264_level,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrl_handler,
+ &ctrl_h264_level_ops,
+ V4L2_CID_MPEG_VIDEO_H264_LEVEL,
+ V4L2_MPEG_VIDEO_H264_LEVEL_5_1,
+ 0x0,
+ V4L2_MPEG_VIDEO_H264_LEVEL_4_0);
+ if (!ctrl) {
+ vpu_err("add ctrl h264 level fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_bitrate_mode(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_bitrate_mode_ops = {
+ .s_ctrl = set_bitrate_mode,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrl_handler,
+ &ctrl_bitrate_mode_ops,
+ V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
+ V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
+ 0x0,
+ V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
+ if (!ctrl) {
+ vpu_err("add ctrl bitrate mode fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_bitrate(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_bitrate_ops = {
+ .s_ctrl = set_bitrate,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &ctrl_bitrate_ops,
+ V4L2_CID_MPEG_VIDEO_BITRATE,
+ BITRATE_LOW_THRESHOLD * BITRATE_COEF,
+ BITRATE_HIGH_THRESHOLD * BITRATE_COEF,
+ BITRATE_COEF,
+ BITRATE_DEFAULT_TARGET * BITRATE_COEF);
+ if (!ctrl) {
+ vpu_err("add ctrl bitrate fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_bitrate_peak(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_bitrate_ops = {
+ .s_ctrl = set_bitrate_peak,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &ctrl_bitrate_ops,
+ V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
+ BITRATE_LOW_THRESHOLD * BITRATE_COEF,
+ BITRATE_HIGH_THRESHOLD * BITRATE_COEF,
+ BITRATE_COEF,
+ BITRATE_DEFAULT_PEAK * BITRATE_COEF);
+ if (!ctrl) {
+ vpu_err("add ctrl bitrate peak fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_gop_size(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_gop_ops = {
+ .s_ctrl = set_gop_size,
+ .g_volatile_ctrl = get_gop_size,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &ctrl_gop_ops,
+ V4L2_CID_MPEG_VIDEO_GOP_SIZE,
+ GOP_L_THRESHOLD,
+ GOP_H_THRESHOLD,
+ 1,
+ GOP_DEFAULT);
+ if (!ctrl) {
+ vpu_err("add ctrl gop size fail\n");
+ return -EINVAL;
+ }
+
+ ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
+ ctrl->flags |= V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
+
+ return 0;
+}
+
+static int add_ctrl_i_period(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_i_period_ops = {
+ .s_ctrl = set_i_period,
+ .g_volatile_ctrl = get_gop_size,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &ctrl_i_period_ops,
+ V4L2_CID_MPEG_VIDEO_H264_I_PERIOD,
+ GOP_L_THRESHOLD,
+ GOP_H_THRESHOLD,
+ 1,
+ GOP_DEFAULT);
+
+ if (!ctrl) {
+ vpu_err("add ctrl i period fail\n");
+ return -EINVAL;
+ }
+
+ ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
+ ctrl->flags |= V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
+
+ return 0;
+}
+
+static int add_ctrl_b_frames(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_b_frames = {
+ .s_ctrl = set_b_frames,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &ctrl_b_frames,
+ V4L2_CID_MPEG_VIDEO_B_FRAMES,
+ BFRAMES_L_THRESHOLD,
+ BFRAMES_H_THRESHOLD,
+ 1,
+ BFRAMES_DEFAULT);
+
+ if (!ctrl) {
+ vpu_err("add ctrl b frames fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_i_frame_qp(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_iframe_qp_ops = {
+ .s_ctrl = set_qp,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &ctrl_iframe_qp_ops,
+ V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
+ QP_MIN,
+ QP_MAX,
+ 1,
+ QP_DEFAULT);
+ if (!ctrl) {
+ vpu_err("add ctrl h264 I frame qp fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_p_frame_qp(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_pframe_qp_ops = {
+ .s_ctrl = set_qp,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &ctrl_pframe_qp_ops,
+ V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP,
+ QP_MIN,
+ QP_MAX,
+ 1,
+ QP_DEFAULT);
+ if (!ctrl) {
+ vpu_err("add ctrl h264 P frame qp fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_b_frame_qp(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_bframe_qp_ops = {
+ .s_ctrl = set_qp,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &ctrl_bframe_qp_ops,
+ V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP,
+ QP_MIN,
+ QP_MAX,
+ 1,
+ QP_DEFAULT);
+ if (!ctrl) {
+ vpu_err("add ctrl h264 B frame qp fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_min_buffers_for_output(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_min_buffers_ops = {
+ .g_volatile_ctrl = get_min_buffers_for_output,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &ctrl_min_buffers_ops,
+ V4L2_CID_MIN_BUFFERS_FOR_OUTPUT,
+ 1,
+ 32,
+ 1,
+ MIN_BUFFER_COUNT);
+ if (!ctrl) {
+ vpu_err("add ctrl min buffers for output fail\n");
+ return -EINVAL;
+ }
+
+ ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
+
+ return 0;
+}
+
+static int add_ctrl_display_re_ordering(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops re_ordering_ops = {
+ .s_ctrl = set_display_re_ordering,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &re_ordering_ops,
+ V4L2_CID_MPEG_VIDEO_H264_ASO,
+ 0, 1, 1, 1);
+ if (!ctrl) {
+ vpu_err("add ctrl display re ordering fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_force_key_frame(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops force_key_frame_ops = {
+ .s_ctrl = set_force_key_frame,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &force_key_frame_ops,
+ V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME,
+ 0, 0, 0, 0);
+ if (!ctrl) {
+ vpu_err("add ctrl force key frame fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int add_ctrl_h264_cpb_size(struct vpu_ctx *ctx)
+{
+ static const struct v4l2_ctrl_ops ctrl_cpb_size_ops = {
+ .s_ctrl = set_h264_cpb_size,
+ };
+ struct v4l2_ctrl *ctrl;
+
+ ctrl = v4l2_ctrl_new_std(&ctx->ctrl_handler,
+ &ctrl_cpb_size_ops,
+ V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE,
+ 64, 10240, 1, 1024);
+
+ if (!ctrl) {
+ vpu_err("add ctrl h264 cpb size fail\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int vpu_enc_register_ctrls(struct vpu_ctx *ctx)
+{
+ add_ctrl_h264_profile(ctx);
+ add_ctrl_h264_level(ctx);
+ add_ctrl_bitrate_mode(ctx);
+ add_ctrl_bitrate(ctx);
+ add_ctrl_bitrate_peak(ctx);
+ add_ctrl_gop_size(ctx);
+ add_ctrl_i_period(ctx);
+ add_ctrl_b_frames(ctx);
+ add_ctrl_i_frame_qp(ctx);
+ add_ctrl_p_frame_qp(ctx);
+ add_ctrl_b_frame_qp(ctx);
+ add_ctrl_min_buffers_for_output(ctx);
+ add_ctrl_display_re_ordering(ctx);
+ add_ctrl_force_key_frame(ctx);
+ add_ctrl_h264_cpb_size(ctx);
+
+ return 0;
+}
+
+int vpu_enc_setup_ctrls(struct vpu_ctx *ctx)
+{
+ vpu_log_func();
+
+ v4l2_ctrl_handler_init(&ctx->ctrl_handler, 11);
+ vpu_enc_register_ctrls(ctx);
+ if (ctx->ctrl_handler.error) {
+ vpu_err("control initialization error (%d)\n",
+ ctx->ctrl_handler.error);
+ return -EINVAL;
+ }
+ ctx->ctrl_inited = true;
+ return v4l2_ctrl_handler_setup(&ctx->ctrl_handler);
+}
+
+int vpu_enc_free_ctrls(struct vpu_ctx *ctx)
+{
+ vpu_log_func();
+
+ if (ctx->ctrl_inited) {
+ v4l2_ctrl_handler_free(&ctx->ctrl_handler);
+ ctx->ctrl_inited = false;
+ }
+
+ return 0;
+}
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_ctrl.h b/drivers/mxc/vpu_windsor/vpu_encoder_ctrl.h
new file mode 100644
index 000000000000..1e7898ae4194
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_ctrl.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#ifndef _VPU_ENCODER_CTRL_H
+#define _VPU_ENCODER_CTRL_H
+
+#include "mediasys_types.h"
+
+int vpu_enc_setup_ctrls(struct vpu_ctx *ctx);
+int vpu_enc_free_ctrls(struct vpu_ctx *ctx);
+
+#endif
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_mem.c b/drivers/mxc/vpu_windsor/vpu_encoder_mem.c
new file mode 100644
index 000000000000..278adcea9b3d
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_mem.c
@@ -0,0 +1,623 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#define TAG "[VPU Encoder Mem]\t "
+#include <linux/kernel.h>
+#include <linux/dma-mapping.h>
+#include "vpu_encoder_config.h"
+#include "vpu_encoder_b0.h"
+#include "vpu_encoder_mem.h"
+
+int vpu_enc_init_reserved_memory(struct vpu_enc_mem_info *info)
+{
+ if (!info || !info->phy_addr || !info->size)
+ return -EINVAL;
+
+ info->virt_addr = ioremap_wc(info->phy_addr, info->size);
+ if (!info->virt_addr)
+ return -EINVAL;
+ memset_io(info->virt_addr, 0, info->size);
+ info->bytesused = 0;
+ INIT_LIST_HEAD(&info->memorys);
+ mutex_init(&info->lock);
+
+ return 0;
+}
+
+void vpu_enc_release_reserved_memory(struct vpu_enc_mem_info *info)
+{
+ struct vpu_enc_mem_item *item = NULL;
+ struct vpu_enc_mem_item *tmp = NULL;
+
+ if (!info)
+ return;
+
+ mutex_lock(&info->lock);
+ list_for_each_entry_safe(item, tmp, &info->memorys, list) {
+ list_del_init(&item->list);
+ info->bytesused -= item->size;
+ vpu_dbg(LVL_MEM, "free reserved memory %ld\n", item->size);
+ VPU_SAFE_RELEASE(item, vfree);
+ }
+ mutex_unlock(&info->lock);
+
+ mutex_destroy(&info->lock);
+ if (info->virt_addr) {
+ iounmap(info->virt_addr);
+ info->virt_addr = NULL;
+ }
+}
+
+int vpu_enc_alloc_reserved_mem(struct vpu_enc_mem_info *info,
+ struct buffer_addr *buffer)
+{
+ struct vpu_enc_mem_item *item = NULL;
+ struct list_head *pos = NULL;
+ unsigned long offset = 0;
+ int ret;
+
+ if (!info || !buffer)
+ return -EINVAL;
+
+ mutex_lock(&info->lock);
+ if (buffer->size + info->bytesused > info->size) {
+ ret = -ENOMEM;
+ goto exit;
+ }
+
+ list_for_each_entry(item, &info->memorys, list) {
+ if (item->offset - offset >= buffer->size) {
+ pos = &item->list;
+ break;
+ }
+ offset = item->offset + item->size;
+ }
+ if (!pos && info->size - offset >= buffer->size)
+ pos = &info->memorys;
+ if (!pos) {
+ ret = -ENOMEM;
+ goto exit;
+ }
+ item = vzalloc(sizeof(*item));
+ if (!item) {
+ ret = -EINVAL;
+ goto exit;
+ }
+ item->offset = offset;
+ item->virt_addr = info->virt_addr + offset;
+ item->phy_addr = info->phy_addr + offset;
+ item->size = buffer->size;
+ list_add_tail(&item->list, pos);
+ info->bytesused += buffer->size;
+ vpu_dbg(LVL_MEM, "alloc reserved memory <0x%lx 0x%lx(%ld)>\n",
+ item->phy_addr, item->size, item->size);
+ buffer->virt_addr = item->virt_addr;
+ buffer->phy_addr = item->phy_addr;
+ ret = 0;
+exit:
+ mutex_unlock(&info->lock);
+ return ret;
+}
+
+int vpu_enc_free_reserved_mem(struct vpu_enc_mem_info *info,
+ struct buffer_addr *buffer)
+{
+ struct vpu_enc_mem_item *item = NULL;
+ struct vpu_enc_mem_item *tmp = NULL;
+ unsigned long offset;
+ int ret = -EINVAL;
+
+ if (!info || !buffer)
+ return -EINVAL;
+ if (!buffer->virt_addr)
+ return 0;
+
+ if (buffer->phy_addr < info->phy_addr) {
+ vpu_err("invalid reserved memory addr : 0x%llx %d\n",
+ buffer->phy_addr, buffer->size);
+ return -EINVAL;
+ }
+
+ offset = buffer->phy_addr - info->phy_addr;
+ if (offset + buffer->size > info->size) {
+ vpu_err("invalid reserved memory addr : 0x%llx %d\n",
+ buffer->phy_addr, buffer->size);
+ return -EINVAL;
+ }
+
+ mutex_lock(&info->lock);
+ list_for_each_entry_safe(item, tmp, &info->memorys, list) {
+ if (offset < item->offset)
+ continue;
+ if (offset + buffer->size > item->offset + item->size)
+ continue;
+ list_del_init(&item->list);
+ info->bytesused -= item->size;
+ vpu_dbg(LVL_MEM, "free reserved memory <0x%lx 0x%lx(%ld)>\n",
+ item->phy_addr, item->size, item->size);
+ VPU_SAFE_RELEASE(item, vfree);
+ ret = 0;
+ break;
+ }
+ mutex_unlock(&info->lock);
+
+ return ret;
+}
+
+void vpu_enc_add_dma_size(struct vpu_attr *attr, unsigned long size)
+{
+ if (!attr)
+ return;
+
+ atomic64_add(size, &attr->total_dma_size);
+}
+
+void vpu_enc_sub_dma_size(struct vpu_attr *attr, unsigned long size)
+{
+ if (!attr)
+ return;
+
+ atomic64_sub(size, &attr->total_dma_size);
+}
+
+int vpu_enc_alloc_dma_buffer(struct vpu_ctx *ctx, struct buffer_addr *buffer)
+{
+ if (!ctx || !ctx->dev || !buffer || !buffer->size)
+ return -EINVAL;
+
+ vpu_dbg(LVL_MEM, "alloc coherent dma %d\n", buffer->size);
+ buffer->virt_addr = dma_alloc_coherent(ctx->dev->generic_dev,
+ buffer->size,
+ (dma_addr_t *)&buffer->phy_addr,
+ GFP_KERNEL | GFP_DMA32);
+ if (!buffer->virt_addr) {
+ vpu_err("encoder alloc coherent dma(%d) fail\n",
+ buffer->size);
+ return -ENOMEM;
+ }
+ memset_io(buffer->virt_addr, 0, buffer->size);
+ vpu_enc_add_dma_size(get_vpu_ctx_attr(ctx), buffer->size);
+
+ return 0;
+}
+
+void vpu_enc_init_dma_buffer(struct buffer_addr *buffer)
+{
+ if (!buffer)
+ return;
+
+ buffer->virt_addr = NULL;
+ buffer->phy_addr = 0;
+ buffer->size = 0;
+}
+
+int vpu_enc_free_dma_buffer(struct vpu_ctx *ctx, struct buffer_addr *buffer)
+{
+ if (!ctx || !ctx->dev || !buffer)
+ return -EINVAL;
+
+ if (!buffer->virt_addr)
+ return 0;
+
+ vpu_dbg(LVL_MEM, "free coherent dma %d\n", buffer->size);
+ vpu_enc_sub_dma_size(get_vpu_ctx_attr(ctx), buffer->size);
+ dma_free_coherent(ctx->dev->generic_dev, buffer->size,
+ buffer->virt_addr, buffer->phy_addr);
+
+ vpu_enc_init_dma_buffer(buffer);
+
+ return 0;
+}
+
+static bool check_mem_resource_is_valid(MEDIAIP_ENC_MEM_RESOURCE *resource)
+{
+ if (!resource)
+ return false;
+ if (resource->uMemVirtAddr >= VPU_MU_MAX_ADDRESS)
+ return false;
+ if (resource->uMemVirtAddr + resource->uMemSize > VPU_MU_MAX_ADDRESS)
+ return false;
+ return true;
+}
+
+static u32 get_enc_alloc_size(u32 size)
+{
+ u32 esize = ALIGN(size, PAGE_SIZE);
+
+ if (esize < size + sizeof(u32))
+ esize += PAGE_SIZE;
+
+ return esize;
+}
+
+static int alloc_mem_res(struct vpu_ctx *ctx, struct buffer_addr *buffer,
+ MEDIAIP_ENC_MEM_RESOURCE *resource, u32 size)
+{
+ int ret;
+
+ if (!ctx || !buffer || !resource)
+ return -EINVAL;
+
+ if (!size) {
+ vpu_err("invalid memory resource size : %d\n", size);
+ return -EINVAL;
+ }
+
+ buffer->size = get_enc_alloc_size(size);
+ ret = vpu_enc_alloc_dma_buffer(ctx, buffer);
+ if (ret)
+ return ret;
+
+ resource->uMemPhysAddr = buffer->phy_addr;
+ resource->uMemVirtAddr = cpu_phy_to_mu(ctx->core_dev, buffer->phy_addr);
+ resource->uMemSize = size;
+
+ return 0;
+}
+
+static int free_mem_res(struct vpu_ctx *ctx, struct buffer_addr *buffer,
+ MEDIAIP_ENC_MEM_RESOURCE *resource)
+{
+ if (!ctx || !buffer || !resource)
+ return -EINVAL;
+
+ vpu_enc_free_dma_buffer(ctx, buffer);
+
+ resource->uMemPhysAddr = 0;
+ resource->uMemVirtAddr = 0;
+ resource->uMemSize = 0;
+
+ return 0;
+}
+
+static int alloc_reserved_mem_res(struct vpu_ctx *ctx,
+ struct buffer_addr *buffer,
+ MEDIAIP_ENC_MEM_RESOURCE *resource,
+ u32 size)
+{
+ int ret;
+
+ if (!ctx || !ctx->dev || !buffer || !resource)
+ return -EINVAL;
+
+ if (!size) {
+ vpu_err("invalid memory resource size : %d\n", size);
+ return -EINVAL;
+ }
+
+ buffer->size = get_enc_alloc_size(size);
+ ret = vpu_enc_alloc_reserved_mem(&ctx->dev->reserved_mem, buffer);
+ if (ret)
+ return ret;
+
+ resource->uMemPhysAddr = buffer->phy_addr;
+ resource->uMemVirtAddr = cpu_phy_to_mu(ctx->core_dev, buffer->phy_addr);
+ resource->uMemSize = size;
+
+ return 0;
+}
+
+static int free_reserved_mem_res(struct vpu_ctx *ctx,
+ struct buffer_addr *buffer,
+ MEDIAIP_ENC_MEM_RESOURCE *resource)
+{
+ if (!ctx || !ctx->dev || !buffer || !resource)
+ return -EINVAL;
+
+ vpu_enc_free_reserved_mem(&ctx->dev->reserved_mem, buffer);
+
+ resource->uMemPhysAddr = 0;
+ resource->uMemVirtAddr = 0;
+ resource->uMemSize = 0;
+
+ return 0;
+}
+
+static int free_enc_frames(struct vpu_ctx *ctx, pMEDIAIP_ENC_MEM_POOL pool)
+{
+ int i;
+
+ vpu_log_func();
+ for (i = 0; i < ctx->mem_req.uEncFrmNum; i++)
+ free_mem_res(ctx, &ctx->encFrame[i],
+ &pool->tEncFrameBuffers[i]);
+
+ return 0;
+}
+
+static int alloc_enc_frames(struct vpu_ctx *ctx, pMEDIAIP_ENC_MEM_POOL pool)
+{
+ int i;
+ int ret;
+
+ vpu_log_func();
+ for (i = 0; i < ctx->mem_req.uEncFrmNum; i++) {
+ ret = alloc_mem_res(ctx,
+ &ctx->encFrame[i],
+ &pool->tEncFrameBuffers[i],
+ ctx->mem_req.uEncFrmSize);
+ if (ret) {
+ vpu_err("alloc enc frame[%d] fail\n", i);
+ goto error;
+ }
+ vpu_dbg(LVL_MEM, "encFrame[%d]: 0x%llx,%d(%d)\n", i,
+ ctx->encFrame[i].phy_addr,
+ ctx->mem_req.uEncFrmSize,
+ ctx->encFrame[i].size);
+ }
+
+ return 0;
+error:
+ free_enc_frames(ctx, pool);
+ return ret;
+}
+
+static int free_ref_frames(struct vpu_ctx *ctx, pMEDIAIP_ENC_MEM_POOL pool)
+{
+ int i;
+
+ vpu_log_func();
+ for (i = 0; i < ctx->mem_req.uRefFrmNum; i++)
+ free_mem_res(ctx, &ctx->refFrame[i],
+ &pool->tRefFrameBuffers[i]);
+
+ return 0;
+}
+
+static int alloc_ref_frames(struct vpu_ctx *ctx, pMEDIAIP_ENC_MEM_POOL pool)
+{
+ int i;
+ int ret;
+
+ vpu_log_func();
+ for (i = 0; i < ctx->mem_req.uRefFrmNum; i++) {
+ ret = alloc_mem_res(ctx,
+ &ctx->refFrame[i],
+ &pool->tRefFrameBuffers[i],
+ ctx->mem_req.uRefFrmSize);
+ if (ret) {
+ vpu_err("alloc ref frame[%d] fail\n", i);
+ goto error;
+ }
+ vpu_dbg(LVL_MEM, "refFrame[%d]: 0x%llx,%d(%d)\n", i,
+ ctx->refFrame[i].phy_addr,
+ ctx->mem_req.uRefFrmSize,
+ ctx->refFrame[i].size);
+ }
+
+ return 0;
+error:
+ free_ref_frames(ctx, pool);
+ return ret;
+}
+
+static int free_act_frame(struct vpu_ctx *ctx, pMEDIAIP_ENC_MEM_POOL pool)
+{
+ if (!ctx || !pool)
+ return -EINVAL;
+
+ vpu_log_func();
+ free_reserved_mem_res(ctx, &ctx->actFrame, &pool->tActFrameBufferArea);
+
+ return 0;
+}
+
+static int alloc_act_frame(struct vpu_ctx *ctx, pMEDIAIP_ENC_MEM_POOL pool)
+{
+ int ret = 0;
+
+ vpu_log_func();
+ ret = alloc_reserved_mem_res(ctx,
+ &ctx->actFrame,
+ &pool->tActFrameBufferArea,
+ ctx->mem_req.uActBufSize);
+ if (ret) {
+ vpu_err("alloc act frame fail\n");
+ return ret;
+ }
+
+ if (!check_mem_resource_is_valid(&pool->tActFrameBufferArea)) {
+ vpu_err("invalid actFrames address, 0x%x, 0x%x, 0x%x\n",
+ pool->tActFrameBufferArea.uMemPhysAddr,
+ pool->tActFrameBufferArea.uMemVirtAddr,
+ pool->tActFrameBufferArea.uMemSize);
+ free_act_frame(ctx, pool);
+ return -EINVAL;
+ }
+
+ vpu_dbg(LVL_MEM, "actFrame: 0x%llx, %d(%d)\n",
+ ctx->actFrame.phy_addr,
+ ctx->mem_req.uActBufSize,
+ ctx->actFrame.size);
+ return 0;
+}
+
+static void set_mem_pattern(u32 *ptr)
+{
+ if (!ptr)
+ return;
+ *ptr = VPU_MEM_PATTERN;
+}
+
+static int check_mem_pattern(u32 *ptr)
+{
+ if (!ptr)
+ return -EINVAL;
+
+ if (*ptr != VPU_MEM_PATTERN)
+ return -EINVAL;
+
+ return 0;
+}
+
+static void vpu_enc_set_mem_pattern(struct vpu_ctx *ctx)
+{
+ int i;
+
+ if (!ctx)
+ return;
+
+ for (i = 0; i < MEDIAIP_MAX_NUM_WINDSOR_SRC_FRAMES; i++) {
+ if (!ctx->encFrame[i].virt_addr)
+ continue;
+ set_mem_pattern(ctx->encFrame[i].virt_addr +
+ ctx->mem_req.uEncFrmSize);
+ }
+
+ for (i = 0; i < MEDIAIP_MAX_NUM_WINDSOR_REF_FRAMES; i++) {
+ if (!ctx->refFrame[i].virt_addr)
+ continue;
+ set_mem_pattern(ctx->refFrame[i].virt_addr +
+ ctx->mem_req.uRefFrmSize);
+ }
+
+ if (ctx->actFrame.virt_addr)
+ set_mem_pattern(ctx->actFrame.virt_addr +
+ ctx->mem_req.uActBufSize);
+}
+
+int vpu_enc_check_mem_overstep(struct vpu_ctx *ctx)
+{
+ int i;
+ int ret;
+ int flag = 0;
+
+ if (!ctx)
+ return -EINVAL;
+
+ for (i = 0; i < MEDIAIP_MAX_NUM_WINDSOR_SRC_FRAMES; i++) {
+ if (!ctx->encFrame[i].virt_addr)
+ continue;
+ ret = check_mem_pattern(ctx->encFrame[i].virt_addr +
+ ctx->mem_req.uEncFrmSize);
+ if (ret) {
+ vpu_err("***error:[%d][%d]encFrame[%d] out of bounds\n",
+ ctx->core_dev->id, ctx->str_index, i);
+ flag = 1;
+ }
+ }
+
+ for (i = 0; i < MEDIAIP_MAX_NUM_WINDSOR_REF_FRAMES; i++) {
+ if (!ctx->refFrame[i].virt_addr)
+ continue;
+ ret = check_mem_pattern(ctx->refFrame[i].virt_addr +
+ ctx->mem_req.uRefFrmSize);
+ if (ret) {
+ vpu_err("***error:[%d][%d]refFrame[%d] out of bounds\n",
+ ctx->core_dev->id, ctx->str_index, i);
+ flag = 1;
+ }
+ }
+
+ if (ctx->actFrame.virt_addr) {
+ ret = check_mem_pattern(ctx->actFrame.virt_addr +
+ ctx->mem_req.uActBufSize);
+ if (ret) {
+ vpu_err("***error:[%d][%d]actFrame out of bounds\n",
+ ctx->core_dev->id, ctx->str_index);
+ flag = 1;
+ }
+ }
+
+ if (flag) {
+ vpu_err("Error:Memory out of bounds in [%d][%d]\n",
+ ctx->core_dev->id, ctx->str_index);
+ vpu_enc_set_mem_pattern(ctx);
+ }
+
+ return 0;
+}
+
+int vpu_enc_alloc_mem(struct vpu_ctx *ctx,
+ MEDIAIP_ENC_MEM_REQ_DATA *req_data,
+ pMEDIAIP_ENC_MEM_POOL pool)
+{
+ int ret;
+
+ if (!ctx || !req_data || !pool)
+ return -EINVAL;
+
+ if (ctx->mem_req.uEncFrmSize < req_data->uEncFrmSize ||
+ ctx->mem_req.uEncFrmNum < req_data->uEncFrmNum) {
+ free_enc_frames(ctx, pool);
+ ctx->mem_req.uEncFrmSize = req_data->uEncFrmSize;
+ ctx->mem_req.uEncFrmNum = req_data->uEncFrmNum;
+ ret = alloc_enc_frames(ctx, pool);
+ if (ret)
+ return ret;
+ }
+
+ if (ctx->mem_req.uRefFrmSize < req_data->uRefFrmSize ||
+ ctx->mem_req.uRefFrmNum < req_data->uRefFrmNum) {
+ free_ref_frames(ctx, pool);
+ ctx->mem_req.uRefFrmSize = req_data->uRefFrmSize;
+ ctx->mem_req.uRefFrmNum = req_data->uRefFrmNum;
+ ret = alloc_ref_frames(ctx, pool);
+ if (ret)
+ goto error_alloc_refs;
+ }
+
+ if (ctx->mem_req.uActBufSize < req_data->uActBufSize) {
+ free_act_frame(ctx, pool);
+ ctx->mem_req.uActBufSize = req_data->uActBufSize;
+ ret = alloc_act_frame(ctx, pool);
+ if (ret)
+ goto error_alloc_act;
+ }
+
+ vpu_enc_set_mem_pattern(ctx);
+
+ return 0;
+error_alloc_act:
+ free_ref_frames(ctx, pool);
+error_alloc_refs:
+ free_enc_frames(ctx, pool);
+ return ret;
+}
+
+int vpu_enc_free_mem(struct vpu_ctx *ctx, pMEDIAIP_ENC_MEM_POOL pool)
+{
+ if (!ctx || !pool)
+ return -EINVAL;
+
+ free_act_frame(ctx, pool);
+ free_ref_frames(ctx, pool);
+ free_enc_frames(ctx, pool);
+
+ return 0;
+}
+
+int vpu_enc_alloc_stream(struct vpu_ctx *ctx)
+{
+ int ret;
+
+ if (ctx->encoder_stream.virt_addr)
+ return 0;
+
+ ctx->encoder_stream.size =
+ max_t(u32, ctx->cpb_size * CPB_COUNT, STREAM_SIZE);
+ ret = vpu_enc_alloc_dma_buffer(ctx, &ctx->encoder_stream);
+ if (ret) {
+ vpu_err("alloc encoder stream buffer fail\n");
+ return -ENOMEM;
+ }
+ vpu_dbg(LVL_MEM, "encoder_stream: 0x%llx, %d\n",
+ ctx->encoder_stream.phy_addr, ctx->encoder_stream.size);
+
+ return 0;
+}
+
+void vpu_enc_free_stream(struct vpu_ctx *ctx)
+{
+ vpu_enc_free_dma_buffer(ctx, &ctx->encoder_stream);
+}
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_mem.h b/drivers/mxc/vpu_windsor/vpu_encoder_mem.h
new file mode 100644
index 000000000000..b673da0610a4
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_mem.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#ifndef _VPU_ENCODER_MEM_H
+#define _VPU_ENCODER_MEM_H
+
+#include "vpu_encoder_b0.h"
+
+int vpu_enc_init_reserved_memory(struct vpu_enc_mem_info *info);
+void vpu_enc_release_reserved_memory(struct vpu_enc_mem_info *info);
+void vpu_enc_add_dma_size(struct vpu_attr *attr, unsigned long size);
+void vpu_enc_sub_dma_size(struct vpu_attr *attr, unsigned long size);
+int vpu_enc_alloc_dma_buffer(struct vpu_ctx *ctx, struct buffer_addr *buffer);
+int vpu_enc_free_dma_buffer(struct vpu_ctx *ctx, struct buffer_addr *buffer);
+void vpu_enc_init_dma_buffer(struct buffer_addr *buffer);
+int vpu_enc_check_mem_overstep(struct vpu_ctx *ctx);
+int vpu_enc_alloc_mem(struct vpu_ctx *ctx,
+ MEDIAIP_ENC_MEM_REQ_DATA *req_data,
+ pMEDIAIP_ENC_MEM_POOL pool);
+int vpu_enc_free_mem(struct vpu_ctx *ctx, pMEDIAIP_ENC_MEM_POOL pool);
+int vpu_enc_alloc_stream(struct vpu_ctx *ctx);
+void vpu_enc_free_stream(struct vpu_ctx *ctx);
+
+#endif
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_mu.c b/drivers/mxc/vpu_windsor/vpu_encoder_mu.c
new file mode 100644
index 000000000000..62b6164d2ff4
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_mu.c
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ *
+ * @file vpu_encoder_mu.h
+ *
+ */
+
+#include "vpu_encoder_mu.h"
+
+static void vpu_enc_mbox_free(struct core_device *core_dev)
+{
+ if (core_dev->sc_chan_tx0.ch && !IS_ERR(core_dev->sc_chan_tx0.ch))
+ mbox_free_channel(core_dev->sc_chan_tx0.ch);
+ if (core_dev->sc_chan_tx1.ch && !IS_ERR(core_dev->sc_chan_tx1.ch))
+ mbox_free_channel(core_dev->sc_chan_tx1.ch);
+ if (core_dev->sc_chan_rx.ch && !IS_ERR(core_dev->sc_chan_rx.ch))
+ mbox_free_channel(core_dev->sc_chan_rx.ch);
+
+ core_dev->sc_chan_tx0.ch = NULL;
+ core_dev->sc_chan_tx1.ch = NULL;
+ core_dev->sc_chan_rx.ch = NULL;
+}
+
+static void vpu_enc_mu_inq_msg(struct core_device *core_dev, void *msg)
+{
+ if (&core_dev->mu_msg_fifo == NULL) {
+ vpu_err("mu_msg_fifo is NULL\n");
+ return;
+ }
+
+ if (kfifo_in(&core_dev->mu_msg_fifo, msg, sizeof(u_int32)) != sizeof(u_int32)) {
+ vpu_err("No memory for mu msg fifo\n");
+ return;
+ }
+
+ queue_work(core_dev->workqueue, &core_dev->msg_work);
+}
+
+static void vpu_enc_rx_callback(struct mbox_client *c, void *msg)
+{
+ struct vpu_sc_chan *sc_chan = container_of(c, struct vpu_sc_chan, cl);
+ struct core_device *dev =
+ container_of(sc_chan, struct core_device, sc_chan_rx);
+
+ vpu_enc_mu_inq_msg(dev, msg);
+}
+
+static int vpu_enc_rtx_channel_request(struct vpu_sc_chan *sc_chan, bool block)
+{
+ struct device *dev = sc_chan->dev->generic_dev;
+ struct mbox_client *cl;
+ int ret = 0;
+
+ cl = &sc_chan->cl;
+ cl->dev = dev;
+ if (block) {
+ cl->tx_block = true;
+ cl->tx_tout = 1000;
+ } else {
+ cl->tx_block = false;
+ }
+ cl->knows_txdone = false;
+ cl->rx_callback = vpu_enc_rx_callback;
+
+ sc_chan->ch = mbox_request_channel_byname(cl, sc_chan->name);
+ if (IS_ERR(sc_chan->ch)) {
+ ret = PTR_ERR(sc_chan->ch);
+ if (ret != -EPROBE_DEFER)
+ vpu_err("Failed to request mbox chan %s, ret: %d\n",
+ sc_chan->name, ret);
+ }
+
+ return ret;
+}
+
+static int vpu_enc_rtx_channel_init(struct core_device *core_dev)
+{
+ int ret = 0;
+
+ /* Normally, use block mode to ensure msg be writed correctly.
+ * Firmware do not separate read tx1 channel until receive tx0.
+ * Hence, when use tx1 must combine with tx0, and flow is tx1 -> tx0 to
+ * ensure firmware read tx1 correctly. Due to tx1 write first, tx1 shall
+ * use non-block mode, otherwise always wait timeout.
+ * In addition, tx0 use block mode then also can ensure tx1 msg be
+ * writed correctly as tx0 and tx1 are considered as a whole in this
+ * case.
+ */
+
+ /* core device id count from 0, mu count from 1 */
+
+ core_dev->sc_chan_tx0.dev = core_dev;
+ scnprintf(core_dev->sc_chan_tx0.name, sizeof(core_dev->sc_chan_tx0.name) - 1,
+ "enc%d_tx0", core_dev->id + 1);
+ ret = vpu_enc_rtx_channel_request(&core_dev->sc_chan_tx0, true);
+ if (ret)
+ goto err;
+
+ core_dev->sc_chan_tx1.dev = core_dev;
+ scnprintf(core_dev->sc_chan_tx1.name, sizeof(core_dev->sc_chan_tx1.name) - 1,
+ "enc%d_tx1", core_dev->id + 1);
+ ret = vpu_enc_rtx_channel_request(&core_dev->sc_chan_tx1, false);
+ if (ret)
+ goto err;
+
+ core_dev->sc_chan_rx.dev = core_dev;
+ scnprintf(core_dev->sc_chan_rx.name, sizeof(core_dev->sc_chan_rx.name) - 1,
+ "enc%d_rx", core_dev->id + 1);
+ ret = vpu_enc_rtx_channel_request(&core_dev->sc_chan_rx, true);
+ if (ret)
+ goto err;
+
+ return ret;
+
+err:
+ vpu_enc_mbox_free(core_dev);
+
+ return ret;
+}
+
+int vpu_enc_mu_request(struct core_device *core_dev)
+{
+ int ret = 0;
+
+ ret = vpu_enc_rtx_channel_init(core_dev);
+
+ return ret;
+}
+
+void vpu_enc_mu_free(struct core_device *core_dev)
+{
+ vpu_enc_mbox_free(core_dev);
+}
+
+void vpu_enc_mu_send_msg(struct core_device *core_dev, MSG_Type type, u_int32 value)
+{
+ /* Ensure firmware read tx1 correctly when receive tx0,
+ * need to write tx1 first.
+ */
+
+ if (value != 0xffff)
+ mbox_send_message(core_dev->sc_chan_tx1.ch, &value);
+ if (type != 0xffff)
+ mbox_send_message(core_dev->sc_chan_tx0.ch, &type);
+}
+
+u_int32 vpu_enc_mu_receive_msg(struct core_device *core_dev, void *msg)
+{
+ int ret = 0;
+
+ if (kfifo_len(&core_dev->mu_msg_fifo) >= sizeof(u_int32)) {
+ ret = kfifo_out(&core_dev->mu_msg_fifo, msg, sizeof(u_int32));
+ if (ret != sizeof(u_int32))
+ vpu_err("error: kfifo_out mu msg failed\n, ret=%d\n",
+ ret);
+ } else {
+ ret = kfifo_len(&core_dev->mu_msg_fifo);
+ }
+
+ return ret;
+}
+
+static int vpu_enc_sc_get_fuse(struct imx_sc_ipc *ipc, u32 word, u32 *fuse)
+{
+ struct vpu_sc_msg_misc msg;
+ struct imx_sc_rpc_msg *hdr = &msg.hdr;
+ int ret;
+
+ hdr->ver = IMX_SC_RPC_VERSION;
+ hdr->svc = IMX_SC_RPC_SVC_MISC;
+ hdr->func = IMX_SC_MISC_FUNC_OTP_FUSE_READ;
+ hdr->size = 2;
+
+ msg.word = word;
+
+ ret = imx_scu_call_rpc(ipc, &msg, true);
+ if (ret)
+ return ret;
+
+ *fuse = msg.word;
+
+ return ret;
+}
+
+int vpu_enc_sc_check_fuse(void)
+{
+ u_int32 fuse = 0xffff;
+ int ret = 0;
+ struct imx_sc_ipc *ipcHandle;
+
+ ret = imx_scu_get_handle(&ipcHandle);
+ if (ret) {
+ vpu_err("error: scu get handle fail: %d\n", ret);
+ return -EINVAL;
+ }
+
+ ret = vpu_enc_sc_get_fuse(ipcHandle, VPU_DISABLE_BITS, &fuse);
+ if (ret) {
+ vpu_dbg(LVL_WARN, "warning: read value fail: %d\n", ret);
+ return ret;
+ }
+
+ if (fuse & VPU_ENCODER_MASK) {
+ vpu_err("warning: VPU Encoder is disabled\n");
+ return -EINVAL;
+ }
+
+ return ret;
+}
+
+void vpu_enc_mu_enable_rx(struct core_device *core_dev)
+{
+
+}
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_mu.h b/drivers/mxc/vpu_windsor/vpu_encoder_mu.h
new file mode 100644
index 000000000000..5b290365a2f2
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_mu.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ *
+ * @file vpu_encoder_mu.h
+ *
+ */
+
+#ifndef _VPU_ENCODER_MU_H_
+#define _VPU_ENCODER_MU_H_
+
+#include <linux/version.h>
+#include <linux/interrupt.h>
+#include <linux/mx8_mu.h>
+#include <linux/workqueue.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/mailbox_client.h>
+#include <linux/pm_domain.h>
+#include <linux/kfifo.h>
+
+#include "vpu_encoder_b0.h"
+
+int vpu_enc_mu_request(struct core_device *core_dev);
+void vpu_enc_mu_free(struct core_device *core_dev);
+void vpu_enc_mu_send_msg(struct core_device *core_dev, MSG_Type type, u_int32 value);
+u_int32 vpu_enc_mu_receive_msg(struct core_device *core_dev, void *msg);
+int vpu_enc_sc_check_fuse(void);
+void vpu_enc_mu_enable_rx(struct core_device *core_dev);
+
+#endif
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_pm.c b/drivers/mxc/vpu_windsor/vpu_encoder_pm.c
new file mode 100644
index 000000000000..7a55d044f0d5
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_pm.c
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ *
+ * @file vpu_encoder_pm.c
+ *
+ */
+
+#include "vpu_encoder_pm.h"
+
+int vpu_enc_attach_pm_domains(struct vpu_dev *dev)
+{
+ int ret = 0;
+
+ dev->pd_vpu = dev_pm_domain_attach_by_name(&dev->plat_dev->dev, "vpu");
+ if (IS_ERR(dev->pd_vpu)) {
+ vpu_err("error: unable to get vpu power domain\n");
+ ret = PTR_ERR(dev->pd_vpu);
+ goto err;
+ }
+ dev->pd_vpu_link = device_link_add(&dev->plat_dev->dev, dev->pd_vpu,
+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+ if (IS_ERR(dev->pd_vpu_link)) {
+ vpu_err("error: unable to link vpu power domain\n");
+ ret = PTR_ERR(dev->pd_vpu_link);
+ goto err;
+ }
+
+ dev->pd_enc1 = dev_pm_domain_attach_by_name(&dev->plat_dev->dev,
+ "vpuenc1");
+ if (IS_ERR(dev->pd_enc1)) {
+ vpu_err("error: unable to get vpu enc1 power domain\n");
+ ret = PTR_ERR(dev->pd_enc1);
+ goto err;
+ }
+ dev->pd_enc1_link = device_link_add(&dev->plat_dev->dev, dev->pd_enc1,
+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+ if (IS_ERR(dev->pd_enc1_link)) {
+ vpu_err("error: unable to link vpu enc1 power domain\n");
+ ret = PTR_ERR(dev->pd_enc1_link);
+ goto err;
+ }
+
+ dev->pd_mu1 = dev_pm_domain_attach_by_name(&dev->plat_dev->dev,
+ "vpumu1");
+ if (IS_ERR(dev->pd_mu1)) {
+ vpu_err("error: unable to get vpu mu1 power domain\n");
+ ret = PTR_ERR(dev->pd_mu1);
+ goto err;
+ }
+ dev->pd_mu1_link = device_link_add(&dev->plat_dev->dev, dev->pd_mu1,
+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+ if (IS_ERR(dev->pd_mu1_link)) {
+ vpu_err("error: unable to link vpu mu1 power domain\n");
+ ret = PTR_ERR(dev->pd_mu1_link);
+ goto err;
+ }
+
+ if (dev->plat_type == IMX8QM) {
+ dev->pd_enc2 = dev_pm_domain_attach_by_name(&dev->plat_dev->dev,
+ "vpuenc2");
+ if (IS_ERR(dev->pd_enc2)) {
+ vpu_err("error: unable to get vpu enc2 power domain\n");
+ ret = PTR_ERR(dev->pd_enc2);
+ goto err;
+ }
+ dev->pd_enc2_link = device_link_add(&dev->plat_dev->dev, dev->pd_enc2,
+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+ if (IS_ERR(dev->pd_enc2_link)) {
+ vpu_err("error: unable to link vpu enc2 power domain\n");
+ ret = PTR_ERR(dev->pd_enc2_link);
+ goto err;
+ }
+
+ dev->pd_mu2 = dev_pm_domain_attach_by_name(&dev->plat_dev->dev,
+ "vpumu2");
+ if (IS_ERR(dev->pd_mu2)) {
+ vpu_err("error: unable to get vpu mu2 power domain\n");
+ ret = PTR_ERR(dev->pd_mu2);
+ goto err;
+ }
+
+ dev->pd_mu2_link = device_link_add(&dev->plat_dev->dev, dev->pd_mu2,
+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE);
+ if (IS_ERR(dev->pd_mu2_link)) {
+ vpu_err("error: unable to link vpu mu2 power domain\n");
+ ret = PTR_ERR(dev->pd_mu2_link);
+ goto err;
+ }
+ }
+
+ return ret;
+err:
+ vpu_enc_detach_pm_domains(dev);
+ return ret;
+}
+
+void vpu_enc_detach_pm_domains(struct vpu_dev *dev)
+{
+ if (dev->pd_vpu_link && !IS_ERR(dev->pd_vpu_link))
+ device_link_del(dev->pd_vpu_link);
+ if (dev->pd_vpu && !IS_ERR(dev->pd_vpu))
+ dev_pm_domain_detach(dev->pd_vpu, true);
+
+ if (dev->pd_enc1_link && !IS_ERR(dev->pd_enc1_link))
+ device_link_del(dev->pd_enc1_link);
+ if (dev->pd_enc1 && !IS_ERR(dev->pd_enc1))
+ dev_pm_domain_detach(dev->pd_enc1, true);
+
+ if (dev->pd_mu1_link && !IS_ERR(dev->pd_mu1_link))
+ device_link_del(dev->pd_mu1_link);
+ if (dev->pd_mu1 && !IS_ERR(dev->pd_mu1))
+ dev_pm_domain_detach(dev->pd_mu1, true);
+
+ if (dev->plat_type == IMX8QM) {
+ if (dev->pd_enc2_link && !IS_ERR(dev->pd_enc2_link))
+ device_link_del(dev->pd_enc2_link);
+ if (dev->pd_enc2 && !IS_ERR(dev->pd_enc2))
+ dev_pm_domain_detach(dev->pd_enc2, true);
+ if (dev->pd_mu2_link && !IS_ERR(dev->pd_mu2_link))
+ device_link_del(dev->pd_mu2_link);
+ if (dev->pd_mu2 && !IS_ERR(dev->pd_mu2))
+ dev_pm_domain_detach(dev->pd_mu2, true);
+ }
+
+ dev->pd_vpu = NULL;
+ dev->pd_vpu_link = NULL;
+ dev->pd_enc1 = NULL;
+ dev->pd_enc1_link = NULL;
+ dev->pd_mu1 = NULL;
+ dev->pd_mu1_link = NULL;
+ if (dev->plat_type == IMX8QM) {
+ dev->pd_enc2 = NULL;
+ dev->pd_enc2_link = NULL;
+ dev->pd_mu2 = NULL;
+ dev->pd_mu2_link = NULL;
+ }
+}
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_pm.h b/drivers/mxc/vpu_windsor/vpu_encoder_pm.h
new file mode 100644
index 000000000000..5e08adc8799e
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_pm.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/*
+ *
+ * @file vpu_encoder_pm.h
+ *
+ */
+
+#ifndef _VPU_ENCODER_PM_H_
+#define _VPU_ENCODER_PM_H_
+
+#include <linux/version.h>
+#include <linux/pm_domain.h>
+#include <linux/platform_device.h>
+
+#include "vpu_encoder_b0.h"
+
+int vpu_enc_attach_pm_domains(struct vpu_dev *dev);
+void vpu_enc_detach_pm_domains(struct vpu_dev *dev);
+
+#endif
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_rpc.c b/drivers/mxc/vpu_windsor/vpu_encoder_rpc.c
new file mode 100644
index 000000000000..f670a940c8db
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_rpc.c
@@ -0,0 +1,448 @@
+/*
+ * This file is provided under a dual BSD/GPLv2 license. When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include "vpu_encoder_rpc.h"
+
+void rpc_init_shared_memory_encoder(struct shared_addr *This,
+ unsigned long long base_phy_addr,
+ void *base_virt_addr,
+ u_int32 total_size,
+ u32 *actual_size)
+{
+ pENC_RPC_HOST_IFACE pSharedInterface;
+ unsigned int phy_addr;
+ unsigned int i;
+ unsigned int temp_addr;
+ BUFFER_DESCRIPTOR_TYPE *pSharedCmdBufDescPtr;
+ BUFFER_DESCRIPTOR_TYPE *pSharedMsgBufDescPtr;
+ pMEDIA_ENC_API_CONTROL_INTERFACE pEncCtrlInterface;
+
+ This->shared_mem_phy = base_phy_addr;
+ This->shared_mem_vir = base_virt_addr;
+ This->base_offset = (unsigned long long)(base_virt_addr - base_phy_addr);
+
+ pSharedInterface = (pENC_RPC_HOST_IFACE)This->shared_mem_vir;
+ This->pSharedInterface = pSharedInterface;
+
+ pSharedInterface->FwExecBaseAddr = base_phy_addr;
+ pSharedInterface->FwExecAreaSize = total_size;
+
+ pSharedCmdBufDescPtr = (BUFFER_DESCRIPTOR_TYPE *)&pSharedInterface->StreamCmdBufferDesc;
+ pSharedMsgBufDescPtr = (BUFFER_DESCRIPTOR_TYPE *)&pSharedInterface->StreamMsgBufferDesc;
+
+ phy_addr = base_phy_addr + sizeof(ENC_RPC_HOST_IFACE);
+ This->cmd_mem_phy = phy_addr;
+ This->cmd_mem_vir = This->shared_mem_vir + sizeof(ENC_RPC_HOST_IFACE);
+
+ pSharedCmdBufDescPtr->wptr = phy_addr;
+ pSharedCmdBufDescPtr->rptr = pSharedCmdBufDescPtr->wptr;
+ pSharedCmdBufDescPtr->start = pSharedCmdBufDescPtr->wptr;
+ pSharedCmdBufDescPtr->end = pSharedCmdBufDescPtr->start + CMD_SIZE;
+
+ phy_addr += CMD_SIZE;
+ This->msg_mem_phy = phy_addr;
+ This->msg_mem_vir = This->cmd_mem_vir + CMD_SIZE;
+
+ pSharedMsgBufDescPtr->wptr = phy_addr;
+ pSharedMsgBufDescPtr->rptr = pSharedMsgBufDescPtr->wptr;
+ pSharedMsgBufDescPtr->start = pSharedMsgBufDescPtr->wptr;
+ pSharedMsgBufDescPtr->end = pSharedMsgBufDescPtr->start + MSG_SIZE;
+
+ phy_addr += MSG_SIZE;
+
+ for (i = 0; i < VID_API_NUM_STREAMS; i++) {
+ pSharedInterface->pEncCtrlInterface[i] = phy_addr;
+ phy_addr += sizeof(MEDIA_ENC_API_CONTROL_INTERFACE);
+ }
+
+ for (i = 0; i < VID_API_NUM_STREAMS; i++) {
+ temp_addr = pSharedInterface->pEncCtrlInterface[i];
+ pEncCtrlInterface = (pMEDIA_ENC_API_CONTROL_INTERFACE)(temp_addr + This->base_offset);
+ pEncCtrlInterface->pEncYUVBufferDesc = phy_addr;
+ phy_addr += sizeof(MEDIAIP_ENC_YUV_BUFFER_DESC);
+ pEncCtrlInterface->pEncStreamBufferDesc = phy_addr;
+ phy_addr += sizeof(BUFFER_DESCRIPTOR_TYPE);
+ pEncCtrlInterface->pEncExpertModeParam = phy_addr;
+ phy_addr += sizeof(MEDIAIP_ENC_EXPERT_MODE_PARAM);
+ pEncCtrlInterface->pEncParam = phy_addr;
+ phy_addr += sizeof(MEDIAIP_ENC_PARAM);
+ pEncCtrlInterface->pEncMemPool = phy_addr;
+ phy_addr += sizeof(MEDIAIP_ENC_MEM_POOL);
+ pEncCtrlInterface->pEncEncodingStatus = phy_addr;
+ phy_addr += sizeof(ENC_ENCODING_STATUS);
+ pEncCtrlInterface->pEncDSAStatus = phy_addr;
+ phy_addr += sizeof(ENC_DSA_STATUS_t);
+ }
+ if (actual_size)
+ *actual_size = phy_addr - base_phy_addr;
+}
+
+void rpc_set_system_cfg_value_encoder(void *Interface, u_int32 regs_base, u_int32 core_id)
+{
+ pENC_RPC_HOST_IFACE pSharedInterface;
+ MEDIAIP_FW_SYSTEM_CONFIG *pSystemCfg;
+
+ pSharedInterface = (pENC_RPC_HOST_IFACE)Interface;
+ pSystemCfg = &pSharedInterface->sSystemCfg;
+ pSystemCfg->uNumWindsors = 1;
+ pSystemCfg->uWindsorIrqPin[0x0][0x0] = 0x4; // PAL_IRQ_WINDSOR_LOW
+ pSystemCfg->uWindsorIrqPin[0x0][0x1] = 0x5; // PAL_IRQ_WINDSOR_HI
+ pSystemCfg->uMaloneBaseAddress[0] = (unsigned int)(regs_base + 0x180000);
+ if (core_id == 0)
+ pSystemCfg->uWindsorBaseAddress[0] = (unsigned int)(regs_base + 0x800000);
+ else
+ pSystemCfg->uWindsorBaseAddress[0] = (unsigned int)(regs_base + 0xa00000);
+ pSystemCfg->uMaloneBaseAddress[0x1] = 0x0;
+ pSystemCfg->uHifOffset[0x0] = 0x1C000;
+ pSystemCfg->uHifOffset[0x1] = 0x0;
+
+ pSystemCfg->uDPVBaseAddr = 0x0;
+ pSystemCfg->uDPVIrqPin = 0x0;
+ pSystemCfg->uPixIfBaseAddr = (unsigned int)(regs_base + 0x180000 + 0x20000);
+ pSystemCfg->uFSLCacheBaseAddr[0] = (unsigned int)(regs_base + 0x60000);
+ pSystemCfg->uFSLCacheBaseAddr[1] = (unsigned int)(regs_base + 0x68000);
+}
+
+u_int32 rpc_MediaIPFW_Video_buffer_space_check_encoder(BUFFER_DESCRIPTOR_TYPE *pBufDesc,
+ BOOL bFull,
+ u_int32 uSize,
+ u_int32 *puUpdateAddress)
+{
+ u_int32 uPtr1;
+ u_int32 uPtr2;
+ u_int32 start;
+ u_int32 end;
+ u_int32 uTemp;
+
+ /* bFull is FALSE when send message, write data */
+ /* bFull is TRUE when process commands, read data */
+ uPtr1 = (bFull) ? pBufDesc->rptr : pBufDesc->wptr;
+ uPtr2 = (bFull) ? pBufDesc->wptr : pBufDesc->rptr;
+
+ if (uPtr1 == uPtr2) {
+ if (bFull)
+ /* No data at all to read */
+ return 0;
+ else {
+ /* wrt pointer equal to read pointer thus the */
+ /* buffer is completely empty for further writes */
+ start = pBufDesc->start;
+ end = pBufDesc->end;
+ /* The address to be returned in this case is for */
+ /* the updated write pointer. */
+ uTemp = uPtr1 + uSize;
+ if (uTemp >= end)
+ uTemp += (start - end);
+ *puUpdateAddress = uTemp;
+ return (end - start);
+ }
+ } else if (uPtr1 < uPtr2) {
+ /* return updated rd pointer address */
+ /* In this case if size was too big - we expect the */
+ /* external ftn to compare the size against the */
+ /* space returned.
+ */
+ *puUpdateAddress = uPtr1 + uSize;
+ return (uPtr2 - uPtr1);
+ }
+ /* We know the system has looped!! */
+ start = pBufDesc->start;
+ end = pBufDesc->end;
+ uTemp = uPtr1 + uSize;
+ if (uTemp >= end)
+ uTemp += (start - end);
+ *puUpdateAddress = uTemp;
+ return ((end - uPtr1) + (uPtr2 - start));
+}
+
+static void rpc_update_cmd_buffer_ptr_encoder(BUFFER_DESCRIPTOR_TYPE *pCmdDesc)
+{
+ u_int32 uWritePtr;
+
+ /*avoid sw reset fail*/
+ mb();
+ uWritePtr = pCmdDesc->wptr + 4;
+ if (uWritePtr >= pCmdDesc->end)
+ uWritePtr = pCmdDesc->start;
+ pCmdDesc->wptr = uWritePtr;
+}
+
+void rpc_send_cmd_buf_encoder(struct shared_addr *This,
+ u_int32 idx,
+ u_int32 cmdid,
+ u_int32 cmdnum,
+ u_int32 *local_cmddata)
+{
+ pENC_RPC_HOST_IFACE pSharedInterface = (pENC_RPC_HOST_IFACE)This->shared_mem_vir;
+ BUFFER_DESCRIPTOR_TYPE *pCmdDesc = &pSharedInterface->StreamCmdBufferDesc;
+ u_int32 *cmddata;
+ u_int32 i;
+ u_int32 *cmdword = (u_int32 *)(This->cmd_mem_vir+pCmdDesc->wptr - pCmdDesc->start);
+
+ *cmdword = 0;
+ *cmdword |= ((idx & 0x000000ff) << 24);
+ *cmdword |= ((cmdnum & 0x000000ff) << 16);
+ *cmdword |= ((cmdid & 0x00003fff) << 0);
+ rpc_update_cmd_buffer_ptr_encoder(pCmdDesc);
+
+ for (i = 0; i < cmdnum; i++) {
+ cmddata = (u_int32 *)(This->cmd_mem_vir+pCmdDesc->wptr - pCmdDesc->start);
+ *cmddata = local_cmddata[i];
+ rpc_update_cmd_buffer_ptr_encoder(pCmdDesc);
+ }
+}
+
+u_int32 rpc_MediaIPFW_Video_message_check_encoder(struct shared_addr *This)
+{
+ u_int32 uSpace;
+ u_int32 uIgnore;
+ pENC_RPC_HOST_IFACE pSharedInterface = (pENC_RPC_HOST_IFACE)This->shared_mem_vir;
+ BUFFER_DESCRIPTOR_TYPE *pMsgDesc = &pSharedInterface->StreamMsgBufferDesc;
+ u_int32 msgword;
+ u_int32 msgnum;
+
+ uSpace = rpc_MediaIPFW_Video_buffer_space_check_encoder(pMsgDesc, TRUE, 0, &uIgnore);
+ uSpace = (uSpace >> 2);
+ if (uSpace) {
+ /* get current msgword word */
+ msgword = *((u_int32 *)(This->msg_mem_vir+pMsgDesc->rptr - pMsgDesc->start));
+ /* Find the number of additional words */
+ msgnum = ((msgword & 0x00ff0000) >> 16);
+
+ /*
+ * * Check the number of message words against
+ * * 1) a limit - some sort of maximum or at least
+ * * the size of the SW buffer the message is read into
+ * * 2) The space reported (where space is write ptr - read ptr in 32bit words)
+ * * It must be less than space (as opposed to <=) because
+ * * the message itself is not included in msgword
+ */
+ if (msgnum < VID_API_MESSAGE_LIMIT) {
+ if (msgnum < uSpace)
+ return API_MSG_AVAILABLE;
+ else
+ return API_MSG_INCOMPLETE;
+ } else
+ return API_MSG_BUFFER_ERROR;
+ }
+ return API_MSG_UNAVAILABLE;
+}
+
+static void rpc_update_msg_buffer_ptr_encoder(BUFFER_DESCRIPTOR_TYPE *pMsgDesc)
+{
+ u_int32 uReadPtr;
+
+ uReadPtr = pMsgDesc->rptr + 4;
+ if (uReadPtr >= pMsgDesc->end)
+ uReadPtr = pMsgDesc->start;
+ pMsgDesc->rptr = uReadPtr;
+}
+
+u32 rpc_read_msg_u32(struct shared_addr *shared_mem)
+{
+ u32 msgword;
+ u32 *ptr = NULL;
+ pENC_RPC_HOST_IFACE iface = NULL;
+ BUFFER_DESCRIPTOR_TYPE *msg_buf = NULL;
+
+ if (!shared_mem)
+ return 0;
+
+ iface = shared_mem->pSharedInterface;
+ msg_buf = &iface->StreamMsgBufferDesc;
+ ptr = shared_mem->msg_mem_vir + msg_buf->rptr - msg_buf->start;
+ rpc_update_msg_buffer_ptr_encoder(msg_buf);
+ msgword = *ptr;
+
+ return msgword;
+}
+
+int rpc_read_msg_array(struct shared_addr *shared_mem, u32 *buf, u32 number)
+{
+ int i;
+ u32 val;
+
+ if (!shared_mem)
+ return -EINVAL;
+
+ for (i = 0; i < number; i++) {
+ val = rpc_read_msg_u32(shared_mem);
+ if (buf)
+ buf[i] = val;
+ }
+
+ return 0;
+}
+
+int rpc_get_msg_header(struct shared_addr *shared_mem, struct msg_header *msg)
+{
+ u32 msgword;
+
+ if (!shared_mem || !msg)
+ return -EINVAL;
+
+ msgword = rpc_read_msg_u32(shared_mem);
+ msg->idx = ((msgword & 0xff000000) >> 24);
+ msg->msgnum = ((msgword & 0x00ff0000) >> 16);
+ msg->msgid = ((msgword & 0x00003fff) >> 0);
+
+ return 0;
+}
+
+static void *phy_to_virt(u_int32 src, unsigned long long offset)
+{
+ void *result;
+
+ result = (void *)(src + offset);
+ return result;
+}
+
+#define GET_CTRL_INTERFACE_MEMBER(shared_mem, index, name, member) \
+ do {\
+ pENC_RPC_HOST_IFACE iface = shared_mem->pSharedInterface; \
+ pMEDIA_ENC_API_CONTROL_INTERFACE ctrl_interface =\
+ phy_to_virt(iface->pEncCtrlInterface[index],\
+ shared_mem->base_offset);\
+ name = phy_to_virt(ctrl_interface->member,\
+ shared_mem->base_offset);\
+ } while (0)
+
+pMEDIAIP_ENC_YUV_BUFFER_DESC rpc_get_yuv_buffer_desc(
+ struct shared_addr *shared_mem, int index)
+{
+ pMEDIAIP_ENC_YUV_BUFFER_DESC desc = NULL;
+
+ GET_CTRL_INTERFACE_MEMBER(shared_mem, index, desc, pEncYUVBufferDesc);
+
+ return desc;
+}
+
+pBUFFER_DESCRIPTOR_TYPE rpc_get_stream_buffer_desc(
+ struct shared_addr *shared_mem, int index)
+{
+ pBUFFER_DESCRIPTOR_TYPE desc = NULL;
+
+ GET_CTRL_INTERFACE_MEMBER(shared_mem, index,
+ desc, pEncStreamBufferDesc);
+
+ return desc;
+}
+
+pMEDIAIP_ENC_EXPERT_MODE_PARAM rpc_get_expert_mode_param(
+ struct shared_addr *shared_mem, int index)
+{
+ pMEDIAIP_ENC_EXPERT_MODE_PARAM param = NULL;
+
+ GET_CTRL_INTERFACE_MEMBER(shared_mem, index,
+ param, pEncExpertModeParam);
+
+ return param;
+}
+
+pMEDIAIP_ENC_PARAM rpc_get_enc_param(
+ struct shared_addr *shared_mem, int index)
+{
+ pMEDIAIP_ENC_PARAM param = NULL;
+
+ GET_CTRL_INTERFACE_MEMBER(shared_mem, index, param, pEncParam);
+
+ return param;
+}
+
+pMEDIAIP_ENC_MEM_POOL rpc_get_mem_pool(
+ struct shared_addr *shared_mem, int index)
+{
+ pMEDIAIP_ENC_MEM_POOL pool = NULL;
+
+ GET_CTRL_INTERFACE_MEMBER(shared_mem, index, pool, pEncMemPool);
+
+ return pool;
+}
+
+pENC_ENCODING_STATUS rpc_get_encoding_status(
+ struct shared_addr *shared_mem, int index)
+{
+ pENC_ENCODING_STATUS encoding_status = NULL;
+
+ GET_CTRL_INTERFACE_MEMBER(shared_mem, index,
+ encoding_status, pEncEncodingStatus);
+
+ return encoding_status;
+}
+
+pENC_DSA_STATUS_t rpc_get_dsa_status(struct shared_addr *shared_mem, int index)
+{
+ pENC_DSA_STATUS_t dsa_status = NULL;
+
+ GET_CTRL_INTERFACE_MEMBER(shared_mem, index, dsa_status, pEncDSAStatus);
+
+ return dsa_status;
+}
+
+void rpc_set_print_buffer(struct shared_addr *shared_mem,
+ unsigned long print_phy_addr, u32 size)
+{
+ pENC_RPC_HOST_IFACE pSharedInterface;
+ pBUFFER_DESCRIPTOR_TYPE debugBufDesc;
+
+
+ pSharedInterface = shared_mem->pSharedInterface;
+ debugBufDesc = &pSharedInterface->DebugBufferDesc;
+
+ debugBufDesc->start = print_phy_addr;
+ debugBufDesc->end = debugBufDesc->start + size;
+ debugBufDesc->wptr = debugBufDesc->rptr = debugBufDesc->start;
+}
diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_rpc.h b/drivers/mxc/vpu_windsor/vpu_encoder_rpc.h
new file mode 100644
index 000000000000..934b542a4929
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_encoder_rpc.h
@@ -0,0 +1,132 @@
+/*
+ * This file is provided under a dual BSD/GPLv2 license. When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.GPL.
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2018 NXP. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __VPU_ENCODER_RPC_H__
+#define __VPU_ENCODER_RPC_H__
+
+#include "mediasys_types.h"
+
+#define CMD_SIZE 2560
+#define MSG_SIZE 25600
+#define CODEC_SIZE 0x1000
+#define JPEG_SIZE 0x1000
+#define SEQ_SIZE 0x1000
+#define GOP_SIZE 0x1000
+#define PIC_SIZE 0x1000
+#define QMETER_SIZE 0x1000
+#define DEBUG_SIZE 0x1000
+#define ENG_SIZE 0x1000
+#define LOCAL_MSG_NUM VID_API_MESSAGE_LIMIT
+
+struct shared_addr {
+ pENC_RPC_HOST_IFACE pSharedInterface;
+ unsigned long long shared_mem_phy;
+ void *shared_mem_vir;
+ unsigned long long cmd_mem_phy;
+ void *cmd_mem_vir;
+ unsigned long long msg_mem_phy;
+ void *msg_mem_vir;
+ unsigned long long codec_mem_phy;
+ void *codec_mem_vir;
+ unsigned long long jpeg_mem_phy;
+ void *jpeg_mem_vir;
+ unsigned long long seq_mem_phy;
+ void *seq_mem_vir;
+ unsigned long long pic_mem_phy;
+ void *pic_mem_vir;
+ unsigned long long gop_mem_phy;
+ void *gop_mem_vir;
+ unsigned long long qmeter_mem_phy;
+ void *qmeter_mem_vir;
+ unsigned long long base_offset;
+};
+
+struct msg_header {
+ u32 idx;
+ u32 msgnum;
+ u32 msgid;
+};
+
+void rpc_init_shared_memory_encoder(struct shared_addr *This,
+ unsigned long long base_phy_addr,
+ void *base_virt_addr,
+ u_int32 total_size,
+ u32 *actual_size);
+void rpc_set_system_cfg_value_encoder(void *Interface, u_int32 regs_base, u_int32 core_id);
+void rpc_send_cmd_buf_encoder(struct shared_addr *This,
+ u_int32 idx,
+ u_int32 cmdid,
+ u_int32 cmdnum,
+ u_int32 *local_cmddata);
+u32 rpc_read_msg_u32(struct shared_addr *shared_mem);
+int rpc_read_msg_array(struct shared_addr *shared_mem, u32 *buf, u32 number);
+int rpc_get_msg_header(struct shared_addr *shared_mem, struct msg_header *msg);
+
+pMEDIAIP_ENC_YUV_BUFFER_DESC rpc_get_yuv_buffer_desc(
+ struct shared_addr *shared_mem, int index);
+pBUFFER_DESCRIPTOR_TYPE rpc_get_stream_buffer_desc(
+ struct shared_addr *shared_mem, int index);
+pMEDIAIP_ENC_EXPERT_MODE_PARAM rpc_get_expert_mode_param(
+ struct shared_addr *shared_mem, int index);
+pMEDIAIP_ENC_PARAM rpc_get_enc_param(
+ struct shared_addr *shared_mem, int index);
+pMEDIAIP_ENC_MEM_POOL rpc_get_mem_pool(
+ struct shared_addr *shared_mem, int index);
+pENC_ENCODING_STATUS rpc_get_encoding_status(
+ struct shared_addr *shared_mem, int index);
+pENC_DSA_STATUS_t rpc_get_dsa_status(struct shared_addr *shared_mem, int index);
+void rpc_set_print_buffer(struct shared_addr *shared_mem,
+ unsigned long print_phy_addr, u32 size);
+
+#endif
diff --git a/drivers/mxc/vpu_windsor/vpu_event_msg.c b/drivers/mxc/vpu_windsor/vpu_event_msg.c
new file mode 100644
index 000000000000..852c4154f6b4
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_event_msg.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#define TAG "[VPU Encoder Msg]\t "
+#include <linux/kernel.h>
+#include <linux/list.h>
+#include <linux/vmalloc.h>
+
+#include "vpu_encoder_b0.h"
+#include "vpu_event_msg.h"
+
+static atomic64_t total_ext_data = ATOMIC64_INIT(0);
+
+static struct vpu_event_msg *alloc_event_msg(void)
+{
+ struct vpu_event_msg *msg = NULL;
+
+ msg = vzalloc(sizeof(*msg));
+
+ return msg;
+}
+
+static void free_event_msg(struct vpu_event_msg *msg)
+{
+ if (!msg)
+ return;
+
+ free_msg_ext_buffer(msg);
+ VPU_SAFE_RELEASE(msg, vfree);
+}
+
+static void set_msg_count(struct vpu_ctx *ctx, unsigned long count)
+{
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+
+ if (attr)
+ attr->msg_count = count;
+}
+
+static void inc_msg_count(struct vpu_ctx *ctx)
+{
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+
+ if (attr)
+ attr->msg_count++;
+}
+
+static void dec_msg_count(struct vpu_ctx *ctx)
+{
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+
+ if (attr)
+ attr->msg_count--;
+}
+
+static bool is_msg_count_full(struct vpu_ctx *ctx)
+{
+ struct vpu_attr *attr = get_vpu_ctx_attr(ctx);
+
+ if (!attr)
+ return false;
+ if (attr->msg_count > MSG_COUNT_THD)
+ return true;
+ return false;
+}
+
+void cleanup_ctx_msg_queue(struct vpu_ctx *ctx)
+{
+ struct vpu_event_msg *msg;
+ struct vpu_event_msg *tmp;
+
+ WARN_ON(!ctx);
+
+ vpu_log_func();
+ mutex_lock(&ctx->instance_mutex);
+ list_for_each_entry_safe(msg, tmp, &ctx->msg_q, list) {
+ list_del_init(&msg->list);
+ vpu_dbg(LVL_MSG, "drop core[%d] ctx[%d] msg:[%d]\n",
+ ctx->core_dev->id, ctx->str_index, msg->msgid);
+ VPU_SAFE_RELEASE(msg, free_event_msg);
+ dec_msg_count(ctx);
+ }
+
+ list_for_each_entry_safe(msg, tmp, &ctx->idle_q, list) {
+ list_del_init(&msg->list);
+ VPU_SAFE_RELEASE(msg, free_event_msg);
+ dec_msg_count(ctx);
+ }
+ mutex_unlock(&ctx->instance_mutex);
+}
+
+static int increase_idle_msg(struct vpu_ctx *ctx, u32 count)
+{
+ int i;
+
+ for (i = 0; i < count; i++) {
+ struct vpu_event_msg *msg = alloc_event_msg();
+
+ if (!msg)
+ continue;
+ list_add_tail(&msg->list, &ctx->idle_q);
+ inc_msg_count(ctx);
+ }
+
+ return 0;
+}
+
+int init_ctx_msg_queue(struct vpu_ctx *ctx)
+{
+ WARN_ON(!ctx);
+ if (!ctx)
+ return -EINVAL;
+
+ vpu_log_func();
+ mutex_lock(&ctx->instance_mutex);
+
+ set_msg_count(ctx, 0);
+ INIT_LIST_HEAD(&ctx->msg_q);
+ INIT_LIST_HEAD(&ctx->idle_q);
+
+ mutex_unlock(&ctx->instance_mutex);
+
+ return 0;
+}
+
+struct vpu_event_msg *get_idle_msg(struct vpu_ctx *ctx)
+{
+ struct vpu_event_msg *msg = NULL;
+
+ WARN_ON(!ctx);
+
+ mutex_lock(&ctx->instance_mutex);
+ if (list_empty(&ctx->idle_q))
+ increase_idle_msg(ctx, 1);
+
+ msg = list_first_entry(&ctx->idle_q, struct vpu_event_msg, list);
+ if (msg)
+ list_del_init(&msg->list);
+
+ mutex_unlock(&ctx->instance_mutex);
+
+ return msg;
+}
+
+void put_idle_msg(struct vpu_ctx *ctx, struct vpu_event_msg *msg)
+{
+ WARN_ON(!ctx);
+
+ if (!ctx || !msg)
+ return;
+
+ free_msg_ext_buffer(msg);
+
+ mutex_lock(&ctx->instance_mutex);
+ if (is_msg_count_full(ctx)) {
+ VPU_SAFE_RELEASE(msg, free_event_msg);
+ dec_msg_count(ctx);
+ } else {
+ list_add_tail(&msg->list, &ctx->idle_q);
+ }
+ mutex_unlock(&ctx->instance_mutex);
+}
+
+struct vpu_event_msg *pop_event_msg(struct vpu_ctx *ctx)
+{
+ struct vpu_event_msg *msg = NULL;
+
+ WARN_ON(!ctx);
+
+ mutex_lock(&ctx->instance_mutex);
+ if (list_empty(&ctx->msg_q))
+ goto exit;
+
+ msg = list_first_entry(&ctx->msg_q, struct vpu_event_msg, list);
+ if (msg)
+ list_del_init(&msg->list);
+
+exit:
+ mutex_unlock(&ctx->instance_mutex);
+ return msg;
+}
+
+void push_back_event_msg(struct vpu_ctx *ctx, struct vpu_event_msg *msg)
+{
+ WARN_ON(!ctx);
+
+ if (!ctx || !msg)
+ return;
+
+ mutex_lock(&ctx->instance_mutex);
+ list_add_tail(&msg->list, &ctx->msg_q);
+ mutex_unlock(&ctx->instance_mutex);
+}
+
+int alloc_msg_ext_buffer(struct vpu_event_msg *msg, u32 number)
+{
+ WARN_ON(!msg);
+
+ if (!msg || !number)
+ return -EINVAL;
+
+ msg->ext_data = vzalloc(number * sizeof(u32));
+ if (!msg->ext_data)
+ return -ENOMEM;
+ msg->number = number;
+
+ atomic64_add(number, &total_ext_data);
+ vpu_dbg(LVL_MSG, "++++alloc %d msg ext data: %lld\n",
+ number, get_total_ext_data_number());
+
+ return 0;
+}
+
+void free_msg_ext_buffer(struct vpu_event_msg *msg)
+{
+ WARN_ON(!msg);
+
+ if (!msg || !msg->ext_data)
+ return;
+
+ atomic64_sub(msg->number, &total_ext_data);
+ VPU_SAFE_RELEASE(msg->ext_data, vfree);
+ vpu_dbg(LVL_MSG, "----free %d msg ext data: %lld\n",
+ msg->number, get_total_ext_data_number());
+}
+
+long long get_total_ext_data_number(void)
+{
+ return atomic64_read(&total_ext_data);
+}
diff --git a/drivers/mxc/vpu_windsor/vpu_event_msg.h b/drivers/mxc/vpu_windsor/vpu_event_msg.h
new file mode 100644
index 000000000000..87fc489aa1bf
--- /dev/null
+++ b/drivers/mxc/vpu_windsor/vpu_event_msg.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2018-2019 NXP
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#ifndef _VPU_EVENT_MSG_H
+#define _VPU_EVENT_MSG_H
+
+#include "vpu_encoder_config.h"
+
+struct vpu_event_msg {
+ struct list_head list;
+ u32 idx;
+ u32 msgid;
+ u32 number;
+ u32 data[MSG_DATA_DEFAULT_SIZE];
+ u32 *ext_data;
+};
+
+int init_ctx_msg_queue(struct vpu_ctx *ctx);
+void cleanup_ctx_msg_queue(struct vpu_ctx *ctx);
+struct vpu_event_msg *get_idle_msg(struct vpu_ctx *ctx);
+void put_idle_msg(struct vpu_ctx *ctx, struct vpu_event_msg *msg);
+struct vpu_event_msg *pop_event_msg(struct vpu_ctx *ctx);
+void push_back_event_msg(struct vpu_ctx *ctx, struct vpu_event_msg *msg);
+int alloc_msg_ext_buffer(struct vpu_event_msg *msg, u32 number);
+void free_msg_ext_buffer(struct vpu_event_msg *msg);
+long long get_total_ext_data_number(void);
+
+#endif
diff --git a/include/linux/hantrodec.h b/include/linux/hantrodec.h
new file mode 100644
index 000000000000..f423ea82a04e
--- /dev/null
+++ b/include/linux/hantrodec.h
@@ -0,0 +1,29 @@
+/*****************************************************************************
+*
+* The GPL License (GPL)
+*
+* Copyright (c) 2015-2017, VeriSilicon Inc.
+* Copyright (c) 2011-2014, Google Inc.
+*
+* 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.
+*
+*****************************************************************************/
+
+#ifndef _HANTRODEC_H_
+#define _HANTRODEC_H_
+
+#include <uapi/linux/hantrodec.h>
+
+#endif /* !_HANTRODEC_H_ */
diff --git a/include/linux/hx280enc.h b/include/linux/hx280enc.h
new file mode 100755
index 000000000000..186a00e3446f
--- /dev/null
+++ b/include/linux/hx280enc.h
@@ -0,0 +1,31 @@
+/*****************************************************************************
+ * Encoder device driver (kernel module header)
+ *
+ * Copyright (C) 2012 Google Finland Oy.
+ *
+ * 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.
+ *
+--------------------------------------------------------------------------------
+--
+-- Abstract : 6280/7280/8270/8290/H1 Encoder device driver (kernel module)
+--
+*****************************************************************************/
+
+#ifndef _HX280ENC_H_
+#define _HX280ENC_H_
+
+#include <uapi/linux/hx280enc.h>
+
+#endif /* !_HX280ENC_H_ */
diff --git a/include/linux/ipu-v3-pre.h b/include/linux/ipu-v3-pre.h
new file mode 100644
index 000000000000..f5a26e5eadbf
--- /dev/null
+++ b/include/linux/ipu-v3-pre.h
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2014-2015 Freescale Semiconductor, Inc.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#ifndef __LINUX_IPU_V3_PRE_H_
+#define __LINUX_IPU_V3_PRE_H_
+
+#define IPU_PRE_MAX_WIDTH 1920
+#define IPU_PRE_MAX_BPP 4
+#define IPU_PRE_SMALL_LINE 9 /* to workaround errata ERR009624*/
+
+struct ipu_rect {
+ int left;
+ int top;
+ int width;
+ int height;
+};
+
+struct ipu_pre_context {
+ bool repeat;
+ bool vflip;
+ bool handshake_en;
+ bool hsk_abort_en;
+ unsigned int hsk_line_num;
+ bool sdw_update;
+ unsigned int block_size;
+ unsigned int interlaced;
+ unsigned int prefetch_mode;
+
+ unsigned long cur_buf;
+ unsigned long next_buf;
+
+ unsigned int tile_fmt;
+
+ unsigned int read_burst;
+ unsigned int prefetch_input_bpp;
+ unsigned int prefetch_input_pixel_fmt;
+ unsigned int prefetch_shift_offset;
+ unsigned int prefetch_shift_width;
+ bool shift_bypass;
+ bool field_inverse;
+ bool tpr_coor_offset_en;
+ /* the output of prefetch is
+ * also the input of store
+ */
+ struct ipu_rect prefetch_output_size;
+ unsigned int prefetch_input_active_width;
+ unsigned int prefetch_input_width;
+ unsigned int prefetch_input_height;
+ unsigned int store_pitch;
+ int interlace_offset;
+
+ bool store_en;
+ unsigned int write_burst;
+ unsigned int store_output_bpp;
+
+ unsigned int sec_buf_off;
+ unsigned int trd_buf_off;
+
+ /* return for IPU fb caller */
+ unsigned long store_addr;
+};
+
+/*
+ * In order to workaround the PRE SoC bug recorded by errata ERR009624,
+ * the software cannot write the PRE_CTRL register when the PRE writes
+ * the PRE_CTRL register automatically to set the ENABLE bit(bit0) to 1
+ * in the PRE repeat mode.
+ * The software mechanism to set the PRE_CTRL register is different for
+ * PRE Y resolution higher than 9 lines and lower or equal to 9 lines.
+ * Use this helper to check the Y resolution.
+ */
+static inline bool ipu_pre_yres_is_small(unsigned int yres)
+{
+ return yres <= IPU_PRE_SMALL_LINE;
+}
+
+#ifdef CONFIG_MXC_IPU_V3_PRE
+int ipu_pre_alloc(int ipu_id, ipu_channel_t ipu_ch);
+void ipu_pre_free(unsigned int *id);
+unsigned long ipu_pre_alloc_double_buffer(unsigned int id, unsigned int size);
+void ipu_pre_free_double_buffer(unsigned int id);
+int ipu_pre_config(int id, struct ipu_pre_context *config);
+int ipu_pre_set_ctrl(unsigned int id, struct ipu_pre_context *config);
+int ipu_pre_enable(int id);
+void ipu_pre_disable(int id);
+int ipu_pre_set_fb_buffer(int id, bool resolve,
+ unsigned long fb_paddr,
+ unsigned int y_res,
+ unsigned int x_crop,
+ unsigned int y_crop,
+ unsigned int sec_buf_off,
+ unsigned int trd_buf_off);
+int ipu_pre_sdw_update(int id);
+#else
+int ipu_pre_alloc(int ipu_id, ipu_channel_t channel)
+{
+ return -ENODEV;
+}
+
+void ipu_pre_free(unsigned int *id)
+{
+}
+
+unsigned long ipu_pre_alloc_double_buffer(unsigned int id, unsigned int size)
+{
+ return -ENODEV;
+}
+
+void ipu_pre_free_double_buffer(unsigned int id)
+{
+}
+
+int ipu_pre_config(int id, struct ipu_pre_context *config)
+{
+ return -ENODEV;
+}
+
+int ipu_pre_set_ctrl(unsigned int id, struct ipu_pre_context *config)
+{
+ return -ENODEV;
+}
+
+int ipu_pre_enable(int id)
+{
+ return -ENODEV;
+}
+
+void ipu_pre_disable(int id)
+{
+ return;
+}
+
+int ipu_pre_set_fb_buffer(int id, bool resolve,
+ unsigned long fb_paddr,
+ unsigned int y_res,
+ unsigned int x_crop,
+ unsigned int y_crop,
+ unsigned int sec_buf_off,
+ unsigned int trd_buf_off)
+{
+ return -ENODEV;
+}
+int ipu_pre_sdw_update(int id)
+{
+ return -ENODEV;
+}
+#endif
+#endif /* __LINUX_IPU_V3_PRE_H_ */
diff --git a/include/linux/ipu-v3-prg.h b/include/linux/ipu-v3-prg.h
new file mode 100644
index 000000000000..2ab803a6699f
--- /dev/null
+++ b/include/linux/ipu-v3-prg.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2014-2015 Freescale Semiconductor, Inc.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#ifndef __LINUX_IPU_V3_PRG_H_
+#define __LINUX_IPU_V3_PRG_H_
+
+#include <linux/ipu-v3.h>
+
+#define PRG_SO_INTERLACE 1
+#define PRG_SO_PROGRESSIVE 0
+#define PRG_BLOCK_MODE 1
+#define PRG_SCAN_MODE 0
+
+struct ipu_prg_config {
+ unsigned int id;
+ unsigned int pre_num;
+ ipu_channel_t ipu_ch;
+ unsigned int stride;
+ unsigned int height;
+ unsigned int ipu_height;
+ unsigned int crop_line;
+ unsigned int so;
+ unsigned int ilo;
+ unsigned int block_mode;
+ bool vflip;
+ u32 baddr;
+ u32 offset;
+};
+
+#ifdef CONFIG_MXC_IPU_V3_PRG
+int ipu_prg_config(struct ipu_prg_config *config);
+int ipu_prg_disable(unsigned int ipu_id, unsigned int pre_num);
+int ipu_prg_wait_buf_ready(unsigned int ipu_id, unsigned int pre_num,
+ unsigned int hsk_line_num,
+ int pre_store_out_height);
+#else
+int ipu_prg_config(struct ipu_prg_config *config)
+{
+ return -ENODEV;
+}
+
+int ipu_prg_disable(unsigned int ipu_id, unsigned int pre_num)
+{
+ return -ENODEV;
+}
+
+int ipu_prg_wait_buf_ready(unsigned int ipu_id, unsigned int pre_num,
+ unsigned int hsk_line_num,
+ int pre_store_out_height)
+{
+ return -ENODEV;
+}
+#endif
+#endif /* __LINUX_IPU_V3_PRG_H_ */
diff --git a/include/linux/ipu-v3.h b/include/linux/ipu-v3.h
new file mode 100644
index 000000000000..ae09614a2257
--- /dev/null
+++ b/include/linux/ipu-v3.h
@@ -0,0 +1,770 @@
+/*
+ * Copyright (c) 2010 Sascha Hauer <s.hauer@pengutronix.de>
+ * Copyright (C) 2011-2015 Freescale Semiconductor, Inc.
+ *
+ * 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.
+ */
+
+#ifndef __LINUX_IPU_V3_H_
+#define __LINUX_IPU_V3_H_
+
+#include <linux/ipu.h>
+
+/* IPU Driver channels definitions. */
+/* Note these are different from IDMA channels */
+#define IPU_MAX_CH 32
+#define _MAKE_CHAN(num, v_in, g_in, a_in, out) \
+ ((num << 24) | (v_in << 18) | (g_in << 12) | (a_in << 6) | out)
+#define _MAKE_ALT_CHAN(ch) (ch | (IPU_MAX_CH << 24))
+#define IPU_CHAN_ID(ch) (ch >> 24)
+#define IPU_CHAN_ALT(ch) (ch & 0x02000000)
+#define IPU_CHAN_ALPHA_IN_DMA(ch) ((uint32_t) (ch >> 6) & 0x3F)
+#define IPU_CHAN_GRAPH_IN_DMA(ch) ((uint32_t) (ch >> 12) & 0x3F)
+#define IPU_CHAN_VIDEO_IN_DMA(ch) ((uint32_t) (ch >> 18) & 0x3F)
+#define IPU_CHAN_OUT_DMA(ch) ((uint32_t) (ch & 0x3F))
+#define NO_DMA 0x3F
+#define ALT 1
+/*!
+ * Enumeration of IPU logical channels. An IPU logical channel is defined as a
+ * combination of an input (memory to IPU), output (IPU to memory), and/or
+ * secondary input IDMA channels and in some cases an Image Converter task.
+ * Some channels consist of only an input or output.
+ */
+typedef enum {
+ CHAN_NONE = -1,
+ MEM_ROT_ENC_MEM = _MAKE_CHAN(1, 45, NO_DMA, NO_DMA, 48),
+ MEM_ROT_VF_MEM = _MAKE_CHAN(2, 46, NO_DMA, NO_DMA, 49),
+ MEM_ROT_PP_MEM = _MAKE_CHAN(3, 47, NO_DMA, NO_DMA, 50),
+
+ MEM_PRP_ENC_MEM = _MAKE_CHAN(4, 12, 14, 17, 20),
+ MEM_PRP_VF_MEM = _MAKE_CHAN(5, 12, 14, 17, 21),
+ MEM_PP_MEM = _MAKE_CHAN(6, 11, 15, 18, 22),
+
+ MEM_DC_SYNC = _MAKE_CHAN(7, 28, NO_DMA, NO_DMA, NO_DMA),
+ MEM_DC_ASYNC = _MAKE_CHAN(8, 41, NO_DMA, NO_DMA, NO_DMA),
+ MEM_BG_SYNC = _MAKE_CHAN(9, 23, NO_DMA, 51, NO_DMA),
+ MEM_FG_SYNC = _MAKE_CHAN(10, 27, NO_DMA, 31, NO_DMA),
+
+ MEM_BG_ASYNC0 = _MAKE_CHAN(11, 24, NO_DMA, 52, NO_DMA),
+ MEM_FG_ASYNC0 = _MAKE_CHAN(12, 29, NO_DMA, 33, NO_DMA),
+ MEM_BG_ASYNC1 = _MAKE_ALT_CHAN(MEM_BG_ASYNC0),
+ MEM_FG_ASYNC1 = _MAKE_ALT_CHAN(MEM_FG_ASYNC0),
+
+ DIRECT_ASYNC0 = _MAKE_CHAN(13, NO_DMA, NO_DMA, NO_DMA, NO_DMA),
+ DIRECT_ASYNC1 = _MAKE_CHAN(14, NO_DMA, NO_DMA, NO_DMA, NO_DMA),
+
+ CSI_MEM0 = _MAKE_CHAN(15, NO_DMA, NO_DMA, NO_DMA, 0),
+ CSI_MEM1 = _MAKE_CHAN(16, NO_DMA, NO_DMA, NO_DMA, 1),
+ CSI_MEM2 = _MAKE_CHAN(17, NO_DMA, NO_DMA, NO_DMA, 2),
+ CSI_MEM3 = _MAKE_CHAN(18, NO_DMA, NO_DMA, NO_DMA, 3),
+
+ CSI_MEM = CSI_MEM0,
+
+ CSI_PRP_ENC_MEM = _MAKE_CHAN(19, NO_DMA, NO_DMA, NO_DMA, 20),
+ CSI_PRP_VF_MEM = _MAKE_CHAN(20, NO_DMA, NO_DMA, NO_DMA, 21),
+
+ /* for vdi mem->vdi->ic->mem , add graphics plane and alpha*/
+ MEM_VDI_PRP_VF_MEM_P = _MAKE_CHAN(21, 8, 14, 17, 21),
+ MEM_VDI_PRP_VF_MEM = _MAKE_CHAN(22, 9, 14, 17, 21),
+ MEM_VDI_PRP_VF_MEM_N = _MAKE_CHAN(23, 10, 14, 17, 21),
+
+ /* for vdi mem->vdi->mem */
+ MEM_VDI_MEM_P = _MAKE_CHAN(24, 8, NO_DMA, NO_DMA, 5),
+ MEM_VDI_MEM = _MAKE_CHAN(25, 9, NO_DMA, NO_DMA, 5),
+ MEM_VDI_MEM_N = _MAKE_CHAN(26, 10, NO_DMA, NO_DMA, 5),
+
+ /* fake channel for vdoa to link with IPU */
+ MEM_VDOA_MEM = _MAKE_CHAN(27, NO_DMA, NO_DMA, NO_DMA, NO_DMA),
+
+ MEM_PP_ADC = CHAN_NONE,
+ ADC_SYS2 = CHAN_NONE,
+
+} ipu_channel_t;
+
+/*!
+ * Enumeration of types of buffers for a logical channel.
+ */
+typedef enum {
+ IPU_OUTPUT_BUFFER = 0, /*!< Buffer for output from IPU */
+ IPU_ALPHA_IN_BUFFER = 1, /*!< Buffer for input to IPU */
+ IPU_GRAPH_IN_BUFFER = 2, /*!< Buffer for input to IPU */
+ IPU_VIDEO_IN_BUFFER = 3, /*!< Buffer for input to IPU */
+ IPU_INPUT_BUFFER = IPU_VIDEO_IN_BUFFER,
+ IPU_SEC_INPUT_BUFFER = IPU_GRAPH_IN_BUFFER,
+} ipu_buffer_t;
+
+#define IPU_PANEL_SERIAL 1
+#define IPU_PANEL_PARALLEL 2
+
+/*!
+ * Enumeration of ADC channel operation mode.
+ */
+typedef enum {
+ Disable,
+ WriteTemplateNonSeq,
+ ReadTemplateNonSeq,
+ WriteTemplateUnCon,
+ ReadTemplateUnCon,
+ WriteDataWithRS,
+ WriteDataWoRS,
+ WriteCmd
+} mcu_mode_t;
+
+/*!
+ * Enumeration of ADC channel addressing mode.
+ */
+typedef enum {
+ FullWoBE,
+ FullWithBE,
+ XY
+} display_addressing_t;
+
+/*!
+ * Union of initialization parameters for a logical channel.
+ */
+typedef union {
+ struct {
+ uint32_t csi;
+ uint32_t mipi_id;
+ uint32_t mipi_vc;
+ bool mipi_en;
+ bool interlaced;
+ } csi_mem;
+ struct {
+ uint32_t in_width;
+ uint32_t in_height;
+ uint32_t in_pixel_fmt;
+ uint32_t out_width;
+ uint32_t out_height;
+ uint32_t out_pixel_fmt;
+ uint32_t outh_resize_ratio;
+ uint32_t outv_resize_ratio;
+ uint32_t csi;
+ uint32_t mipi_id;
+ uint32_t mipi_vc;
+ bool mipi_en;
+ } csi_prp_enc_mem;
+ struct {
+ uint32_t in_width;
+ uint32_t in_height;
+ uint32_t in_pixel_fmt;
+ uint32_t out_width;
+ uint32_t out_height;
+ uint32_t out_pixel_fmt;
+ uint32_t outh_resize_ratio;
+ uint32_t outv_resize_ratio;
+ } mem_prp_enc_mem;
+ struct {
+ uint32_t in_width;
+ uint32_t in_height;
+ uint32_t in_pixel_fmt;
+ uint32_t out_width;
+ uint32_t out_height;
+ uint32_t out_pixel_fmt;
+ } mem_rot_enc_mem;
+ struct {
+ uint32_t in_width;
+ uint32_t in_height;
+ uint32_t in_pixel_fmt;
+ uint32_t out_width;
+ uint32_t out_height;
+ uint32_t out_pixel_fmt;
+ uint32_t outh_resize_ratio;
+ uint32_t outv_resize_ratio;
+ bool graphics_combine_en;
+ bool global_alpha_en;
+ bool key_color_en;
+ uint32_t in_g_pixel_fmt;
+ uint8_t alpha;
+ uint32_t key_color;
+ bool alpha_chan_en;
+ ipu_motion_sel motion_sel;
+ enum v4l2_field field_fmt;
+ uint32_t csi;
+ uint32_t mipi_id;
+ uint32_t mipi_vc;
+ bool mipi_en;
+ } csi_prp_vf_mem;
+ struct {
+ uint32_t in_width;
+ uint32_t in_height;
+ uint32_t in_pixel_fmt;
+ uint32_t out_width;
+ uint32_t out_height;
+ uint32_t out_pixel_fmt;
+ bool graphics_combine_en;
+ bool global_alpha_en;
+ bool key_color_en;
+ display_port_t disp;
+ uint32_t out_left;
+ uint32_t out_top;
+ } csi_prp_vf_adc;
+ struct {
+ uint32_t in_width;
+ uint32_t in_height;
+ uint32_t in_pixel_fmt;
+ uint32_t out_width;
+ uint32_t out_height;
+ uint32_t out_pixel_fmt;
+ uint32_t outh_resize_ratio;
+ uint32_t outv_resize_ratio;
+ bool graphics_combine_en;
+ bool global_alpha_en;
+ bool key_color_en;
+ uint32_t in_g_pixel_fmt;
+ uint8_t alpha;
+ uint32_t key_color;
+ bool alpha_chan_en;
+ ipu_motion_sel motion_sel;
+ enum v4l2_field field_fmt;
+ } mem_prp_vf_mem;
+ struct {
+ uint32_t temp;
+ } mem_prp_vf_adc;
+ struct {
+ uint32_t temp;
+ } mem_rot_vf_mem;
+ struct {
+ uint32_t in_width;
+ uint32_t in_height;
+ uint32_t in_pixel_fmt;
+ uint32_t out_width;
+ uint32_t out_height;
+ uint32_t out_pixel_fmt;
+ uint32_t outh_resize_ratio;
+ uint32_t outv_resize_ratio;
+ bool graphics_combine_en;
+ bool global_alpha_en;
+ bool key_color_en;
+ uint32_t in_g_pixel_fmt;
+ uint8_t alpha;
+ uint32_t key_color;
+ bool alpha_chan_en;
+ } mem_pp_mem;
+ struct {
+ uint32_t temp;
+ } mem_rot_mem;
+ struct {
+ uint32_t in_width;
+ uint32_t in_height;
+ uint32_t in_pixel_fmt;
+ uint32_t out_width;
+ uint32_t out_height;
+ uint32_t out_pixel_fmt;
+ bool graphics_combine_en;
+ bool global_alpha_en;
+ bool key_color_en;
+ display_port_t disp;
+ uint32_t out_left;
+ uint32_t out_top;
+ } mem_pp_adc;
+ struct {
+ uint32_t di;
+ bool interlaced;
+ uint32_t in_pixel_fmt;
+ uint32_t out_pixel_fmt;
+ } mem_dc_sync;
+ struct {
+ uint32_t temp;
+ } mem_sdc_fg;
+ struct {
+ uint32_t di;
+ bool interlaced;
+ uint32_t in_pixel_fmt;
+ uint32_t out_pixel_fmt;
+ bool alpha_chan_en;
+ } mem_dp_bg_sync;
+ struct {
+ uint32_t temp;
+ } mem_sdc_bg;
+ struct {
+ uint32_t di;
+ bool interlaced;
+ uint32_t in_pixel_fmt;
+ uint32_t out_pixel_fmt;
+ bool alpha_chan_en;
+ } mem_dp_fg_sync;
+ struct {
+ uint32_t di;
+ } direct_async;
+ struct {
+ display_port_t disp;
+ mcu_mode_t ch_mode;
+ uint32_t out_left;
+ uint32_t out_top;
+ } adc_sys1;
+ struct {
+ display_port_t disp;
+ mcu_mode_t ch_mode;
+ uint32_t out_left;
+ uint32_t out_top;
+ } adc_sys2;
+} ipu_channel_params_t;
+
+/*
+ * IPU_IRQF_ONESHOT - Interrupt is not reenabled after the irq handler finished.
+ */
+#define IPU_IRQF_NONE 0x00000000
+#define IPU_IRQF_ONESHOT 0x00000001
+
+/*!
+ * Enumeration of IPU interrupt sources.
+ */
+enum ipu_irq_line {
+ IPU_IRQ_CSI0_OUT_EOF = 0,
+ IPU_IRQ_CSI1_OUT_EOF = 1,
+ IPU_IRQ_CSI2_OUT_EOF = 2,
+ IPU_IRQ_CSI3_OUT_EOF = 3,
+ IPU_IRQ_VDIC_OUT_EOF = 5,
+ IPU_IRQ_VDI_P_IN_EOF = 8,
+ IPU_IRQ_VDI_C_IN_EOF = 9,
+ IPU_IRQ_VDI_N_IN_EOF = 10,
+ IPU_IRQ_PP_IN_EOF = 11,
+ IPU_IRQ_PRP_IN_EOF = 12,
+ IPU_IRQ_PRP_GRAPH_IN_EOF = 14,
+ IPU_IRQ_PP_GRAPH_IN_EOF = 15,
+ IPU_IRQ_PRP_ALPHA_IN_EOF = 17,
+ IPU_IRQ_PP_ALPHA_IN_EOF = 18,
+ IPU_IRQ_PRP_ENC_OUT_EOF = 20,
+ IPU_IRQ_PRP_VF_OUT_EOF = 21,
+ IPU_IRQ_PP_OUT_EOF = 22,
+ IPU_IRQ_BG_SYNC_EOF = 23,
+ IPU_IRQ_BG_ASYNC_EOF = 24,
+ IPU_IRQ_FG_SYNC_EOF = 27,
+ IPU_IRQ_DC_SYNC_EOF = 28,
+ IPU_IRQ_FG_ASYNC_EOF = 29,
+ IPU_IRQ_FG_ALPHA_SYNC_EOF = 31,
+
+ IPU_IRQ_FG_ALPHA_ASYNC_EOF = 33,
+ IPU_IRQ_DC_READ_EOF = 40,
+ IPU_IRQ_DC_ASYNC_EOF = 41,
+ IPU_IRQ_DC_CMD1_EOF = 42,
+ IPU_IRQ_DC_CMD2_EOF = 43,
+ IPU_IRQ_DC_MASK_EOF = 44,
+ IPU_IRQ_PRP_ENC_ROT_IN_EOF = 45,
+ IPU_IRQ_PRP_VF_ROT_IN_EOF = 46,
+ IPU_IRQ_PP_ROT_IN_EOF = 47,
+ IPU_IRQ_PRP_ENC_ROT_OUT_EOF = 48,
+ IPU_IRQ_PRP_VF_ROT_OUT_EOF = 49,
+ IPU_IRQ_PP_ROT_OUT_EOF = 50,
+ IPU_IRQ_BG_ALPHA_SYNC_EOF = 51,
+ IPU_IRQ_BG_ALPHA_ASYNC_EOF = 52,
+
+ IPU_IRQ_BG_SYNC_NFACK = 64 + 23,
+ IPU_IRQ_FG_SYNC_NFACK = 64 + 27,
+ IPU_IRQ_DC_SYNC_NFACK = 64 + 28,
+
+ IPU_IRQ_DP_SF_START = 448 + 2,
+ IPU_IRQ_DP_SF_END = 448 + 3,
+ IPU_IRQ_BG_SF_END = IPU_IRQ_DP_SF_END,
+ IPU_IRQ_DC_FC_0 = 448 + 8,
+ IPU_IRQ_DC_FC_1 = 448 + 9,
+ IPU_IRQ_DC_FC_2 = 448 + 10,
+ IPU_IRQ_DC_FC_3 = 448 + 11,
+ IPU_IRQ_DC_FC_4 = 448 + 12,
+ IPU_IRQ_DC_FC_6 = 448 + 13,
+ IPU_IRQ_VSYNC_PRE_0 = 448 + 14,
+ IPU_IRQ_VSYNC_PRE_1 = 448 + 15,
+
+ IPU_IRQ_COUNT
+};
+
+/*!
+ * Bitfield of Display Interface signal polarities.
+ */
+typedef struct {
+ unsigned datamask_en:1;
+ unsigned int_clk:1;
+ unsigned interlaced:1;
+ unsigned odd_field_first:1;
+ unsigned clksel_en:1;
+ unsigned clkidle_en:1;
+ unsigned data_pol:1; /* true = inverted */
+ unsigned clk_pol:1; /* true = rising edge */
+ unsigned enable_pol:1;
+ unsigned Hsync_pol:1; /* true = active high */
+ unsigned Vsync_pol:1;
+} ipu_di_signal_cfg_t;
+
+/*!
+ * Bitfield of CSI signal polarities and modes.
+ */
+
+typedef struct {
+ unsigned data_width:4;
+ unsigned clk_mode:3;
+ unsigned ext_vsync:1;
+ unsigned Vsync_pol:1;
+ unsigned Hsync_pol:1;
+ unsigned pixclk_pol:1;
+ unsigned data_pol:1;
+ unsigned sens_clksrc:1;
+ unsigned pack_tight:1;
+ unsigned force_eof:1;
+ unsigned data_en_pol:1;
+ unsigned data_fmt;
+ unsigned csi;
+ unsigned mclk;
+} ipu_csi_signal_cfg_t;
+
+/*!
+ * Enumeration of CSI data bus widths.
+ */
+enum {
+ IPU_CSI_DATA_WIDTH_4 = 0,
+ IPU_CSI_DATA_WIDTH_8 = 1,
+ IPU_CSI_DATA_WIDTH_10 = 3,
+ IPU_CSI_DATA_WIDTH_16 = 9,
+};
+
+/*!
+ * Enumeration of CSI clock modes.
+ */
+enum {
+ IPU_CSI_CLK_MODE_GATED_CLK,
+ IPU_CSI_CLK_MODE_NONGATED_CLK,
+ IPU_CSI_CLK_MODE_CCIR656_PROGRESSIVE,
+ IPU_CSI_CLK_MODE_CCIR656_INTERLACED,
+ IPU_CSI_CLK_MODE_CCIR1120_PROGRESSIVE_DDR,
+ IPU_CSI_CLK_MODE_CCIR1120_PROGRESSIVE_SDR,
+ IPU_CSI_CLK_MODE_CCIR1120_INTERLACED_DDR,
+ IPU_CSI_CLK_MODE_CCIR1120_INTERLACED_SDR,
+};
+
+enum {
+ IPU_CSI_MIPI_DI0,
+ IPU_CSI_MIPI_DI1,
+ IPU_CSI_MIPI_DI2,
+ IPU_CSI_MIPI_DI3,
+};
+
+typedef enum {
+ RGB,
+ YCbCr,
+ YUV
+} ipu_color_space_t;
+
+/*!
+ * Enumeration of ADC vertical sync mode.
+ */
+typedef enum {
+ VsyncNone,
+ VsyncInternal,
+ VsyncCSI,
+ VsyncExternal
+} vsync_t;
+
+typedef enum {
+ DAT,
+ CMD
+} cmddata_t;
+
+/*!
+ * Enumeration of ADC display update mode.
+ */
+typedef enum {
+ IPU_ADC_REFRESH_NONE,
+ IPU_ADC_AUTO_REFRESH,
+ IPU_ADC_AUTO_REFRESH_SNOOP,
+ IPU_ADC_SNOOPING,
+} ipu_adc_update_mode_t;
+
+/*!
+ * Enumeration of ADC display interface types (serial or parallel).
+ */
+enum {
+ IPU_ADC_IFC_MODE_SYS80_TYPE1,
+ IPU_ADC_IFC_MODE_SYS80_TYPE2,
+ IPU_ADC_IFC_MODE_SYS68K_TYPE1,
+ IPU_ADC_IFC_MODE_SYS68K_TYPE2,
+ IPU_ADC_IFC_MODE_3WIRE_SERIAL,
+ IPU_ADC_IFC_MODE_4WIRE_SERIAL,
+ IPU_ADC_IFC_MODE_5WIRE_SERIAL_CLK,
+ IPU_ADC_IFC_MODE_5WIRE_SERIAL_CS,
+};
+
+enum {
+ IPU_ADC_IFC_WIDTH_8,
+ IPU_ADC_IFC_WIDTH_16,
+};
+
+/*!
+ * Enumeration of ADC display interface burst mode.
+ */
+enum {
+ IPU_ADC_BURST_WCS,
+ IPU_ADC_BURST_WBLCK,
+ IPU_ADC_BURST_NONE,
+ IPU_ADC_BURST_SERIAL,
+};
+
+/*!
+ * Enumeration of ADC display interface RW signal timing modes.
+ */
+enum {
+ IPU_ADC_SER_NO_RW,
+ IPU_ADC_SER_RW_BEFORE_RS,
+ IPU_ADC_SER_RW_AFTER_RS,
+};
+
+/*!
+ * Bitfield of ADC signal polarities and modes.
+ */
+typedef struct {
+ unsigned data_pol:1;
+ unsigned clk_pol:1;
+ unsigned cs_pol:1;
+ unsigned rs_pol:1;
+ unsigned addr_pol:1;
+ unsigned read_pol:1;
+ unsigned write_pol:1;
+ unsigned Vsync_pol:1;
+ unsigned burst_pol:1;
+ unsigned burst_mode:2;
+ unsigned ifc_mode:3;
+ unsigned ifc_width:5;
+ unsigned ser_preamble_len:4;
+ unsigned ser_preamble:8;
+ unsigned ser_rw_mode:2;
+} ipu_adc_sig_cfg_t;
+
+/*!
+ * Enumeration of ADC template commands.
+ */
+enum {
+ RD_DATA,
+ RD_ACK,
+ RD_WAIT,
+ WR_XADDR,
+ WR_YADDR,
+ WR_ADDR,
+ WR_CMND,
+ WR_DATA,
+};
+
+/*!
+ * Enumeration of ADC template command flow control.
+ */
+enum {
+ SINGLE_STEP,
+ PAUSE,
+ STOP,
+};
+
+
+/*Define template constants*/
+#define ATM_ADDR_RANGE 0x20 /*offset address of DISP */
+#define TEMPLATE_BUF_SIZE 0x20 /*size of template */
+
+/*!
+ * Define to create ADC template command entry.
+ */
+#define ipu_adc_template_gen(oc, rs, fc, dat) (((rs) << 29) | ((fc) << 27) | \
+ ((oc) << 24) | (dat))
+
+typedef struct {
+ u32 reg;
+ u32 value;
+} ipu_lpmc_reg_t;
+
+#define IPU_LPMC_REG_READ 0x80000000L
+
+#define CSI_MCLK_VF 1
+#define CSI_MCLK_ENC 2
+#define CSI_MCLK_RAW 4
+#define CSI_MCLK_I2C 8
+
+struct ipu_soc;
+/* Common IPU API */
+struct ipu_soc *ipu_get_soc(int id);
+int32_t ipu_init_channel(struct ipu_soc *ipu, ipu_channel_t channel, ipu_channel_params_t *params);
+void ipu_uninit_channel(struct ipu_soc *ipu, ipu_channel_t channel);
+void ipu_disable_hsp_clk(struct ipu_soc *ipu);
+
+static inline bool ipu_can_rotate_in_place(ipu_rotate_mode_t rot)
+{
+#ifdef CONFIG_MXC_IPU_V3D
+ return (rot < IPU_ROTATE_HORIZ_FLIP);
+#else
+ return (rot < IPU_ROTATE_90_RIGHT);
+#endif
+}
+
+int32_t ipu_init_channel_buffer(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type,
+ uint32_t pixel_fmt,
+ uint16_t width, uint16_t height,
+ uint32_t stride,
+ ipu_rotate_mode_t rot_mode,
+ dma_addr_t phyaddr_0, dma_addr_t phyaddr_1,
+ dma_addr_t phyaddr_2,
+ uint32_t u_offset, uint32_t v_offset);
+
+int32_t ipu_update_channel_buffer(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type,
+ uint32_t bufNum, dma_addr_t phyaddr);
+
+int32_t ipu_update_channel_offset(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type,
+ uint32_t pixel_fmt,
+ uint16_t width, uint16_t height,
+ uint32_t stride,
+ uint32_t u, uint32_t v,
+ uint32_t vertical_offset, uint32_t horizontal_offset);
+
+int32_t ipu_get_channel_offset(uint32_t pixel_fmt,
+ uint16_t width, uint16_t height,
+ uint32_t stride,
+ uint32_t u, uint32_t v,
+ uint32_t vertical_offset, uint32_t horizontal_offset,
+ uint32_t *u_offset, uint32_t *v_offset);
+
+int32_t ipu_select_buffer(struct ipu_soc *ipu, ipu_channel_t channel,
+ ipu_buffer_t type, uint32_t bufNum);
+int32_t ipu_select_multi_vdi_buffer(struct ipu_soc *ipu, uint32_t bufNum);
+
+int32_t ipu_link_channels(struct ipu_soc *ipu, ipu_channel_t src_ch, ipu_channel_t dest_ch);
+int32_t ipu_unlink_channels(struct ipu_soc *ipu, ipu_channel_t src_ch, ipu_channel_t dest_ch);
+
+int32_t ipu_is_channel_busy(struct ipu_soc *ipu, ipu_channel_t channel);
+int32_t ipu_check_buffer_ready(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type,
+ uint32_t bufNum);
+void ipu_clear_buffer_ready(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type,
+ uint32_t bufNum);
+uint32_t ipu_get_cur_buffer_idx(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type);
+int32_t ipu_enable_channel(struct ipu_soc *ipu, ipu_channel_t channel);
+int32_t ipu_disable_channel(struct ipu_soc *ipu, ipu_channel_t channel, bool wait_for_stop);
+int32_t ipu_swap_channel(struct ipu_soc *ipu, ipu_channel_t from_ch, ipu_channel_t to_ch);
+uint32_t ipu_channel_status(struct ipu_soc *ipu, ipu_channel_t channel);
+
+int32_t ipu_enable_csi(struct ipu_soc *ipu, uint32_t csi);
+int32_t ipu_disable_csi(struct ipu_soc *ipu, uint32_t csi);
+
+int ipu_lowpwr_display_enable(void);
+int ipu_lowpwr_display_disable(void);
+
+int ipu_enable_irq(struct ipu_soc *ipu, uint32_t irq);
+void ipu_disable_irq(struct ipu_soc *ipu, uint32_t irq);
+void ipu_clear_irq(struct ipu_soc *ipu, uint32_t irq);
+int ipu_request_irq(struct ipu_soc *ipu, uint32_t irq,
+ irqreturn_t(*handler) (int, void *),
+ uint32_t irq_flags, const char *devname, void *dev_id);
+void ipu_free_irq(struct ipu_soc *ipu, uint32_t irq, void *dev_id);
+bool ipu_get_irq_status(struct ipu_soc *ipu, uint32_t irq);
+void ipu_set_csc_coefficients(struct ipu_soc *ipu, ipu_channel_t channel, int32_t param[][3]);
+int32_t ipu_set_channel_bandmode(struct ipu_soc *ipu, ipu_channel_t channel,
+ ipu_buffer_t type, uint32_t band_height);
+
+/* two stripe calculations */
+struct stripe_param{
+ unsigned int input_width; /* width of the input stripe */
+ unsigned int output_width; /* width of the output stripe */
+ unsigned int input_column; /* the first column on the input stripe */
+ unsigned int output_column; /* the first column on the output stripe */
+ unsigned int idr;
+ /* inverse downisizing ratio parameter; expressed as a power of 2 */
+ unsigned int irr;
+ /* inverse resizing ratio parameter; expressed as a multiple of 2^-13 */
+};
+int ipu_calc_stripes_sizes(const unsigned int input_frame_width,
+ unsigned int output_frame_width,
+ const unsigned int maximal_stripe_width,
+ const unsigned long long cirr,
+ const unsigned int equal_stripes,
+ u32 input_pixelformat,
+ u32 output_pixelformat,
+ struct stripe_param *left,
+ struct stripe_param *right);
+
+/* SDC API */
+int32_t ipu_init_sync_panel(struct ipu_soc *ipu, int disp,
+ uint32_t pixel_clk,
+ uint16_t width, uint16_t height,
+ uint32_t pixel_fmt,
+ uint16_t h_start_width, uint16_t h_sync_width,
+ uint16_t h_end_width, uint16_t v_start_width,
+ uint16_t v_sync_width, uint16_t v_end_width,
+ uint32_t v_to_h_sync, ipu_di_signal_cfg_t sig);
+
+void ipu_uninit_sync_panel(struct ipu_soc *ipu, int disp);
+
+int32_t ipu_disp_set_window_pos(struct ipu_soc *ipu, ipu_channel_t channel, int16_t x_pos,
+ int16_t y_pos);
+int32_t ipu_disp_get_window_pos(struct ipu_soc *ipu, ipu_channel_t channel, int16_t *x_pos,
+ int16_t *y_pos);
+int32_t ipu_disp_set_global_alpha(struct ipu_soc *ipu, ipu_channel_t channel, bool enable,
+ uint8_t alpha);
+int32_t ipu_disp_set_color_key(struct ipu_soc *ipu, ipu_channel_t channel, bool enable,
+ uint32_t colorKey);
+int32_t ipu_disp_set_gamma_correction(struct ipu_soc *ipu, ipu_channel_t channel, bool enable,
+ int constk[], int slopek[]);
+
+int ipu_init_async_panel(struct ipu_soc *ipu, int disp, int type, uint32_t cycle_time,
+ uint32_t pixel_fmt, ipu_adc_sig_cfg_t sig);
+void ipu_reset_disp_panel(struct ipu_soc *ipu);
+
+/* CMOS Sensor Interface API */
+int32_t ipu_csi_init_interface(struct ipu_soc *ipu, uint16_t width, uint16_t height,
+ uint32_t pixel_fmt, ipu_csi_signal_cfg_t sig);
+
+int32_t ipu_csi_get_sensor_protocol(struct ipu_soc *ipu, uint32_t csi);
+
+int32_t ipu_csi_enable_mclk(struct ipu_soc *ipu, int src, bool flag, bool wait);
+
+static inline int32_t ipu_csi_enable_mclk_if(struct ipu_soc *ipu, int src, uint32_t csi,
+ bool flag, bool wait)
+{
+ return ipu_csi_enable_mclk(ipu, csi, flag, wait);
+}
+
+int ipu_csi_read_mclk_flag(void);
+
+void ipu_csi_flash_strobe(bool flag);
+
+void ipu_csi_get_window_size(struct ipu_soc *ipu, uint32_t *width, uint32_t *height, uint32_t csi);
+
+void ipu_csi_set_window_size(struct ipu_soc *ipu, uint32_t width, uint32_t height, uint32_t csi);
+
+void ipu_csi_set_window_pos(struct ipu_soc *ipu, uint32_t left, uint32_t top, uint32_t csi);
+
+uint32_t bytes_per_pixel(uint32_t fmt);
+
+bool ipu_ch_param_bad_alpha_pos(uint32_t fmt);
+int ipu_ch_param_get_axi_id(struct ipu_soc *ipu, ipu_channel_t channel, ipu_buffer_t type);
+ipu_color_space_t format_to_colorspace(uint32_t fmt);
+bool ipu_pixel_format_is_gpu_tile(uint32_t fmt);
+bool ipu_pixel_format_is_split_gpu_tile(uint32_t fmt);
+bool ipu_pixel_format_is_pre_yuv(uint32_t fmt);
+bool ipu_pixel_format_is_multiplanar_yuv(uint32_t fmt);
+
+struct ipuv3_fb_platform_data {
+ char disp_dev[32];
+ u32 interface_pix_fmt;
+ char *mode_str;
+ int default_bpp;
+ bool int_clk;
+
+ /* reserved mem */
+ resource_size_t res_base[2];
+ resource_size_t res_size[2];
+
+ /*
+ * Late init to avoid display channel being
+ * re-initialized as we've probably setup the
+ * channel in bootloader.
+ */
+ bool late_init;
+
+ /* Enable prefetch engine or not? */
+ bool prefetch;
+
+ /* Enable the PRE resolve engine or not? */
+ bool resolve;
+};
+
+#endif /* __LINUX_IPU_V3_H_ */
diff --git a/include/linux/ipu.h b/include/linux/ipu.h
new file mode 100644
index 000000000000..1090ac65f24b
--- /dev/null
+++ b/include/linux/ipu.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2005-2015 Freescale Semiconductor, Inc.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU Lesser General
+ * Public License. You may obtain a copy of the GNU Lesser General
+ * Public License Version 2.1 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/lgpl-license.html
+ * http://www.gnu.org/copyleft/lgpl.html
+ */
+
+/*!
+ * @defgroup IPU MXC Image Processing Unit (IPU) Driver
+ */
+/*!
+ * @file linux/ipu.h
+ *
+ * @brief This file contains the IPU driver API declarations.
+ *
+ * @ingroup IPU
+ */
+
+#ifndef __LINUX_IPU_H__
+#define __LINUX_IPU_H__
+
+#include <linux/interrupt.h>
+#include <uapi/linux/ipu.h>
+
+unsigned int fmt_to_bpp(unsigned int pixelformat);
+cs_t colorspaceofpixel(int fmt);
+int need_csc(int ifmt, int ofmt);
+
+int ipu_queue_task(struct ipu_task *task);
+int ipu_check_task(struct ipu_task *task);
+
+#endif
diff --git a/include/linux/mfd/mxc-hdmi-core.h b/include/linux/mfd/mxc-hdmi-core.h
new file mode 100644
index 000000000000..b2696b951f43
--- /dev/null
+++ b/include/linux/mfd/mxc-hdmi-core.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2011-2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+#ifndef __LINUX_MXC_HDMI_CORE_H_
+#define __LINUX_MXC_HDMI_CORE_H_
+
+#include <video/mxc_edid.h>
+
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+
+#define IRQ_DISABLE_SUCCEED 0
+#define IRQ_DISABLE_FAIL 1
+
+bool hdmi_check_overflow(void);
+
+u8 hdmi_readb(unsigned int reg);
+void hdmi_writeb(u8 value, unsigned int reg);
+void hdmi_mask_writeb(u8 data, unsigned int addr, u8 shift, u8 mask);
+unsigned int hdmi_read4(unsigned int reg);
+void hdmi_write4(unsigned int value, unsigned int reg);
+
+void hdmi_irq_init(void);
+void hdmi_irq_enable(int irq);
+unsigned int hdmi_irq_disable(int irq);
+
+void hdmi_set_sample_rate(unsigned int rate);
+void hdmi_set_dma_mode(unsigned int dma_running);
+void hdmi_init_clk_regenerator(void);
+void hdmi_clk_regenerator_update_pixel_clock(u32 pixclock);
+
+void hdmi_set_edid_cfg(struct mxc_edid_cfg *cfg);
+void hdmi_get_edid_cfg(struct mxc_edid_cfg *cfg);
+
+extern int mxc_hdmi_ipu_id;
+extern int mxc_hdmi_disp_id;
+
+void hdmi_set_registered(int registered);
+int hdmi_get_registered(void);
+int mxc_hdmi_abort_stream(void);
+int mxc_hdmi_register_audio(struct snd_pcm_substream *substream);
+void mxc_hdmi_unregister_audio(struct snd_pcm_substream *substream);
+unsigned int hdmi_set_cable_state(unsigned int state);
+unsigned int hdmi_set_blank_state(unsigned int state);
+int check_hdmi_state(void);
+
+#endif
diff --git a/include/linux/mxc_mlb.h b/include/linux/mxc_mlb.h
new file mode 100644
index 000000000000..d7c792a2bee4
--- /dev/null
+++ b/include/linux/mxc_mlb.h
@@ -0,0 +1,55 @@
+/*
+ * mxc_mlb.h
+ *
+ * Copyright 2008-2013 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#ifndef _MXC_MLB_H
+#define _MXC_MLB_H
+
+/* define IOCTL command */
+#define MLB_DBG_RUNTIME _IO('S', 0x09)
+#define MLB_SET_FPS _IOW('S', 0x10, unsigned int)
+#define MLB_GET_VER _IOR('S', 0x11, unsigned long)
+#define MLB_SET_DEVADDR _IOR('S', 0x12, unsigned char)
+
+/*!
+ * set channel address for each logical channel
+ * the MSB 16bits is for tx channel, the left LSB is for rx channel
+ */
+#define MLB_CHAN_SETADDR _IOW('S', 0x13, unsigned int)
+#define MLB_CHAN_STARTUP _IO('S', 0x14)
+#define MLB_CHAN_SHUTDOWN _IO('S', 0x15)
+#define MLB_CHAN_GETEVENT _IOR('S', 0x16, unsigned long)
+
+#define MLB_SET_ISOC_BLKSIZE_188 _IO('S', 0x17)
+#define MLB_SET_ISOC_BLKSIZE_196 _IO('S', 0x18)
+#define MLB_SET_SYNC_QUAD _IOW('S', 0x19, unsigned int)
+#define MLB_IRQ_ENABLE _IO('S', 0x20)
+#define MLB_IRQ_DISABLE _IO('S', 0x21)
+
+/*!
+ * MLB event define
+ */
+enum {
+ MLB_EVT_TX_PROTO_ERR_CUR = 1 << 0,
+ MLB_EVT_TX_BRK_DETECT_CUR = 1 << 1,
+ MLB_EVT_TX_PROTO_ERR_PREV = 1 << 8,
+ MLB_EVT_TX_BRK_DETECT_PREV = 1 << 9,
+ MLB_EVT_RX_PROTO_ERR_CUR = 1 << 16,
+ MLB_EVT_RX_BRK_DETECT_CUR = 1 << 17,
+ MLB_EVT_RX_PROTO_ERR_PREV = 1 << 24,
+ MLB_EVT_RX_BRK_DETECT_PREV = 1 << 25,
+};
+
+
+#endif /* _MXC_MLB_H */
diff --git a/include/linux/mxc_sim_interface.h b/include/linux/mxc_sim_interface.h
new file mode 100644
index 000000000000..5eae53a59075
--- /dev/null
+++ b/include/linux/mxc_sim_interface.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * 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.
+ */
+#ifndef MXC_SIM_INTERFACE_H
+#define MXC_SIM_INTERFACE_H
+
+#define SIM_ATR_LENGTH_MAX 32
+
+/* Raw ATR SIM_IOCTL_GET_ATR */
+typedef struct {
+ unsigned int size;/* length of ATR received */
+ unsigned char *atr_buffer;/* raw ATR string received */
+ int errval;/* The error vale reported to user space after completing ATR*/
+} sim_atr_t;
+
+/* ISO7816-3 protocols */
+#define SIM_PROTOCOL_T0 1
+#define SIM_PROTOCOL_T1 2
+
+/* Transfer types for SIM_IOCTL_XFER */
+#define SIM_XFER_TYPE_TPDU 1
+#define SIM_XFER_TYPE_PTS 2
+
+typedef struct {
+ unsigned int wwt;
+ unsigned int cwt;
+ unsigned int bwt;
+ unsigned int bgt;
+ unsigned int cgt;
+} sim_timing_t;
+
+/* Transfer data for SIM_IOCTL_XFER */
+typedef struct {
+ unsigned char *xmt_buffer; /* transmit buffer pointer */
+ int xmt_length;/* transmit buffer length */
+ int timeout;/* transfer timeout in milliseconds */
+ int errval;/* The error vale reported to user space after completing transmitting*/
+} sim_xmt_t;
+
+typedef struct {
+ unsigned char *rcv_buffer; /* receive buffer pointer */
+ int rcv_length; /* receive buffer length */
+ int timeout;/* transfer timeout in milliseconds */
+ int errval;/* The error vale reported to user space after receiving*/
+} sim_rcv_t;
+
+typedef struct {
+ unsigned char di;
+ unsigned char fi;
+} sim_baud_t;
+
+/* Interface power states */
+#define SIM_POWER_OFF (0)
+#define SIM_POWER_ON (1)
+
+/* Return values for SIM_IOCTL_GET_PRESENSE */
+#define SIM_PRESENT_REMOVED (0)
+#define SIM_PRESENT_DETECTED (1)
+#define SIM_PRESENT_OPERATIONAL (2)
+
+/* The error value */
+#define SIM_OK (0)
+#define SIM_ERROR_CWT (1 << 0)
+#define SIM_ERROR_BWT (1 << 1)
+#define SIM_ERROR_PARITY (1 << 2)
+#define SIM_ERROR_INVALID_TS (1 << 3)
+#define SIM_ERROR_FRAME (1 << 4)
+#define SIM_ERROR_ATR_TIMEROUT (1 << 5)
+#define SIM_ERROR_NACK_THRESHOLD (1 << 6)
+#define SIM_ERROR_BGT (1 << 7)
+#define SIM_ERROR_ATR_DELAY (1 << 8)
+
+/* Return values for SIM_IOCTL_GET_ERROR */
+#define SIM_E_ACCESS (1)
+#define SIM_E_TPDUSHORT (2)
+#define SIM_E_PTSEMPTY (3)
+#define SIM_E_INVALIDXFERTYPE (4)
+#define SIM_E_INVALIDXMTLENGTH (5)
+#define SIM_E_INVALIDRCVLENGTH (6)
+#define SIM_E_NACK (7)
+#define SIM_E_TIMEOUT (8)
+#define SIM_E_NOCARD (9)
+#define SIM_E_PARAM_FI_INVALID (10)
+#define SIM_E_PARAM_DI_INVALID (11)
+#define SIM_E_PARAM_FBYD_WITHFRACTION (12)
+#define SIM_E_PARAM_FBYD_NOTDIVBY8OR12 (13)
+#define SIM_E_PARAM_DIVISOR_RANGE (14)
+#define SIM_E_MALLOC (15)
+#define SIM_E_IRQ (16)
+#define SIM_E_POWERED_ON (17)
+#define SIM_E_POWERED_OFF (18)
+
+/* ioctl encodings */
+#define SIM_IOCTL_BASE (0xc0)
+#define SIM_IOCTL_GET_PRESENSE _IOR(SIM_IOCTL_BASE, 1, int)
+#define SIM_IOCTL_GET_ATR _IOR(SIM_IOCTL_BASE, 2, sim_atr_t)
+#define SIM_IOCTL_XMT _IOR(SIM_IOCTL_BASE, 3, sim_xmt_t)
+#define SIM_IOCTL_RCV _IOR(SIM_IOCTL_BASE, 4, sim_rcv_t)
+#define SIM_IOCTL_ACTIVATE _IO(SIM_IOCTL_BASE, 5)
+#define SIM_IOCTL_DEACTIVATE _IO(SIM_IOCTL_BASE, 6)
+#define SIM_IOCTL_WARM_RESET _IO(SIM_IOCTL_BASE, 7)
+#define SIM_IOCTL_COLD_RESET _IO(SIM_IOCTL_BASE, 8)
+#define SIM_IOCTL_CARD_LOCK _IO(SIM_IOCTL_BASE, 9)
+#define SIM_IOCTL_CARD_EJECT _IO(SIM_IOCTL_BASE, 10)
+#define SIM_IOCTL_SET_PROTOCOL _IOR(SIM_IOCTL_BASE, 11, unsigned int)
+#define SIM_IOCTL_SET_TIMING _IOR(SIM_IOCTL_BASE, 12, sim_timing_t)
+#define SIM_IOCTL_SET_BAUD _IOR(SIM_IOCTL_BASE, 13, sim_baud_t)
+#define SIM_IOCTL_WAIT _IOR(SIM_IOCTL_BASE, 14, unsigned int)
+
+#endif
diff --git a/include/linux/mxc_vpu.h b/include/linux/mxc_vpu.h
new file mode 100644
index 000000000000..df024698dee7
--- /dev/null
+++ b/include/linux/mxc_vpu.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2004-2013, 2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU Lesser General
+ * Public License. You may obtain a copy of the GNU Lesser General
+ * Public License Version 2.1 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/lgpl-license.html
+ * http://www.gnu.org/copyleft/lgpl.html
+ */
+
+/*!
+ * @defgroup VPU Video Processor Unit Driver
+ */
+
+/*!
+ * @file linux/mxc_vpu.h
+ *
+ * @brief VPU system initialization and file operation definition
+ *
+ * @ingroup VPU
+ */
+
+#ifndef __LINUX_MXC_VPU_H__
+#define __LINUX_MXC_VPU_H__
+
+#include <linux/fs.h>
+
+struct mxc_vpu_platform_data {
+ bool iram_enable;
+ int iram_size;
+ void (*reset) (void);
+ void (*pg) (int);
+};
+
+struct vpu_mem_desc {
+ u32 size;
+ dma_addr_t phy_addr;
+ u32 cpu_addr; /* cpu address to free the dma mem */
+ u32 virt_uaddr; /* virtual user space address */
+};
+
+#define VPU_IOC_MAGIC 'V'
+
+#define VPU_IOC_PHYMEM_ALLOC _IO(VPU_IOC_MAGIC, 0)
+#define VPU_IOC_PHYMEM_FREE _IO(VPU_IOC_MAGIC, 1)
+#define VPU_IOC_WAIT4INT _IO(VPU_IOC_MAGIC, 2)
+#define VPU_IOC_PHYMEM_DUMP _IO(VPU_IOC_MAGIC, 3)
+#define VPU_IOC_REG_DUMP _IO(VPU_IOC_MAGIC, 4)
+#define VPU_IOC_IRAM_SETTING _IO(VPU_IOC_MAGIC, 6)
+#define VPU_IOC_CLKGATE_SETTING _IO(VPU_IOC_MAGIC, 7)
+#define VPU_IOC_GET_WORK_ADDR _IO(VPU_IOC_MAGIC, 8)
+#define VPU_IOC_REQ_VSHARE_MEM _IO(VPU_IOC_MAGIC, 9)
+#define VPU_IOC_SYS_SW_RESET _IO(VPU_IOC_MAGIC, 11)
+#define VPU_IOC_GET_SHARE_MEM _IO(VPU_IOC_MAGIC, 12)
+#define VPU_IOC_QUERY_BITWORK_MEM _IO(VPU_IOC_MAGIC, 13)
+#define VPU_IOC_SET_BITWORK_MEM _IO(VPU_IOC_MAGIC, 14)
+#define VPU_IOC_PHYMEM_CHECK _IO(VPU_IOC_MAGIC, 15)
+#define VPU_IOC_LOCK_DEV _IO(VPU_IOC_MAGIC, 16)
+
+#define BIT_CODE_RUN 0x000
+#define BIT_CODE_DOWN 0x004
+#define BIT_INT_CLEAR 0x00C
+#define BIT_INT_STATUS 0x010
+#define BIT_CUR_PC 0x018
+#define BIT_INT_REASON 0x174
+
+#define MJPEG_PIC_STATUS_REG 0x3004
+#define MBC_SET_SUBBLK_EN 0x4A0
+
+#define BIT_WORK_CTRL_BUF_BASE 0x100
+#define BIT_WORK_CTRL_BUF_REG(i) (BIT_WORK_CTRL_BUF_BASE + i * 4)
+#define BIT_CODE_BUF_ADDR BIT_WORK_CTRL_BUF_REG(0)
+#define BIT_WORK_BUF_ADDR BIT_WORK_CTRL_BUF_REG(1)
+#define BIT_PARA_BUF_ADDR BIT_WORK_CTRL_BUF_REG(2)
+#define BIT_BIT_STREAM_CTRL BIT_WORK_CTRL_BUF_REG(3)
+#define BIT_FRAME_MEM_CTRL BIT_WORK_CTRL_BUF_REG(4)
+#define BIT_BIT_STREAM_PARAM BIT_WORK_CTRL_BUF_REG(5)
+
+#ifndef CONFIG_SOC_IMX6Q
+#define BIT_RESET_CTRL 0x11C
+#else
+#define BIT_RESET_CTRL 0x128
+#endif
+
+/* i could be 0, 1, 2, 3 */
+#define BIT_RD_PTR_BASE 0x120
+#define BIT_RD_PTR_REG(i) (BIT_RD_PTR_BASE + i * 8)
+#define BIT_WR_PTR_REG(i) (BIT_RD_PTR_BASE + i * 8 + 4)
+
+/* i could be 0, 1, 2, 3 */
+#define BIT_FRM_DIS_FLG_BASE (cpu_is_mx51() ? 0x150 : 0x140)
+#define BIT_FRM_DIS_FLG_REG(i) (BIT_FRM_DIS_FLG_BASE + i * 4)
+
+#define BIT_BUSY_FLAG 0x160
+#define BIT_RUN_COMMAND 0x164
+#define BIT_INT_ENABLE 0x170
+
+#define BITVAL_PIC_RUN 8
+
+#define VPU_SLEEP_REG_VALUE 10
+#define VPU_WAKE_REG_VALUE 11
+
+int vl2cc_init(u32 vl2cc_hw_base);
+void vl2cc_enable(void);
+void vl2cc_flush(void);
+void vl2cc_disable(void);
+void vl2cc_cleanup(void);
+
+int vl2cc_init(u32 vl2cc_hw_base);
+void vl2cc_enable(void);
+void vl2cc_flush(void);
+void vl2cc_disable(void);
+void vl2cc_cleanup(void);
+
+#endif
diff --git a/include/uapi/linux/hantrodec.h b/include/uapi/linux/hantrodec.h
new file mode 100644
index 000000000000..4add50e85299
--- /dev/null
+++ b/include/uapi/linux/hantrodec.h
@@ -0,0 +1,93 @@
+/*****************************************************************************
+*
+* The GPL License (GPL)
+*
+* Copyright (c) 2015-2017, VeriSilicon Inc.
+* Copyright (c) 2011-2014, Google Inc.
+*
+* 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.
+*
+*****************************************************************************/
+
+#ifndef _UAPI_HANTRODEC_H_
+#define _UAPI_HANTRODEC_H_
+#include <linux/ioctl.h>
+#include <linux/types.h>
+
+#undef PDEBUG
+#ifdef HANTRODEC_DEBUG
+# ifdef __KERNEL__
+# define PDEBUG(fmt, args...) pr_info("hantrodec: " fmt, ## args)
+# else
+# define PDEBUG(fmt, args...) fprintf(stderr, fmt, ## args)
+# endif
+#else
+# define PDEBUG(fmt, args...)
+#endif
+
+struct core_desc {
+ __u32 id; /* id of the Core */
+ __u32 *regs; /* pointer to user registers */
+ __u32 size; /* size of register space */
+};
+
+/* Use 'k' as magic number */
+#define HANTRODEC_IOC_MAGIC 'k'
+
+/*
+ * S means "Set" through a ptr,
+ * T means "Tell" directly with the argument value
+ * G means "Get": reply by setting through a pointer
+ * Q means "Query": response is on the return value
+ * X means "eXchange": G and S atomically
+ * H means "sHift": T and Q atomically
+ */
+
+#define HANTRODEC_PP_INSTANCE _IO(HANTRODEC_IOC_MAGIC, 1)
+#define HANTRODEC_HW_PERFORMANCE _IO(HANTRODEC_IOC_MAGIC, 2)
+#define HANTRODEC_IOCGHWOFFSET _IOR(HANTRODEC_IOC_MAGIC, 3, unsigned long *)
+#define HANTRODEC_IOCGHWIOSIZE _IOR(HANTRODEC_IOC_MAGIC, 4, unsigned int *)
+
+#define HANTRODEC_IOC_CLI _IO(HANTRODEC_IOC_MAGIC, 5)
+#define HANTRODEC_IOC_STI _IO(HANTRODEC_IOC_MAGIC, 6)
+#define HANTRODEC_IOC_MC_OFFSETS _IOR(HANTRODEC_IOC_MAGIC, 7, unsigned long *)
+#define HANTRODEC_IOC_MC_CORES _IOR(HANTRODEC_IOC_MAGIC, 8, unsigned int *)
+
+
+#define HANTRODEC_IOCS_DEC_PUSH_REG _IOW(HANTRODEC_IOC_MAGIC, 9, struct core_desc *)
+#define HANTRODEC_IOCS_PP_PUSH_REG _IOW(HANTRODEC_IOC_MAGIC, 10, struct core_desc *)
+
+#define HANTRODEC_IOCH_DEC_RESERVE _IO(HANTRODEC_IOC_MAGIC, 11)
+#define HANTRODEC_IOCT_DEC_RELEASE _IO(HANTRODEC_IOC_MAGIC, 12)
+#define HANTRODEC_IOCQ_PP_RESERVE _IO(HANTRODEC_IOC_MAGIC, 13)
+#define HANTRODEC_IOCT_PP_RELEASE _IO(HANTRODEC_IOC_MAGIC, 14)
+
+#define HANTRODEC_IOCX_DEC_WAIT _IOWR(HANTRODEC_IOC_MAGIC, 15, struct core_desc *)
+#define HANTRODEC_IOCX_PP_WAIT _IOWR(HANTRODEC_IOC_MAGIC, 16, struct core_desc *)
+
+#define HANTRODEC_IOCS_DEC_PULL_REG _IOWR(HANTRODEC_IOC_MAGIC, 17, struct core_desc *)
+#define HANTRODEC_IOCS_PP_PULL_REG _IOWR(HANTRODEC_IOC_MAGIC, 18, struct core_desc *)
+
+#define HANTRODEC_IOCG_CORE_WAIT _IOR(HANTRODEC_IOC_MAGIC, 19, int *)
+
+#define HANTRODEC_IOX_ASIC_ID _IOWR(HANTRODEC_IOC_MAGIC, 20, __u32 *)
+
+#define HANTRODEC_IOCG_CORE_ID _IO(HANTRODEC_IOC_MAGIC, 21)
+
+#define HANTRODEC_DEBUG_STATUS _IO(HANTRODEC_IOC_MAGIC, 29)
+
+#define HANTRODEC_IOC_MAXNR 29
+
+#endif /* !_UAPI_HANTRODEC_H_ */
diff --git a/include/uapi/linux/hx280enc.h b/include/uapi/linux/hx280enc.h
new file mode 100755
index 000000000000..d465c25f9f66
--- /dev/null
+++ b/include/uapi/linux/hx280enc.h
@@ -0,0 +1,79 @@
+ /*****************************************************************************
+ * Encoder device driver (kernel module header)
+ *
+ * Copyright (C) 2012 Google Finland Oy.
+ *
+ * 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.
+ *
+--------------------------------------------------------------------------------
+--
+-- Abstract : 6280/7280/8270/8290/H1 Encoder device driver (kernel module)
+--
+*****************************************************************************/
+#ifndef _UAPI_HX280ENC_H_
+#define _UAPI_HX280ENC_H_
+#include <linux/ioctl.h> /* needed for the _IOW etc stuff used later */
+
+/*
+ * Macros to help debugging
+ */
+
+#undef PDEBUG /* undef it, just in case */
+#ifdef HX280ENC_DEBUG
+# ifdef __KERNEL__
+ /* This one if debugging is on, and kernel space */
+# define PDEBUG(fmt, args...) printk(KERN_INFO "hmp4e: " fmt, ## args)
+# else
+ /* This one for user space */
+# define PDEBUG(fmt, args...) printf(__FILE__ ":%d: " fmt, __LINE__, ## args)
+# endif
+#else
+# define PDEBUG(fmt, args...) /* not debugging: nothing */
+#endif
+
+/*
+ * Ioctl definitions
+ */
+
+/* Use 'k' as magic number */
+#define HX280ENC_IOC_MAGIC 'k'
+/*
+ * S means "Set" through a ptr,
+ * T means "Tell" directly with the argument value
+ * G means "Get": reply by setting through a pointer
+ * Q means "Query": response is on the return value
+ * X means "eXchange": G and S atomically
+ * H means "sHift": T and Q atomically
+ */
+ /*
+ * #define HX280ENC_IOCGBUFBUSADDRESS _IOR(HX280ENC_IOC_MAGIC, 1, unsigned long *)
+ * #define HX280ENC_IOCGBUFSIZE _IOR(HX280ENC_IOC_MAGIC, 2, unsigned int *)
+ */
+#define HX280ENC_IOCGHWOFFSET _IOR(HX280ENC_IOC_MAGIC, 3, unsigned long *)
+#define HX280ENC_IOCGHWIOSIZE _IOR(HX280ENC_IOC_MAGIC, 4, unsigned int *)
+#define HX280ENC_IOC_CLI _IO(HX280ENC_IOC_MAGIC, 5)
+#define HX280ENC_IOC_STI _IO(HX280ENC_IOC_MAGIC, 6)
+#define HX280ENC_IOCXVIRT2BUS _IOWR(HX280ENC_IOC_MAGIC, 7, unsigned long *)
+
+#define HX280ENC_IOCHARDRESET _IO(HX280ENC_IOC_MAGIC, 8) /* debugging tool */
+#define HX280ENC_IOCGSRAMOFFSET _IOR(HX280ENC_IOC_MAGIC, 9, unsigned long *)
+#define HX280ENC_IOCGSRAMEIOSIZE _IOR(HX280ENC_IOC_MAGIC, 10, unsigned int *)
+
+#define HX280ENC_IOCH_ENC_RESERVE _IOR(HX280ENC_IOC_MAGIC, 11, unsigned int *)
+#define HX280ENC_IOCH_ENC_RELEASE _IOR(HX280ENC_IOC_MAGIC, 12, unsigned int *)
+#define HX280ENC_IOCG_CORE_WAIT _IOR(HX280ENC_IOC_MAGIC, 13, unsigned int *)
+#define HX280ENC_IOC_MAXNR 30
+
+#endif /* !_UAPI_HX280ENC_H_ */
diff --git a/include/uapi/linux/mxc_mlb.h b/include/uapi/linux/mxc_mlb.h
new file mode 100644
index 000000000000..20ba5240ea51
--- /dev/null
+++ b/include/uapi/linux/mxc_mlb.h
@@ -0,0 +1,55 @@
+/*
+ * mxc_mlb.h
+ *
+ * Copyright 2008-2013 Freescale Semiconductor, Inc. All Rights Reserved.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#ifndef _MXC_MLB_UAPI_H
+#define _MXC_MLB_UAPI_H
+
+/* define IOCTL command */
+#define MLB_DBG_RUNTIME _IO('S', 0x09)
+#define MLB_SET_FPS _IOW('S', 0x10, unsigned int)
+#define MLB_GET_VER _IOR('S', 0x11, unsigned long)
+#define MLB_SET_DEVADDR _IOR('S', 0x12, unsigned char)
+
+/*!
+ * set channel address for each logical channel
+ * the MSB 16bits is for tx channel, the left LSB is for rx channel
+ */
+#define MLB_CHAN_SETADDR _IOW('S', 0x13, unsigned int)
+#define MLB_CHAN_STARTUP _IO('S', 0x14)
+#define MLB_CHAN_SHUTDOWN _IO('S', 0x15)
+#define MLB_CHAN_GETEVENT _IOR('S', 0x16, unsigned long)
+
+#define MLB_SET_ISOC_BLKSIZE_188 _IO('S', 0x17)
+#define MLB_SET_ISOC_BLKSIZE_196 _IO('S', 0x18)
+#define MLB_SET_SYNC_QUAD _IOW('S', 0x19, unsigned int)
+#define MLB_IRQ_ENABLE _IO('S', 0x20)
+#define MLB_IRQ_DISABLE _IO('S', 0x21)
+
+/*!
+ * MLB event define
+ */
+enum {
+ MLB_EVT_TX_PROTO_ERR_CUR = 1 << 0,
+ MLB_EVT_TX_BRK_DETECT_CUR = 1 << 1,
+ MLB_EVT_TX_PROTO_ERR_PREV = 1 << 8,
+ MLB_EVT_TX_BRK_DETECT_PREV = 1 << 9,
+ MLB_EVT_RX_PROTO_ERR_CUR = 1 << 16,
+ MLB_EVT_RX_BRK_DETECT_CUR = 1 << 17,
+ MLB_EVT_RX_PROTO_ERR_PREV = 1 << 24,
+ MLB_EVT_RX_BRK_DETECT_PREV = 1 << 25,
+};
+
+
+#endif /* _MXC_MLB_H */
diff --git a/include/uapi/linux/mxc_sim_interface.h b/include/uapi/linux/mxc_sim_interface.h
new file mode 100644
index 000000000000..9ac3c029ab40
--- /dev/null
+++ b/include/uapi/linux/mxc_sim_interface.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2015 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * 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.
+ */
+#ifndef UAPI_MXC_SIM_INTERFACE_H
+#define UAPI_MXC_SIM_INTERFACE_H
+
+#define SIM_ATR_LENGTH_MAX 32
+
+/* Raw ATR SIM_IOCTL_GET_ATR */
+typedef struct {
+ unsigned int size;/* length of ATR received */
+ unsigned char *atr_buffer;/* raw ATR string received */
+ int errval;/* The error vale reported to user space after completing ATR*/
+} sim_atr_t;
+
+/* ISO7816-3 protocols */
+#define SIM_PROTOCOL_T0 1
+#define SIM_PROTOCOL_T1 2
+
+/* Transfer types for SIM_IOCTL_XFER */
+#define SIM_XFER_TYPE_TPDU 1
+#define SIM_XFER_TYPE_PTS 2
+
+typedef struct {
+ unsigned int wwt;
+ unsigned int cwt;
+ unsigned int bwt;
+ unsigned int bgt;
+ unsigned int cgt;
+} sim_timing_t;
+
+/* Transfer data for SIM_IOCTL_XFER */
+typedef struct {
+ unsigned char *xmt_buffer; /* transmit buffer pointer */
+ int xmt_length;/* transmit buffer length */
+ int timeout;/* transfer timeout in milliseconds */
+ int errval;/* The error vale reported to user space after completing transmitting*/
+} sim_xmt_t;
+
+typedef struct {
+ unsigned char *rcv_buffer; /* receive buffer pointer */
+ int rcv_length; /* receive buffer length */
+ int timeout;/* transfer timeout in milliseconds */
+ int errval;/* The error vale reported to user space after receiving*/
+} sim_rcv_t;
+
+typedef struct {
+ unsigned char di;
+ unsigned char fi;
+} sim_baud_t;
+
+/* Interface power states */
+#define SIM_POWER_OFF (0)
+#define SIM_POWER_ON (1)
+
+/* Return values for SIM_IOCTL_GET_PRESENSE */
+#define SIM_PRESENT_REMOVED (0)
+#define SIM_PRESENT_DETECTED (1)
+#define SIM_PRESENT_OPERATIONAL (2)
+
+/* The error value */
+#define SIM_OK (0)
+#define SIM_ERROR_CWT (1 << 0)
+#define SIM_ERROR_BWT (1 << 1)
+#define SIM_ERROR_PARITY (1 << 2)
+#define SIM_ERROR_INVALID_TS (1 << 3)
+#define SIM_ERROR_FRAME (1 << 4)
+#define SIM_ERROR_ATR_TIMEROUT (1 << 5)
+#define SIM_ERROR_NACK_THRESHOLD (1 << 6)
+#define SIM_ERROR_BGT (1 << 7)
+#define SIM_ERROR_ATR_DELAY (1 << 8)
+
+/* Return values for SIM_IOCTL_GET_ERROR */
+#define SIM_E_ACCESS (1)
+#define SIM_E_TPDUSHORT (2)
+#define SIM_E_PTSEMPTY (3)
+#define SIM_E_INVALIDXFERTYPE (4)
+#define SIM_E_INVALIDXMTLENGTH (5)
+#define SIM_E_INVALIDRCVLENGTH (6)
+#define SIM_E_NACK (7)
+#define SIM_E_TIMEOUT (8)
+#define SIM_E_NOCARD (9)
+#define SIM_E_PARAM_FI_INVALID (10)
+#define SIM_E_PARAM_DI_INVALID (11)
+#define SIM_E_PARAM_FBYD_WITHFRACTION (12)
+#define SIM_E_PARAM_FBYD_NOTDIVBY8OR12 (13)
+#define SIM_E_PARAM_DIVISOR_RANGE (14)
+#define SIM_E_MALLOC (15)
+#define SIM_E_IRQ (16)
+#define SIM_E_POWERED_ON (17)
+#define SIM_E_POWERED_OFF (18)
+
+/* ioctl encodings */
+#define SIM_IOCTL_BASE (0xc0)
+#define SIM_IOCTL_GET_PRESENSE _IOR(SIM_IOCTL_BASE, 1, int)
+#define SIM_IOCTL_GET_ATR _IOR(SIM_IOCTL_BASE, 2, sim_atr_t)
+#define SIM_IOCTL_XMT _IOR(SIM_IOCTL_BASE, 3, sim_xmt_t)
+#define SIM_IOCTL_RCV _IOR(SIM_IOCTL_BASE, 4, sim_rcv_t)
+#define SIM_IOCTL_ACTIVATE _IO(SIM_IOCTL_BASE, 5)
+#define SIM_IOCTL_DEACTIVATE _IO(SIM_IOCTL_BASE, 6)
+#define SIM_IOCTL_WARM_RESET _IO(SIM_IOCTL_BASE, 7)
+#define SIM_IOCTL_COLD_RESET _IO(SIM_IOCTL_BASE, 8)
+#define SIM_IOCTL_CARD_LOCK _IO(SIM_IOCTL_BASE, 9)
+#define SIM_IOCTL_CARD_EJECT _IO(SIM_IOCTL_BASE, 10)
+#define SIM_IOCTL_SET_PROTOCOL _IOR(SIM_IOCTL_BASE, 11, unsigned int)
+#define SIM_IOCTL_SET_TIMING _IOR(SIM_IOCTL_BASE, 12, sim_timing_t)
+#define SIM_IOCTL_SET_BAUD _IOR(SIM_IOCTL_BASE, 13, sim_baud_t)
+#define SIM_IOCTL_WAIT _IOR(SIM_IOCTL_BASE, 14, unsigned int)
+
+#endif
diff --git a/include/video/mxc_hdmi.h b/include/video/mxc_hdmi.h
new file mode 100644
index 000000000000..79eb3024f65c
--- /dev/null
+++ b/include/video/mxc_hdmi.h
@@ -0,0 +1,1015 @@
+/*
+ * Copyright (C) 2011-2015 Freescale Semiconductor, Inc.
+ */
+
+/*
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#ifndef __MXC_HDMI_H__
+#define __MXC_HDMI_H__
+
+/*
+ * Hdmi controller registers
+ */
+
+/* Identification Registers */
+#define HDMI_DESIGN_ID 0x0000
+#define HDMI_REVISION_ID 0x0001
+#define HDMI_PRODUCT_ID0 0x0002
+#define HDMI_PRODUCT_ID1 0x0003
+#define HDMI_CONFIG0_ID 0x0004
+#define HDMI_CONFIG1_ID 0x0005
+#define HDMI_CONFIG2_ID 0x0006
+#define HDMI_CONFIG3_ID 0x0007
+
+/* Interrupt Registers */
+#define HDMI_IH_FC_STAT0 0x0100
+#define HDMI_IH_FC_STAT1 0x0101
+#define HDMI_IH_FC_STAT2 0x0102
+#define HDMI_IH_AS_STAT0 0x0103
+#define HDMI_IH_PHY_STAT0 0x0104
+#define HDMI_IH_I2CM_STAT0 0x0105
+#define HDMI_IH_CEC_STAT0 0x0106
+#define HDMI_IH_VP_STAT0 0x0107
+#define HDMI_IH_I2CMPHY_STAT0 0x0108
+#define HDMI_IH_AHBDMAAUD_STAT0 0x0109
+
+#define HDMI_IH_MUTE_FC_STAT0 0x0180
+#define HDMI_IH_MUTE_FC_STAT1 0x0181
+#define HDMI_IH_MUTE_FC_STAT2 0x0182
+#define HDMI_IH_MUTE_AS_STAT0 0x0183
+#define HDMI_IH_MUTE_PHY_STAT0 0x0184
+#define HDMI_IH_MUTE_I2CM_STAT0 0x0185
+#define HDMI_IH_MUTE_CEC_STAT0 0x0186
+#define HDMI_IH_MUTE_VP_STAT0 0x0187
+#define HDMI_IH_MUTE_I2CMPHY_STAT0 0x0188
+#define HDMI_IH_MUTE_AHBDMAAUD_STAT0 0x0189
+#define HDMI_IH_MUTE 0x01FF
+
+/* Video Sample Registers */
+#define HDMI_TX_INVID0 0x0200
+#define HDMI_TX_INSTUFFING 0x0201
+#define HDMI_TX_GYDATA0 0x0202
+#define HDMI_TX_GYDATA1 0x0203
+#define HDMI_TX_RCRDATA0 0x0204
+#define HDMI_TX_RCRDATA1 0x0205
+#define HDMI_TX_BCBDATA0 0x0206
+#define HDMI_TX_BCBDATA1 0x0207
+
+/* Video Packetizer Registers */
+#define HDMI_VP_STATUS 0x0800
+#define HDMI_VP_PR_CD 0x0801
+#define HDMI_VP_STUFF 0x0802
+#define HDMI_VP_REMAP 0x0803
+#define HDMI_VP_CONF 0x0804
+#define HDMI_VP_STAT 0x0805
+#define HDMI_VP_INT 0x0806
+#define HDMI_VP_MASK 0x0807
+#define HDMI_VP_POL 0x0808
+
+/* Frame Composer Registers */
+#define HDMI_FC_INVIDCONF 0x1000
+#define HDMI_FC_INHACTV0 0x1001
+#define HDMI_FC_INHACTV1 0x1002
+#define HDMI_FC_INHBLANK0 0x1003
+#define HDMI_FC_INHBLANK1 0x1004
+#define HDMI_FC_INVACTV0 0x1005
+#define HDMI_FC_INVACTV1 0x1006
+#define HDMI_FC_INVBLANK 0x1007
+#define HDMI_FC_HSYNCINDELAY0 0x1008
+#define HDMI_FC_HSYNCINDELAY1 0x1009
+#define HDMI_FC_HSYNCINWIDTH0 0x100A
+#define HDMI_FC_HSYNCINWIDTH1 0x100B
+#define HDMI_FC_VSYNCINDELAY 0x100C
+#define HDMI_FC_VSYNCINWIDTH 0x100D
+#define HDMI_FC_INFREQ0 0x100E
+#define HDMI_FC_INFREQ1 0x100F
+#define HDMI_FC_INFREQ2 0x1010
+#define HDMI_FC_CTRLDUR 0x1011
+#define HDMI_FC_EXCTRLDUR 0x1012
+#define HDMI_FC_EXCTRLSPAC 0x1013
+#define HDMI_FC_CH0PREAM 0x1014
+#define HDMI_FC_CH1PREAM 0x1015
+#define HDMI_FC_CH2PREAM 0x1016
+#define HDMI_FC_AVICONF3 0x1017
+#define HDMI_FC_GCP 0x1018
+#define HDMI_FC_AVICONF0 0x1019
+#define HDMI_FC_AVICONF1 0x101A
+#define HDMI_FC_AVICONF2 0x101B
+#define HDMI_FC_AVIVID 0x101C
+#define HDMI_FC_AVIETB0 0x101D
+#define HDMI_FC_AVIETB1 0x101E
+#define HDMI_FC_AVISBB0 0x101F
+#define HDMI_FC_AVISBB1 0x1020
+#define HDMI_FC_AVIELB0 0x1021
+#define HDMI_FC_AVIELB1 0x1022
+#define HDMI_FC_AVISRB0 0x1023
+#define HDMI_FC_AVISRB1 0x1024
+#define HDMI_FC_AUDICONF0 0x1025
+#define HDMI_FC_AUDICONF1 0x1026
+#define HDMI_FC_AUDICONF2 0x1027
+#define HDMI_FC_AUDICONF3 0x1028
+#define HDMI_FC_VSDIEEEID0 0x1029
+#define HDMI_FC_VSDSIZE 0x102A
+#define HDMI_FC_VSDIEEEID1 0x1030
+#define HDMI_FC_VSDIEEEID2 0x1031
+#define HDMI_FC_VSDPAYLOAD0 0x1032
+#define HDMI_FC_VSDPAYLOAD1 0x1033
+#define HDMI_FC_VSDPAYLOAD2 0x1034
+#define HDMI_FC_VSDPAYLOAD3 0x1035
+#define HDMI_FC_VSDPAYLOAD4 0x1036
+#define HDMI_FC_VSDPAYLOAD5 0x1037
+#define HDMI_FC_VSDPAYLOAD6 0x1038
+#define HDMI_FC_VSDPAYLOAD7 0x1039
+#define HDMI_FC_VSDPAYLOAD8 0x103A
+#define HDMI_FC_VSDPAYLOAD9 0x103B
+#define HDMI_FC_VSDPAYLOAD10 0x103C
+#define HDMI_FC_VSDPAYLOAD11 0x103D
+#define HDMI_FC_VSDPAYLOAD12 0x103E
+#define HDMI_FC_VSDPAYLOAD13 0x103F
+#define HDMI_FC_VSDPAYLOAD14 0x1040
+#define HDMI_FC_VSDPAYLOAD15 0x1041
+#define HDMI_FC_VSDPAYLOAD16 0x1042
+#define HDMI_FC_VSDPAYLOAD17 0x1043
+#define HDMI_FC_VSDPAYLOAD18 0x1044
+#define HDMI_FC_VSDPAYLOAD19 0x1045
+#define HDMI_FC_VSDPAYLOAD20 0x1046
+#define HDMI_FC_VSDPAYLOAD21 0x1047
+#define HDMI_FC_VSDPAYLOAD22 0x1048
+#define HDMI_FC_VSDPAYLOAD23 0x1049
+#define HDMI_FC_SPDVENDORNAME0 0x104A
+#define HDMI_FC_SPDVENDORNAME1 0x104B
+#define HDMI_FC_SPDVENDORNAME2 0x104C
+#define HDMI_FC_SPDVENDORNAME3 0x104D
+#define HDMI_FC_SPDVENDORNAME4 0x104E
+#define HDMI_FC_SPDVENDORNAME5 0x104F
+#define HDMI_FC_SPDVENDORNAME6 0x1050
+#define HDMI_FC_SPDVENDORNAME7 0x1051
+#define HDMI_FC_SDPPRODUCTNAME0 0x1052
+#define HDMI_FC_SDPPRODUCTNAME1 0x1053
+#define HDMI_FC_SDPPRODUCTNAME2 0x1054
+#define HDMI_FC_SDPPRODUCTNAME3 0x1055
+#define HDMI_FC_SDPPRODUCTNAME4 0x1056
+#define HDMI_FC_SDPPRODUCTNAME5 0x1057
+#define HDMI_FC_SDPPRODUCTNAME6 0x1058
+#define HDMI_FC_SDPPRODUCTNAME7 0x1059
+#define HDMI_FC_SDPPRODUCTNAME8 0x105A
+#define HDMI_FC_SDPPRODUCTNAME9 0x105B
+#define HDMI_FC_SDPPRODUCTNAME10 0x105C
+#define HDMI_FC_SDPPRODUCTNAME11 0x105D
+#define HDMI_FC_SDPPRODUCTNAME12 0x105E
+#define HDMI_FC_SDPPRODUCTNAME13 0x105F
+#define HDMI_FC_SDPPRODUCTNAME14 0x1060
+#define HDMI_FC_SPDPRODUCTNAME15 0x1061
+#define HDMI_FC_SPDDEVICEINF 0x1062
+#define HDMI_FC_AUDSCONF 0x1063
+#define HDMI_FC_AUDSSTAT 0x1064
+#define HDMI_FC_DATACH0FILL 0x1070
+#define HDMI_FC_DATACH1FILL 0x1071
+#define HDMI_FC_DATACH2FILL 0x1072
+#define HDMI_FC_CTRLQHIGH 0x1073
+#define HDMI_FC_CTRLQLOW 0x1074
+#define HDMI_FC_ACP0 0x1075
+#define HDMI_FC_ACP28 0x1076
+#define HDMI_FC_ACP27 0x1077
+#define HDMI_FC_ACP26 0x1078
+#define HDMI_FC_ACP25 0x1079
+#define HDMI_FC_ACP24 0x107A
+#define HDMI_FC_ACP23 0x107B
+#define HDMI_FC_ACP22 0x107C
+#define HDMI_FC_ACP21 0x107D
+#define HDMI_FC_ACP20 0x107E
+#define HDMI_FC_ACP19 0x107F
+#define HDMI_FC_ACP18 0x1080
+#define HDMI_FC_ACP17 0x1081
+#define HDMI_FC_ACP16 0x1082
+#define HDMI_FC_ACP15 0x1083
+#define HDMI_FC_ACP14 0x1084
+#define HDMI_FC_ACP13 0x1085
+#define HDMI_FC_ACP12 0x1086
+#define HDMI_FC_ACP11 0x1087
+#define HDMI_FC_ACP10 0x1088
+#define HDMI_FC_ACP9 0x1089
+#define HDMI_FC_ACP8 0x108A
+#define HDMI_FC_ACP7 0x108B
+#define HDMI_FC_ACP6 0x108C
+#define HDMI_FC_ACP5 0x108D
+#define HDMI_FC_ACP4 0x108E
+#define HDMI_FC_ACP3 0x108F
+#define HDMI_FC_ACP2 0x1090
+#define HDMI_FC_ACP1 0x1091
+#define HDMI_FC_ISCR1_0 0x1092
+#define HDMI_FC_ISCR1_16 0x1093
+#define HDMI_FC_ISCR1_15 0x1094
+#define HDMI_FC_ISCR1_14 0x1095
+#define HDMI_FC_ISCR1_13 0x1096
+#define HDMI_FC_ISCR1_12 0x1097
+#define HDMI_FC_ISCR1_11 0x1098
+#define HDMI_FC_ISCR1_10 0x1099
+#define HDMI_FC_ISCR1_9 0x109A
+#define HDMI_FC_ISCR1_8 0x109B
+#define HDMI_FC_ISCR1_7 0x109C
+#define HDMI_FC_ISCR1_6 0x109D
+#define HDMI_FC_ISCR1_5 0x109E
+#define HDMI_FC_ISCR1_4 0x109F
+#define HDMI_FC_ISCR1_3 0x10A0
+#define HDMI_FC_ISCR1_2 0x10A1
+#define HDMI_FC_ISCR1_1 0x10A2
+#define HDMI_FC_ISCR2_15 0x10A3
+#define HDMI_FC_ISCR2_14 0x10A4
+#define HDMI_FC_ISCR2_13 0x10A5
+#define HDMI_FC_ISCR2_12 0x10A6
+#define HDMI_FC_ISCR2_11 0x10A7
+#define HDMI_FC_ISCR2_10 0x10A8
+#define HDMI_FC_ISCR2_9 0x10A9
+#define HDMI_FC_ISCR2_8 0x10AA
+#define HDMI_FC_ISCR2_7 0x10AB
+#define HDMI_FC_ISCR2_6 0x10AC
+#define HDMI_FC_ISCR2_5 0x10AD
+#define HDMI_FC_ISCR2_4 0x10AE
+#define HDMI_FC_ISCR2_3 0x10AF
+#define HDMI_FC_ISCR2_2 0x10B0
+#define HDMI_FC_ISCR2_1 0x10B1
+#define HDMI_FC_ISCR2_0 0x10B2
+#define HDMI_FC_DATAUTO0 0x10B3
+#define HDMI_FC_DATAUTO1 0x10B4
+#define HDMI_FC_DATAUTO2 0x10B5
+#define HDMI_FC_DATMAN 0x10B6
+#define HDMI_FC_DATAUTO3 0x10B7
+#define HDMI_FC_RDRB0 0x10B8
+#define HDMI_FC_RDRB1 0x10B9
+#define HDMI_FC_RDRB2 0x10BA
+#define HDMI_FC_RDRB3 0x10BB
+#define HDMI_FC_RDRB4 0x10BC
+#define HDMI_FC_RDRB5 0x10BD
+#define HDMI_FC_RDRB6 0x10BE
+#define HDMI_FC_RDRB7 0x10BF
+#define HDMI_FC_STAT0 0x10D0
+#define HDMI_FC_INT0 0x10D1
+#define HDMI_FC_MASK0 0x10D2
+#define HDMI_FC_POL0 0x10D3
+#define HDMI_FC_STAT1 0x10D4
+#define HDMI_FC_INT1 0x10D5
+#define HDMI_FC_MASK1 0x10D6
+#define HDMI_FC_POL1 0x10D7
+#define HDMI_FC_STAT2 0x10D8
+#define HDMI_FC_INT2 0x10D9
+#define HDMI_FC_MASK2 0x10DA
+#define HDMI_FC_POL2 0x10DB
+#define HDMI_FC_PRCONF 0x10E0
+
+#define HDMI_FC_GMD_STAT 0x1100
+#define HDMI_FC_GMD_EN 0x1101
+#define HDMI_FC_GMD_UP 0x1102
+#define HDMI_FC_GMD_CONF 0x1103
+#define HDMI_FC_GMD_HB 0x1104
+#define HDMI_FC_GMD_PB0 0x1105
+#define HDMI_FC_GMD_PB1 0x1106
+#define HDMI_FC_GMD_PB2 0x1107
+#define HDMI_FC_GMD_PB3 0x1108
+#define HDMI_FC_GMD_PB4 0x1109
+#define HDMI_FC_GMD_PB5 0x110A
+#define HDMI_FC_GMD_PB6 0x110B
+#define HDMI_FC_GMD_PB7 0x110C
+#define HDMI_FC_GMD_PB8 0x110D
+#define HDMI_FC_GMD_PB9 0x110E
+#define HDMI_FC_GMD_PB10 0x110F
+#define HDMI_FC_GMD_PB11 0x1110
+#define HDMI_FC_GMD_PB12 0x1111
+#define HDMI_FC_GMD_PB13 0x1112
+#define HDMI_FC_GMD_PB14 0x1113
+#define HDMI_FC_GMD_PB15 0x1114
+#define HDMI_FC_GMD_PB16 0x1115
+#define HDMI_FC_GMD_PB17 0x1116
+#define HDMI_FC_GMD_PB18 0x1117
+#define HDMI_FC_GMD_PB19 0x1118
+#define HDMI_FC_GMD_PB20 0x1119
+#define HDMI_FC_GMD_PB21 0x111A
+#define HDMI_FC_GMD_PB22 0x111B
+#define HDMI_FC_GMD_PB23 0x111C
+#define HDMI_FC_GMD_PB24 0x111D
+#define HDMI_FC_GMD_PB25 0x111E
+#define HDMI_FC_GMD_PB26 0x111F
+#define HDMI_FC_GMD_PB27 0x1120
+
+#define HDMI_FC_DBGFORCE 0x1200
+#define HDMI_FC_DBGAUD0CH0 0x1201
+#define HDMI_FC_DBGAUD1CH0 0x1202
+#define HDMI_FC_DBGAUD2CH0 0x1203
+#define HDMI_FC_DBGAUD0CH1 0x1204
+#define HDMI_FC_DBGAUD1CH1 0x1205
+#define HDMI_FC_DBGAUD2CH1 0x1206
+#define HDMI_FC_DBGAUD0CH2 0x1207
+#define HDMI_FC_DBGAUD1CH2 0x1208
+#define HDMI_FC_DBGAUD2CH2 0x1209
+#define HDMI_FC_DBGAUD0CH3 0x120A
+#define HDMI_FC_DBGAUD1CH3 0x120B
+#define HDMI_FC_DBGAUD2CH3 0x120C
+#define HDMI_FC_DBGAUD0CH4 0x120D
+#define HDMI_FC_DBGAUD1CH4 0x120E
+#define HDMI_FC_DBGAUD2CH4 0x120F
+#define HDMI_FC_DBGAUD0CH5 0x1210
+#define HDMI_FC_DBGAUD1CH5 0x1211
+#define HDMI_FC_DBGAUD2CH5 0x1212
+#define HDMI_FC_DBGAUD0CH6 0x1213
+#define HDMI_FC_DBGAUD1CH6 0x1214
+#define HDMI_FC_DBGAUD2CH6 0x1215
+#define HDMI_FC_DBGAUD0CH7 0x1216
+#define HDMI_FC_DBGAUD1CH7 0x1217
+#define HDMI_FC_DBGAUD2CH7 0x1218
+#define HDMI_FC_DBGTMDS0 0x1219
+#define HDMI_FC_DBGTMDS1 0x121A
+#define HDMI_FC_DBGTMDS2 0x121B
+
+/* HDMI Source PHY Registers */
+#define HDMI_PHY_CONF0 0x3000
+#define HDMI_PHY_TST0 0x3001
+#define HDMI_PHY_TST1 0x3002
+#define HDMI_PHY_TST2 0x3003
+#define HDMI_PHY_STAT0 0x3004
+#define HDMI_PHY_INT0 0x3005
+#define HDMI_PHY_MASK0 0x3006
+#define HDMI_PHY_POL0 0x3007
+
+/* HDMI Master PHY Registers */
+#define HDMI_PHY_I2CM_SLAVE_ADDR 0x3020
+#define HDMI_PHY_I2CM_ADDRESS_ADDR 0x3021
+#define HDMI_PHY_I2CM_DATAO_1_ADDR 0x3022
+#define HDMI_PHY_I2CM_DATAO_0_ADDR 0x3023
+#define HDMI_PHY_I2CM_DATAI_1_ADDR 0x3024
+#define HDMI_PHY_I2CM_DATAI_0_ADDR 0x3025
+#define HDMI_PHY_I2CM_OPERATION_ADDR 0x3026
+#define HDMI_PHY_I2CM_INT_ADDR 0x3027
+#define HDMI_PHY_I2CM_CTLINT_ADDR 0x3028
+#define HDMI_PHY_I2CM_DIV_ADDR 0x3029
+#define HDMI_PHY_I2CM_SOFTRSTZ_ADDR 0x302a
+#define HDMI_PHY_I2CM_SS_SCL_HCNT_1_ADDR 0x302b
+#define HDMI_PHY_I2CM_SS_SCL_HCNT_0_ADDR 0x302c
+#define HDMI_PHY_I2CM_SS_SCL_LCNT_1_ADDR 0x302d
+#define HDMI_PHY_I2CM_SS_SCL_LCNT_0_ADDR 0x302e
+#define HDMI_PHY_I2CM_FS_SCL_HCNT_1_ADDR 0x302f
+#define HDMI_PHY_I2CM_FS_SCL_HCNT_0_ADDR 0x3030
+#define HDMI_PHY_I2CM_FS_SCL_LCNT_1_ADDR 0x3031
+#define HDMI_PHY_I2CM_FS_SCL_LCNT_0_ADDR 0x3032
+
+/* Audio Sampler Registers */
+#define HDMI_AUD_CONF0 0x3100
+#define HDMI_AUD_CONF1 0x3101
+#define HDMI_AUD_INT 0x3102
+#define HDMI_AUD_CONF2 0x3103
+#define HDMI_AUD_N1 0x3200
+#define HDMI_AUD_N2 0x3201
+#define HDMI_AUD_N3 0x3202
+#define HDMI_AUD_CTS1 0x3203
+#define HDMI_AUD_CTS2 0x3204
+#define HDMI_AUD_CTS3 0x3205
+#define HDMI_AUD_INPUTCLKFS 0x3206
+#define HDMI_AUD_SPDIFINT 0x3302
+#define HDMI_AUD_CONF0_HBR 0x3400
+#define HDMI_AUD_HBR_STATUS 0x3401
+#define HDMI_AUD_HBR_INT 0x3402
+#define HDMI_AUD_HBR_POL 0x3403
+#define HDMI_AUD_HBR_MASK 0x3404
+
+/* Generic Parallel Audio Interface Registers */
+/* Not used as GPAUD interface is not enabled in hw */
+#define HDMI_GP_CONF0 0x3500
+#define HDMI_GP_CONF1 0x3501
+#define HDMI_GP_CONF2 0x3502
+#define HDMI_GP_STAT 0x3503
+#define HDMI_GP_INT 0x3504
+#define HDMI_GP_MASK 0x3505
+#define HDMI_GP_POL 0x3506
+
+/* Audio DMA Registers */
+#define HDMI_AHB_DMA_CONF0 0x3600
+#define HDMI_AHB_DMA_START 0x3601
+#define HDMI_AHB_DMA_STOP 0x3602
+#define HDMI_AHB_DMA_THRSLD 0x3603
+#define HDMI_AHB_DMA_STRADDR0 0x3604
+#define HDMI_AHB_DMA_STRADDR1 0x3605
+#define HDMI_AHB_DMA_STRADDR2 0x3606
+#define HDMI_AHB_DMA_STRADDR3 0x3607
+#define HDMI_AHB_DMA_STPADDR0 0x3608
+#define HDMI_AHB_DMA_STPADDR1 0x3609
+#define HDMI_AHB_DMA_STPADDR2 0x360a
+#define HDMI_AHB_DMA_STPADDR3 0x360b
+#define HDMI_AHB_DMA_BSTADDR0 0x360c
+#define HDMI_AHB_DMA_BSTADDR1 0x360d
+#define HDMI_AHB_DMA_BSTADDR2 0x360e
+#define HDMI_AHB_DMA_BSTADDR3 0x360f
+#define HDMI_AHB_DMA_MBLENGTH0 0x3610
+#define HDMI_AHB_DMA_MBLENGTH1 0x3611
+#define HDMI_AHB_DMA_STAT 0x3612
+#define HDMI_AHB_DMA_INT 0x3613
+#define HDMI_AHB_DMA_MASK 0x3614
+#define HDMI_AHB_DMA_POL 0x3615
+#define HDMI_AHB_DMA_CONF1 0x3616
+#define HDMI_AHB_DMA_BUFFSTAT 0x3617
+#define HDMI_AHB_DMA_BUFFINT 0x3618
+#define HDMI_AHB_DMA_BUFFMASK 0x3619
+#define HDMI_AHB_DMA_BUFFPOL 0x361a
+
+/* Main Controller Registers */
+#define HDMI_MC_SFRDIV 0x4000
+#define HDMI_MC_CLKDIS 0x4001
+#define HDMI_MC_SWRSTZ 0x4002
+#define HDMI_MC_OPCTRL 0x4003
+#define HDMI_MC_FLOWCTRL 0x4004
+#define HDMI_MC_PHYRSTZ 0x4005
+#define HDMI_MC_LOCKONCLOCK 0x4006
+#define HDMI_MC_HEACPHY_RST 0x4007
+
+/* Color Space Converter Registers */
+#define HDMI_CSC_CFG 0x4100
+#define HDMI_CSC_SCALE 0x4101
+#define HDMI_CSC_COEF_A1_MSB 0x4102
+#define HDMI_CSC_COEF_A1_LSB 0x4103
+#define HDMI_CSC_COEF_A2_MSB 0x4104
+#define HDMI_CSC_COEF_A2_LSB 0x4105
+#define HDMI_CSC_COEF_A3_MSB 0x4106
+#define HDMI_CSC_COEF_A3_LSB 0x4107
+#define HDMI_CSC_COEF_A4_MSB 0x4108
+#define HDMI_CSC_COEF_A4_LSB 0x4109
+#define HDMI_CSC_COEF_B1_MSB 0x410A
+#define HDMI_CSC_COEF_B1_LSB 0x410B
+#define HDMI_CSC_COEF_B2_MSB 0x410C
+#define HDMI_CSC_COEF_B2_LSB 0x410D
+#define HDMI_CSC_COEF_B3_MSB 0x410E
+#define HDMI_CSC_COEF_B3_LSB 0x410F
+#define HDMI_CSC_COEF_B4_MSB 0x4110
+#define HDMI_CSC_COEF_B4_LSB 0x4111
+#define HDMI_CSC_COEF_C1_MSB 0x4112
+#define HDMI_CSC_COEF_C1_LSB 0x4113
+#define HDMI_CSC_COEF_C2_MSB 0x4114
+#define HDMI_CSC_COEF_C2_LSB 0x4115
+#define HDMI_CSC_COEF_C3_MSB 0x4116
+#define HDMI_CSC_COEF_C3_LSB 0x4117
+#define HDMI_CSC_COEF_C4_MSB 0x4118
+#define HDMI_CSC_COEF_C4_LSB 0x4119
+
+/* HDCP Interrupt Registers */
+#define HDMI_A_APIINTCLR 0x5006
+#define HDMI_A_APIINTSTAT 0x5007
+#define HDMI_A_APIINTMSK 0x5008
+
+/* CEC Engine Registers */
+#define HDMI_CEC_CTRL 0x7D00
+#define HDMI_CEC_STAT 0x7D01
+#define HDMI_CEC_MASK 0x7D02
+#define HDMI_CEC_POLARITY 0x7D03
+#define HDMI_CEC_INT 0x7D04
+#define HDMI_CEC_ADDR_L 0x7D05
+#define HDMI_CEC_ADDR_H 0x7D06
+#define HDMI_CEC_TX_CNT 0x7D07
+#define HDMI_CEC_RX_CNT 0x7D08
+#define HDMI_CEC_TX_DATA0 0x7D10
+#define HDMI_CEC_TX_DATA1 0x7D11
+#define HDMI_CEC_TX_DATA2 0x7D12
+#define HDMI_CEC_TX_DATA3 0x7D13
+#define HDMI_CEC_TX_DATA4 0x7D14
+#define HDMI_CEC_TX_DATA5 0x7D15
+#define HDMI_CEC_TX_DATA6 0x7D16
+#define HDMI_CEC_TX_DATA7 0x7D17
+#define HDMI_CEC_TX_DATA8 0x7D18
+#define HDMI_CEC_TX_DATA9 0x7D19
+#define HDMI_CEC_TX_DATA10 0x7D1a
+#define HDMI_CEC_TX_DATA11 0x7D1b
+#define HDMI_CEC_TX_DATA12 0x7D1c
+#define HDMI_CEC_TX_DATA13 0x7D1d
+#define HDMI_CEC_TX_DATA14 0x7D1e
+#define HDMI_CEC_TX_DATA15 0x7D1f
+#define HDMI_CEC_RX_DATA0 0x7D20
+#define HDMI_CEC_RX_DATA1 0x7D21
+#define HDMI_CEC_RX_DATA2 0x7D22
+#define HDMI_CEC_RX_DATA3 0x7D23
+#define HDMI_CEC_RX_DATA4 0x7D24
+#define HDMI_CEC_RX_DATA5 0x7D25
+#define HDMI_CEC_RX_DATA6 0x7D26
+#define HDMI_CEC_RX_DATA7 0x7D27
+#define HDMI_CEC_RX_DATA8 0x7D28
+#define HDMI_CEC_RX_DATA9 0x7D29
+#define HDMI_CEC_RX_DATA10 0x7D2a
+#define HDMI_CEC_RX_DATA11 0x7D2b
+#define HDMI_CEC_RX_DATA12 0x7D2c
+#define HDMI_CEC_RX_DATA13 0x7D2d
+#define HDMI_CEC_RX_DATA14 0x7D2e
+#define HDMI_CEC_RX_DATA15 0x7D2f
+#define HDMI_CEC_LOCK 0x7D30
+#define HDMI_CEC_WKUPCTRL 0x7D31
+
+/* I2C Master Registers (E-DDC) */
+#define HDMI_I2CM_SLAVE 0x7E00
+#define HDMI_I2CM_ADDRESS 0x7E01
+#define HDMI_I2CM_DATAO 0x7E02
+#define HDMI_I2CM_DATAI 0x7E03
+#define HDMI_I2CM_OPERATION 0x7E04
+#define HDMI_I2CM_INT 0x7E05
+#define HDMI_I2CM_CTLINT 0x7E06
+#define HDMI_I2CM_DIV 0x7E07
+#define HDMI_I2CM_SEGADDR 0x7E08
+#define HDMI_I2CM_SOFTRSTZ 0x7E09
+#define HDMI_I2CM_SEGPTR 0x7E0A
+#define HDMI_I2CM_SS_SCL_HCNT_1_ADDR 0x7E0B
+#define HDMI_I2CM_SS_SCL_HCNT_0_ADDR 0x7E0C
+#define HDMI_I2CM_SS_SCL_LCNT_1_ADDR 0x7E0D
+#define HDMI_I2CM_SS_SCL_LCNT_0_ADDR 0x7E0E
+#define HDMI_I2CM_FS_SCL_HCNT_1_ADDR 0x7E0F
+#define HDMI_I2CM_FS_SCL_HCNT_0_ADDR 0x7E10
+#define HDMI_I2CM_FS_SCL_LCNT_1_ADDR 0x7E11
+#define HDMI_I2CM_FS_SCL_LCNT_0_ADDR 0x7E12
+
+/* Random Number Generator Registers (RNG) */
+#define HDMI_RNG_BASE 0x8000
+
+
+/*
+ * Register field definitions
+ */
+enum {
+/* IH_FC_INT2 field values */
+ HDMI_IH_FC_INT2_OVERFLOW_MASK = 0x03,
+ HDMI_IH_FC_INT2_LOW_PRIORITY_OVERFLOW = 0x02,
+ HDMI_IH_FC_INT2_HIGH_PRIORITY_OVERFLOW = 0x01,
+
+/* IH_FC_STAT2 field values */
+ HDMI_IH_FC_STAT2_OVERFLOW_MASK = 0x03,
+ HDMI_IH_FC_STAT2_LOW_PRIORITY_OVERFLOW = 0x02,
+ HDMI_IH_FC_STAT2_HIGH_PRIORITY_OVERFLOW = 0x01,
+
+/* IH_PHY_STAT0 field values */
+ HDMI_IH_PHY_STAT0_RX_SENSE3 = 0x20,
+ HDMI_IH_PHY_STAT0_RX_SENSE2 = 0x10,
+ HDMI_IH_PHY_STAT0_RX_SENSE1 = 0x8,
+ HDMI_IH_PHY_STAT0_RX_SENSE0 = 0x4,
+ HDMI_IH_PHY_STAT0_TX_PHY_LOCK = 0x2,
+ HDMI_IH_PHY_STAT0_HPD = 0x1,
+
+/* IH_CEC_STAT0 field values */
+ HDMI_IH_CEC_STAT0_WAKEUP = 0x40,
+ HDMI_IH_CEC_STAT0_ERROR_FOLL = 0x20,
+ HDMI_IH_CEC_STAT0_ERROR_INIT = 0x10,
+ HDMI_IH_CEC_STAT0_ARB_LOST = 0x8,
+ HDMI_IH_CEC_STAT0_NACK = 0x4,
+ HDMI_IH_CEC_STAT0_EOM = 0x2,
+ HDMI_IH_CEC_STAT0_DONE = 0x1,
+
+
+/* IH_MUTE_I2CMPHY_STAT0 field values */
+ HDMI_IH_MUTE_I2CMPHY_STAT0_I2CMPHYDONE = 0x2,
+ HDMI_IH_MUTE_I2CMPHY_STAT0_I2CMPHYERROR = 0x1,
+
+/* IH_PHY_STAT0 field values */
+ HDMI_IH_MUTE_PHY_STAT0_RX_SENSE3 = 0x20,
+ HDMI_IH_MUTE_PHY_STAT0_RX_SENSE2 = 0x10,
+ HDMI_IH_MUTE_PHY_STAT0_RX_SENSE1 = 0x8,
+ HDMI_IH_MUTE_PHY_STAT0_RX_SENSE0 = 0x4,
+ HDMI_IH_MUTE_PHY_STAT0_TX_PHY_LOCK = 0x2,
+ HDMI_IH_MUTE_PHY_STAT0_HPD = 0x1,
+
+/* IH_AHBDMAAUD_STAT0 field values */
+ HDMI_IH_AHBDMAAUD_STAT0_ERROR = 0x20,
+ HDMI_IH_AHBDMAAUD_STAT0_LOST = 0x10,
+ HDMI_IH_AHBDMAAUD_STAT0_RETRY = 0x08,
+ HDMI_IH_AHBDMAAUD_STAT0_DONE = 0x04,
+ HDMI_IH_AHBDMAAUD_STAT0_BUFFFULL = 0x02,
+ HDMI_IH_AHBDMAAUD_STAT0_BUFFEMPTY = 0x01,
+
+/* IH_MUTE_FC_STAT2 field values */
+ HDMI_IH_MUTE_FC_STAT2_OVERFLOW_MASK = 0x03,
+ HDMI_IH_MUTE_FC_STAT2_LOW_PRIORITY_OVERFLOW = 0x02,
+ HDMI_IH_MUTE_FC_STAT2_HIGH_PRIORITY_OVERFLOW = 0x01,
+
+/* IH_MUTE_AHBDMAAUD_STAT0 field values */
+ HDMI_IH_MUTE_AHBDMAAUD_STAT0_ERROR = 0x20,
+ HDMI_IH_MUTE_AHBDMAAUD_STAT0_LOST = 0x10,
+ HDMI_IH_MUTE_AHBDMAAUD_STAT0_RETRY = 0x08,
+ HDMI_IH_MUTE_AHBDMAAUD_STAT0_DONE = 0x04,
+ HDMI_IH_MUTE_AHBDMAAUD_STAT0_BUFFFULL = 0x02,
+ HDMI_IH_MUTE_AHBDMAAUD_STAT0_BUFFEMPTY = 0x01,
+
+/* IH_MUTE field values */
+ HDMI_IH_MUTE_MUTE_WAKEUP_INTERRUPT = 0x2,
+ HDMI_IH_MUTE_MUTE_ALL_INTERRUPT = 0x1,
+
+/* TX_INVID0 field values */
+ HDMI_TX_INVID0_INTERNAL_DE_GENERATOR_MASK = 0x80,
+ HDMI_TX_INVID0_INTERNAL_DE_GENERATOR_ENABLE = 0x80,
+ HDMI_TX_INVID0_INTERNAL_DE_GENERATOR_DISABLE = 0x00,
+ HDMI_TX_INVID0_VIDEO_MAPPING_MASK = 0x1F,
+ HDMI_TX_INVID0_VIDEO_MAPPING_OFFSET = 0,
+
+/* TX_INSTUFFING field values */
+ HDMI_TX_INSTUFFING_BDBDATA_STUFFING_MASK = 0x4,
+ HDMI_TX_INSTUFFING_BDBDATA_STUFFING_ENABLE = 0x4,
+ HDMI_TX_INSTUFFING_BDBDATA_STUFFING_DISABLE = 0x0,
+ HDMI_TX_INSTUFFING_RCRDATA_STUFFING_MASK = 0x2,
+ HDMI_TX_INSTUFFING_RCRDATA_STUFFING_ENABLE = 0x2,
+ HDMI_TX_INSTUFFING_RCRDATA_STUFFING_DISABLE = 0x0,
+ HDMI_TX_INSTUFFING_GYDATA_STUFFING_MASK = 0x1,
+ HDMI_TX_INSTUFFING_GYDATA_STUFFING_ENABLE = 0x1,
+ HDMI_TX_INSTUFFING_GYDATA_STUFFING_DISABLE = 0x0,
+
+/* VP_PR_CD field values */
+ HDMI_VP_PR_CD_COLOR_DEPTH_MASK = 0xF0,
+ HDMI_VP_PR_CD_COLOR_DEPTH_OFFSET = 4,
+ HDMI_VP_PR_CD_DESIRED_PR_FACTOR_MASK = 0x0F,
+ HDMI_VP_PR_CD_DESIRED_PR_FACTOR_OFFSET = 0,
+
+/* VP_STUFF field values */
+ HDMI_VP_STUFF_IDEFAULT_PHASE_MASK = 0x20,
+ HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET = 5,
+ HDMI_VP_STUFF_IFIX_PP_TO_LAST_MASK = 0x10,
+ HDMI_VP_STUFF_IFIX_PP_TO_LAST_OFFSET = 4,
+ HDMI_VP_STUFF_ICX_GOTO_P0_ST_MASK = 0x8,
+ HDMI_VP_STUFF_ICX_GOTO_P0_ST_OFFSET = 3,
+ HDMI_VP_STUFF_YCC422_STUFFING_MASK = 0x4,
+ HDMI_VP_STUFF_YCC422_STUFFING_STUFFING_MODE = 0x4,
+ HDMI_VP_STUFF_YCC422_STUFFING_DIRECT_MODE = 0x0,
+ HDMI_VP_STUFF_PP_STUFFING_MASK = 0x2,
+ HDMI_VP_STUFF_PP_STUFFING_STUFFING_MODE = 0x2,
+ HDMI_VP_STUFF_PP_STUFFING_DIRECT_MODE = 0x0,
+ HDMI_VP_STUFF_PR_STUFFING_MASK = 0x1,
+ HDMI_VP_STUFF_PR_STUFFING_STUFFING_MODE = 0x1,
+ HDMI_VP_STUFF_PR_STUFFING_DIRECT_MODE = 0x0,
+
+/* VP_CONF field values */
+ HDMI_VP_CONF_BYPASS_EN_MASK = 0x40,
+ HDMI_VP_CONF_BYPASS_EN_ENABLE = 0x40,
+ HDMI_VP_CONF_BYPASS_EN_DISABLE = 0x00,
+ HDMI_VP_CONF_PP_EN_ENMASK = 0x20,
+ HDMI_VP_CONF_PP_EN_ENABLE = 0x20,
+ HDMI_VP_CONF_PP_EN_DISABLE = 0x00,
+ HDMI_VP_CONF_PR_EN_MASK = 0x10,
+ HDMI_VP_CONF_PR_EN_ENABLE = 0x10,
+ HDMI_VP_CONF_PR_EN_DISABLE = 0x00,
+ HDMI_VP_CONF_YCC422_EN_MASK = 0x8,
+ HDMI_VP_CONF_YCC422_EN_ENABLE = 0x8,
+ HDMI_VP_CONF_YCC422_EN_DISABLE = 0x0,
+ HDMI_VP_CONF_BYPASS_SELECT_MASK = 0x4,
+ HDMI_VP_CONF_BYPASS_SELECT_VID_PACKETIZER = 0x4,
+ HDMI_VP_CONF_BYPASS_SELECT_PIX_REPEATER = 0x0,
+ HDMI_VP_CONF_OUTPUT_SELECTOR_MASK = 0x3,
+ HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS = 0x3,
+ HDMI_VP_CONF_OUTPUT_SELECTOR_YCC422 = 0x1,
+ HDMI_VP_CONF_OUTPUT_SELECTOR_PP = 0x0,
+
+/* VP_REMAP field values */
+ HDMI_VP_REMAP_MASK = 0x3,
+ HDMI_VP_REMAP_YCC422_24bit = 0x2,
+ HDMI_VP_REMAP_YCC422_20bit = 0x1,
+ HDMI_VP_REMAP_YCC422_16bit = 0x0,
+
+/* FC_INVIDCONF field values */
+ HDMI_FC_INVIDCONF_HDCP_KEEPOUT_MASK = 0x80,
+ HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE = 0x80,
+ HDMI_FC_INVIDCONF_HDCP_KEEPOUT_INACTIVE = 0x00,
+ HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_MASK = 0x40,
+ HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_HIGH = 0x40,
+ HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_LOW = 0x00,
+ HDMI_FC_INVIDCONF_HSYNC_IN_POLARITY_MASK = 0x20,
+ HDMI_FC_INVIDCONF_HSYNC_IN_POLARITY_ACTIVE_HIGH = 0x20,
+ HDMI_FC_INVIDCONF_HSYNC_IN_POLARITY_ACTIVE_LOW = 0x00,
+ HDMI_FC_INVIDCONF_DE_IN_POLARITY_MASK = 0x10,
+ HDMI_FC_INVIDCONF_DE_IN_POLARITY_ACTIVE_HIGH = 0x10,
+ HDMI_FC_INVIDCONF_DE_IN_POLARITY_ACTIVE_LOW = 0x00,
+ HDMI_FC_INVIDCONF_DVI_MODEZ_MASK = 0x8,
+ HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE = 0x8,
+ HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE = 0x0,
+ HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_MASK = 0x2,
+ HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_ACTIVE_HIGH = 0x2,
+ HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_ACTIVE_LOW = 0x0,
+ HDMI_FC_INVIDCONF_IN_I_P_MASK = 0x1,
+ HDMI_FC_INVIDCONF_IN_I_P_INTERLACED = 0x1,
+ HDMI_FC_INVIDCONF_IN_I_P_PROGRESSIVE = 0x0,
+
+/* FC_AUDICONF0 field values */
+ HDMI_FC_AUDICONF0_CC_OFFSET = 4,
+ HDMI_FC_AUDICONF0_CC_MASK = 0x70,
+ HDMI_FC_AUDICONF0_CT_OFFSET = 0,
+ HDMI_FC_AUDICONF0_CT_MASK = 0xF,
+
+/* FC_AUDICONF1 field values */
+ HDMI_FC_AUDICONF1_SS_OFFSET = 3,
+ HDMI_FC_AUDICONF1_SS_MASK = 0x18,
+ HDMI_FC_AUDICONF1_SF_OFFSET = 0,
+ HDMI_FC_AUDICONF1_SF_MASK = 0x7,
+
+/* FC_AUDICONF3 field values */
+ HDMI_FC_AUDICONF3_LFEPBL_OFFSET = 5,
+ HDMI_FC_AUDICONF3_LFEPBL_MASK = 0x60,
+ HDMI_FC_AUDICONF3_DM_INH_OFFSET = 4,
+ HDMI_FC_AUDICONF3_DM_INH_MASK = 0x10,
+ HDMI_FC_AUDICONF3_LSV_OFFSET = 0,
+ HDMI_FC_AUDICONF3_LSV_MASK = 0xF,
+
+/* FC_AUDSCHNLS0 field values */
+ HDMI_FC_AUDSCHNLS0_CGMSA_OFFSET = 4,
+ HDMI_FC_AUDSCHNLS0_CGMSA_MASK = 0x30,
+ HDMI_FC_AUDSCHNLS0_COPYRIGHT_OFFSET = 0,
+ HDMI_FC_AUDSCHNLS0_COPYRIGHT_MASK = 0x01,
+
+/* FC_AUDSCHNLS3-6 field values */
+ HDMI_FC_AUDSCHNLS3_OIEC_CH0_OFFSET = 0,
+ HDMI_FC_AUDSCHNLS3_OIEC_CH0_MASK = 0x0f,
+ HDMI_FC_AUDSCHNLS3_OIEC_CH1_OFFSET = 4,
+ HDMI_FC_AUDSCHNLS3_OIEC_CH1_MASK = 0xf0,
+ HDMI_FC_AUDSCHNLS4_OIEC_CH2_OFFSET = 0,
+ HDMI_FC_AUDSCHNLS4_OIEC_CH2_MASK = 0x0f,
+ HDMI_FC_AUDSCHNLS4_OIEC_CH3_OFFSET = 4,
+ HDMI_FC_AUDSCHNLS4_OIEC_CH3_MASK = 0xf0,
+
+ HDMI_FC_AUDSCHNLS5_OIEC_CH0_OFFSET = 0,
+ HDMI_FC_AUDSCHNLS5_OIEC_CH0_MASK = 0x0f,
+ HDMI_FC_AUDSCHNLS5_OIEC_CH1_OFFSET = 4,
+ HDMI_FC_AUDSCHNLS5_OIEC_CH1_MASK = 0xf0,
+ HDMI_FC_AUDSCHNLS6_OIEC_CH2_OFFSET = 0,
+ HDMI_FC_AUDSCHNLS6_OIEC_CH2_MASK = 0x0f,
+ HDMI_FC_AUDSCHNLS6_OIEC_CH3_OFFSET = 4,
+ HDMI_FC_AUDSCHNLS6_OIEC_CH3_MASK = 0xf0,
+
+/* HDMI_FC_AUDSCHNLS7 field values */
+ HDMI_FC_AUDSCHNLS7_ACCURACY_OFFSET = 4,
+ HDMI_FC_AUDSCHNLS7_ACCURACY_MASK = 0x30,
+
+/* HDMI_FC_AUDSCHNLS8 field values */
+ HDMI_FC_AUDSCHNLS8_ORIGSAMPFREQ_MASK = 0xf0,
+ HDMI_FC_AUDSCHNLS8_ORIGSAMPFREQ_OFFSET = 4,
+ HDMI_FC_AUDSCHNLS8_WORDLEGNTH_MASK = 0x0f,
+ HDMI_FC_AUDSCHNLS8_WORDLEGNTH_OFFSET = 0,
+
+/* FC_AUDSCONF field values */
+ HDMI_FC_AUDSCONF_AUD_PACKET_SAMPFIT_MASK = 0xF0,
+ HDMI_FC_AUDSCONF_AUD_PACKET_SAMPFIT_OFFSET = 4,
+ HDMI_FC_AUDSCONF_AUD_PACKET_LAYOUT_MASK = 0x1,
+ HDMI_FC_AUDSCONF_AUD_PACKET_LAYOUT_OFFSET = 0,
+ HDMI_FC_AUDSCONF_AUD_PACKET_LAYOUT_LAYOUT1 = 0x1,
+ HDMI_FC_AUDSCONF_AUD_PACKET_LAYOUT_LAYOUT0 = 0x0,
+
+/* FC_STAT2 field values */
+ HDMI_FC_STAT2_OVERFLOW_MASK = 0x03,
+ HDMI_FC_STAT2_LOW_PRIORITY_OVERFLOW = 0x02,
+ HDMI_FC_STAT2_HIGH_PRIORITY_OVERFLOW = 0x01,
+
+/* FC_INT2 field values */
+ HDMI_FC_INT2_OVERFLOW_MASK = 0x03,
+ HDMI_FC_INT2_LOW_PRIORITY_OVERFLOW = 0x02,
+ HDMI_FC_INT2_HIGH_PRIORITY_OVERFLOW = 0x01,
+
+/* FC_MASK2 field values */
+ HDMI_FC_MASK2_OVERFLOW_MASK = 0x03,
+ HDMI_FC_MASK2_LOW_PRIORITY_OVERFLOW = 0x02,
+ HDMI_FC_MASK2_HIGH_PRIORITY_OVERFLOW = 0x01,
+
+/* FC_PRCONF field values */
+ HDMI_FC_PRCONF_INCOMING_PR_FACTOR_MASK = 0xF0,
+ HDMI_FC_PRCONF_INCOMING_PR_FACTOR_OFFSET = 4,
+ HDMI_FC_PRCONF_OUTPUT_PR_FACTOR_MASK = 0x0F,
+ HDMI_FC_PRCONF_OUTPUT_PR_FACTOR_OFFSET = 0,
+
+/* FC_AVICONF0-FC_AVICONF3 field values */
+ HDMI_FC_AVICONF0_PIX_FMT_MASK = 0x03,
+ HDMI_FC_AVICONF0_PIX_FMT_RGB = 0x00,
+ HDMI_FC_AVICONF0_PIX_FMT_YCBCR422 = 0x01,
+ HDMI_FC_AVICONF0_PIX_FMT_YCBCR444 = 0x02,
+ HDMI_FC_AVICONF0_ACTIVE_FMT_MASK = 0x40,
+ HDMI_FC_AVICONF0_ACTIVE_FMT_INFO_PRESENT = 0x40,
+ HDMI_FC_AVICONF0_ACTIVE_FMT_NO_INFO = 0x00,
+ HDMI_FC_AVICONF0_BAR_DATA_MASK = 0x0C,
+ HDMI_FC_AVICONF0_BAR_DATA_NO_DATA = 0x00,
+ HDMI_FC_AVICONF0_BAR_DATA_VERT_BAR = 0x04,
+ HDMI_FC_AVICONF0_BAR_DATA_HORIZ_BAR = 0x08,
+ HDMI_FC_AVICONF0_BAR_DATA_VERT_HORIZ_BAR = 0x0C,
+ HDMI_FC_AVICONF0_SCAN_INFO_MASK = 0x30,
+ HDMI_FC_AVICONF0_SCAN_INFO_OVERSCAN = 0x10,
+ HDMI_FC_AVICONF0_SCAN_INFO_UNDERSCAN = 0x20,
+ HDMI_FC_AVICONF0_SCAN_INFO_NODATA = 0x00,
+
+ HDMI_FC_AVICONF1_ACTIVE_ASPECT_RATIO_MASK = 0x0F,
+ HDMI_FC_AVICONF1_ACTIVE_ASPECT_RATIO_USE_CODED = 0x08,
+ HDMI_FC_AVICONF1_ACTIVE_ASPECT_RATIO_4_3 = 0x09,
+ HDMI_FC_AVICONF1_ACTIVE_ASPECT_RATIO_16_9 = 0x0A,
+ HDMI_FC_AVICONF1_ACTIVE_ASPECT_RATIO_14_9 = 0x0B,
+ HDMI_FC_AVICONF1_CODED_ASPECT_RATIO_MASK = 0x30,
+ HDMI_FC_AVICONF1_CODED_ASPECT_RATIO_NO_DATA = 0x00,
+ HDMI_FC_AVICONF1_CODED_ASPECT_RATIO_4_3 = 0x10,
+ HDMI_FC_AVICONF1_CODED_ASPECT_RATIO_16_9 = 0x20,
+ HDMI_FC_AVICONF1_COLORIMETRY_MASK = 0xC0,
+ HDMI_FC_AVICONF1_COLORIMETRY_NO_DATA = 0x00,
+ HDMI_FC_AVICONF1_COLORIMETRY_SMPTE = 0x40,
+ HDMI_FC_AVICONF1_COLORIMETRY_ITUR = 0x80,
+ HDMI_FC_AVICONF1_COLORIMETRY_EXTENDED_INFO = 0xC0,
+
+ HDMI_FC_AVICONF2_SCALING_MASK = 0x03,
+ HDMI_FC_AVICONF2_SCALING_NONE = 0x00,
+ HDMI_FC_AVICONF2_SCALING_HORIZ = 0x01,
+ HDMI_FC_AVICONF2_SCALING_VERT = 0x02,
+ HDMI_FC_AVICONF2_SCALING_HORIZ_VERT = 0x03,
+ HDMI_FC_AVICONF2_RGB_QUANT_MASK = 0x0C,
+ HDMI_FC_AVICONF2_RGB_QUANT_DEFAULT = 0x00,
+ HDMI_FC_AVICONF2_RGB_QUANT_LIMITED_RANGE = 0x04,
+ HDMI_FC_AVICONF2_RGB_QUANT_FULL_RANGE = 0x08,
+ HDMI_FC_AVICONF2_EXT_COLORIMETRY_MASK = 0x70,
+ HDMI_FC_AVICONF2_EXT_COLORIMETRY_XVYCC601 = 0x00,
+ HDMI_FC_AVICONF2_EXT_COLORIMETRY_XVYCC709 = 0x10,
+ HDMI_FC_AVICONF2_EXT_COLORIMETRY_SYCC601 = 0x20,
+ HDMI_FC_AVICONF2_EXT_COLORIMETRY_ADOBE_YCC601 = 0x30,
+ HDMI_FC_AVICONF2_EXT_COLORIMETRY_ADOBE_RGB = 0x40,
+ HDMI_FC_AVICONF2_IT_CONTENT_MASK = 0x80,
+ HDMI_FC_AVICONF2_IT_CONTENT_NO_DATA = 0x00,
+ HDMI_FC_AVICONF2_IT_CONTENT_VALID = 0x80,
+
+ HDMI_FC_AVICONF3_IT_CONTENT_TYPE_MASK = 0x03,
+ HDMI_FC_AVICONF3_IT_CONTENT_TYPE_GRAPHICS = 0x00,
+ HDMI_FC_AVICONF3_IT_CONTENT_TYPE_PHOTO = 0x01,
+ HDMI_FC_AVICONF3_IT_CONTENT_TYPE_CINEMA = 0x02,
+ HDMI_FC_AVICONF3_IT_CONTENT_TYPE_GAME = 0x03,
+ HDMI_FC_AVICONF3_QUANT_RANGE_MASK = 0x0C,
+ HDMI_FC_AVICONF3_QUANT_RANGE_LIMITED = 0x00,
+ HDMI_FC_AVICONF3_QUANT_RANGE_FULL = 0x04,
+
+/* FC_DBGFORCE field values */
+ HDMI_FC_DBGFORCE_FORCEAUDIO = 0x10,
+ HDMI_FC_DBGFORCE_FORCEVIDEO = 0x1,
+
+/* PHY_CONF0 field values */
+ HDMI_PHY_CONF0_PDZ_MASK = 0x80,
+ HDMI_PHY_CONF0_PDZ_OFFSET = 7,
+ HDMI_PHY_CONF0_ENTMDS_MASK = 0x40,
+ HDMI_PHY_CONF0_ENTMDS_OFFSET = 6,
+ HDMI_PHY_CONF0_SPARECTRL = 0x20,
+ HDMI_PHY_CONF0_GEN2_PDDQ_MASK = 0x10,
+ HDMI_PHY_CONF0_GEN2_PDDQ_OFFSET = 4,
+ HDMI_PHY_CONF0_GEN2_TXPWRON_MASK = 0x8,
+ HDMI_PHY_CONF0_GEN2_TXPWRON_OFFSET = 3,
+ HDMI_PHY_CONF0_GEN2_ENHPDRXSENSE_MASK = 0x4,
+ HDMI_PHY_CONF0_GEN2_ENHPDRXSENSE_OFFSET = 2,
+ HDMI_PHY_CONF0_SELDATAENPOL_MASK = 0x2,
+ HDMI_PHY_CONF0_SELDATAENPOL_OFFSET = 1,
+ HDMI_PHY_CONF0_SELDIPIF_MASK = 0x1,
+ HDMI_PHY_CONF0_SELDIPIF_OFFSET = 0,
+
+/* PHY_TST0 field values */
+ HDMI_PHY_TST0_TSTCLR_MASK = 0x20,
+ HDMI_PHY_TST0_TSTCLR_OFFSET = 5,
+ HDMI_PHY_TST0_TSTEN_MASK = 0x10,
+ HDMI_PHY_TST0_TSTEN_OFFSET = 4,
+ HDMI_PHY_TST0_TSTCLK_MASK = 0x1,
+ HDMI_PHY_TST0_TSTCLK_OFFSET = 0,
+
+/* PHY_STAT0 field values */
+ HDMI_PHY_RX_SENSE3 = 0x80,
+ HDMI_PHY_RX_SENSE2 = 0x40,
+ HDMI_PHY_RX_SENSE1 = 0x20,
+ HDMI_PHY_RX_SENSE0 = 0x10,
+ HDMI_PHY_HPD = 0x02,
+ HDMI_PHY_TX_PHY_LOCK = 0x01,
+
+/* PHY_I2CM_SLAVE_ADDR field values */
+ HDMI_PHY_I2CM_SLAVE_ADDR_PHY_GEN2 = 0x69,
+ HDMI_PHY_I2CM_SLAVE_ADDR_HEAC_PHY = 0x49,
+
+/* PHY_I2CM_OPERATION_ADDR field values */
+ HDMI_PHY_I2CM_OPERATION_ADDR_WRITE = 0x10,
+ HDMI_PHY_I2CM_OPERATION_ADDR_READ = 0x1,
+
+/* HDMI_PHY_I2CM_INT_ADDR */
+ HDMI_PHY_I2CM_INT_ADDR_DONE_POL = 0x08,
+ HDMI_PHY_I2CM_INT_ADDR_DONE_MASK = 0x04,
+
+/* HDMI_PHY_I2CM_CTLINT_ADDR */
+ HDMI_PHY_I2CM_CTLINT_ADDR_NAC_POL = 0x80,
+ HDMI_PHY_I2CM_CTLINT_ADDR_NAC_MASK = 0x40,
+ HDMI_PHY_I2CM_CTLINT_ADDR_ARBITRATION_POL = 0x08,
+ HDMI_PHY_I2CM_CTLINT_ADDR_ARBITRATION_MASK = 0x04,
+
+/* AUD_CTS3 field values */
+ HDMI_AUD_CTS3_N_SHIFT_OFFSET = 5,
+ HDMI_AUD_CTS3_N_SHIFT_MASK = 0xe0,
+ HDMI_AUD_CTS3_N_SHIFT_1 = 0,
+ HDMI_AUD_CTS3_N_SHIFT_16 = 0x20,
+ HDMI_AUD_CTS3_N_SHIFT_32 = 0x40,
+ HDMI_AUD_CTS3_N_SHIFT_64 = 0x60,
+ HDMI_AUD_CTS3_N_SHIFT_128 = 0x80,
+ HDMI_AUD_CTS3_N_SHIFT_256 = 0xa0,
+ /* note that the CTS3 MANUAL bit has been removed
+ from our part. Can't set it, will read as 0. */
+ HDMI_AUD_CTS3_CTS_MANUAL = 0x10,
+ HDMI_AUD_CTS3_AUDCTS19_16_MASK = 0x0f,
+
+/* AHB_DMA_CONF0 field values */
+ HDMI_AHB_DMA_CONF0_SW_FIFO_RST_OFFSET = 7,
+ HDMI_AHB_DMA_CONF0_SW_FIFO_RST_MASK = 0x80,
+ HDMI_AHB_DMA_CONF0_HBR = 0x10,
+ HDMI_AHB_DMA_CONF0_EN_HLOCK_OFFSET = 3,
+ HDMI_AHB_DMA_CONF0_EN_HLOCK_MASK = 0x08,
+ HDMI_AHB_DMA_CONF0_INCR_TYPE_OFFSET = 1,
+ HDMI_AHB_DMA_CONF0_INCR_TYPE_MASK = 0x06,
+ HDMI_AHB_DMA_CONF0_INCR4 = 0x0,
+ HDMI_AHB_DMA_CONF0_INCR8 = 0x2,
+ HDMI_AHB_DMA_CONF0_INCR16 = 0x4,
+ HDMI_AHB_DMA_CONF0_BURST_MODE = 0x1,
+
+/* HDMI_AHB_DMA_START field values */
+ HDMI_AHB_DMA_START_START_OFFSET = 0,
+ HDMI_AHB_DMA_START_START_MASK = 0x01,
+
+/* HDMI_AHB_DMA_STOP field values */
+ HDMI_AHB_DMA_STOP_STOP_OFFSET = 0,
+ HDMI_AHB_DMA_STOP_STOP_MASK = 0x01,
+
+/* AHB_DMA_STAT, AHB_DMA_INT, AHB_DMA_MASK, AHB_DMA_POL field values */
+ HDMI_AHB_DMA_DONE = 0x80,
+ HDMI_AHB_DMA_RETRY_SPLIT = 0x40,
+ HDMI_AHB_DMA_LOSTOWNERSHIP = 0x20,
+ HDMI_AHB_DMA_ERROR = 0x10,
+ HDMI_AHB_DMA_FIFO_THREMPTY = 0x04,
+ HDMI_AHB_DMA_FIFO_FULL = 0x02,
+ HDMI_AHB_DMA_FIFO_EMPTY = 0x01,
+
+/* AHB_DMA_BUFFSTAT, AHB_DMA_BUFFINT, AHB_DMA_BUFFMASK, AHB_DMA_BUFFPOL field values */
+ HDMI_AHB_DMA_BUFFSTAT_FULL = 0x02,
+ HDMI_AHB_DMA_BUFFSTAT_EMPTY = 0x01,
+
+/* MC_CLKDIS field values */
+ HDMI_MC_CLKDIS_HDCPCLK_DISABLE = 0x40,
+ HDMI_MC_CLKDIS_CECCLK_DISABLE = 0x20,
+ HDMI_MC_CLKDIS_CSCCLK_DISABLE = 0x10,
+ HDMI_MC_CLKDIS_AUDCLK_DISABLE = 0x8,
+ HDMI_MC_CLKDIS_PREPCLK_DISABLE = 0x4,
+ HDMI_MC_CLKDIS_TMDSCLK_DISABLE = 0x2,
+ HDMI_MC_CLKDIS_PIXELCLK_DISABLE = 0x1,
+
+/* MC_SWRSTZ field values */
+ HDMI_MC_SWRSTZ_TMDSSWRST_REQ = 0x02,
+
+/* MC_FLOWCTRL field values */
+ HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_MASK = 0x1,
+ HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_IN_PATH = 0x1,
+ HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_BYPASS = 0x0,
+
+/* MC_PHYRSTZ field values */
+ HDMI_MC_PHYRSTZ_ASSERT = 0x0,
+ HDMI_MC_PHYRSTZ_DEASSERT = 0x1,
+
+/* MC_HEACPHY_RST field values */
+ HDMI_MC_HEACPHY_RST_ASSERT = 0x1,
+ HDMI_MC_HEACPHY_RST_DEASSERT = 0x0,
+
+/* CSC_CFG field values */
+ HDMI_CSC_CFG_INTMODE_MASK = 0x30,
+ HDMI_CSC_CFG_INTMODE_OFFSET = 4,
+ HDMI_CSC_CFG_INTMODE_DISABLE = 0x00,
+ HDMI_CSC_CFG_INTMODE_CHROMA_INT_FORMULA1 = 0x10,
+ HDMI_CSC_CFG_INTMODE_CHROMA_INT_FORMULA2 = 0x20,
+ HDMI_CSC_CFG_DECMODE_MASK = 0x3,
+ HDMI_CSC_CFG_DECMODE_OFFSET = 0,
+ HDMI_CSC_CFG_DECMODE_DISABLE = 0x0,
+ HDMI_CSC_CFG_DECMODE_CHROMA_INT_FORMULA1 = 0x1,
+ HDMI_CSC_CFG_DECMODE_CHROMA_INT_FORMULA2 = 0x2,
+ HDMI_CSC_CFG_DECMODE_CHROMA_INT_FORMULA3 = 0x3,
+
+/* CSC_SCALE field values */
+ HDMI_CSC_SCALE_CSC_COLORDE_PTH_MASK = 0xF0,
+ HDMI_CSC_SCALE_CSC_COLORDE_PTH_24BPP = 0x00,
+ HDMI_CSC_SCALE_CSC_COLORDE_PTH_30BPP = 0x50,
+ HDMI_CSC_SCALE_CSC_COLORDE_PTH_36BPP = 0x60,
+ HDMI_CSC_SCALE_CSC_COLORDE_PTH_48BPP = 0x70,
+ HDMI_CSC_SCALE_CSCSCALE_MASK = 0x03,
+
+/* I2CM_OPERATION field values */
+ HDMI_I2CM_OPERATION_WRITE = 0x10,
+ HDMI_I2CM_OPERATION_READ_EXT = 0x2,
+ HDMI_I2CM_OPERATION_READ = 0x1,
+
+/* HDMI_I2CM_INT */
+ HDMI_I2CM_INT_DONE_POL = 0x08,
+ HDMI_I2CM_INT_DONE_MASK = 0x04,
+
+/* HDMI_I2CM_CTLINT */
+ HDMI_I2CM_CTLINT_NAC_POL = 0x80,
+ HDMI_I2CM_CTLINT_NAC_MASK = 0x40,
+ HDMI_I2CM_CTLINT_ARBITRATION_POL = 0x08,
+ HDMI_I2CM_CTLINT_ARBITRATION_MASK = 0x04,
+
+};
+
+enum imx_hdmi_type {
+ IMX6DL_HDMI,
+ IMX6Q_HDMI,
+};
+
+/* IOCTL commands */
+#define HDMI_IOC_MAGIC 'H'
+
+#define HDMI_IOC_GET_RESOURCE _IO(HDMI_IOC_MAGIC, 0)
+#define HDMI_IOC_GET_CPU_TYPE _IO(HDMI_IOC_MAGIC, 1)
+
+
+#endif /* __MXC_HDMI_H__ */