sonic-buildimage/platform/mellanox/non-upstream-patches/patches/0220-UBUNTU-SAUCE-pka-Add-pka-driver.patch
Kebo Liu e286869b24
[Mellanox] Update HW-MGMT package to new version V.7.0030.1011 (#16239)
- Why I did it
1. Update Mellanox HW-MGMT package to newer version V.7.0030.1011
2. Replace the SONiC PMON Thermal control algorithm with the one inside the HW-MGMT package on all Nvidia platforms
3. Support Spectrum-4 systems

- How I did it
1. Update the HW-MGMT package version number and submodule pointer
2. Remove the thermal control algorithm implementation from Mellanox platform API
3. Revise the patch to HW-MGMT package which will disable HW-MGMT from running on SIMX
4. Update the downstream kernel patch list

Signed-off-by: Kebo Liu <kebol@nvidia.com>
2023-09-06 11:32:08 +03:00

10217 lines
430 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From c1e48283efef4faeee6b601fc679ea228bd8d6ef Mon Sep 17 00:00:00 2001
From: Mahantesh Salimath <mahantesh@nvidia.com>
Date: Thu, 30 Jun 2022 16:46:50 -0400
Subject: [PATCH backport 5.10 21/63] UBUNTU: SAUCE: pka: Add pka driver.
BugLink: https://bugs.launchpad.net/bugs/1980415
* This driver is picked from internal linux repo;bfdev-5.4.60 branch.
For commit history, please refer to above repo and branch.
Signed-off-by: Mahantesh Salimath <mahantesh@nvidia.com>
Reviewed-by: Khalil Blaiech <kblaiech@nvidia.com>
Signed-off-by: Mahantesh Salimath <mahantesh@nvidia.com>
Signed-off-by: Ike Panhc <ike.pan@canonical.com>
---
drivers/platform/mellanox/Kconfig | 2 +
drivers/platform/mellanox/Makefile | 1 +
drivers/platform/mellanox/mlxbf_pka/Kconfig | 14 +
drivers/platform/mellanox/mlxbf_pka/Makefile | 9 +
.../mellanox/mlxbf_pka/mlxbf_pka_addrs.h | 284 +
.../mellanox/mlxbf_pka/mlxbf_pka_config.h | 226 +
.../mellanox/mlxbf_pka/mlxbf_pka_cpu.h | 72 +
.../mellanox/mlxbf_pka/mlxbf_pka_debug.h | 66 +
.../mellanox/mlxbf_pka/mlxbf_pka_dev.c | 2414 +++++++++
.../mellanox/mlxbf_pka/mlxbf_pka_dev.h | 310 ++
.../mellanox/mlxbf_pka/mlxbf_pka_drv.c | 1398 +++++
.../mellanox/mlxbf_pka/mlxbf_pka_firmware.h | 4823 +++++++++++++++++
.../mellanox/mlxbf_pka/mlxbf_pka_ioctl.h | 127 +
.../mellanox/mlxbf_pka/mlxbf_pka_mmio.h | 49 +
.../mellanox/mlxbf_pka/mlxbf_pka_ring.h | 276 +
15 files changed, 10071 insertions(+)
create mode 100644 drivers/platform/mellanox/mlxbf_pka/Kconfig
create mode 100644 drivers/platform/mellanox/mlxbf_pka/Makefile
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_addrs.h
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_config.h
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_cpu.h
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_debug.h
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_firmware.h
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ioctl.h
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_mmio.h
create mode 100644 drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ring.h
diff --git a/drivers/platform/mellanox/Kconfig b/drivers/platform/mellanox/Kconfig
index 5d329350a..946bc2375 100644
--- a/drivers/platform/mellanox/Kconfig
+++ b/drivers/platform/mellanox/Kconfig
@@ -97,6 +97,8 @@ config MLXBF_TRIO
This driver supports the TRIO PCIe root complex interface on
Mellanox BlueField SoCs.
+source "drivers/platform/mellanox/mlxbf_pka/Kconfig"
+
config NVSW_SN2201
tristate "Nvidia SN2201 platform driver support"
depends on REGMAP
diff --git a/drivers/platform/mellanox/Makefile b/drivers/platform/mellanox/Makefile
index 161fad566..046347d3a 100644
--- a/drivers/platform/mellanox/Makefile
+++ b/drivers/platform/mellanox/Makefile
@@ -12,3 +12,4 @@ obj-$(CONFIG_MLXREG_HOTPLUG) += mlxreg-hotplug.o
obj-$(CONFIG_MLXREG_IO) += mlxreg-io.o
obj-$(CONFIG_MLXREG_LC) += mlxreg-lc.o
obj-$(CONFIG_NVSW_SN2201) += nvsw-sn2201.o
+obj-$(CONFIG_MLXBF_PKA) += mlxbf_pka/
diff --git a/drivers/platform/mellanox/mlxbf_pka/Kconfig b/drivers/platform/mellanox/mlxbf_pka/Kconfig
new file mode 100644
index 000000000..ebc038ec7
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/Kconfig
@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: GPL-2.0-only OR Linux-OpenIB
+#
+# Platform support for Mellanox BlueField PKA
+#
+
+config MLXBF_PKA
+ tristate "Mellanox BlueField Public Key Accelerator driver"
+ depends on ARM64 && IOMMU_API && VFIO_IOMMU_TYPE1 && VFIO_PLATFORM
+ help
+ If you say yes to this option, support will be included for the
+ Public Key Accelerator device on Mellanox BlueField SoCs.
+
+ This driver can also be built as a module. If so, the module will
+ be called pka-mlxbf.
diff --git a/drivers/platform/mellanox/mlxbf_pka/Makefile b/drivers/platform/mellanox/mlxbf_pka/Makefile
new file mode 100644
index 000000000..d9f5be4d6
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/Makefile
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only OR Linux-OpenIB
+#
+# Makefile for Mellanox BlueField PKA Driver
+#
+
+obj-m += mlxbf-pka.o
+
+mlxbf-pka-y := mlxbf_pka_drv.o
+mlxbf-pka-y += mlxbf_pka_dev.o
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_addrs.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_addrs.h
new file mode 100644
index 000000000..cd2a4d814
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_addrs.h
@@ -0,0 +1,284 @@
+//
+// BSD LICENSE
+//
+// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved.
+// 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 Mellanox Technologies 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 __PKA_ADDRS_H__
+#define __PKA_ADDRS_H__
+
+// Define memory size in bytes
+#define MEM_SIZE_4KB 0x1000
+#define MEM_SIZE_8KB 0x2000
+#define MEM_SIZE_16KB 0x4000
+#define MEM_SIZE_32KB 0x8000
+#define MEM_SIZE_64KB 0x10000
+
+//
+// COMMON SPACE
+//
+#define CRYPTO_COMMON_BASE 0x0
+
+// Common IO CSR addresses/offsets: These are all addressed as 8-byte registers.
+#define DEV_INFO_ADDR (0x00 | CRYPTO_COMMON_BASE)
+#define DEV_CTL_ADDR (0x08 | CRYPTO_COMMON_BASE)
+#define MMIO_INFO_ADDR (0x10 | CRYPTO_COMMON_BASE)
+#define SCRATCHPAD_ADDR (0x20 | CRYPTO_COMMON_BASE)
+#define SEMAPHORE0_ADDR (0x28 | CRYPTO_COMMON_BASE)
+#define SEMAPHORE1_ADDR (0x30 | CRYPTO_COMMON_BASE)
+#define CLOCK_COUNT_ADDR (0x38 | CRYPTO_COMMON_BASE)
+#define INT_SETUP_ADDR (0x40 | CRYPTO_COMMON_BASE)
+#define CRED_CTL_ADDR (0x50 | CRYPTO_COMMON_BASE)
+#define SAM_CTL_ADDR (0x58 | CRYPTO_COMMON_BASE)
+
+//
+// CRYPTO SPACE
+//
+
+// All addresses/offsets herein are BYTE addresses.
+
+// EIP154 CSRS:
+
+// Global Control Space CSR addresses/offsets. These are accessed from the
+// ARM as 8 byte reads/writes however only the bottom 32 bits are implemented.
+#define PKA_CLOCK_SWITCH_ADDR 0x11C68
+#define PKA_CLK_FORCE_ADDR 0x11C80
+#define MODE_SELECTION_ADDR 0x11C88
+#define PKA_PROT_STATUS_ADDR 0x11C90
+#define PKA_OPTIONS_ADDR 0x11DF0
+#define PKA_VERSION_ADDR 0x11DF8
+
+// Advanced Interrupt Controller CSR addresses/offsets. These are accessed
+// from the ARM as 8 byte reads/writes however only the bottom 32 bits are
+// implemented.
+#define AIC_POL_CTRL_ADDR 0x11E00
+#define AIC_TYPE_CTRL_ADDR 0x11E08
+#define AIC_ENABLE_CTRL_ADDR 0x11E10
+#define AIC_RAW_STAT_ADDR 0x11E18
+#define AIC_ENABLE_SET_ADDR 0x11E18
+#define AIC_ENABLED_STAT_ADDR 0x11E20
+#define AIC_ACK_ADDR 0x11E20
+#define AIC_ENABLE_CLR_ADDR 0x11E28
+#define AIC_OPTIONS_ADDR 0x11E30
+#define AIC_VERSION_ADDR 0x11E38
+
+// The True Random Number Generator CSR addresses/offsets. These are accessed
+// from the ARM as 8 byte reads/writes however only the bottom 32 bits are
+// implemented.
+#define TRNG_OUTPUT_0_ADDR 0x12000
+#define TRNG_OUTPUT_1_ADDR 0x12008
+#define TRNG_OUTPUT_2_ADDR 0x12010
+#define TRNG_OUTPUT_3_ADDR 0x12018
+#define TRNG_STATUS_ADDR 0x12020
+#define TRNG_INTACK_ADDR 0x12020
+#define TRNG_CONTROL_ADDR 0x12028
+#define TRNG_CONFIG_ADDR 0x12030
+#define TRNG_ALARMCNT_ADDR 0x12038
+#define TRNG_FROENABLE_ADDR 0x12040
+#define TRNG_FRODETUNE_ADDR 0x12048
+#define TRNG_ALARMMASK_ADDR 0x12050
+#define TRNG_ALARMSTOP_ADDR 0x12058
+#define TRNG_BLOCKCNT_ADDR 0x120E8
+#define TRNG_OPTIONS_ADDR 0x120F0
+#define TRNG_TEST_ADDR 0x120E0
+#define TRNG_RAW_L_ADDR 0x12060
+#define TRNG_RAW_H_ADDR 0x12068
+#define TRNG_RUN_CNT_ADDR 0x12080
+#define TRNG_MONOBITCNT_ADDR 0x120B8
+#define TRNG_POKER_3_0_ADDR 0x120C0
+#define TRNG_POKER_7_4 0x120C8
+#define TRNG_POKER_B_8 0x120D0
+#define TRNG_POKER_F_C 0x120D8
+
+#define TRNG_PS_AI_0_ADDR 0x12080
+#define TRNG_PS_AI_1_ADDR 0x12088
+#define TRNG_PS_AI_2_ADDR 0x12090
+#define TRNG_PS_AI_3_ADDR 0x12098
+#define TRNG_PS_AI_4_ADDR 0x120A0
+#define TRNG_PS_AI_5_ADDR 0x120A8
+#define TRNG_PS_AI_6_ADDR 0x120B0
+#define TRNG_PS_AI_7_ADDR 0x120B8
+#define TRNG_PS_AI_8_ADDR 0x120C0
+#define TRNG_PS_AI_9_ADDR 0x120C8
+#define TRNG_PS_AI_10_ADDR 0x120D0
+#define TRNG_PS_AI_11_ADDR 0x120D8
+
+// Control register address/offset. This is accessed from the ARM using 8
+// byte reads/writes however only the bottom 32 bits are implemented.
+#define PKA_MASTER_SEQ_CTRL_ADDR 0x27F90
+
+// Ring CSRs: These are all accessed from the ARM using 8 byte reads/writes
+// however only the bottom 32 bits are implemented.
+
+// Ring 0 CSRS
+#define COMMAND_COUNT_0_ADDR 0x80080
+#define RESULT_COUNT_0_ADDR 0x80088
+#define IRQ_THRESH_0_ADDR 0x80090
+
+// Ring 1 CSRS:
+#define COMMAND_COUNT_1_ADDR 0x90080
+#define RESULT_COUNT_1_ADDR 0x90088
+#define IRQ_THRESH_1_ADDR 0x90090
+
+// Ring 2 CSRS:
+#define COMMAND_COUNT_2_ADDR 0xA0080
+#define RESULT_COUNT_2_ADDR 0xA0088
+#define IRQ_THRESH_2_ADDR 0xA0090
+
+// Ring 3 CSRS:
+#define COMMAND_COUNT_3_ADDR 0xB0080
+#define RESULT_COUNT_3_ADDR 0xB0088
+#define IRQ_THRESH_3_ADDR 0xB0090
+
+// EIP154 RAM regions: Note that the FARM_PROG_RAM_X address range overlaps
+// with the FARM_DATA_RAM_X and FARM_DATA_RAM_X_EXT address ranges. This
+// conflict is resolved by using the FARM_PROG_RAM_X only when the
+// Sequencer is in SW reset, and the DATA_RAMs are picked only when the
+// engine is operation.
+//
+// Note:
+// The FARM_DATA_RAM_X_EXT RAMs may also be
+// called the LNME FIFO RAMs in some of the documentation.
+//
+// PKA_BUFFER_RAM : 1024 x 64 - 8K bytes
+// PKA_SECURE_RAM : 1536 x 64 - 12K bytes
+// PKA_MASTER_PROG_RAM : 8192 x 32 - 32K bytes
+// FARM_DATA_RAM_X : 1024 x 64 - 8K bytes
+// FARM_DATA_RAM_X_EXT : 256 x 32 - 1K bytes
+// FARM_PROG_RAM_X : 2048 x 32 - 8K bytes
+//
+// Note:
+// *TBD* Since hardware guys multiplied the address per 2, the size of
+// each memory/registers group increased and become two times larger.
+// Memory size should be adjusted accordingly:
+// PKA Buffer RAM size : 8KB --> 16KB
+// PKA Secure RAM size : 8KB --> 16KB
+// PKA Master Program RAM size : 32KB --> 64KB
+// PKA Farm Data RAM size : 4KB --> 8KB
+// PKA Farm Data RAM extension size : 4KB --> 8KB
+// PKA Farm Program RAM size : 8KB --> 16KB
+//
+#define PKA_BUFFER_RAM_BASE 0x00000
+#define PKA_BUFFER_RAM_SIZE MEM_SIZE_16KB // 0x00000...0x03FFF
+
+#define PKA_SECURE_RAM_BASE 0x20000
+#define PKA_SECURE_RAM_SIZE MEM_SIZE_16KB // 0x20000...0x23FFF
+
+#define PKA_MASTER_PROG_RAM_BASE 0x30000
+#define PKA_MASTER_PROG_RAM_SIZE MEM_SIZE_64KB // 0x30000...0x3FFFF
+
+#define FARM_DATA_RAM_0_BASE 0x40000
+#define FARM_DATA_RAM_0_SIZE MEM_SIZE_8KB // 0x40000...0x41FFF
+#define FARM_DATA_RAM_0_EXT_BASE 0x42000
+#define FARM_DATA_RAM_0_EXT_SIZE MEM_SIZE_8KB // 0x42000...0x43FFF
+#define FARM_PROG_RAM_0_BASE 0x40000
+#define FARM_PROG_RAM_0_SIZE MEM_SIZE_16KB // 0x40000...0x43FFF
+#define FARM_DATA_RAM_1_BASE 0x44000
+#define FARM_DATA_RAM_1_SIZE MEM_SIZE_8KB // 0x44000...0x45FFF
+#define FARM_DATA_RAM_1_EXT_BASE 0x46000
+#define FARM_DATA_RAM_1_EXT_SIZE MEM_SIZE_8KB // 0x46000...0x47FFF
+#define FARM_PROG_RAM_1_BASE 0x44000
+#define FARM_PROG_RAM_1_SIZE MEM_SIZE_16KB // 0x44000...0x47FFF
+#define FARM_DATA_RAM_2_BASE 0x48000
+#define FARM_DATA_RAM_2_SIZE MEM_SIZE_8KB // 0x48000...0x49FFF
+#define FARM_DATA_RAM_2_EXT_BASE 0x4A000
+#define FARM_DATA_RAM_2_EXT_SIZE MEM_SIZE_8KB // 0x4A000...0x4BFFF
+#define FARM_PROG_RAM_2_BASE 0x48000
+#define FARM_PROG_RAM_2_SIZE MEM_SIZE_16KB // 0x48000...0x4BFFF
+#define FARM_DATA_RAM_3_BASE 0x4C000
+#define FARM_DATA_RAM_3_SIZE MEM_SIZE_8KB // 0x4C000...0x4DFFF
+#define FARM_DATA_RAM_3_EXT_BASE 0x4E000
+#define FARM_DATA_RAM_3_EXT_SIZE MEM_SIZE_8KB // 0x4E000...0x4FFFF
+#define FARM_PROG_RAM_3_BASE 0x4C000
+#define FARM_PROG_RAM_3_SIZE MEM_SIZE_16KB // 0x4C000...0x4FFFF
+#define FARM_DATA_RAM_4_BASE 0x50000
+#define FARM_DATA_RAM_4_SIZE MEM_SIZE_8KB // 0x50000...0x51FFF
+#define FARM_DATA_RAM_4_EXT_BASE 0x52000
+#define FARM_DATA_RAM_4_EXT_SIZE MEM_SIZE_8KB // 0x52000...0x53FFF
+#define FARM_PROG_RAM_4_BASE 0x50000
+#define FARM_PROG_RAM_4_SIZE MEM_SIZE_16KB // 0x50000...0x53FFF
+#define FARM_DATA_RAM_5_BASE 0x54000
+#define FARM_DATA_RAM_5_SIZE MEM_SIZE_8KB // 0x54000...0x55FFF
+#define FARM_DATA_RAM_5_EXT_BASE 0x56000
+#define FARM_DATA_RAM_5_EXT_SIZE MEM_SIZE_8KB // 0x56000...0x57FFF
+#define FARM_PROG_RAM_5_BASE 0x54000
+#define FARM_PROG_RAM_5_SIZE MEM_SIZE_16KB // 0x54000...0x57FFF
+
+// PKA Buffer RAM offsets. These are NOT real CSR's but instead are
+// specific offset/addresses within the EIP154 PKA_BUFFER_RAM.
+
+// Ring 0:
+#define RING_CMMD_BASE_0_ADDR 0x00000
+#define RING_RSLT_BASE_0_ADDR 0x00010
+#define RING_SIZE_TYPE_0_ADDR 0x00020
+#define RING_RW_PTRS_0_ADDR 0x00028
+#define RING_RW_STAT_0_ADDR 0x00030
+
+// Ring 1
+#define RING_CMMD_BASE_1_ADDR 0x00040
+#define RING_RSLT_BASE_1_ADDR 0x00050
+#define RING_SIZE_TYPE_1_ADDR 0x00060
+#define RING_RW_PTRS_1_ADDR 0x00068
+#define RING_RW_STAT_1_ADDR 0x00070
+
+// Ring 2
+#define RING_CMMD_BASE_2_ADDR 0x00080
+#define RING_RSLT_BASE_2_ADDR 0x00090
+#define RING_SIZE_TYPE_2_ADDR 0x000A0
+#define RING_RW_PTRS_2_ADDR 0x000A8
+#define RING_RW_STAT_2_ADDR 0x000B0
+
+// Ring 3
+#define RING_CMMD_BASE_3_ADDR 0x000C0
+#define RING_RSLT_BASE_3_ADDR 0x000D0
+#define RING_SIZE_TYPE_3_ADDR 0x000E0
+#define RING_RW_PTRS_3_ADDR 0x000E8
+#define RING_RW_STAT_3_ADDR 0x000F0
+
+// Ring Options
+#define PKA_RING_OPTIONS_ADDR 0x07FF8
+
+// Alternate Window RAM size
+#define PKA_WINDOW_RAM_REGION_SIZE MEM_SIZE_16KB
+
+// Currently, we do not use these MiCA specific CSRs.
+
+// The PKI (not EIP154) CSR address/offsets: These are all addressed as
+// 8-byte registers.
+#define PKA_INT_MASK_ADDR 0x00
+#define PKA_INT_MASK_SET_ADDR 0x08
+#define PKA_INT_MASK_RESET_ADDR 0x10
+#define PKA_ZEROIZE_ADDR 0x40
+#define TST_FRO_ADDR 0x50
+#define FRO_COUNT_ADDR 0x58
+#define PKA_PARITY_CTL_ADDR 0x60
+#define PKA_PARITY_STAT_ADDR 0x68
+
+#endif // __PKA_ADDRS_H__
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_config.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_config.h
new file mode 100644
index 000000000..5b69d55be
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_config.h
@@ -0,0 +1,226 @@
+//
+// BSD LICENSE
+//
+// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved.
+// 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 Mellanox Technologies 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 __PKA_CONFIG_H__
+#define __PKA_CONFIG_H__
+
+#include "mlxbf_pka_addrs.h"
+
+// The maximum number of PKA shims refered to as IO blocks.
+#define PKA_MAX_NUM_IO_BLOCKS 8
+// The maximum number of Rings supported by IO block (shim).
+#define PKA_MAX_NUM_IO_BLOCK_RINGS 4
+
+#define PKA_MAX_NUM_RINGS \
+ (PKA_MAX_NUM_IO_BLOCK_RINGS * PKA_MAX_NUM_IO_BLOCKS)
+
+// Resources are regions which include info control/status words,
+// count registers and host window ram.
+#define PKA_MAX_NUM_RING_RESOURCES 3
+
+// PKA Ring resources.
+// Define Ring resources parameters including base address, size (in bytes)
+// and ring spacing.
+#define PKA_RING_WORDS_ADDR PKA_BUFFER_RAM_BASE
+#define PKA_RING_CNTRS_ADDR COMMAND_COUNT_0_ADDR
+
+#define PKA_RING_WORDS_SIZE 0x40 // 64 bytes
+#define PKA_RING_CNTRS_SIZE 0x20 // 32 bytes (3 count registers)
+#define PKA_RING_MEM_SIZE 0x4000 // 16K bytes
+
+#define PKA_RING_WORDS_SPACING 0x40 // 64 bytes
+#define PKA_RING_CNTRS_SPACING 0x10000 // 64K bytes
+#define PKA_RING_MEM_0_SPACING 0x4000 // 16K bytes
+#define PKA_RING_MEM_1_SPACING 0x10000 // 64K bytes
+
+// PKA Window RAM parameters.
+// Define whether to split or not Window RAM during PKA device creation phase.
+#define SPLIT_WINDOW_RAM_MODE_ENABLED 1
+#define SPLIT_WINDOW_RAM_MODE_DISABLED 0
+#define PKA_SPLIT_WINDOW_RAM_MODE SPLIT_WINDOW_RAM_MODE_DISABLED
+// Defines for Window RAM partition. It is valid for 16K memory.
+#define PKA_WINDOW_RAM_RING_MEM_SIZE 0x0800 // 2KB
+#define PKA_WINDOW_RAM_DATA_MEM_SIZE 0x3800 // 14KB
+
+// Offset mask, common to both Window and Alternate Window RAM.
+#define PKA_WINDOW_RAM_OFFSET_MASK1 0x730000
+
+// Macro for mapping PKA Ring address into Window RAM address. It converts the
+// ring address, either physical address or virtual address, to valid address
+// into the Window RAM. This is done assuming the Window RAM base, size and
+// mask. Here, base is the actual physical address of the Window RAM, with the
+// help of mask it is reduced to Window RAM offset within that PKA block.
+// Further, with the help of addr and size, we arrive at the Window RAM
+// offset address for a PKA Ring within the given Window RAM.
+#define PKA_RING_MEM_ADDR(base, mask, addr, size) \
+ ((base & mask) | (((addr) & 0xffff) | \
+ ((((addr) & ~((size) - 1)) & 0xf0000) >> 2)))
+
+// PKA Master Sequencer Control/Status Register
+// Write '1' to bit [31] puts the Master controller Sequencer in a reset
+// reset state. Resetting the Sequencer (in order to load other firmware)
+// should only be done when the EIP-154 is not performing any operations.
+#define PKA_MASTER_SEQ_CTRL_RESET_VAL 0x80000000
+// Write '1' to bit [30] will reset all Command and Result counters. This
+// bit is write-only and self clearing and can only be set if the Reset
+// bit [31] is 1.
+#define PKA_MASTER_SEQ_CTRL_CLEAR_COUNTERS_VAL 0x40000000
+// Bit [8] in the PKA Master Sequencer Control/Status Register is tied to
+// the 'pka_master_irq interrupt' on the EIP-154 interrupt controller.
+#define PKA_MASTER_SEQ_CTRL_MASTER_IRQ_BIT 8
+// Sequencer status bits are used by the Master controller Sequencer to
+// reflect status. Bit [0] is tied to the 'pka_master_irq' interrupt on
+// the EIP-154 interrupt controller.
+#define PKA_MASTER_SEQ_CTRL_STATUS_BYTE 0x01
+// 'pka_master_irq' mask for the Master controller Sequencer Status Register.
+#define PKA_MASTER_SEQ_CTRL_MASTER_IRQ_MASK 0x100
+
+// Advanced Interrupt Controller (AIC) configuration
+// AIC Polarity Control Register is used to set each individual interrupt
+// signal (High Level / Rising Edge) during the initialization phase.
+// '0' = Low level or falling edge.
+// '1' = High level or rising edge.
+#define PKA_AIC_POL_CTRL_REG_VAL 0x000FFFFF
+// AIC Type Control Register is used to set each interrupt to level or edge.
+// '0' = Level.
+// '1' = Edge.
+#define PKA_AIC_TYPE_CTRL_REG_VAL 0x000FFFFF
+// AIC Enable Control Register is used to enable interrupt inputs.
+// '0' = Disabled.
+// '1' = Enabled.
+#define PKA_AIC_ENABLE_CTRL_REG_VAL 0x000F030F
+// AIC Enabled Status Register bits reflect the status of the interrupts
+// gated with the enable bits of the AIC_ENABLE_CTRL Register.
+// '0' = Inactive.
+// '1' = Pending.
+#define PKA_AIC_ENABLE_STAT_REG_VAL 0x000F030F
+
+// 'pka_master_irq' mask for the AIC Enabled Status Register.
+#define PKA_AIC_ENABLED_STAT_MASTER_IRQ_MASK 0x100
+
+// PKA_RING_OPTIONS field to specify the priority in which rings are handled:
+// '00' = full rotating priority,
+// '01' = fixed priority (ring 0 lowest),
+// '10' = ring 0 has the highest priority and the remaining rings have
+// rotating priority,
+// '11' = reserved, do not use.
+#define PKA_FULL_ROTATING_PRIORITY 0x0
+#define PKA_FIXED_PRIORITY 0x1
+#define PKA_RING_0_HAS_THE_HIGHEST_PRIORITY 0x2
+#define PKA_RESERVED 0x3
+#define PKA_RING_OPTIONS_PRIORITY PKA_FULL_ROTATING_PRIORITY
+
+// 'Signature' byte used because the ring options are transferred through RAM
+// which does not have a defined reset value. The EIP-154 master controller
+// keeps reading the PKA_RING_OPTIONS word at start-up until the Signature
+// byte contains 0x46 and the Reserved field contains zero.
+#define PKA_RING_OPTIONS_SIGNATURE_BYTE 0x46
+
+// Order of the result reporting: Two schemas are available:
+// InOrder - This means that the results will be reported in the same order
+// as the commands were provided.
+// OutOfOrder - This means that the results are reported as soon as they are
+// available
+#define PKA_RING_TYPE_IN_ORDER_BIT 1
+#define PKA_RING_TYPE_OUT_OF_ORDER_BIT 0
+#define PKA_RING_TYPE_IN_ORDER PKA_RING_TYPE_OUT_OF_ORDER_BIT
+
+// Byte order of the data written/read to/from Rings.
+// Little Endian (LE) - The least significant bytes have the lowest address.
+// Big Endian (BE) - The most significant bytes come first.
+#define PKA_RING_BYTE_ORDER_LE 0
+#define PKA_RING_BYTE_ORDER_BE 1
+#define PKA_RING_BYTE_ORDER PKA_RING_BYTE_ORDER_LE
+
+// 'trng_clk_on' mask for PKA Clock Switch Forcing Register. Turn on the
+// TRNG clock. When the TRNG is controlled via the Host slave interface,
+// this engine needs to be turned on by setting bit 11.
+#define PKA_CLK_FORCE_TRNG_ON 0x800
+
+// Number of TRNG Output registers
+#define PKA_TRNG_OUTPUT_CNT 4
+
+// TRNG Configuration
+#define PKA_TRNG_CONFIG_REG_VAL 0x00020008
+// TRNG Alarm Counter Register Value
+#define PKA_TRNG_ALARMCNT_REG_VAL 0x000200FF
+// TRNG FRO Enable Register Value
+#define PKA_TRNG_FROENABLE_REG_VAL 0x00FFFFFF
+// TRNG Control Register Value; Set bit 10 to start the EIP-76 a.k.a TRNG
+// engine, gathering entropy from the FROs.
+#define PKA_TRNG_CONTROL_REG_VAL 0x00000400
+
+// TRNG Control bit
+#define PKA_TRNG_CONTROL_TEST_MODE 0x100
+
+// TRNG Control Register Value; Set bit 10 and 12 to start the EIP-76 a.k.a TRNG
+// engine with DRBG enabled, gathering entropy from the FROs.
+#define PKA_TRNG_CONTROL_DRBG_REG_VAL 0x00001400
+
+// DRBG enabled TRNG 'request_data' value. REQ_DATA_VAL (in accordance with
+// DATA_BLOCK_MASK) requests 256 blocks of 128-bit random output.
+// 4095 blocks is the max number that can be requested for the TRNG(with DRBG)
+// configuration on Bluefield platforms.
+#define PKA_TRNG_CONTROL_REQ_DATA_VAL 0x10010000
+
+// Mask for 'Data Block' in TRNG Control Register.
+#define PKA_TRNG_DRBG_DATA_BLOCK_MASK 0xfff00000
+
+// Set bit 12 of TRNG Control Register to enable DRBG functionality.
+#define PKA_TRNG_CONTROL_DRBG_ENABLE_VAL 0x00001000
+
+// Set bit 8 a.ka 'test_sp_800_90 DRBG' bit in the TRNG Test Register.
+#define PKA_TRNG_TEST_DRBG_VAL 0x00000080
+
+// Number of Personalization String/Additional Input Registers
+#define PKA_TRNG_PS_AI_REG_COUNT 12
+
+// DRBG Reseed enable
+#define PKA_TRNG_CONTROL_DRBG_RESEED 0x00008000
+
+// TRNG Status bits
+#define PKA_TRNG_STATUS_READY 0x1
+#define PKA_TRNG_STATUS_SHUTDOWN_OFLO 0x2
+#define PKA_TRNG_STATUS_TEST_READY 0x100
+#define PKA_TRNG_STATUS_MONOBIT_FAIL 0x80
+#define PKA_TRNG_STATUS_RUN_FAIL 0x10
+#define PKA_TRNG_STATUS_POKER_FAIL 0x40
+
+// TRNG Alarm Counter bits
+#define PKA_TRNG_ALARMCNT_STALL_RUN_POKER 0x8000
+
+// TRNG Test bits
+#define PKA_TRNG_TEST_KNOWN_NOISE 0x20
+#define PKA_TRNG_TEST_NOISE 0x2000
+
+#endif // __PKA_CONFIG_H__
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_cpu.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_cpu.h
new file mode 100644
index 000000000..12a368c13
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_cpu.h
@@ -0,0 +1,72 @@
+//
+// BSD LICENSE
+//
+// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved.
+// 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 Mellanox Technologies 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 __PKA_CPU_H__
+#define __PKA_CPU_H__
+
+#include <linux/types.h>
+#include <linux/timex.h>
+
+#define PKA_AARCH_64
+#define MAX_CPU_NUMBER 16 // BlueField specific
+
+#define MEGA 1000000
+#define GIGA 1000000000
+
+#define MS_PER_S 1000
+#define US_PER_S 1000000
+#define NS_PER_S 1000000000
+
+// Initial guess at our CPU speed. We set this to be larger than any
+// possible real speed, so that any calculated delays will be too long,
+// rather than too short.
+//
+//*Warning: use dummy value for frequency
+//#define CPU_HZ_MAX (2 * GIGA) // Cortex A72 : 2 GHz max -> 2.5 GHz max
+#define CPU_HZ_MAX (1255 * MEGA) // CPU Freq for High/Bin Chip
+
+// YIELD hints the CPU to switch to another thread if possible
+// and executes as a NOP otherwise.
+#define pka_cpu_yield() ({ asm volatile("yield" : : : "memory"); })
+// ISB flushes the pipeline, then restarts. This is guaranteed to
+// stall the CPU a number of cycles.
+#define pka_cpu_relax() ({ asm volatile("isb" : : : "memory"); })
+
+// Processor speed in hertz; used in routines which might be called very
+// early in boot.
+static inline uint64_t pka_early_cpu_speed(void)
+{
+ return CPU_HZ_MAX;
+}
+
+#endif // __PKA_CPU_H__
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_debug.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_debug.h
new file mode 100644
index 000000000..a44af6eb1
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_debug.h
@@ -0,0 +1,66 @@
+//
+// BSD LICENSE
+//
+// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved.
+// 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 Mellanox Technologies 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 __PKA_DEBUG_H__
+#define __PKA_DEBUG_H__
+
+// PKA library bitmask. Use those bits to enable debug messages
+#define PKA_DRIVER 0x0001
+#define PKA_DEV 0x0002
+#define PKA_RING 0x0004
+#define PKA_QUEUE 0x0008
+#define PKA_MEM 0x0010
+#define PKA_USER 0x0020
+#define PKA_TESTS 0x0040
+// PKA debug mask. This indicates the debug/verbosity level.
+#define PKA_DEBUG_LIB_MASK 0x0040
+
+#define PKA_PRINT(lib, fmt, args...) \
+ ({ pr_info(#lib": "fmt, ##args); })
+
+#define PKA_ERROR(lib, fmt, args...) \
+ ({ pr_err(#lib": %s: error: "fmt, __func__, ##args); })
+
+#define PKA_DEBUG(lib, fmt, args...) \
+ ({ \
+ if (lib & PKA_DEBUG_LIB_MASK) \
+ pr_debug(#lib": %s: "fmt, __func__, ##args); \
+ })
+
+#define PKA_PANIC(lib, msg, args...) \
+ ({ \
+ pr_info(#lib": %s: panic: "msg, __func__, ##args); \
+ panic(msg, ##args); \
+ })
+
+#endif // __PKA_DEBUG_H__
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c
new file mode 100644
index 000000000..c90c70134
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.c
@@ -0,0 +1,2414 @@
+//
+// BSD LICENSE
+//
+// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved.
+// 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 Mellanox Technologies 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/delay.h>
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/ioport.h>
+#include <linux/timex.h>
+#include <linux/vfio.h>
+
+#include "mlxbf_pka_dev.h"
+
+#define BYTES_PER_WORD 4
+#define BYTES_PER_DOUBLE_WORD 8
+
+// Personalization string "NVIDIA-MELLANOX-BLUEFIELD-TRUE_RANDOM_NUMBER_GEN"
+uint32_t pka_trng_drbg_ps_str[] =
+{
+ 0x4e564944, 0x49412d4d, 0x454c4c41, 0x4e4f582d,
+ 0x424c5545, 0x4649454c, 0x442d5452, 0x55455f52,
+ 0x414e444f, 0x4d5f4e55, 0x4d424552, 0x5f47454e
+};
+
+// Personalization string for DRBG test
+uint32_t pka_trng_drbg_test_ps_str[] =
+{
+ 0x64299d83, 0xc34d7098, 0x5bd1f51d, 0xddccfdc1,
+ 0xdd0455b7, 0x166279e5, 0x0974cb1b, 0x2f2cd100,
+ 0x59a5060a, 0xca79940d, 0xd4e29a40, 0x56b7b779
+};
+
+// First Entropy string for DRBG test
+uint32_t pka_trng_drbg_test_etpy_str1[] =
+{
+ 0xaa6bbcab, 0xef45e339, 0x136ca1e7, 0xbce1c881,
+ 0x9fa37b09, 0x63b53667, 0xb36e0053, 0xa202ed81,
+ 0x4650d90d, 0x8eed6127, 0x666f2402, 0x0dfd3af9
+};
+
+// Second Entropy string for DRBG test
+uint32_t pka_trng_drbg_test_etpy_str2[] =
+{
+ 0x35c1b7a1, 0x0154c52b, 0xd5777390, 0x226a4fdb,
+ 0x5f16080d, 0x06b68369, 0xd0c93d00, 0x3336e27f,
+ 0x1abf2c37, 0xe6ab006c, 0xa4adc6e1, 0x8e1907a2
+};
+
+// Known answer for DRBG test
+uint32_t pka_trng_drbg_test_output[] =
+{
+ 0xb663b9f1, 0x24943e13, 0x80f7dce5, 0xaba1a16f
+};
+
+pka_dev_gbl_config_t pka_gbl_config;
+
+// Global PKA shim resource info table
+static pka_dev_gbl_shim_res_info_t pka_gbl_res_tbl[PKA_MAX_NUM_IO_BLOCKS];
+
+// Start a PKA device timer.
+static uint64_t pka_dev_timer_start(uint32_t usec)
+{
+ uint64_t cur_time = get_cycles();
+ return (cur_time + (pka_early_cpu_speed() * usec) / 1000000ULL);
+}
+
+// Test a PKA device timer for completion.
+static int pka_dev_timer_done(uint64_t timer)
+{
+ return (get_cycles() >= timer);
+}
+
+// Return register base address
+static uint64_t pka_dev_get_register_base(uint64_t base, uint64_t reg_addr)
+{
+ return (base + reg_addr) & PAGE_MASK;
+}
+
+// Return register offset
+static uint64_t pka_dev_get_register_offset(uint64_t base, uint64_t reg_addr)
+{
+ return (base + reg_addr) & ~PAGE_MASK;
+}
+
+// Return word offset within io memory
+static uint64_t pka_dev_get_word_offset(uint64_t mem_base, uint64_t word_addr,
+ uint64_t mem_size)
+{
+ return (mem_base + word_addr) & (mem_size - 1);
+}
+
+static uint64_t pka_dev_io_read(void *mem_ptr, uint64_t mem_off)
+{
+ uint64_t data;
+
+ data = pka_mmio_read(mem_ptr + mem_off);
+
+ return data;
+}
+
+static void pka_dev_io_write(void *mem_ptr, uint64_t mem_off, uint64_t value)
+{
+ pka_mmio_write(mem_ptr + mem_off, value);
+}
+
+// Add the resource to the global resource table
+static int pka_dev_add_resource(pka_dev_res_t *res_ptr, uint32_t shim_idx)
+{
+ uint8_t res_cnt;
+
+ res_cnt = pka_gbl_res_tbl[shim_idx].res_cnt;
+
+ if (res_cnt >= PKA_DEV_SHIM_RES_CNT)
+ return -ENOMEM;
+
+ pka_gbl_res_tbl[shim_idx].res_tbl[res_cnt] = res_ptr;
+ pka_gbl_res_tbl[shim_idx].res_cnt++;
+
+ return 0;
+}
+
+// Remove the resource from the global resource table
+static int pka_dev_put_resource(pka_dev_res_t *res, uint32_t shim_idx)
+{
+ pka_dev_res_t *res_ptr;
+ uint8_t res_idx;
+
+ for (res_idx = 0; res_idx < PKA_DEV_SHIM_RES_CNT; res_idx++)
+ {
+ res_ptr = pka_gbl_res_tbl[shim_idx].res_tbl[res_idx];
+ if (res_ptr && strcmp(res_ptr->name, res->name) == 0)
+ {
+ pka_gbl_res_tbl[shim_idx].res_tbl[res_idx] = NULL;
+ pka_gbl_res_tbl[shim_idx].res_cnt--;
+ break;
+ }
+ }
+
+ // Check whether the resource shares the same memory map; If so,
+ // the memory map shouldn't be released.
+ for (res_idx = 0; res_idx < PKA_DEV_SHIM_RES_CNT; res_idx++)
+ {
+ res_ptr = pka_gbl_res_tbl[shim_idx].res_tbl[res_idx];
+ if (res_ptr && (res_ptr->base == res->base))
+ return -EBUSY;
+ }
+
+ return 0;
+}
+
+static void* pka_dev_get_resource_ioaddr(uint64_t res_base, uint32_t shim_idx)
+{
+ pka_dev_res_t *res_ptr;
+ uint8_t res_cnt, res_idx;
+
+ res_cnt = pka_gbl_res_tbl[shim_idx].res_cnt;
+
+ if (res_cnt == 0)
+ return NULL;
+
+ for (res_idx = 0; res_idx < res_cnt; res_idx++)
+ {
+ res_ptr = pka_gbl_res_tbl[shim_idx].res_tbl[res_idx];
+ if (res_ptr->base == res_base)
+ return res_ptr->ioaddr;
+ }
+
+ return NULL;
+}
+
+// Set PKA device resource config - - map io memory if needed.
+static int pka_dev_set_resource_config(pka_dev_shim_t *shim,
+ pka_dev_res_t *res_ptr,
+ uint64_t res_base,
+ uint64_t res_size,
+ uint64_t res_type,
+ char *res_name)
+{
+ int ret = 0;
+
+ if (res_ptr->status == PKA_DEV_RES_STATUS_MAPPED)
+ return -EPERM;
+
+ if (res_type == PKA_DEV_RES_TYPE_REG)
+ res_ptr->base = res_base;
+
+ if (res_type == PKA_DEV_RES_TYPE_MEM)
+ res_ptr->base = shim->mem_res.eip154_base + res_base;
+
+ res_ptr->size = res_size;
+ res_ptr->type = res_type;
+ res_ptr->name = res_name;
+ res_ptr->status = PKA_DEV_RES_STATUS_UNMAPPED;
+ res_ptr->ioaddr = pka_dev_get_resource_ioaddr(res_ptr->base,
+ shim->shim_id);
+ if (!res_ptr->ioaddr)
+ {
+ if (!request_mem_region(res_ptr->base, res_ptr->size, res_ptr->name))
+ {
+ PKA_ERROR(PKA_DEV, "failed to get io memory region\n");
+ return -EPERM;
+ }
+
+ res_ptr->ioaddr = ioremap(res_ptr->base, res_ptr->size);
+ }
+
+ res_ptr->status = PKA_DEV_RES_STATUS_MAPPED;
+
+ if (!res_ptr->ioaddr || pka_dev_add_resource(res_ptr, shim->shim_id))
+ {
+ PKA_ERROR(PKA_DEV, "unable to map io memory\n");
+ release_mem_region(res_ptr->base, res_ptr->size);
+ return -ENOMEM;
+ }
+ return ret;
+}
+
+// Unset PKA device resource config - unmap io memory if needed.
+static void pka_dev_unset_resource_config(pka_dev_shim_t *shim,
+ pka_dev_res_t *res_ptr)
+{
+ int ret = -EBUSY;
+
+ if (res_ptr->status != PKA_DEV_RES_STATUS_MAPPED)
+ return;
+
+ if (res_ptr->ioaddr &&
+ ret != pka_dev_put_resource(res_ptr, shim->shim_id))
+ {
+ iounmap(res_ptr->ioaddr);
+ release_mem_region(res_ptr->base, res_ptr->size);
+ }
+
+ res_ptr->status = PKA_DEV_RES_STATUS_UNMAPPED;
+}
+
+int pka_dev_clear_ring_counters(pka_dev_ring_t *ring)
+{
+ pka_dev_shim_t *shim;
+ pka_dev_res_t *master_seq_ctrl_ptr;
+ void *master_reg_ptr;
+ uint64_t master_reg_base, master_reg_off;
+
+ shim = ring->shim;
+ master_seq_ctrl_ptr = &shim->resources.master_seq_ctrl;
+ master_reg_base = master_seq_ctrl_ptr->base;
+ master_reg_ptr = master_seq_ctrl_ptr->ioaddr;
+ master_reg_off = pka_dev_get_register_offset(master_reg_base,
+ PKA_MASTER_SEQ_CTRL_ADDR);
+
+ // push the EIP-154 master controller into reset.
+ pka_dev_io_write(master_reg_ptr, master_reg_off,
+ PKA_MASTER_SEQ_CTRL_RESET_VAL);
+
+ // clear counters.
+ pka_dev_io_write(master_reg_ptr, master_reg_off,
+ PKA_MASTER_SEQ_CTRL_CLEAR_COUNTERS_VAL);
+
+ // take the EIP-154 master controller out of reset.
+ pka_dev_io_write(master_reg_ptr, master_reg_off, 0);
+
+ return 0;
+}
+
+// Initialize ring. Set ring parameters and configure ring resources.
+// It returns 0 on success, a negative error code on failure.
+static int pka_dev_init_ring(pka_dev_ring_t *ring, uint32_t ring_id,
+ pka_dev_shim_t *shim)
+{
+ int ret = 0;
+
+ pka_dev_res_t *ring_info_words_ptr;
+ pka_dev_res_t *ring_counters_ptr;
+ pka_dev_res_t *ring_window_ram_ptr;
+
+ uint32_t ring_words_off;
+ uint32_t ring_cntrs_off;
+ uint32_t ring_mem_off;
+ uint32_t ring_mem_base;
+
+ uint32_t shim_ring_id;
+ uint8_t window_ram_split;
+
+ if (ring->status != PKA_DEV_RING_STATUS_UNDEFINED)
+ {
+ PKA_ERROR(PKA_DEV, "PKA ring must be undefined\n");
+ return -EPERM;
+ }
+
+ if (ring_id > PKA_MAX_NUM_RINGS - 1)
+ {
+ PKA_ERROR(PKA_DEV, "invalid ring identifier\n");
+ return -EINVAL;
+ }
+
+ ring->ring_id = ring_id;
+ ring->shim = shim;
+ ring->resources_num = PKA_MAX_NUM_RING_RESOURCES;
+
+ shim_ring_id = ring_id % PKA_MAX_NUM_IO_BLOCK_RINGS;
+ shim->rings[shim_ring_id] = ring;
+
+ // Configure ring information control/status words resource
+ ring_info_words_ptr = &ring->resources.info_words;
+ ring_words_off = shim_ring_id * PKA_RING_WORDS_SPACING;
+ ring_info_words_ptr->base = ring_words_off + shim->mem_res.eip154_base +
+ PKA_RING_WORDS_ADDR;
+ ring_info_words_ptr->size = PKA_RING_WORDS_SIZE;
+ ring_info_words_ptr->type = PKA_DEV_RES_TYPE_MEM;
+ ring_info_words_ptr->status = PKA_DEV_RES_STATUS_UNMAPPED;
+ ring_info_words_ptr->name = "PKA_RING_INFO";
+
+ // Configure ring counters registers resource
+ ring_counters_ptr = &ring->resources.counters;
+ ring_cntrs_off = shim_ring_id * PKA_RING_CNTRS_SPACING;
+ ring_counters_ptr->base = ring_cntrs_off + shim->mem_res.eip154_base +
+ PKA_RING_CNTRS_ADDR;
+ ring_counters_ptr->size = PKA_RING_CNTRS_SIZE;
+ ring_counters_ptr->type = PKA_DEV_RES_TYPE_REG;
+ ring_counters_ptr->status = PKA_DEV_RES_STATUS_UNMAPPED;
+ ring_counters_ptr->name = "PKA_RING_CNTRS";
+
+ // Configure ring window RAM resource
+ window_ram_split = shim->window_ram_split;
+ if (window_ram_split == PKA_SHIM_WINDOW_RAM_SPLIT_ENABLED)
+ {
+ ring_mem_off = shim_ring_id * PKA_RING_MEM_1_SPACING;
+ ring_mem_base = ring_mem_off + shim->mem_res.alt_wndw_ram_0_base;
+ }
+ else
+ {
+ ring_mem_off = shim_ring_id * PKA_RING_MEM_0_SPACING;
+ ring_mem_base = ring_mem_off + shim->mem_res.wndw_ram_base;
+ }
+
+ ring_window_ram_ptr = &ring->resources.window_ram;
+ ring_window_ram_ptr->base = ring_mem_base;
+ ring_window_ram_ptr->size = PKA_RING_MEM_SIZE;
+ ring_window_ram_ptr->type = PKA_DEV_RES_TYPE_MEM;
+ ring_window_ram_ptr->status = PKA_DEV_RES_STATUS_UNMAPPED;
+ ring_window_ram_ptr->name = "PKA_RING_WINDOW";
+
+ ring->ring_info = kzalloc(sizeof(pka_dev_hw_ring_info_t), GFP_KERNEL);
+ if (!ring->ring_info)
+ {
+ PKA_ERROR(PKA_DEV, "unable to kmalloc\n");
+ kfree(ring->ring_info);
+ return -ENOMEM;
+ }
+
+ mutex_init(&ring->mutex);
+ ring->status = PKA_DEV_RING_STATUS_INITIALIZED;
+
+ return ret;
+}
+
+// Release a given Ring.
+static int pka_dev_release_ring(pka_dev_ring_t *ring)
+{
+ int ret = 0;
+
+ pka_dev_shim_t *shim;
+ uint32_t shim_ring_id;
+
+ if (ring->status == PKA_DEV_RING_STATUS_UNDEFINED)
+ return ret;
+
+ if (ring->status == PKA_DEV_RING_STATUS_BUSY)
+ {
+ PKA_ERROR(PKA_DEV, "PKA ring is busy\n");
+ return -EBUSY;
+ }
+
+ shim = ring->shim;
+
+ if (shim->status == PKA_SHIM_STATUS_RUNNING)
+ {
+ PKA_ERROR(PKA_DEV, "PKA shim is running\n");
+ return -EPERM;
+ }
+
+ pka_dev_unset_resource_config(shim, &ring->resources.info_words);
+ pka_dev_unset_resource_config(shim, &ring->resources.counters);
+ pka_dev_unset_resource_config(shim, &ring->resources.window_ram);
+
+ kfree(ring->ring_info);
+
+ ring->status = PKA_DEV_RING_STATUS_UNDEFINED;
+ shim_ring_id = ring->ring_id % PKA_MAX_NUM_IO_BLOCK_RINGS;
+ shim->rings[shim_ring_id] = NULL;
+ shim->rings_num--;
+
+ return ret;
+}
+
+// Partition the window RAM for a given PKA ring. Here we statically divide
+// the 16K memory region into three partitions: First partition is reserved
+// for command descriptor ring (1K), second partition is reserved for result
+// descriptor ring (1K), and the remaining 14K are reserved for vector data.
+// Through this memroy partition scheme, command/result descriptor rings hold
+// a total of 1KB/64B = 16 descriptors each. The adresses for the rings start
+// at offset 0x3800. Also note that it is possible to have rings full while
+// the vector data can support more data, the opposite can also happen, but
+// it is not suitable. For instance ECC point multiplication requires 8 input
+// vectors and 2 output vectors, a total of 10 vectors. If each vector has a
+// length of 24 words (24x4B = 96B), we can process 14KB/960B = 14 operations
+// which is close to 16 the total descriptors supported by rings. On the other
+// hand, using 12K vector data region, allows to process only 12 operations,
+// while rings can hold 32 descriptors (ring usage is significantly low).
+// For ECDSA verify, we have 12 vectors which require 1152B, with 14KB we can
+// handle 12 operations, against 10 operations with 12KB vector data memory.
+// We believe that the aformentionned memory partition help us to leverage
+// the trade-off between supported descriptors and required vectors. Note
+// that these examples gives approximative values and does not include buffer
+// word padding across vectors.
+//
+// The function also writes the result descriptor rings base addresses, size
+// and type, and initialize the read and write pointers and statistics. It
+// returns 0 on success, a negative error code on failure.
+//
+// This function must be called once per ring, at initialization before any
+// other fonctions are called.
+static int pka_dev_partition_mem(pka_dev_ring_t *ring)
+{
+ int ret = 0;
+
+ pka_dev_shim_t *shim;
+ pka_dev_hw_ring_info_t *ring_info;
+
+ uint32_t ring_mem_base;
+ uint32_t ring_mem_size;
+ uint32_t data_mem_base;
+ uint32_t data_mem_size;
+
+ uint64_t cmd_desc_ring_base;
+ uint32_t cmd_desc_ring_size;
+ uint64_t rslt_desc_ring_base;
+ uint32_t rslt_desc_ring_size;
+
+ uint16_t num_cmd_desc;
+ uint16_t host_desc_size;
+ uint8_t ring_in_order;
+
+ uint64_t window_ram_base;
+ uint64_t window_ram_size;
+
+ shim = ring->shim;
+
+ if (!ring->shim ||
+ ring->status != PKA_DEV_RING_STATUS_INITIALIZED)
+ return -EPERM;
+
+ ring_in_order = shim->ring_type;
+ window_ram_base = ring->resources.window_ram.base;
+ window_ram_size = ring->resources.window_ram.size;
+ // Partition ring memory. Give ring pair (cmmd descriptor ring and rslt
+ // descriptor ring) an equal portion of the memory. The cmmd descriptor
+ // ring and result descriptor ring are used as "non-overlapping" ring.
+ // Currently set aside 1/8 of the window RAM for command/result descriptor
+ // rings - giving a total of 1K/64B = 16 descriptors per ring.
+ // The remaining memory is "Data Memory" - i.e. memory to hold the command
+ // operands and results - also called input/output vectors (in all cases
+ // these vectors are just single large integers - often in the range of
+ // hundreds to thousands of bits long).
+ ring_mem_size = PKA_WINDOW_RAM_RING_MEM_SIZE / 2;
+ data_mem_size = PKA_WINDOW_RAM_DATA_MEM_SIZE;
+ data_mem_base = window_ram_base;
+ ring_mem_base = data_mem_base + data_mem_size;
+
+ num_cmd_desc = ring_mem_size / CMD_DESC_SIZE;
+ host_desc_size = CMD_DESC_SIZE / BYTES_PER_WORD;
+
+ cmd_desc_ring_size = num_cmd_desc * CMD_DESC_SIZE;
+ rslt_desc_ring_size = cmd_desc_ring_size;
+
+ ring->num_cmd_desc = num_cmd_desc;
+
+ // The command and result descriptor rings may be placed at different
+ // (non-overlapping) locations in Window RAM memory space. PKI command
+ // interface: Most of the functionality is defined by the EIP-154 master
+ // firmware on the EIP-154 master controller Sequencer.
+ cmd_desc_ring_base = ring_mem_base;
+ rslt_desc_ring_base = ring_mem_base + cmd_desc_ring_size;
+
+ cmd_desc_ring_base =
+ PKA_RING_MEM_ADDR(window_ram_base, shim->mem_res.wndw_ram_off_mask,
+ cmd_desc_ring_base, window_ram_size);
+ rslt_desc_ring_base =
+ PKA_RING_MEM_ADDR(window_ram_base, shim->mem_res.wndw_ram_off_mask,
+ rslt_desc_ring_base, window_ram_size);
+
+ ring_info = ring->ring_info;
+ // Fill ring information.
+ ring_info->cmmd_base = cmd_desc_ring_base;
+ ring_info->rslt_base = rslt_desc_ring_base;
+ ring_info->size = num_cmd_desc - 1;
+ ring_info->host_desc_size = host_desc_size;
+ ring_info->in_order = ring_in_order;
+ ring_info->cmmd_rd_ptr = 0x0;
+ ring_info->rslt_wr_ptr = 0x0;
+ ring_info->cmmd_rd_stats = 0x0;
+ ring_info->rslt_wr_stats = 0x0;
+
+ return ret;
+}
+
+// Write the ring base address, ring size and type, and initialize (clear)
+// the read and write pointers and statistics.
+static int pka_dev_write_ring_info(pka_dev_res_t *buffer_ram_ptr,
+ uint8_t ring_id,
+ uint32_t ring_cmmd_base_val,
+ uint32_t ring_rslt_base_val,
+ uint32_t ring_size_type_val)
+{
+ uint32_t ring_spacing;
+ uint64_t word_off;
+ int ret = 0;
+
+ if (buffer_ram_ptr->status != PKA_DEV_RES_STATUS_MAPPED ||
+ buffer_ram_ptr->type != PKA_DEV_RES_TYPE_MEM)
+ return -EPERM;
+
+ PKA_DEBUG(PKA_DEV, "Writing ring information control/status words\n");
+
+ ring_spacing = ring_id * PKA_RING_WORDS_SPACING;
+
+ // Write the command ring base address that the EIP-154
+ // master firmware uses with the command ring read pointer
+ // to get command descriptors from the Host ring. After the
+ // initialization, although the word is writeable it should
+ // be regarded as read-only.
+ word_off = pka_dev_get_word_offset(buffer_ram_ptr->base,
+ RING_CMMD_BASE_0_ADDR + ring_spacing,
+ PKA_BUFFER_RAM_SIZE);
+ pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, ring_cmmd_base_val);
+
+ // Write the result ring base address that the EIP-154
+ // master firmware uses with the result ring write pointer
+ // to put the result descriptors in the Host ring. After
+ // the initialization, although the word is writeable it
+ // should be regarded as read-only.
+ word_off = pka_dev_get_word_offset(buffer_ram_ptr->base,
+ RING_RSLT_BASE_0_ADDR + ring_spacing,
+ PKA_BUFFER_RAM_SIZE);
+ pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, ring_rslt_base_val);
+
+ // Write the ring size (number of descriptors), the size of
+ // the descriptor and the result reporting scheme. After the
+ // initialization, although the word is writeable it should
+ // be regarded as read-only.
+ word_off = pka_dev_get_word_offset(buffer_ram_ptr->base,
+ RING_SIZE_TYPE_0_ADDR + ring_spacing,
+ PKA_BUFFER_RAM_SIZE);
+ pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, ring_size_type_val);
+
+ // Write the command and result ring indices that the EIP-154
+ // master firmware uses. This word should be written with zero
+ // when the ring information is initialized. After the
+ // initialization, although the word is writeable it should be
+ // regarded as read-only.
+ word_off = pka_dev_get_word_offset(buffer_ram_ptr->base,
+ RING_RW_PTRS_0_ADDR + ring_spacing,
+ PKA_BUFFER_RAM_SIZE);
+ pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, 0);
+
+ // Write the ring statistics (two 16-bit counters, one for
+ // commands and one for results) from EIP-154 master firmware
+ // point of view. This word should be written with zero when
+ // the ring information is initialized. After the initializa-
+ // -tion, although the word is writeable it should be regarded
+ // as read-only.
+ word_off = pka_dev_get_word_offset(buffer_ram_ptr->base,
+ RING_RW_STAT_0_ADDR + ring_spacing,
+ PKA_BUFFER_RAM_SIZE);
+ pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, 0);
+
+ return ret;
+}
+
+// Set up the control/status words. Upon a PKI command the EIP-154 master
+// firmware will read and partially update the ring information.
+static int pka_dev_set_ring_info(pka_dev_ring_t *ring)
+{
+ int ret = 0;
+
+ pka_dev_shim_t *shim;
+ pka_dev_hw_ring_info_t *ring_info;
+ pka_dev_res_t *buffer_ram_ptr;
+
+ uint32_t ring_cmmd_base_val;
+ uint32_t ring_rslt_base_val;
+ uint32_t ring_size_type_val;
+
+ uint8_t ring_id;
+
+ shim = ring->shim;
+ // Ring info configuration MUST be done when the PKA ring
+ // is initilaized.
+ if ((shim->status != PKA_SHIM_STATUS_INITIALIZED &&
+ shim->status != PKA_SHIM_STATUS_RUNNING &&
+ shim->status != PKA_SHIM_STATUS_STOPPED) ||
+ ring->status != PKA_DEV_RING_STATUS_INITIALIZED)
+ return -EPERM;
+
+ ring_id = ring->ring_id % PKA_MAX_NUM_IO_BLOCK_RINGS;
+
+ // Partition ring memory.
+ ret = pka_dev_partition_mem(ring);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to initialize ring memory\n");
+ return ret;
+ }
+
+ // Fill ring infomation.
+ ring_info = ring->ring_info;
+
+ ring_cmmd_base_val = ring_info->cmmd_base;
+ ring_rslt_base_val = ring_info->rslt_base;
+
+ ring_size_type_val = (ring_info->in_order & 0x0001) << 31;
+ ring_size_type_val |= (ring_info->host_desc_size & 0x03FF) << 18;
+ ring_size_type_val |= (ring->num_cmd_desc - 1) & 0xFFFF;
+
+ buffer_ram_ptr = &shim->resources.buffer_ram;
+ // Write ring information status/control words in the PKA Buffer RAM
+ ret = pka_dev_write_ring_info(buffer_ram_ptr, ring_id, ring_cmmd_base_val,
+ ring_rslt_base_val, ring_size_type_val);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to wirte ring information\n");
+ return ret;
+ }
+
+ ring->status = PKA_DEV_RING_STATUS_READY;
+
+ return ret;
+}
+
+// Create shim. Set shim parameters and configure shim resources.
+// It returns 0 on success, a negative error code on failure.
+static int pka_dev_create_shim(pka_dev_shim_t *shim, uint32_t shim_id,
+ uint8_t split, struct pka_dev_mem_res *mem_res)
+{
+ int ret = 0;
+
+ uint64_t reg_base;
+ uint64_t reg_size;
+
+ if (shim->status == PKA_SHIM_STATUS_CREATED)
+ return ret;
+
+ if (shim->status != PKA_SHIM_STATUS_UNDEFINED)
+ {
+ PKA_ERROR(PKA_DEV, "PKA device must be undefined\n");
+ return -EPERM;
+ }
+
+ if (shim_id > PKA_MAX_NUM_IO_BLOCKS - 1)
+ {
+ PKA_ERROR(PKA_DEV, "invalid shim identifier\n");
+ return -EINVAL;
+ }
+
+ shim->shim_id = shim_id;
+ shim->mem_res = *mem_res;
+
+ if (split)
+ shim->window_ram_split = PKA_SHIM_WINDOW_RAM_SPLIT_ENABLED;
+ else
+ shim->window_ram_split = PKA_SHIM_WINDOW_RAM_SPLIT_DISABLED;
+
+ shim->ring_type = PKA_RING_TYPE_IN_ORDER;
+ shim->ring_priority = PKA_RING_OPTIONS_PRIORITY;
+ shim->rings_num = PKA_MAX_NUM_IO_BLOCK_RINGS;
+ shim->rings = kzalloc(sizeof(pka_dev_ring_t) * shim->rings_num,
+ GFP_KERNEL);
+ if (!shim->rings)
+ {
+ PKA_ERROR(PKA_DEV, "unable to kmalloc\n");
+ return -ENOMEM;
+ }
+
+ // Set PKA device Buffer RAM config
+ ret = pka_dev_set_resource_config(shim, &shim->resources.buffer_ram,
+ PKA_BUFFER_RAM_BASE,
+ PKA_BUFFER_RAM_SIZE,
+ PKA_DEV_RES_TYPE_MEM,
+ "PKA_BUFFER_RAM");
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "unable to set Buffer RAM config\n");
+ return ret;
+ }
+
+ // Set PKA device Master Program RAM config
+ ret = pka_dev_set_resource_config(shim, &shim->resources.master_prog_ram,
+ PKA_MASTER_PROG_RAM_BASE,
+ PKA_MASTER_PROG_RAM_SIZE,
+ PKA_DEV_RES_TYPE_MEM,
+ "PKA_MASTER_PROG_RAM");
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "unable to set Master Program RAM config\n");
+ return ret;
+ }
+
+ // Set PKA device Master Controller register
+ reg_size = PAGE_SIZE;
+ reg_base = pka_dev_get_register_base(shim->mem_res.eip154_base,
+ PKA_MASTER_SEQ_CTRL_ADDR);
+ ret = pka_dev_set_resource_config(shim, &shim->resources.master_seq_ctrl,
+ reg_base, reg_size,
+ PKA_DEV_RES_TYPE_REG,
+ "PKA_MASTER_SEQ_CTRL");
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "unable to set Master Controller register "
+ "config\n");
+ return ret;
+ }
+
+ // Set PKA device AIC registers
+ reg_size = PAGE_SIZE;
+ reg_base = pka_dev_get_register_base(shim->mem_res.eip154_base,
+ AIC_POL_CTRL_ADDR);
+ ret = pka_dev_set_resource_config(shim, &shim->resources.aic_csr,
+ reg_base, reg_size,
+ PKA_DEV_RES_TYPE_REG,
+ "PKA_AIC_CSR");
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "unable to set AIC registers config\n");
+ return ret;
+ }
+
+ // Set PKA device TRNG registers
+ reg_size = PAGE_SIZE;
+ reg_base = pka_dev_get_register_base(shim->mem_res.eip154_base,
+ TRNG_OUTPUT_0_ADDR);
+ ret = pka_dev_set_resource_config(shim, &shim->resources.trng_csr,
+ reg_base, reg_size,
+ PKA_DEV_RES_TYPE_REG,
+ "PKA_TRNG_CSR");
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "unable to setup the TRNG\n");
+ return ret;
+ }
+
+ // Set PKA device 'glue' logic registers
+ reg_size = PAGE_SIZE;
+ reg_base = pka_dev_get_register_base(shim->mem_res.csr_base,
+ PKA_INT_MASK_ADDR);
+ ret = pka_dev_set_resource_config(shim, &shim->resources.ext_csr,
+ reg_base, reg_size,
+ PKA_DEV_RES_TYPE_REG,
+ "PKA_EXT_CSR");
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "unable to setup the MiCA specific registers\n");
+ return ret;
+ }
+
+ shim->status = PKA_SHIM_STATUS_CREATED;
+
+ return ret;
+}
+
+// Delete shim and unset shim resources.
+static int pka_dev_delete_shim(pka_dev_shim_t *shim)
+{
+ int ret = 0;
+ pka_dev_res_t *res_buffer_ram, *res_master_prog_ram;
+ pka_dev_res_t *res_master_seq_ctrl, *res_aic_csr, *res_trng_csr;
+
+ PKA_DEBUG(PKA_DEV, "PKA device delete shim\n");
+
+ if (shim->status == PKA_SHIM_STATUS_UNDEFINED)
+ return ret;
+
+ if (shim->status != PKA_SHIM_STATUS_FINALIZED &&
+ shim->status != PKA_SHIM_STATUS_CREATED)
+ {
+ PKA_ERROR(PKA_DEV, "PKA device status must be finalized\n");
+ return -EPERM;
+ }
+
+ res_buffer_ram = &shim->resources.buffer_ram;
+ res_master_prog_ram = &shim->resources.master_prog_ram;
+ res_master_seq_ctrl = &shim->resources.master_seq_ctrl;
+ res_aic_csr = &shim->resources.aic_csr;
+ res_trng_csr = &shim->resources.trng_csr;
+
+ pka_dev_unset_resource_config(shim, res_buffer_ram);
+ pka_dev_unset_resource_config(shim, res_master_prog_ram);
+ pka_dev_unset_resource_config(shim, res_master_seq_ctrl);
+ pka_dev_unset_resource_config(shim, res_aic_csr);
+ pka_dev_unset_resource_config(shim, res_trng_csr);
+
+ kfree(shim->rings);
+
+ shim->status = PKA_SHIM_STATUS_UNDEFINED;
+
+ return ret;
+}
+
+static int pka_dev_config_aic_interrupts(pka_dev_res_t *aic_csr_ptr)
+{
+ int ret = 0;
+
+ uint64_t csr_reg_base, csr_reg_off;
+ void *csr_reg_ptr;
+
+ if (aic_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED ||
+ aic_csr_ptr->type != PKA_DEV_RES_TYPE_REG)
+ return -EPERM;
+
+ PKA_DEBUG(PKA_DEV, "configure the AIC so that all interrupts "
+ "are properly recognized\n");
+
+ csr_reg_base = aic_csr_ptr->base;
+ csr_reg_ptr = aic_csr_ptr->ioaddr;
+
+ // Configure the signal polarity for each interrupt.
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, AIC_POL_CTRL_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_AIC_POL_CTRL_REG_VAL);
+
+ // Configure the signal type for each interrupt
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, AIC_TYPE_CTRL_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_AIC_TYPE_CTRL_REG_VAL);
+
+ // Set the enable control register
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, AIC_ENABLE_CTRL_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_AIC_ENABLE_CTRL_REG_VAL);
+
+ // Set the enabled status register
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, AIC_ENABLED_STAT_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_AIC_ENABLE_STAT_REG_VAL);
+
+ // *TBD* Write PKA_INT_MASK_RESET with 1's for each interrupt bit
+ // to allow them to propagate out the interrupt controller.
+ // EIP-154 interrupts can still be programmed and observed via polling
+ // regardless of whether PKA_INT_MASK is masking out the interrupts or
+ // not. The mask is for system propagation, i.e. propagate to the GIC.
+ // Bit positions are as follows:
+ // Bit 10 - parity_error_irq (non EIP-154 interrupt)
+ // Bit 9 - trng_irq
+ // Bit 8 - pka_master_irq
+ // Bits 7:4 - pka_queue_*_result_irq
+ // Bits 3:0 - pka_queue_*_empty_irq
+
+ return ret;
+}
+
+static int pka_dev_load_image(pka_dev_res_t *res_ptr, const uint32_t *data_buf,
+ uint32_t size)
+{
+ uint64_t data_rd;
+ int mismatches;
+ int i, j, ret = 0;
+
+ if (res_ptr->status != PKA_DEV_RES_STATUS_MAPPED ||
+ res_ptr->type != PKA_DEV_RES_TYPE_MEM)
+ return -EPERM;
+
+ // Note that the image size is in word of 4 bytes and memory 'writes'
+ // are 8 bytes aligned, thus the memory start address and end address
+ // are shifted.
+ if (res_ptr->size < (size * BYTES_PER_WORD) << 1)
+ {
+ PKA_ERROR(PKA_DEV, "image size greater than memory size\n");
+ return -EINVAL;
+ }
+
+ for (i = 0, j = 0; i < size; i++, j += BYTES_PER_DOUBLE_WORD)
+ pka_dev_io_write(res_ptr->ioaddr, j,
+ (uint64_t) data_buf[i]);
+
+ mismatches = 0;
+ PKA_DEBUG(PKA_DEV, "PKA DEV: verifying image (%u words)\n", size);
+ for (i = 0, j = 0; i < size; i++, j += BYTES_PER_DOUBLE_WORD)
+ {
+ data_rd = pka_dev_io_read(res_ptr->ioaddr, j);
+ if (data_rd != (uint64_t) data_buf[i])
+ {
+ mismatches += 1;
+ PKA_DEBUG(PKA_DEV, "error while loading image: "
+ "addr:0x%llx expected data: 0x%x actual data: 0x%llx\n",
+ res_ptr->base + j,
+ data_buf[i], data_rd);
+ }
+ }
+
+ if (mismatches > 0)
+ {
+ PKA_PANIC(PKA_DEV, "error while loading image: mismatches: %d\n",
+ mismatches);
+ return -EAGAIN;
+ }
+
+ return ret;
+}
+
+static int
+pka_dev_config_master_seq_controller(pka_dev_shim_t *shim,
+ pka_dev_res_t *master_seq_ctrl_ptr)
+{
+ pka_dev_res_t *aic_csr_ptr, *master_prog_ram;
+ void *aic_reg_ptr, *master_reg_ptr;
+
+ uint64_t aic_reg_base, aic_reg_off;
+ uint64_t master_reg_base, master_reg_off;
+
+ const uint32_t *boot_img_ptr, *master_img_ptr;
+ uint32_t boot_img_size, master_img_size;
+
+ uint32_t pka_master_irq;
+
+ uint64_t timer;
+ uint8_t status_bits;
+ uint8_t shim_fw_id;
+ int ret = 0;
+
+ if (master_seq_ctrl_ptr->status != PKA_DEV_RES_STATUS_MAPPED ||
+ master_seq_ctrl_ptr->type != PKA_DEV_RES_TYPE_REG)
+ return -EPERM;
+
+ master_reg_base = master_seq_ctrl_ptr->base;
+ master_reg_ptr = master_seq_ctrl_ptr->ioaddr;
+ master_reg_off = pka_dev_get_register_offset(master_reg_base,
+ PKA_MASTER_SEQ_CTRL_ADDR);
+
+ PKA_DEBUG(PKA_DEV, "push the EIP-154 master controller into reset\n");
+ pka_dev_io_write(master_reg_ptr, master_reg_off,
+ PKA_MASTER_SEQ_CTRL_RESET_VAL);
+
+ shim_fw_id = pka_firmware_get_id();
+
+ // Load boot image into PKA_MASTER_PROG_RAM
+ boot_img_size = pka_firmware_array[shim_fw_id].boot_img_size;
+ PKA_DEBUG(PKA_DEV, "loading boot image (%d words)\n", boot_img_size);
+
+ boot_img_ptr = pka_firmware_array[shim_fw_id].boot_img;
+ ret = pka_dev_load_image(&shim->resources.master_prog_ram,
+ boot_img_ptr, boot_img_size);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to load boot image\n");
+ return ret;
+ }
+
+ PKA_DEBUG(PKA_DEV, "take the EIP-154 master controller out of reset\n");
+ pka_dev_io_write(master_reg_ptr, master_reg_off, 0);
+
+ // Poll for 'pka_master_irq' bit in AIC_ENABLED_STAT register to indicate
+ // sequencer is initialized
+ aic_csr_ptr = &shim->resources.aic_csr;
+ if (aic_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED ||
+ aic_csr_ptr->type != PKA_DEV_RES_TYPE_REG)
+ return -EPERM;
+
+ aic_reg_base = aic_csr_ptr->base;
+ aic_reg_ptr = aic_csr_ptr->ioaddr;
+ aic_reg_off = pka_dev_get_register_offset(aic_reg_base,
+ AIC_ENABLED_STAT_ADDR);
+
+ pka_master_irq = 0;
+ PKA_DEBUG(PKA_DEV, "poll for 'pka_master_irq'\n");
+ timer = pka_dev_timer_start(100000); // 100 msec
+ while (pka_master_irq == 0)
+ {
+ pka_master_irq |= pka_dev_io_read(aic_reg_ptr, aic_reg_off)
+ & PKA_AIC_ENABLED_STAT_MASTER_IRQ_MASK;
+ if (pka_dev_timer_done(timer))
+ {
+ //PKA_PANIC(PKA_DEV, "failed to load firmware\n");
+ return -EAGAIN;
+ }
+ }
+ PKA_DEBUG(PKA_DEV, "'pka_master_irq' is active\n");
+
+ // Verify that the EIP-154 boot firmware has finished without errors
+ status_bits = (uint8_t)((pka_dev_io_read(master_reg_ptr,
+ master_reg_off) >> PKA_MASTER_SEQ_CTRL_MASTER_IRQ_BIT)
+ & 0xff);
+ if (status_bits != PKA_MASTER_SEQ_CTRL_STATUS_BYTE)
+ {
+ // If the error indication (bit [15]) is set,
+ // the EIP-154 boot firmware encountered an error and is stopped.
+ if ((status_bits >> (PKA_MASTER_SEQ_CTRL_MASTER_IRQ_BIT - 1)) == 1)
+ {
+ PKA_ERROR(PKA_DEV,
+ "boot firmware encountered an error 0x%x and is stopped\n",
+ status_bits);
+ return -EAGAIN;
+ }
+ PKA_DEBUG(PKA_DEV, "boot firmware in progress %d", status_bits);
+ }
+ PKA_DEBUG(PKA_DEV, "boot firmware has finished successfully\n");
+
+ PKA_DEBUG(PKA_DEV, "push the EIP-154 master controller into reset\n");
+ pka_dev_io_write(master_reg_ptr, master_reg_off,
+ PKA_MASTER_SEQ_CTRL_RESET_VAL);
+
+ // Load Master image into PKA_MASTER_PROG_RAM
+ master_img_size = pka_firmware_array[shim_fw_id].master_img_size;
+ PKA_DEBUG(PKA_DEV, "loading master image (%d words)\n",
+ master_img_size);
+ master_prog_ram = &shim->resources.master_prog_ram;
+ master_img_ptr = pka_firmware_array[shim_fw_id].master_img;
+ ret = pka_dev_load_image(master_prog_ram, master_img_ptr,
+ master_img_size);
+ if (ret)
+ {
+ pr_err("PKA DEV: failed to load master image\n");
+ return ret;
+ }
+
+ PKA_DEBUG(PKA_DEV, "take the EIP-154 master controller out of reset\n");
+ pka_dev_io_write(master_reg_ptr, master_reg_off, 0);
+
+ return ret;
+}
+
+// Configure ring options.
+static int pka_dev_config_ring_options(pka_dev_res_t *buffer_ram_ptr,
+ uint32_t rings_num, uint8_t ring_priority)
+{
+ uint64_t control_word;
+ uint64_t word_off;
+ int ret = 0;
+
+ if (buffer_ram_ptr->status != PKA_DEV_RES_STATUS_MAPPED ||
+ buffer_ram_ptr->type != PKA_DEV_RES_TYPE_MEM)
+ return -EPERM;
+
+ if (rings_num > PKA_MAX_NUM_RINGS ||
+ rings_num < 1)
+ {
+ PKA_ERROR(PKA_DEV, "invalid rings number\n");
+ return -EINVAL;
+ }
+
+ PKA_DEBUG(PKA_DEV, "Configure PKA ring options control word\n");
+
+ // Write PKA_RING_OPTIONS control word located in the PKA_BUFFER_RAM. The
+ // value of this word is determined by the PKA I/O block (Shim). Set the
+ // number of implemented command/result ring pairs that is available in
+ // this EIP-154, encoded as binary value, which is 4.
+ control_word = (uint64_t) 0x0;
+ control_word |= ring_priority & 0xff;
+ control_word |= ((rings_num - 1) << 8) & 0xff00;
+ control_word |= (PKA_RING_OPTIONS_SIGNATURE_BYTE << 24) & 0xff000000;
+ word_off = pka_dev_get_word_offset(buffer_ram_ptr->base,
+ PKA_RING_OPTIONS_ADDR, PKA_BUFFER_RAM_SIZE);
+ pka_dev_io_write(buffer_ram_ptr->ioaddr, word_off, control_word);
+
+ return ret;
+}
+
+static int pka_dev_config_trng_clk(pka_dev_res_t *aic_csr_ptr)
+{
+ int ret = 0;
+
+ uint64_t csr_reg_base, csr_reg_off;
+ uint64_t timer;
+ uint32_t trng_clk_en = 0;
+ void *csr_reg_ptr;
+
+ if (aic_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED ||
+ aic_csr_ptr->type != PKA_DEV_RES_TYPE_REG)
+ return -EPERM;
+
+ PKA_DEBUG(PKA_DEV, "Turn on TRNG clock\n");
+
+ csr_reg_base = aic_csr_ptr->base;
+ csr_reg_ptr = aic_csr_ptr->ioaddr;
+
+ // Enable the TRNG clock in PKA_CLK_FORCE.
+ // In general, this register should be left in its default state of all
+ // zeroes! Only when the TRNG is directly controlled via the Host slave
+ // interface, the engine needs to be turned on using the trng_clk_on
+ // bit in this register. In case the TRNG is controlled via internal
+ // firmware, this is not required.
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, PKA_CLK_FORCE_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_CLK_FORCE_TRNG_ON);
+ // Check whether the system clock for TRNG engine is enabled. The clock
+ // MUST be running to provide access to the TRNG.
+ timer = pka_dev_timer_start(100000); // 100 msec
+ while (trng_clk_en == 0)
+ {
+ trng_clk_en |= pka_dev_io_read(csr_reg_ptr, csr_reg_off)
+ & PKA_CLK_FORCE_TRNG_ON;
+ if (pka_dev_timer_done(timer))
+ {
+ PKA_DEBUG(PKA_DEV, "Failed to enable TRNG clock\n");
+ return -EAGAIN;
+ }
+ }
+ PKA_DEBUG(PKA_DEV, "'trng_clk_on' is enabled\n");
+
+ return ret;
+}
+
+static int pka_dev_trng_wait_test_ready(void *csr_reg_ptr, uint64_t csr_reg_base)
+{
+ uint64_t csr_reg_off, timer, test_ready, csr_reg_val;
+
+ test_ready = 0;
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR);
+ timer = pka_dev_timer_start(1000000); // 1000 ms
+
+ while (!test_ready)
+ {
+ csr_reg_val = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ test_ready = csr_reg_val & PKA_TRNG_STATUS_TEST_READY;
+
+ if (pka_dev_timer_done(timer))
+ {
+ PKA_DEBUG(PKA_DEV, "TRNG: TEST ready timer done, 0x%llx\n", csr_reg_val);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static int pka_dev_trng_enable_test(void *csr_reg_ptr, uint64_t csr_reg_base,
+ uint32_t test)
+{
+ uint64_t csr_reg_val, csr_reg_off;
+
+ // Set the test_mode bit in the TRNG_CONTROL register and the
+ // test_known_noise bit in the TRNG_TEST register this will
+ // immediately set the test_ready bit (in the TRNG_STATUS register)
+ // to indicate that data can be written. It will also reset the
+ // monobit test, run test and poker test circuits to their
+ // initial states. Note that the TRNG need not be enabled for this
+ // test.
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR);
+ csr_reg_val = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off,
+ csr_reg_val | PKA_TRNG_CONTROL_TEST_MODE);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_TEST_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, test);
+
+ // Wait until the 'test_ready' bit is set
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR);
+ do
+ {
+ csr_reg_val = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ } while((csr_reg_val & PKA_TRNG_STATUS_TEST_READY) == 0);
+
+ // Check whether the 'monobit test', 'run test' and 'poker test'
+ // are reset.
+ if (csr_reg_val & (PKA_TRNG_STATUS_MONOBIT_FAIL
+ | PKA_TRNG_STATUS_RUN_FAIL
+ | PKA_TRNG_STATUS_POKER_FAIL))
+ {
+ PKA_ERROR(PKA_DEV, "Test bits aren't reset, TRNG_STATUS:0x%llx\n",
+ csr_reg_val);
+ return -EAGAIN;
+ }
+
+ // Set 'stall_run_poker' bit to allow inspecting the state of the
+ // result counters which would otherwise be reset immediately for
+ // the next 20,000 bits block to test.
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_ALARMCNT_ADDR);
+ csr_reg_val = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off,
+ csr_reg_val | PKA_TRNG_ALARMCNT_STALL_RUN_POKER);
+
+ return 0;
+}
+
+static int pka_dev_trng_test_circuits(void *csr_reg_ptr, uint64_t csr_reg_base,
+ uint64_t datal, uint64_t datah,
+ int count, uint8_t add_half,
+ uint64_t *monobit_fail_cnt,
+ uint64_t *run_fail_cnt,
+ uint64_t *poker_fail_cnt)
+{
+ uint64_t status, csr_reg_off;
+ int test_idx, error;
+
+ if (monobit_fail_cnt == NULL || run_fail_cnt == NULL || poker_fail_cnt == NULL)
+ return -EINVAL;
+
+ error = 0;
+
+ for (test_idx = 0; test_idx < count; test_idx++)
+ {
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_RAW_L_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, datal);
+
+ if (add_half)
+ {
+ if (test_idx < count - 1)
+ {
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_RAW_H_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, datah);
+ }
+ }
+ else
+ {
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_RAW_H_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, datah);
+ }
+
+ // Wait until the test_ready bit in the TRNG_STATUS register
+ // becomes 1 again, signaling readiness for the next 64 bits
+ // of test data. At this point, the previous test data has
+ // been handled so the counter states can be inspected.
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR);
+ do
+ {
+ status = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ } while((status & PKA_TRNG_STATUS_TEST_READY) == 0);
+
+ // Check test status bits.
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_INTACK_ADDR);
+ if (status & PKA_TRNG_STATUS_MONOBIT_FAIL)
+ {
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_STATUS_MONOBIT_FAIL);
+ *monobit_fail_cnt += 1;
+ }
+ else if (status & PKA_TRNG_STATUS_RUN_FAIL)
+ {
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_STATUS_RUN_FAIL);
+ *run_fail_cnt += 1;
+ }
+ else if (status & PKA_TRNG_STATUS_POKER_FAIL)
+ {
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_STATUS_POKER_FAIL);
+ *poker_fail_cnt += 1;
+ }
+
+ }
+
+ error = (*monobit_fail_cnt || *poker_fail_cnt || *run_fail_cnt) ? -EIO : 0;
+
+ return error;
+}
+
+static void pka_dev_trng_disable_test(void *csr_reg_ptr, uint64_t csr_reg_base)
+{
+ uint64_t status, val, csr_reg_off;
+
+ // When done, clear the test_known_noise bit in the TRNG_TEST
+ // register (will immediately clear the test_ready bit in the
+ // TRNG_STATUS register and reset the monobit test, run test
+ // and poker test circuits) and clear the test_mode bit in
+ // the TRNG_CONTROL register.
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_TEST_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR);
+ status = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+
+ if (status & PKA_TRNG_STATUS_TEST_READY)
+ PKA_PRINT(PKA_DEV, "Warning: Test ready bit is still set\n");
+
+ if (status & (PKA_TRNG_STATUS_MONOBIT_FAIL
+ | PKA_TRNG_STATUS_RUN_FAIL
+ | PKA_TRNG_STATUS_POKER_FAIL))
+ PKA_PRINT(PKA_DEV,
+ "Warning: Test bits are still set, TRNG_STATUS:0x%llx\n", status);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR);
+ val = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off,
+ (val & ~PKA_TRNG_STATUS_TEST_READY));
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_ALARMCNT_ADDR);
+ val = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off,
+ (val & ~PKA_TRNG_ALARMCNT_STALL_RUN_POKER));
+
+ return;
+}
+
+static int pka_dev_trng_test_known_answer_basic(void *csr_reg_ptr,
+ uint64_t csr_reg_base)
+{
+ int ret, cnt_idx, cnt_off;
+ uint64_t monobit_fail_cnt, run_fail_cnt, poker_fail_cnt, monobit_cnt;
+ uint64_t poker_cnt[4], csr_reg_off;
+ uint64_t poker_test_exp_cnt[4] = {
+ 0x20f42bf4, 0xaf415f4, 0xf4f4fff4, 0xfff4f4f4
+ };
+
+ PKA_DEBUG(PKA_DEV, "Run known-answer test circuits\n");
+
+ monobit_fail_cnt = 0;
+ run_fail_cnt = 0;
+ poker_fail_cnt = 0;
+
+ ret = pka_dev_trng_enable_test(csr_reg_ptr, csr_reg_base,
+ PKA_TRNG_TEST_KNOWN_NOISE);
+ if (ret)
+ return ret;
+
+ ret = pka_dev_trng_test_circuits(csr_reg_ptr, csr_reg_base, 0x11111333,
+ 0x3555779f, 11, 0, &monobit_fail_cnt, &run_fail_cnt,
+ &poker_fail_cnt);
+
+ ret |= pka_dev_trng_test_circuits(csr_reg_ptr, csr_reg_base, 0x01234567,
+ 0x89abcdef, 302, 1, &monobit_fail_cnt, &run_fail_cnt,
+ &poker_fail_cnt);
+
+ PKA_DEBUG(PKA_DEV, "monobit_fail_cnt : 0x%llx\n", monobit_fail_cnt);
+ PKA_DEBUG(PKA_DEV, "poker_fail_cnt : 0x%llx\n", poker_fail_cnt);
+ PKA_DEBUG(PKA_DEV, "run_fail_cnt : 0x%llx\n", run_fail_cnt);
+
+ for (cnt_idx = 0, cnt_off = 0; cnt_idx < 4; cnt_idx++, cnt_off += 8)
+ {
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ (TRNG_POKER_3_0_ADDR + cnt_off));
+ poker_cnt[cnt_idx] = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ }
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_MONOBITCNT_ADDR);
+ monobit_cnt = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+
+ if (!ret)
+ {
+ if (memcmp(poker_cnt, poker_test_exp_cnt, sizeof(poker_test_exp_cnt)))
+ {
+ PKA_DEBUG(PKA_DEV, "invalid poker counters!\n");
+ ret = -EIO;
+ }
+
+ if (monobit_cnt != 9978)
+ {
+ PKA_DEBUG(PKA_DEV, "invalid sum of squares!\n");
+ ret = -EIO;
+ }
+ }
+
+ pka_dev_trng_disable_test(csr_reg_ptr, csr_reg_base);
+
+ return ret;
+}
+
+static int pka_dev_trng_test_known_answer_poker_fail(void *csr_reg_ptr,
+ uint64_t csr_reg_base)
+{
+ uint64_t monobit_fail_cnt, run_fail_cnt, poker_fail_cnt;
+ int ret;
+
+ monobit_fail_cnt = 0;
+ run_fail_cnt = 0;
+ poker_fail_cnt = 0;
+
+ PKA_DEBUG(PKA_DEV, "Run known-answer test circuits (poker fail)\n");
+
+ pka_dev_trng_enable_test(csr_reg_ptr, csr_reg_base,
+ PKA_TRNG_TEST_KNOWN_NOISE);
+
+ // Ignore the return value here as it is expected that poker test should
+ // fail. Check failure counts thereafter to assert only poker test has failed.
+ pka_dev_trng_test_circuits(csr_reg_ptr, csr_reg_base, 0xffffffff,
+ 0xffffffff, 11, 0, &monobit_fail_cnt, &run_fail_cnt, &poker_fail_cnt);
+
+ PKA_DEBUG(PKA_DEV, "monobit_fail_cnt : 0x%llx\n", monobit_fail_cnt);
+ PKA_DEBUG(PKA_DEV, "poker_fail_cnt : 0x%llx\n", poker_fail_cnt);
+ PKA_DEBUG(PKA_DEV, "run_fail_cnt : 0x%llx\n", run_fail_cnt);
+
+ if (poker_fail_cnt && !run_fail_cnt && !monobit_fail_cnt)
+ ret = 0;
+ else
+ ret = -EIO;
+
+ pka_dev_trng_disable_test(csr_reg_ptr, csr_reg_base);
+
+ return ret;
+}
+
+static int pka_dev_trng_test_unknown_answer(void *csr_reg_ptr,
+ uint64_t csr_reg_base)
+{
+ uint64_t datal, datah, csr_reg_off;
+ int ret, test_idx;
+
+ datah = 0;
+ datal = 0;
+ ret = 0;
+
+ PKA_DEBUG(PKA_DEV, "Run unknown-answer self test\n");
+
+ // First reset, the RAW registers.
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_RAW_L_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_RAW_H_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+
+ // There is a small probability for this test to fail,
+ // So run the test 10 times, if it succeeds once then
+ // assume that the test passed.
+ for (test_idx = 0; test_idx < 10; test_idx++)
+ {
+ pka_dev_trng_enable_test(csr_reg_ptr, csr_reg_base, PKA_TRNG_TEST_NOISE);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_RAW_L_ADDR);
+ datal = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_RAW_H_ADDR);
+ datah = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+
+ PKA_DEBUG(PKA_DEV, "datal=0x%llx\n", datal);
+ PKA_DEBUG(PKA_DEV, "datah=0x%llx\n", datah);
+
+ if (!datah && !datal)
+ {
+ ret = -EIO;
+ }
+ else
+ {
+ ret = 0;
+ break;
+ }
+
+ pka_dev_trng_disable_test(csr_reg_ptr, csr_reg_base);
+ }
+
+ return ret;
+}
+
+// Test TRNG
+static int pka_dev_test_trng(void *csr_reg_ptr, uint64_t csr_reg_base)
+{
+ int ret;
+
+ ret = 0;
+
+ ret = pka_dev_trng_test_known_answer_basic(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ goto exit;
+
+ ret = pka_dev_trng_test_known_answer_poker_fail(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ goto exit;
+
+ ret = pka_dev_trng_test_unknown_answer(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ goto exit;
+
+exit:
+ return ret;
+}
+
+static void pka_dev_trng_write_ps_ai_str(void *csr_reg_ptr,
+ uint64_t csr_reg_base,
+ uint32_t input_str[])
+{
+ uint64_t csr_reg_off;
+ int i;
+
+ for (i = 0; i < PKA_TRNG_PS_AI_REG_COUNT; i++)
+ {
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_PS_AI_0_ADDR + (i * 0x8));
+
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, input_str[i]);
+ }
+}
+
+static void pka_dev_trng_drbg_generate(void *csr_reg_ptr, uint64_t csr_reg_base)
+{
+ uint64_t csr_reg_off;
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_CONTROL_REQ_DATA_VAL);
+}
+
+static int pka_dev_test_trng_drbg(void *csr_reg_ptr, uint64_t csr_reg_base)
+{
+ uint64_t csr_reg_off, csr_reg_val;
+ int i, ret;
+
+ ret = 0;
+
+ // Make sure the engine is idle.
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+
+ // Enable DRBG, TRNG need not be enabled for this test.
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_CONTROL_DRBG_ENABLE_VAL);
+
+ // Set 'test_sp_800_90' bit in the TRNG_TEST register
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_TEST_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_TEST_DRBG_VAL);
+
+ // Wait for 'test_ready' bit to be set.
+ ret = pka_dev_trng_wait_test_ready(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ goto exit;
+
+ // Instantiate
+ pka_dev_trng_write_ps_ai_str(csr_reg_ptr, csr_reg_base, pka_trng_drbg_test_ps_str);
+ ret = pka_dev_trng_wait_test_ready(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ goto exit;
+
+ // Generate
+ pka_dev_trng_write_ps_ai_str(csr_reg_ptr, csr_reg_base, pka_trng_drbg_test_etpy_str1);
+ ret = pka_dev_trng_wait_test_ready(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ goto exit;
+
+ // A standard NIST SP 800-90A DRBG known-answer test discards
+ // the result of the first 'Generate' function and only checks
+ // the result of the second 'Generate' function. Hence 'Generate'
+ // is performed again.
+
+ // Generate
+ pka_dev_trng_write_ps_ai_str(csr_reg_ptr, csr_reg_base, pka_trng_drbg_test_etpy_str2);
+ ret = pka_dev_trng_wait_test_ready(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ goto exit;
+
+ // Check output registers
+ for (i = 0; i < PKA_TRNG_OUTPUT_CNT; i++)
+ {
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_OUTPUT_0_ADDR + (i * 0x8));
+
+ csr_reg_val = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+
+ if ((uint32_t)csr_reg_val != pka_trng_drbg_test_output[i])
+ {
+ PKA_DEBUG(PKA_DEV,
+ "DRBG known answer test failed for output register:%d, 0x%x\n",
+ i, (uint32_t)csr_reg_val);
+ ret = 1;
+ goto exit;
+ }
+ }
+
+ // Clear 'test_sp_800_90' bit in the TRNG_TEST register.
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_TEST_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+
+exit:
+ return ret;
+}
+
+// Configure the TRNG.
+static int pka_dev_config_trng_drbg(pka_dev_res_t *aic_csr_ptr,
+ pka_dev_res_t *trng_csr_ptr)
+{
+ int ret = 0;
+
+ uint64_t csr_reg_base, csr_reg_off;
+ void *csr_reg_ptr;
+
+ if (trng_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED ||
+ trng_csr_ptr->type != PKA_DEV_RES_TYPE_REG)
+ return -EPERM;
+
+ PKA_DEBUG(PKA_DEV, "Starting up the TRNG\n");
+
+ ret = pka_dev_config_trng_clk(aic_csr_ptr);
+ if (ret)
+ return ret;
+
+ csr_reg_base = trng_csr_ptr->base;
+ csr_reg_ptr = trng_csr_ptr->ioaddr;
+
+ // Perform NIST known-answer tests on the complete SP 800-90A DRBG
+ // without BC_DF functionality.
+ ret = pka_dev_test_trng_drbg(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ return ret;
+
+ // Starting up the TRNG with a DRBG
+
+ // Make sure the engine is idle.
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+
+ // Disable all FROs initially
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_FROENABLE_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_FRODETUNE_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+
+ // Write all configuration values in the TRNG_CONFIG and TRNG_ALARMCNT,
+ // write zeroes to the TRNG_ALARMMASK and TRNG_ALARMSTOP registers.
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_CONFIG_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_CONFIG_REG_VAL);
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_ALARMCNT_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_ALARMCNT_REG_VAL);
+
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_ALARMMASK_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_ALARMSTOP_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+
+ // Enable all FROs in the TRNG_FROENABLE register. Note that this can
+ // only be done after clearing the TRNG_ALARMSTOP register.
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_FROENABLE_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_FROENABLE_REG_VAL);
+
+ // Optionally, write 'Personalization string' of upto 384 bits in
+ // TRNG_PS_AI_... registers. The contents of these registers will be
+ // XOR-ed into the output of the SHA-256 'Conditioning Function' to be
+ // used as seed value for the actual DRBG.
+ pka_dev_trng_write_ps_ai_str(csr_reg_ptr, csr_reg_base, pka_trng_drbg_ps_str);
+
+
+ // Run TRNG tests after configuring TRNG.
+ // NOTE: TRNG need not be enabled to carry out these tests.
+ ret = pka_dev_test_trng(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ return ret;
+
+ // Start the actual engine by setting the 'enable_trng' and 'drbg_en' bit
+ // in the TRNG_CONTROL register (also a nice point to set the interrupt mask
+ // bits).
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_CONTROL_DRBG_REG_VAL);
+
+ // The engine is now ready to handle the first 'Generate' request using
+ // the 'request_data' bit of the TRNG_CONTROL register. The first output
+ // for these requests will take a while, as Noise Source and Conditioning
+ // Function must first generate seed entropy for the DRBG.
+
+
+ // Optionally, when buffer RAM is configured: Set a data available
+ // interrupt threshold using the 'load_thresh' and 'blocks_thresh'
+ // fields of the TRNG_INTACK register. This allows delaying the data
+ // available interrupt until the indicated number of 128-bit words are
+ // available in the buffer RAM.
+
+ // Start the actual 'Generate' operation using the 'request_data' and 'data_blocks'
+ // fields of the TRNG_CONTROL register.
+
+ pka_dev_trng_drbg_generate(csr_reg_ptr, csr_reg_base);
+
+ mdelay(200);
+
+ return ret;
+}
+
+// Triggers hardaware zeorize to initialize PKA internal memories
+static int pka_dev_ram_zeroize(pka_dev_res_t *ext_csr_ptr)
+{
+ uint64_t csr_reg_base, csr_reg_off, csr_reg_value;
+ uint64_t timer;
+ void *csr_reg_ptr;
+
+ if (ext_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED ||
+ ext_csr_ptr->type != PKA_DEV_RES_TYPE_REG)
+ return -EPERM;
+
+ PKA_DEBUG(PKA_DEV, "Starting memory zeroize\n");
+
+ csr_reg_base = ext_csr_ptr->base;
+ csr_reg_ptr = ext_csr_ptr->ioaddr;
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ PKA_ZEROIZE_ADDR);
+ // When PKA_ZEROIZE register is written (with any value)
+ // sensitive data in the PKA is zeroed out.
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 1);
+
+ // Now wait until the zeroize completes
+ timer = pka_dev_timer_start(10000000); // 10000 ms
+ csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ while (csr_reg_value != 0)
+ {
+ csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+
+ if (pka_dev_timer_done(timer))
+ {
+ PKA_DEBUG(PKA_DEV, "Timeout while PKA zeorize\n");
+ return -EBUSY;
+ }
+ }
+
+ return 0;
+}
+
+// Initialize PKA IO block refered to as shim. It configures shim's
+// parameters and prepare resources by mapping corresponding memory.
+// The function also configures shim registers and load firmware to
+// shim internal rams. The pka_dev_shim_t passed as input is also an
+// output. It returns 0 on success, a negative error code on failure.
+static int pka_dev_init_shim(pka_dev_shim_t *shim)
+{
+ const uint32_t *farm_img_ptr;
+ uint32_t farm_img_size, data[4], i;
+ uint8_t shim_fw_id;
+
+ int ret = 0;
+
+ if (shim->status != PKA_SHIM_STATUS_CREATED)
+ {
+ PKA_ERROR(PKA_DEV, "PKA device must be created\n");
+ return -EPERM;
+ }
+
+ // First of all, trigger a hardware zeroize to initialize internal
+ // RAM memories
+ ret = pka_dev_ram_zeroize(&shim->resources.ext_csr);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to zeroize PKA\n");
+ return ret;
+ }
+
+ // Configure AIC registers
+ ret = pka_dev_config_aic_interrupts(&shim->resources.aic_csr);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to configure AIC\n");
+ return ret;
+ }
+
+ shim_fw_id = pka_firmware_get_id();
+
+ // Load Farm image into PKA_BUFFER_RAM for non-High Assurance mode
+ // or into PKA_SECURE_RAM for High Assurance mode.
+ farm_img_size = pka_firmware_array[shim_fw_id].farm_img_size;
+ PKA_DEBUG(PKA_DEV, "loading farm image (%d words)\n", farm_img_size);
+
+ farm_img_ptr = pka_firmware_array[shim_fw_id].farm_img;
+ // The IP provider suggests using the zeroize function to initialize
+ // the Buffer RAM. But a bug has been detected when writing ECC bits.
+ // Thus a workaround is used, and has already been shown to work; it
+ // consists of padding the farm image. Then all RAM locations will be
+ // written with correct ECC before the IP reads the image out.
+ ret = pka_dev_load_image(&shim->resources.buffer_ram, farm_img_ptr,
+ farm_img_size);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to load farm image\n");
+ return ret;
+ }
+
+ // Configure EIP-154 Master controller Sequencer
+ ret = pka_dev_config_master_seq_controller(shim,
+ &shim->resources.master_seq_ctrl);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to configure Master controller "
+ "Sequencer\n");
+ return ret;
+ }
+
+ // Configure PKA Ring options control word
+ ret = pka_dev_config_ring_options(&shim->resources.buffer_ram,
+ shim->rings_num, shim->ring_priority);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to configure ring options\n");
+ return ret;
+ }
+
+ shim->trng_enabled = PKA_SHIM_TRNG_ENABLED;
+ shim->trng_err_cycle = 0;
+
+ // Configure the TRNG
+ ret = pka_dev_config_trng_drbg(&shim->resources.aic_csr,
+ &shim->resources.trng_csr);
+
+ // Pull out data from the content of the TRNG buffer RAM and
+ // start the re-generation of new numbers; read and drop 512
+ // words. The read must be done over the 4 TRNG_OUTPUT_X registers
+ // at a time.
+ i = 0;
+ while (i < 128)
+ {
+ pka_dev_trng_read(shim, data, sizeof(data));
+ i++;
+ }
+
+ if (ret)
+ {
+ // Keep running without TRNG since it does not hurt, but
+ // notify users.
+ PKA_ERROR(PKA_DEV, "failed to configure TRNG\n");
+ shim->trng_enabled = PKA_SHIM_TRNG_DISABLED;
+ }
+
+ mutex_init(&shim->mutex);
+ shim->busy_ring_num = 0;
+ shim->status = PKA_SHIM_STATUS_INITIALIZED;
+
+ return ret;
+}
+
+// Release a given shim.
+static int pka_dev_release_shim(pka_dev_shim_t *shim)
+{
+ int ret = 0;
+
+ uint32_t ring_idx;
+
+ if (shim->status != PKA_SHIM_STATUS_INITIALIZED &&
+ shim->status != PKA_SHIM_STATUS_STOPPED)
+ {
+ PKA_ERROR(PKA_DEV, "PKA device must be initialized or stopped\n");
+ return -EPERM;
+ }
+
+ // Release rings which belong to the shim. The operating system might
+ // release ring devices before shim devices. The global configuration
+ // must be checked before proceeding to the release of ring devices.
+ if (pka_gbl_config.dev_rings_cnt)
+ {
+ for (ring_idx = 0; ring_idx < shim->rings_num; ring_idx++)
+ {
+ ret = pka_dev_release_ring(shim->rings[ring_idx]);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to release ring %d\n", ring_idx);
+ return ret;
+ }
+ }
+ }
+
+ shim->busy_ring_num = 0;
+ shim->status = PKA_SHIM_STATUS_FINALIZED;
+
+ return ret;
+}
+
+// Return the ring associated with the given identifier.
+pka_dev_ring_t *pka_dev_get_ring(uint32_t ring_id)
+{
+ return pka_gbl_config.dev_rings[ring_id];
+}
+
+// Return the shim associated with the given identifier.
+pka_dev_shim_t *pka_dev_get_shim(uint32_t shim_id)
+{
+ return pka_gbl_config.dev_shims[shim_id];
+}
+
+
+static pka_dev_ring_t *__pka_dev_register_ring(uint32_t ring_id,
+ uint32_t shim_id)
+{
+ pka_dev_shim_t *shim;
+ pka_dev_ring_t *ring;
+
+ int ret;
+
+ shim = pka_dev_get_shim(shim_id);
+ if (!shim)
+ return NULL;
+
+ ring = kzalloc(sizeof(pka_dev_ring_t), GFP_KERNEL);
+ if (!ring)
+ return ring;
+
+ ring->status = PKA_DEV_RING_STATUS_UNDEFINED;
+
+ // Initialize ring.
+ ret = pka_dev_init_ring(ring, ring_id, shim);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to initialize ring %d\n", ring_id);
+ pka_dev_release_ring(ring);
+ kfree(ring);
+ return NULL;
+ }
+
+ return ring;
+}
+
+pka_dev_ring_t *pka_dev_register_ring(uint32_t ring_id, uint32_t shim_id)
+{
+ pka_dev_ring_t *ring;
+
+ ring = __pka_dev_register_ring(ring_id, shim_id);
+ if (ring)
+ {
+ pka_gbl_config.dev_rings[ring->ring_id] = ring;
+ pka_gbl_config.dev_rings_cnt += 1;
+ }
+
+ return ring;
+}
+
+static int __pka_dev_unregister_ring(pka_dev_ring_t *ring)
+{
+ int ret;
+
+ if (!ring)
+ return -EINVAL;
+
+ // Release ring
+ ret = pka_dev_release_ring(ring);
+ if (ret)
+ return ret;
+
+ kfree(ring);
+
+ return ret;
+}
+
+int pka_dev_unregister_ring(pka_dev_ring_t *ring)
+{
+ pka_gbl_config.dev_rings[ring->ring_id] = NULL;
+ pka_gbl_config.dev_rings_cnt -= 1;
+
+ return __pka_dev_unregister_ring(ring);
+}
+
+static pka_dev_shim_t *__pka_dev_register_shim(uint32_t shim_id,
+ struct pka_dev_mem_res *mem_res)
+{
+ pka_dev_shim_t *shim;
+
+ uint8_t split;
+ int ret = 0;
+
+ PKA_DEBUG(PKA_DEV, "register shim id=%u\n", shim_id);
+
+ shim = kzalloc(sizeof(pka_dev_shim_t), GFP_KERNEL);
+ if (!shim)
+ return shim;
+
+ // Shim state MUST be set to undefined before calling 'pka_dev_create_shim'
+ // function
+ shim->status = PKA_SHIM_STATUS_UNDEFINED;
+
+ // Set the Window RAM user mode
+ split = PKA_SPLIT_WINDOW_RAM_MODE;
+
+ // Create PKA shim
+ ret = pka_dev_create_shim(shim, shim_id, split, mem_res);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to create shim %u\n", shim_id);
+ pka_dev_delete_shim(shim);
+ kfree(shim);
+ return NULL;
+ }
+
+ // Initialize PKA shim
+ ret = pka_dev_init_shim(shim);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to init shim %u\n", shim_id);
+ pka_dev_release_shim(shim);
+ pka_dev_delete_shim(shim);
+ kfree(shim);
+ return NULL;
+ }
+
+ return shim;
+}
+
+pka_dev_shim_t *pka_dev_register_shim(uint32_t shim_id, uint8_t shim_fw_id,
+ struct pka_dev_mem_res *mem_res)
+{
+ pka_dev_shim_t *shim;
+
+ pka_firmware_set_id(shim_fw_id);
+
+ shim = __pka_dev_register_shim(shim_id, mem_res);
+ if (shim)
+ {
+ pka_gbl_config.dev_shims[shim->shim_id] = shim;
+ pka_gbl_config.dev_shims_cnt += 1;
+ }
+
+ return shim;
+}
+
+static int __pka_dev_unregister_shim(pka_dev_shim_t *shim)
+{
+ int ret = 0;
+
+ if (!shim)
+ return -EINVAL;
+
+ // Release shim
+ ret = pka_dev_release_shim(shim);
+ if (ret)
+ return ret;
+
+ // Delete shim
+ ret = pka_dev_delete_shim(shim);
+ if (ret)
+ return ret;
+
+ kfree(shim);
+
+ return ret;
+}
+
+int pka_dev_unregister_shim(pka_dev_shim_t *shim)
+{
+ pka_gbl_config.dev_shims[shim->shim_id] = NULL;
+ pka_gbl_config.dev_shims_cnt -= 1;
+
+ return __pka_dev_unregister_shim(shim);
+}
+
+static bool pka_dev_trng_shutdown_oflo(pka_dev_res_t *trng_csr_ptr,
+ uint64_t *err_cycle)
+{
+ uint64_t csr_reg_base, csr_reg_off, csr_reg_value;
+ uint64_t curr_cycle_cnt, fro_stopped_mask, fro_enabled_mask;
+ void *csr_reg_ptr;
+
+ csr_reg_base = trng_csr_ptr->base;
+ csr_reg_ptr = trng_csr_ptr->ioaddr;
+
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR);
+ csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+
+ if (csr_reg_value & PKA_TRNG_STATUS_SHUTDOWN_OFLO)
+ {
+ curr_cycle_cnt = get_cycles();
+ // See if any FROs were shut down. If they were, toggle bits in the
+ // FRO detune register and reenable the FROs.
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_ALARMSTOP_ADDR);
+ fro_stopped_mask = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ if (fro_stopped_mask)
+ {
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_FROENABLE_ADDR);
+ fro_enabled_mask = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_FRODETUNE_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, fro_stopped_mask);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_FROENABLE_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off,
+ fro_stopped_mask | fro_enabled_mask);
+ }
+
+ // Reset the error
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_ALARMMASK_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_ALARMSTOP_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, 0);
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_INTACK_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off,
+ PKA_TRNG_STATUS_SHUTDOWN_OFLO);
+
+ // If we're seeing this error again within about a second,
+ // the hardware is malfunctioning. Disable the trng and return
+ // an error.
+ if (*err_cycle && (curr_cycle_cnt - *err_cycle < 1000000000))
+ {
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_CONTROL_ADDR);
+ csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ csr_reg_value &= ~PKA_TRNG_CONTROL_REG_VAL;
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, csr_reg_value);
+ return false;
+ }
+
+ *err_cycle = curr_cycle_cnt;
+ }
+
+ return true;
+}
+
+static int pka_dev_trng_drbg_reseed(void *csr_reg_ptr, uint64_t csr_reg_base)
+{
+ uint64_t csr_reg_off;
+ int ret;
+
+ ret = 0;
+
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base, TRNG_CONTROL_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_CONTROL_DRBG_RESEED);
+
+ ret = pka_dev_trng_wait_test_ready(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ return ret;
+
+ // Write personalization string
+ pka_dev_trng_write_ps_ai_str(csr_reg_ptr, csr_reg_base, pka_trng_drbg_ps_str);
+
+ return ret;
+}
+
+// Read from DRBG enabled TRNG
+int pka_dev_trng_read(pka_dev_shim_t *shim, uint32_t *data, uint32_t cnt)
+{
+ int ret = 0;
+
+ pka_dev_res_t *trng_csr_ptr;
+ uint64_t csr_reg_base, csr_reg_off, csr_reg_value;
+ uint64_t timer;
+ uint32_t data_idx, word_cnt;
+ uint8_t output_idx, trng_ready = 0;
+ void *csr_reg_ptr;
+
+ if (!shim || !data || (cnt % PKA_TRNG_OUTPUT_CNT != 0))
+ return -EINVAL;
+
+ if (!cnt)
+ return ret;
+
+ mutex_lock(&shim->mutex);
+
+ trng_csr_ptr = &shim->resources.trng_csr;
+
+ if (trng_csr_ptr->status != PKA_DEV_RES_STATUS_MAPPED ||
+ trng_csr_ptr->type != PKA_DEV_RES_TYPE_REG)
+ {
+ ret = -EPERM;
+ goto exit;
+ }
+
+ csr_reg_base = trng_csr_ptr->base;
+ csr_reg_ptr = trng_csr_ptr->ioaddr;
+
+ if (!pka_dev_trng_shutdown_oflo(trng_csr_ptr,
+ &shim->trng_err_cycle))
+ {
+ ret = -EWOULDBLOCK;
+ goto exit;
+ }
+
+ // Determine the number of 32-bit words.
+ word_cnt = cnt >> 2;
+
+ for (data_idx = 0; data_idx < word_cnt; data_idx++)
+ {
+ output_idx = data_idx % PKA_TRNG_OUTPUT_CNT;
+
+ // Tell the hardware to advance
+ if (output_idx == 0)
+ {
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_INTACK_ADDR);
+ pka_dev_io_write(csr_reg_ptr, csr_reg_off, PKA_TRNG_STATUS_READY);
+ trng_ready = 0;
+
+ // Check if 'data_blocks' field is zero in TRNG_CONTROL register,
+ // if it is then we have to issue a 'Reseed' and Generate' request
+ // for DRBG enabled TRNG.
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_CONTROL_ADDR);
+ csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+
+ if (!((uint32_t)csr_reg_value & PKA_TRNG_DRBG_DATA_BLOCK_MASK))
+ {
+ // Issue reseed
+ ret = pka_dev_trng_drbg_reseed(csr_reg_ptr, csr_reg_base);
+ if (ret)
+ {
+ ret = -EBUSY;
+ goto exit;
+ }
+
+ // Issue generate request
+ pka_dev_trng_drbg_generate(csr_reg_ptr, csr_reg_base);
+ }
+
+ }
+
+ // Wait until a data word is available in the TRNG_OUTPUT_X
+ // registers (using the interrupt and/or 'ready' status bit in the
+ // TRNG_STATUS register. The only way this would hang if the TRNG
+ // never initialized, and we would not call this function if that
+ // happened.
+ timer = pka_dev_timer_start(1000000); // 1000 ms
+ csr_reg_off =
+ pka_dev_get_register_offset(csr_reg_base, TRNG_STATUS_ADDR);
+ while (trng_ready == 0)
+ {
+ csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ trng_ready = csr_reg_value & PKA_TRNG_STATUS_READY;
+
+ if (pka_dev_timer_done(timer))
+ {
+ PKA_DEBUG(PKA_DEV,
+ "Shim %u got error obtaining random number\n",
+ shim->shim_id);
+ ret = -EBUSY;
+ goto exit;
+ }
+ }
+
+ // Read the registers
+ csr_reg_off = pka_dev_get_register_offset(csr_reg_base,
+ TRNG_OUTPUT_0_ADDR + (output_idx * 0x8));
+ csr_reg_value = pka_dev_io_read(csr_reg_ptr, csr_reg_off);
+ data[data_idx] = (uint32_t) csr_reg_value;
+ }
+
+exit:
+ mutex_unlock(&shim->mutex);
+ return ret;
+}
+
+bool pka_dev_has_trng(pka_dev_shim_t *shim)
+{
+ if (!shim)
+ return false;
+
+ return (shim->trng_enabled == PKA_SHIM_TRNG_ENABLED);
+}
+
+// Syscall to open ring.
+int __pka_dev_open_ring(uint32_t ring_id)
+{
+ pka_dev_shim_t *shim;
+ pka_dev_ring_t *ring;
+
+ int ret = 0;
+
+ if (pka_gbl_config.dev_rings_cnt == 0)
+ return -EPERM;
+
+ ring = pka_dev_get_ring(ring_id);
+ if (!ring || !ring->shim)
+ return -ENXIO;
+
+ shim = ring->shim;
+
+ mutex_lock(&ring->mutex);
+
+ if (shim->status == PKA_SHIM_STATUS_UNDEFINED ||
+ shim->status == PKA_SHIM_STATUS_CREATED ||
+ shim->status == PKA_SHIM_STATUS_FINALIZED)
+ {
+ ret = -EPERM;
+ goto unlock_return;
+ }
+
+ if (ring->status == PKA_DEV_RING_STATUS_BUSY)
+ {
+ ret = -EBUSY;
+ goto unlock_return;
+ }
+
+ if (ring->status != PKA_DEV_RING_STATUS_INITIALIZED)
+ {
+ ret = -EPERM;
+ goto unlock_return;
+ }
+
+ // Set ring information words.
+ ret = pka_dev_set_ring_info(ring);
+ if (ret)
+ {
+ PKA_ERROR(PKA_DEV, "failed to set ring information\n");
+ ret = -EWOULDBLOCK;
+ goto unlock_return;
+ }
+
+ if (shim->busy_ring_num == 0)
+ shim->status = PKA_SHIM_STATUS_RUNNING;
+
+ ring->status = PKA_DEV_RING_STATUS_BUSY;
+ shim->busy_ring_num += 1;
+
+unlock_return:
+ mutex_unlock(&ring->mutex);
+ return ret;
+}
+
+// Open ring.
+int pka_dev_open_ring(pka_ring_info_t *ring_info)
+{
+ return __pka_dev_open_ring(ring_info->ring_id);
+}
+
+// Syscall to close ring.
+int __pka_dev_close_ring(uint32_t ring_id)
+{
+ pka_dev_shim_t *shim;
+ pka_dev_ring_t *ring;
+
+ int ret = 0;
+
+ if (pka_gbl_config.dev_rings_cnt == 0)
+ return -EPERM;
+
+ ring = pka_dev_get_ring(ring_id);
+ if (!ring || !ring->shim)
+ return -ENXIO;
+
+ shim = ring->shim;
+
+ mutex_lock(&ring->mutex);
+
+ if (shim->status != PKA_SHIM_STATUS_RUNNING &&
+ ring->status != PKA_DEV_RING_STATUS_BUSY)
+ {
+ ret = -EPERM;
+ goto unlock_return;
+ }
+
+ ring->status = PKA_DEV_RING_STATUS_INITIALIZED;
+ shim->busy_ring_num -= 1;
+
+ if (shim->busy_ring_num == 0)
+ shim->status = PKA_SHIM_STATUS_STOPPED;
+
+unlock_return:
+ mutex_unlock(&ring->mutex);
+ return ret;
+}
+
+// Close ring.
+int pka_dev_close_ring(pka_ring_info_t *ring_info)
+{
+ if (ring_info)
+ {
+ return __pka_dev_close_ring(ring_info->ring_id);
+ }
+
+ return 0;
+}
+
+// Syscall to map ring into memory (kernel-space).
+static int __pka_dev_mmap_ring(uint32_t ring_id)
+{
+ //not implemented
+ return -1;
+}
+
+// Map ring into memory (user-space).
+int pka_dev_mmap_ring(pka_ring_info_t *ring_info)
+{
+ return __pka_dev_mmap_ring(ring_info->ring_id);
+}
+
+// Syscall to unmap ring (kernel-space).
+static int __pka_dev_munmap_ring(uint32_t ring_id)
+{
+ //not implemented
+ return -1;
+}
+
+// Unmap ring (user-space).
+int pka_dev_munmap_ring(pka_ring_info_t *ring_info)
+{
+ if (ring_info)
+ {
+ return __pka_dev_munmap_ring(ring_info->ring_id);
+ }
+
+ return 0;
+}
+
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h
new file mode 100644
index 000000000..06ac28623
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_dev.h
@@ -0,0 +1,310 @@
+//
+// BSD LICENSE
+//
+// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved.
+// 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 Mellanox Technologies 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 __PKA_DEV_H__
+#define __PKA_DEV_H__
+
+///
+/// @file
+///
+/// API to handle the PKA EIP-154 I/O block (shim). It provides functions
+/// and data structures to initialize and configure the PKA shim. It's the
+/// "southband interface" for communication with PKA hardware resources.
+///
+
+#include <linux/mutex.h>
+#include <linux/types.h>
+#include "mlxbf_pka_firmware.h"
+
+#include <linux/vfio.h>
+
+#include "mlxbf_pka_config.h"
+#include "mlxbf_pka_cpu.h"
+#include "mlxbf_pka_debug.h"
+#include "mlxbf_pka_ioctl.h"
+#include "mlxbf_pka_mmio.h"
+#include "mlxbf_pka_ring.h"
+
+#define PKA_SYSFS_RING_DEVICES "/sys/bus/platform/devices"
+#define PKA_VFIO_DIR "/dev/vfio"
+#define PKA_VFIO_CONTAINER_PATH "/dev/vfio/vfio"
+#define PKA_VFIO_GROUP_FMT "/dev/vfio/%d"
+
+#define PKA_DEVFS_RING_DEVICES "/dev/pka/%d"
+
+// Defines specific to device-tree and Linux operating system.
+// Careful, all constants MUST be conform with both devicetree
+// (DTS) and ACPI tables (SSDT).
+// *TBD* Better to be detected automatically (or passed as arg
+// so far).
+#define PKA_DEV_RING_DT_PREFIX_0 "45000000.eip154:ring@%d"
+#define PKA_DEV_RING_DT_PREFIX_1 "47000000.eip154:ring@%d"
+#define PKA_DEV_RING_DT_PREFIX_2 "4d000000.eip154:ring@%d"
+#define PKA_DEV_RING_DT_PREFIX_3 "4f000000.eip154:ring@%d"
+#define PKA_DEV_RING_DT_PREFIX_4 "44000000.eip154:ring@%d"
+#define PKA_DEV_RING_DT_PREFIX_5 "46000000.eip154:ring@%d"
+#define PKA_DEV_RING_DT_PREFIX_6 "4c000000.eip154:ring@%d"
+#define PKA_DEV_RING_DT_PREFIX_7 "4e000000.eip154:ring@%d"
+
+#define PKA_DEV_RING_ACPI_PREFIX "MLNXBF11:%02x"
+
+/// Device resource structure
+typedef struct
+{
+ void *ioaddr; ///< (iore)map-ped version of addr, for
+ /// driver internal use.
+
+ uint64_t base; ///< base address of the device's
+ /// resource
+
+ uint64_t size; ///< size of IO
+
+ uint8_t type; ///< type of resource addr points to
+ int8_t status; ///< status of the resource
+
+ char *name; ///< name of the resource
+} pka_dev_res_t;
+
+/// defines for pka_dev_res->type
+#define PKA_DEV_RES_TYPE_MEM 1 // resource type is memory
+#define PKA_DEV_RES_TYPE_REG 2 // resource type is register
+
+/// defines for pka_dev_res->status
+#define PKA_DEV_RES_STATUS_MAPPED 1 // the resource is (iore)-mapped
+#define PKA_DEV_RES_STATUS_UNMAPPED -1 // the resource is unmapped
+
+/// PKA Ring resources structure
+typedef struct
+{
+ pka_dev_res_t info_words; // ring information words
+ pka_dev_res_t counters; // ring counters
+ pka_dev_res_t window_ram; // window RAM
+} pka_dev_ring_res_t;
+
+typedef struct pka_dev_shim_s pka_dev_shim_t;
+
+/// PKA Ring structure
+typedef struct
+{
+ uint32_t ring_id; ///< ring identifier.
+
+ pka_dev_shim_t *shim; ///< pointer to the shim associated
+ /// to the ring.
+
+ uint32_t resources_num; ///< number of ring ressources.
+ pka_dev_ring_res_t resources; ///< ring resources.
+
+ pka_dev_hw_ring_info_t *ring_info; ///< ring information.
+ uint32_t num_cmd_desc; ///< number of command descriptors.
+
+ int8_t status; ///< status of the ring.
+
+ struct mutex mutex; ///< mutex lock for sharing ring device
+} pka_dev_ring_t;
+
+/// defines for pka_dev_ring->status
+#define PKA_DEV_RING_STATUS_UNDEFINED -1
+#define PKA_DEV_RING_STATUS_INITIALIZED 1
+#define PKA_DEV_RING_STATUS_READY 2
+#define PKA_DEV_RING_STATUS_BUSY 3
+#define PKA_DEV_RING_STATUS_FINALIZED 4
+
+/// PKA Shim resources structure
+typedef struct
+{
+ pka_dev_res_t buffer_ram; // buffer RAM
+ pka_dev_res_t master_prog_ram; // master controller program RAM
+ pka_dev_res_t master_seq_ctrl; // master sequencer controller CSR
+ pka_dev_res_t aic_csr; // interrupt controller CSRs
+ pka_dev_res_t trng_csr; // TRNG module CSRs
+ pka_dev_res_t ext_csr; // MiCA specific CSRs (glue logic)
+} pka_dev_shim_res_t;
+
+#define PKA_DEV_SHIM_RES_CNT 6 // Number of PKA device resources
+
+/// Platform global shim resource information
+typedef struct
+{
+ pka_dev_res_t *res_tbl[PKA_DEV_SHIM_RES_CNT];
+ uint8_t res_cnt;
+} pka_dev_gbl_shim_res_info_t;
+
+struct pka_dev_mem_res
+{
+ uint64_t eip154_base; ///< base address for eip154 mmio registers
+ uint64_t eip154_size; ///< eip154 mmio register region size
+
+ uint64_t wndw_ram_off_mask; ///< common offset mask for alt window ram and window ram
+ uint64_t wndw_ram_base; ///< base address for window ram
+ uint64_t wndw_ram_size; ///< window ram region size
+
+ uint64_t alt_wndw_ram_0_base; ///< base address for alternate window ram 0
+ uint64_t alt_wndw_ram_1_base; ///< base address for alternate window ram 1
+ uint64_t alt_wndw_ram_2_base; ///< base address for alternate window ram 2
+ uint64_t alt_wndw_ram_3_base; ///< base address for alternate window ram 3
+ uint64_t alt_wndw_ram_size; ///< alternate window ram regions size
+
+ uint64_t csr_base; ///< base address for csr registers
+ uint64_t csr_size; ///< csr area size
+};
+
+
+/// PKA Shim structure
+struct pka_dev_shim_s
+{
+ struct pka_dev_mem_res mem_res;
+
+ uint64_t trng_err_cycle; ///< TRNG error cycle
+
+ uint32_t shim_id; ///< shim identifier
+
+ uint32_t rings_num; ///< Number of supported rings (hw
+ /// specific)
+
+ pka_dev_ring_t **rings; ///< pointer to rings which belong to
+ /// the shim.
+
+ uint8_t ring_priority; ///< specify the priority in which
+ /// rings are handled.
+
+ uint8_t ring_type; ///< indicates whether the result
+ /// ring delivers results strictly
+ /// in-order.
+
+ pka_dev_shim_res_t resources; ///< shim resources
+
+ uint8_t window_ram_split; ///< Window RAM mode. if non-zero,
+ /// the splitted window RAM scheme
+ /// is used.
+
+ uint32_t busy_ring_num; ///< Number of active rings (rings in
+ /// busy state)
+
+ uint8_t trng_enabled; ///< Whether the TRNG engine is
+ /// enabled.
+
+ int8_t status; ///< status of the shim
+
+ struct mutex mutex; ///< mutex lock for sharing shim
+};
+
+/// defines for pka_dev_shim->status
+#define PKA_SHIM_STATUS_UNDEFINED -1
+#define PKA_SHIM_STATUS_CREATED 1
+#define PKA_SHIM_STATUS_INITIALIZED 2
+#define PKA_SHIM_STATUS_RUNNING 3
+#define PKA_SHIM_STATUS_STOPPED 4
+#define PKA_SHIM_STATUS_FINALIZED 5
+
+/// defines for pka_dev_shim->window_ram_split
+#define PKA_SHIM_WINDOW_RAM_SPLIT_ENABLED 1 // window RAM is splitted into
+ // 4 * 16KB blocks
+
+#define PKA_SHIM_WINDOW_RAM_SPLIT_DISABLED 2 // window RAM is not splitted
+ // and occupies 64KB
+
+/// defines for pka_dev_shim->trng_enabled
+#define PKA_SHIM_TRNG_ENABLED 1
+#define PKA_SHIM_TRNG_DISABLED 0
+
+/// Platform global configuration structure
+typedef struct
+{
+ uint32_t dev_shims_cnt; ///< number of registered PKA shims.
+ uint32_t dev_rings_cnt; ///< number of registered Rings.
+
+ pka_dev_shim_t *dev_shims[PKA_MAX_NUM_IO_BLOCKS]; ///< table of registered
+ /// PKA shims.
+
+ pka_dev_ring_t *dev_rings[PKA_MAX_NUM_RINGS]; ///< table of registered
+ /// Rings.
+} pka_dev_gbl_config_t;
+
+extern pka_dev_gbl_config_t pka_gbl_config;
+
+/// Ring getter for pka_dev_gbl_config_t structure which holds all system
+/// global configuration. This configuration is shared and common to kernel
+/// device driver associated with PKA hardware.
+pka_dev_ring_t *pka_dev_get_ring(uint32_t ring_id);
+
+/// Shim getter for pka_dev_gbl_config_t structure which holds all system
+/// global configuration. This configuration is shared and common to kernel
+/// device driver associated with PKA hardware.
+pka_dev_shim_t *pka_dev_get_shim(uint32_t shim_id);
+
+/// Register a Ring. This function initializes a Ring and configures its
+/// related resources, and returns a pointer to that ring.
+pka_dev_ring_t *pka_dev_register_ring(uint32_t ring_id, uint32_t shim_id);
+
+/// Unregister a Ring
+int pka_dev_unregister_ring(pka_dev_ring_t *ring);
+
+/// Register PKA IO block. This function initializes a shim and configures its
+/// related resources, and returns a pointer to that ring.
+pka_dev_shim_t *pka_dev_register_shim(uint32_t shim_id, uint8_t shim_fw_id,
+ struct pka_dev_mem_res *mem_res);
+
+/// Unregister PKA IO block
+int pka_dev_unregister_shim(pka_dev_shim_t *shim);
+
+/// Reset a Ring.
+int pka_dev_reset_ring(pka_dev_ring_t *ring);
+
+/// Clear ring counters. This function resets the master sequencer controller
+/// to clear the command and result counters.
+int pka_dev_clear_ring_counters(pka_dev_ring_t *ring);
+
+/// Read data from the TRNG. Drivers can fill up to 'cnt' bytes of data into
+/// the buffer 'data'. The buffer 'data' is aligned for any type and 'cnt' is
+/// a multiple of 4.
+int pka_dev_trng_read(pka_dev_shim_t *shim, uint32_t *data, uint32_t cnt);
+
+/// Return true if the TRNG engine is enabled, false if not.
+bool pka_dev_has_trng(pka_dev_shim_t *shim);
+
+/// Open the file descriptor associated with ring. It returns an integer value,
+/// which is used to refer to the file. If un-successful, it returns a negative
+/// error.
+int pka_dev_open_ring(pka_ring_info_t *ring_info);
+
+/// Close the file descriptor associated with ring. The function returns 0 if
+/// successful, negative value to indicate an error.
+int pka_dev_close_ring(pka_ring_info_t *ring_info);
+
+/// Map ring resources.
+int pka_dev_mmap_ring(pka_ring_info_t *ring_info);
+
+/// Unmap ring resources.
+int pka_dev_munmap_ring(pka_ring_info_t *ring_info);
+
+#endif /// __PKA_DEV_H__
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c
new file mode 100644
index 000000000..b8b5a465e
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_drv.c
@@ -0,0 +1,1398 @@
+// SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause
+
+#include <linux/acpi.h>
+#include <linux/cdev.h>
+#include <linux/device.h>
+#include <linux/hw_random.h>
+#include <linux/interrupt.h>
+#include <linux/iommu.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/of_device.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/types.h>
+#include <linux/uaccess.h>
+#include <linux/vfio.h>
+
+#include "mlxbf_pka_dev.h"
+
+
+#define PKA_DRIVER_VERSION "v3.0"
+#define PKA_DRIVER_NAME "pka-mlxbf"
+
+#define PKA_DRIVER_DESCRIPTION "BlueField PKA driver"
+
+#define PKA_DEVICE_COMPAT "mlx,mlxbf-pka"
+#define PKA_RING_DEVICE_COMPAT "mlx,mlxbf-pka-ring"
+
+#define PKA_DEVICE_ACPIHID_BF1 "MLNXBF10"
+#define PKA_RING_DEVICE_ACPIHID_BF1 "MLNXBF11"
+
+#define PKA_DEVICE_ACPIHID_BF2 "MLNXBF20"
+#define PKA_RING_DEVICE_ACPIHID_BF2 "MLNXBF21"
+
+#define PKA_DEVICE_ACCESS_MODE 0666
+
+#define PKA_DEVICE_RES_CNT 7
+enum pka_mem_res_idx {
+ PKA_ACPI_EIP154_IDX = 0,
+ PKA_ACPI_WNDW_RAM_IDX,
+ PKA_ACPI_ALT_WNDW_RAM_0_IDX,
+ PKA_ACPI_ALT_WNDW_RAM_1_IDX,
+ PKA_ACPI_ALT_WNDW_RAM_2_IDX,
+ PKA_ACPI_ALT_WNDW_RAM_3_IDX,
+ PKA_ACPI_CSR_IDX
+};
+
+enum pka_plat_type {
+ PKA_PLAT_TYPE_BF1 = 0, /* Platform type Bluefield-1 */
+ PKA_PLAT_TYPE_BF2 /* Platform type Bluefield-2 */
+};
+
+static DEFINE_MUTEX(pka_drv_lock);
+
+static uint32_t pka_device_cnt;
+static uint32_t pka_ring_device_cnt;
+
+const char pka_compat[] = PKA_DEVICE_COMPAT;
+const char pka_ring_compat[] = PKA_RING_DEVICE_COMPAT;
+
+const char pka_acpihid_bf1[] = PKA_DEVICE_ACPIHID_BF1;
+const char pka_ring_acpihid_bf1[] = PKA_RING_DEVICE_ACPIHID_BF1;
+
+const char pka_acpihid_bf2[] = PKA_DEVICE_ACPIHID_BF2;
+const char pka_ring_acpihid_bf2[] = PKA_RING_DEVICE_ACPIHID_BF2;
+
+struct pka_drv_plat_info {
+ enum pka_plat_type type;
+ uint8_t fw_id;
+};
+
+static struct pka_drv_plat_info pka_drv_plat[] = {
+ [PKA_PLAT_TYPE_BF1] = {
+ .type = PKA_PLAT_TYPE_BF1,
+ .fw_id = PKA_FIRMWARE_IMAGE_0_ID
+ },
+ [PKA_PLAT_TYPE_BF2] = {
+ .type = PKA_PLAT_TYPE_BF2,
+ .fw_id = PKA_FIRMWARE_IMAGE_2_ID
+ }
+};
+
+static const struct acpi_device_id pka_drv_acpi_ids[] = {
+ { PKA_DEVICE_ACPIHID_BF1, (kernel_ulong_t)&pka_drv_plat[PKA_PLAT_TYPE_BF1] },
+ { PKA_RING_DEVICE_ACPIHID_BF1, 0 },
+ { PKA_DEVICE_ACPIHID_BF2, (kernel_ulong_t)&pka_drv_plat[PKA_PLAT_TYPE_BF2] },
+ { PKA_RING_DEVICE_ACPIHID_BF2, 0 },
+ {},
+};
+
+struct pka_info {
+ struct device *dev; /* the device this info belongs to */
+ const char *name; /* device name */
+ const char *version; /* device driver version */
+ const char *compat;
+ const char *acpihid;
+ uint8_t flag;
+ struct module *module;
+ void *priv; /* optional private data */
+};
+
+/* defines for pka_info->flags */
+#define PKA_DRIVER_FLAG_RING_DEVICE 1
+#define PKA_DRIVER_FLAG_DEVICE 2
+
+struct pka_platdata {
+ struct platform_device *pdev;
+ struct pka_info *info;
+ spinlock_t lock;
+ unsigned long irq_flags;
+};
+
+/* Bits in pka_platdata.irq_flags */
+enum {
+ PKA_IRQ_DISABLED = 0,
+};
+
+struct pka_ring_region {
+ u64 off;
+ u64 addr;
+ resource_size_t size;
+ u32 flags;
+ u32 type;
+ void __iomem *ioaddr;
+};
+
+/* defines for pka_ring_region->flags */
+#define PKA_RING_REGION_FLAG_READ (1 << 0) /* Region supports read */
+#define PKA_RING_REGION_FLAG_WRITE (1 << 1) /* Region supports write */
+#define PKA_RING_REGION_FLAG_MMAP (1 << 2) /* Region supports mmap */
+
+/* defines for pka_ring_region->type */
+#define PKA_RING_RES_TYPE_NONE 0
+#define PKA_RING_RES_TYPE_WORDS 1 /* info control/status words */
+#define PKA_RING_RES_TYPE_CNTRS 2 /* count registers */
+#define PKA_RING_RES_TYPE_MEM 4 /* window RAM region */
+
+#define PKA_DRIVER_RING_DEV_MAX PKA_MAX_NUM_RINGS
+
+struct pka_ring_device {
+ struct pka_info *info;
+ struct device *device;
+ struct iommu_group *group;
+ int32_t group_id;
+ uint32_t device_id;
+ uint32_t parent_device_id;
+ struct mutex mutex;
+ uint32_t flags;
+ struct module *parent_module;
+ pka_dev_ring_t *ring;
+ int minor;
+ uint32_t num_regions;
+ struct pka_ring_region *regions;
+};
+
+#define PKA_DRIVER_DEV_MAX PKA_MAX_NUM_IO_BLOCKS
+#define PKA_DRIVER_RING_NUM_REGIONS_MAX PKA_MAX_NUM_RING_RESOURCES
+
+/* defines for region index */
+#define PKA_RING_REGION_WORDS_IDX 0
+#define PKA_RING_REGION_CNTRS_IDX 1
+#define PKA_RING_REGION_MEM_IDX 2
+
+#define PKA_RING_REGION_OFFSET_SHIFT 40
+#define PKA_RING_REGION_OFFSET_MASK \
+ (((u64)(1) << PKA_RING_REGION_OFFSET_SHIFT) - 1)
+
+#define PKA_RING_OFFSET_TO_INDEX(off) \
+ (off >> PKA_RING_REGION_OFFSET_SHIFT)
+
+#define PKA_RING_REGION_INDEX_TO_OFFSET(index) \
+ ((u64)(index) << PKA_RING_REGION_OFFSET_SHIFT)
+
+struct pka_device {
+ struct pka_info *info;
+ struct device *device;
+ uint32_t device_id;
+ uint8_t fw_id; /* firmware identifier */
+ struct mutex mutex;
+ struct resource *resource[PKA_DEVICE_RES_CNT];
+ pka_dev_shim_t *shim;
+ long irq; /* interrupt number */
+ struct hwrng rng;
+};
+
+/* defines for pka_device->irq */
+#define PKA_IRQ_CUSTOM -1
+#define PKA_IRQ_NONE 0
+
+/* Hardware interrupt handler */
+static irqreturn_t pka_drv_irq_handler(int irq, void *device)
+{
+ struct pka_device *pka_dev = (struct pka_device *)device;
+ struct platform_device *pdev = to_platform_device(pka_dev->device);
+ struct pka_platdata *priv = platform_get_drvdata(pdev);
+
+ PKA_DEBUG(PKA_DRIVER,
+ "handle irq in device %u\n", pka_dev->device_id);
+
+ /* Just disable the interrupt in the interrupt controller */
+
+ spin_lock(&priv->lock);
+ if (!__test_and_set_bit(PKA_IRQ_DISABLED, &priv->irq_flags))
+ disable_irq_nosync(irq);
+ spin_unlock(&priv->lock);
+
+ return IRQ_HANDLED;
+}
+
+static int pka_drv_register_irq(struct pka_device *pka_dev)
+{
+ if (pka_dev->irq && (pka_dev->irq != PKA_IRQ_CUSTOM)) {
+ /*
+ * Allow sharing the irq among several devices (child devices
+ * so far)
+ */
+ return request_irq(pka_dev->irq,
+ (irq_handler_t) pka_drv_irq_handler,
+ IRQF_SHARED, pka_dev->info->name,
+ pka_dev);
+ }
+
+ return -ENXIO;
+}
+
+static int pka_drv_ring_regions_init(struct pka_ring_device *ring_dev)
+{
+ struct pka_ring_region *region;
+ pka_dev_ring_t *ring;
+ pka_dev_res_t *res;
+ uint32_t num_regions;
+
+ ring = ring_dev->ring;
+ if (!ring || !ring->shim)
+ return -ENXIO;
+
+ num_regions = ring->resources_num;
+ ring_dev->num_regions = num_regions;
+ ring_dev->regions = kcalloc(num_regions,
+ sizeof(struct pka_ring_region),
+ GFP_KERNEL);
+ if (!ring_dev->regions)
+ return -ENOMEM;
+
+ /* Information words region */
+ res = &ring->resources.info_words;
+ region = &ring_dev->regions[PKA_RING_REGION_WORDS_IDX];
+ /* map offset to the physical address */
+ region->off =
+ PKA_RING_REGION_INDEX_TO_OFFSET(PKA_RING_REGION_WORDS_IDX);
+ region->addr = res->base;
+ region->size = res->size;
+ region->type = PKA_RING_RES_TYPE_WORDS;
+ region->flags |= (PKA_RING_REGION_FLAG_MMAP |
+ PKA_RING_REGION_FLAG_READ |
+ PKA_RING_REGION_FLAG_WRITE);
+
+ /* Count regiters region */
+ res = &ring->resources.counters;
+ region = &ring_dev->regions[PKA_RING_REGION_CNTRS_IDX];
+ /* map offset to the physical address */
+ region->off =
+ PKA_RING_REGION_INDEX_TO_OFFSET(PKA_RING_REGION_CNTRS_IDX);
+ region->addr = res->base;
+ region->size = res->size;
+ region->type = PKA_RING_RES_TYPE_CNTRS;
+ region->flags |= (PKA_RING_REGION_FLAG_MMAP |
+ PKA_RING_REGION_FLAG_READ |
+ PKA_RING_REGION_FLAG_WRITE);
+
+ /* Window ram region */
+ res = &ring->resources.window_ram;
+ region = &ring_dev->regions[PKA_RING_REGION_MEM_IDX];
+ /* map offset to the physical address */
+ region->off =
+ PKA_RING_REGION_INDEX_TO_OFFSET(PKA_RING_REGION_MEM_IDX);
+ region->addr = res->base;
+ region->size = res->size;
+ region->type = PKA_RING_RES_TYPE_MEM;
+ region->flags |= (PKA_RING_REGION_FLAG_MMAP |
+ PKA_RING_REGION_FLAG_READ |
+ PKA_RING_REGION_FLAG_WRITE);
+
+ return 0;
+}
+
+static void pka_drv_ring_regions_cleanup(struct pka_ring_device *ring_dev)
+{
+ /* clear vfio device regions */
+ ring_dev->num_regions = 0;
+ kfree(ring_dev->regions);
+}
+
+static int pka_drv_ring_open(void *device_data)
+{
+ struct pka_ring_device *ring_dev = device_data;
+ struct pka_info *info = ring_dev->info;
+ pka_ring_info_t ring_info;
+
+ int error;
+
+ PKA_DEBUG(PKA_DRIVER,
+ "open ring device %u (device_data:%p)\n",
+ ring_dev->device_id, ring_dev);
+
+ if (!try_module_get(info->module))
+ return -ENODEV;
+
+ ring_info.ring_id = ring_dev->device_id;
+ error = pka_dev_open_ring(&ring_info);
+ if (error) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to open ring %u\n", ring_dev->device_id);
+ module_put(info->module);
+ return error;
+ }
+
+ /* Initialize regions */
+ error = pka_drv_ring_regions_init(ring_dev);
+ if (error) {
+ PKA_DEBUG(PKA_DRIVER, "failed to initialize regions\n");
+ pka_dev_close_ring(&ring_info);
+ module_put(info->module);
+ return error;
+ }
+
+ return 0;
+}
+
+static void pka_drv_ring_release(void *device_data)
+{
+ struct pka_ring_device *ring_dev = device_data;
+ struct pka_info *info = ring_dev->info;
+ pka_ring_info_t ring_info;
+
+ int error;
+
+ PKA_DEBUG(PKA_DRIVER,
+ "release ring device %u (device_data:%p)\n",
+ ring_dev->device_id, ring_dev);
+
+ pka_drv_ring_regions_cleanup(ring_dev);
+
+ ring_info.ring_id = ring_dev->device_id;
+ error = pka_dev_close_ring(&ring_info);
+ if (error)
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to close ring %u\n",
+ ring_dev->device_id);
+
+ module_put(info->module);
+}
+
+static int pka_drv_ring_mmap_region(struct pka_ring_region region,
+ struct vm_area_struct *vma)
+{
+ u64 req_len, pgoff, req_start;
+
+ req_len = vma->vm_end - vma->vm_start;
+ pgoff = vma->vm_pgoff &
+ ((1U << (PKA_RING_REGION_OFFSET_SHIFT - PAGE_SHIFT)) - 1);
+ req_start = pgoff << PAGE_SHIFT;
+
+ region.size = roundup(region.size, PAGE_SIZE);
+
+ if (req_start + req_len > region.size)
+ return -EINVAL;
+
+ vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+ vma->vm_pgoff = (region.addr >> PAGE_SHIFT) + pgoff;
+
+ return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
+ req_len, vma->vm_page_prot);
+}
+
+static int pka_drv_ring_mmap(void *device_data, struct vm_area_struct *vma)
+{
+ struct pka_ring_device *ring_dev = device_data;
+ struct pka_ring_region *region;
+ unsigned int index;
+
+ PKA_DEBUG(PKA_DRIVER, "mmap device %u\n", ring_dev->device_id);
+
+ index = vma->vm_pgoff >> (PKA_RING_REGION_OFFSET_SHIFT - PAGE_SHIFT);
+
+ if (vma->vm_end < vma->vm_start)
+ return -EINVAL;
+ if (!(vma->vm_flags & VM_SHARED))
+ return -EINVAL;
+ if (index >= ring_dev->num_regions)
+ return -EINVAL;
+ if (vma->vm_start & ~PAGE_MASK)
+ return -EINVAL;
+ if (vma->vm_end & ~PAGE_MASK)
+ return -EINVAL;
+
+ region = &ring_dev->regions[index];
+
+ if (!(region->flags & PKA_RING_REGION_FLAG_MMAP))
+ return -EINVAL;
+
+ if (!(region->flags & PKA_RING_REGION_FLAG_READ)
+ && (vma->vm_flags & VM_READ))
+ return -EINVAL;
+
+ if (!(region->flags & PKA_RING_REGION_FLAG_WRITE)
+ && (vma->vm_flags & VM_WRITE))
+ return -EINVAL;
+
+ vma->vm_private_data = ring_dev;
+
+ if (region->type & PKA_RING_RES_TYPE_CNTRS ||
+ region->type & PKA_RING_RES_TYPE_MEM)
+ return pka_drv_ring_mmap_region(ring_dev->regions[index], vma);
+
+ if (region->type & PKA_RING_RES_TYPE_WORDS)
+ /*
+ * Currently user space is not allowed to access this
+ * region.
+ */
+ return -EINVAL;
+
+ return -EINVAL;
+}
+
+static long pka_drv_ring_ioctl(void *device_data,
+ unsigned int cmd, unsigned long arg)
+{
+ struct pka_ring_device *ring_dev = device_data;
+
+ int error = -ENOTTY;
+
+ if (cmd == PKA_RING_GET_REGION_INFO) {
+ pka_dev_region_info_t info;
+
+ info.mem_index = PKA_RING_REGION_MEM_IDX;
+ info.mem_offset = ring_dev->regions[info.mem_index].off;
+ info.mem_size = ring_dev->regions[info.mem_index].size;
+
+ info.reg_index = PKA_RING_REGION_CNTRS_IDX;
+ info.reg_offset = ring_dev->regions[info.reg_index].off;
+ info.reg_size = ring_dev->regions[info.reg_index].size;
+
+ return copy_to_user((void __user *)arg, &info, sizeof(info)) ?
+ -EFAULT : 0;
+
+ } else if (cmd == PKA_GET_RING_INFO) {
+ pka_dev_hw_ring_info_t *this_ring_info;
+ pka_dev_hw_ring_info_t hw_ring_info;
+
+ this_ring_info = ring_dev->ring->ring_info;
+
+ hw_ring_info.cmmd_base = this_ring_info->cmmd_base;
+ hw_ring_info.rslt_base = this_ring_info->rslt_base;
+ hw_ring_info.size = this_ring_info->size;
+ hw_ring_info.host_desc_size = this_ring_info->host_desc_size;
+ hw_ring_info.in_order = this_ring_info->in_order;
+ hw_ring_info.cmmd_rd_ptr = this_ring_info->cmmd_rd_ptr;
+ hw_ring_info.rslt_wr_ptr = this_ring_info->rslt_wr_ptr;
+ hw_ring_info.cmmd_rd_stats = this_ring_info->cmmd_rd_ptr;
+ hw_ring_info.rslt_wr_stats = this_ring_info->rslt_wr_stats;
+
+ return copy_to_user((void __user *)arg, &hw_ring_info,
+ sizeof(hw_ring_info)) ? -EFAULT : 0;
+ } else if (cmd == PKA_CLEAR_RING_COUNTERS) {
+ return pka_dev_clear_ring_counters(ring_dev->ring);
+ } else if (cmd == PKA_GET_RANDOM_BYTES) {
+ pka_dev_trng_info_t *trng_data;
+ pka_dev_shim_t *shim;
+ bool trng_present;
+ uint32_t byte_cnt;
+ uint32_t *data;
+ int ret;
+
+ ret = -ENOENT;
+ shim = ring_dev->ring->shim;
+ trng_data = (pka_dev_trng_info_t *)arg;
+ /*
+ * We need byte count which is multiple of 4 as
+ * required by pka_dev_trng_read() interface.
+ */
+ byte_cnt = round_up(trng_data->count, 4);
+
+ data = kzalloc(byte_cnt, GFP_KERNEL);
+ if (data == NULL) {
+ PKA_DEBUG(PKA_DRIVER, "failed to allocate memory.\n");
+ return -ENOMEM;
+ }
+
+ trng_present = pka_dev_has_trng(shim);
+ if (!trng_present) {
+ kfree(data);
+ return ret;
+ }
+
+ ret = pka_dev_trng_read(shim, data, byte_cnt);
+ if (ret) {
+ PKA_DEBUG(PKA_DRIVER, "TRNG failed %d\n", ret);
+ kfree(data);
+ return ret;
+ }
+
+ ret = copy_to_user((void __user *)(trng_data->data), data, trng_data->count);
+ kfree(data);
+ return ret ? -EFAULT : 0;
+ }
+
+ return error;
+}
+
+#ifdef CONFIG_PKA_VFIO_IOMMU
+static const struct vfio_device_ops pka_ring_vfio_ops = {
+ .name = PKA_DRIVER_NAME,
+ .open = pka_drv_ring_open,
+ .release = pka_drv_ring_release,
+ .ioctl = pka_drv_ring_ioctl,
+ .mmap = pka_drv_ring_mmap,
+};
+
+static int pka_drv_add_ring_device(struct pka_ring_device *ring_dev)
+{
+ struct device *dev = ring_dev->device;
+ int ret;
+
+ ring_dev->parent_module = THIS_MODULE;
+ ring_dev->flags = VFIO_DEVICE_FLAGS_PLATFORM;
+
+ ring_dev->group = vfio_iommu_group_get(dev);
+ if (!ring_dev->group) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to get IOMMU group for device %d\n",
+ ring_dev->device_id);
+ return -EINVAL;
+ }
+
+ /*
+ * Note that this call aims to add the given child device to a vfio
+ * group. This function creates a new driver data for the device
+ * different from the structure passed as a 3rd argument - i.e.
+ * pka_ring_dev. The struct newly created corresponds to 'vfio_device'
+ * structure which includes a field called 'device_data' that holds
+ * the initialized 'pka_ring_dev'. So to retrieve our private data,
+ * we must call 'dev_get_drvdata()' which returns the 'vfio_device'
+ * struct and access its 'device_data' field. Here one can use
+ * 'pka_platdata' structure instead to be consistent with the parent
+ * devices, and have a common driver data structure which will be used
+ * to manage devices - 'pka_drv_remove()' for instance. Since the VFIO
+ * framework alters the driver data and introduce an indirection, it
+ * is no more relevant to have a common driver data structure. Hence,
+ * we prefer to set the struct 'pka_vfio_dev' instead to avoid
+ * indirection when we have to retrieve this structure during the
+ * open(), mmap(), and ioctl() calls. Since, this structure is used
+ * as driver data here, it will be immediately reachable for these
+ * functions (see first argument passed (void *device_data) passed
+ * to those functions).
+ */
+ ret = vfio_add_group_dev(dev, &pka_ring_vfio_ops, ring_dev);
+ if (ret) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to add group device %d\n",
+ ring_dev->device_id);
+ vfio_iommu_group_put(ring_dev->group, dev);
+ return ret;
+ }
+
+ ring_dev->group_id = iommu_group_id(ring_dev->group);
+
+ PKA_DEBUG(PKA_DRIVER,
+ "ring device %d bus:%p iommu_ops:%p group:%p\n",
+ ring_dev->device_id,
+ dev->bus,
+ dev->bus->iommu_ops,
+ ring_dev->group);
+
+ return 0;
+}
+
+static struct pka_ring_device *pka_drv_del_ring_device(struct device *dev)
+{
+ struct pka_ring_device *ring_dev;
+
+ ring_dev = vfio_del_group_dev(dev);
+ if (ring_dev)
+ vfio_iommu_group_put(dev->iommu_group, dev);
+
+ return ring_dev;
+}
+
+static int pka_drv_init_class(void)
+{
+ return 0;
+}
+
+static void pka_drv_destroy_class(void)
+{
+}
+#else
+static struct pka {
+ struct class *class;
+ struct idr ring_idr;
+ struct mutex ring_lock;
+ struct cdev ring_cdev;
+ dev_t ring_devt;
+} pka;
+
+static int pka_drv_open(struct inode *inode, struct file *filep)
+{
+ struct pka_ring_device *ring_dev;
+ int ret;
+
+ ring_dev = idr_find(&pka.ring_idr, iminor(inode));
+ if (!ring_dev) {
+ PKA_ERROR(PKA_DRIVER,
+ "failed to find idr for device %d\n",
+ ring_dev->device_id);
+ return -ENODEV;
+ }
+
+ ret = pka_drv_ring_open(ring_dev);
+ if (ret)
+ return ret;
+
+ filep->private_data = ring_dev;
+ return 0;
+}
+
+static int pka_drv_release(struct inode *inode, struct file *filep)
+{
+ struct pka_ring_device *ring_dev = filep->private_data;
+
+ filep->private_data = NULL;
+ pka_drv_ring_release(ring_dev);
+
+ return 0;
+}
+
+static int pka_drv_mmap(struct file *filep, struct vm_area_struct *vma)
+{
+ return pka_drv_ring_mmap(filep->private_data, vma);
+}
+
+static long pka_drv_unlocked_ioctl(struct file *filep,
+ unsigned int cmd, unsigned long arg)
+{
+ return pka_drv_ring_ioctl(filep->private_data, cmd, arg);
+}
+
+static const struct file_operations pka_ring_fops = {
+ .owner = THIS_MODULE,
+ .open = pka_drv_open,
+ .release = pka_drv_release,
+ .unlocked_ioctl = pka_drv_unlocked_ioctl,
+ .mmap = pka_drv_mmap,
+};
+
+static int pka_drv_add_ring_device(struct pka_ring_device *ring_dev)
+{
+ struct device *dev = ring_dev->device;
+
+ ring_dev->minor = idr_alloc(&pka.ring_idr,
+ ring_dev, 0, MINORMASK + 1, GFP_KERNEL);
+ if (ring_dev->minor < 0) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to alloc minor to device %d\n",
+ ring_dev->device_id);
+ return ring_dev->minor;
+ }
+
+ dev = device_create(pka.class, NULL,
+ MKDEV(MAJOR(pka.ring_devt), ring_dev->minor),
+ ring_dev, "%d", ring_dev->device_id);
+ if (IS_ERR(dev)) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to create device %d\n",
+ ring_dev->device_id);
+ idr_remove(&pka.ring_idr, ring_dev->minor);
+ return PTR_ERR(dev);
+ }
+
+ PKA_DEBUG(PKA_DRIVER,
+ "ring device %d minor:%d\n",
+ ring_dev->device_id, ring_dev->minor);
+
+ return 0;
+}
+
+static struct pka_ring_device *pka_drv_del_ring_device(struct device *dev)
+{
+ struct platform_device *pdev =
+ container_of(dev, struct platform_device, dev);
+ struct pka_platdata *priv = platform_get_drvdata(pdev);
+ struct pka_info *info = priv->info;
+ struct pka_ring_device *ring_dev = info->priv;
+
+ if (ring_dev) {
+ device_destroy(pka.class, MKDEV(MAJOR(pka.ring_devt),
+ ring_dev->minor));
+ idr_remove(&pka.ring_idr, ring_dev->minor);
+ }
+
+ return ring_dev;
+}
+
+static char *pka_drv_devnode(struct device *dev, umode_t *mode)
+{
+ if (mode != NULL)
+ *mode = PKA_DEVICE_ACCESS_MODE;
+ return kasprintf(GFP_KERNEL, "pka/%s", dev_name(dev));
+}
+
+static int pka_drv_init_class(void)
+{
+ int ret;
+
+ idr_init(&pka.ring_idr);
+ /* /sys/class/pka/$RING */
+ pka.class = class_create(THIS_MODULE, "pka");
+ if (IS_ERR(pka.class))
+ return PTR_ERR(pka.class);
+
+ /* /dev/pka/$RING */
+ pka.class->devnode = pka_drv_devnode;
+
+ ret = alloc_chrdev_region(&pka.ring_devt, 0, MINORMASK, "pka");
+ if (ret)
+ goto err_alloc_chrdev;
+
+ cdev_init(&pka.ring_cdev, &pka_ring_fops);
+ ret = cdev_add(&pka.ring_cdev, pka.ring_devt, MINORMASK);
+ if (ret)
+ goto err_cdev_add;
+
+ return 0;
+
+err_cdev_add:
+ unregister_chrdev_region(pka.ring_devt, MINORMASK);
+err_alloc_chrdev:
+ class_destroy(pka.class);
+ pka.class = NULL;
+ return ret;
+}
+
+static void pka_drv_destroy_class(void)
+{
+ idr_destroy(&pka.ring_idr);
+ cdev_del(&pka.ring_cdev);
+ unregister_chrdev_region(pka.ring_devt, MINORMASK);
+ class_destroy(pka.class);
+ pka.class = NULL;
+}
+#endif
+
+static void pka_drv_get_mem_res(struct pka_device *pka_dev,
+ struct pka_dev_mem_res *mem_res,
+ uint64_t wndw_ram_off_mask)
+{
+ enum pka_mem_res_idx acpi_mem_idx;
+
+ acpi_mem_idx = PKA_ACPI_EIP154_IDX;
+ mem_res->wndw_ram_off_mask = wndw_ram_off_mask;
+
+ /* PKA EIP154 MMIO base address*/
+ mem_res->eip154_base = pka_dev->resource[acpi_mem_idx]->start;
+ mem_res->eip154_size = pka_dev->resource[acpi_mem_idx]->end -
+ mem_res->eip154_base + 1;
+ acpi_mem_idx++;
+
+ /* PKA window ram base address*/
+ mem_res->wndw_ram_base = pka_dev->resource[acpi_mem_idx]->start;
+ mem_res->wndw_ram_size = pka_dev->resource[acpi_mem_idx]->end -
+ mem_res->wndw_ram_base + 1;
+ acpi_mem_idx++;
+
+ /* PKA alternate window ram base address
+ * Note: Here the size of all the alt window ram is same, depicted by
+ * 'alt_wndw_ram_size' variable. All alt window ram resources are read
+ * here even though not all of them are used currently.
+ */
+ mem_res->alt_wndw_ram_0_base = pka_dev->resource[acpi_mem_idx]->start;
+ mem_res->alt_wndw_ram_size = pka_dev->resource[acpi_mem_idx]->end -
+ mem_res->alt_wndw_ram_0_base + 1;
+
+ if (mem_res->alt_wndw_ram_size != PKA_WINDOW_RAM_REGION_SIZE)
+ PKA_ERROR(PKA_DRIVER,
+ "Alternate Window RAM size read from ACPI is incorrect.\n");
+
+ acpi_mem_idx++;
+
+ mem_res->alt_wndw_ram_1_base = pka_dev->resource[acpi_mem_idx]->start;
+ acpi_mem_idx++;
+
+ mem_res->alt_wndw_ram_2_base = pka_dev->resource[acpi_mem_idx]->start;
+ acpi_mem_idx++;
+
+ mem_res->alt_wndw_ram_3_base = pka_dev->resource[acpi_mem_idx]->start;
+ acpi_mem_idx++;
+
+ /* PKA CSR base address*/
+ mem_res->csr_base = pka_dev->resource[acpi_mem_idx]->start;
+ mem_res->csr_size = pka_dev->resource[acpi_mem_idx]->end -
+ mem_res->csr_base + 1;
+}
+
+/*
+ * Note that this function must be serialized because it calls
+ * 'pka_dev_register_shim' which manipulates common counters for
+ * pka devices.
+ */
+static int pka_drv_register_device(struct pka_device *pka_dev,
+ uint64_t wndw_ram_off_mask)
+{
+ uint32_t pka_shim_id;
+ uint8_t pka_shim_fw_id;
+ struct pka_dev_mem_res mem_res;
+
+ /* Register Shim */
+ pka_shim_id = pka_dev->device_id;
+ pka_shim_fw_id = pka_dev->fw_id;
+
+ pka_drv_get_mem_res(pka_dev, &mem_res, wndw_ram_off_mask);
+
+ pka_dev->shim = pka_dev_register_shim(pka_shim_id, pka_shim_fw_id,
+ &mem_res);
+ if (!pka_dev->shim) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to register shim id=%u\n", pka_shim_id);
+ return -EFAULT;
+ }
+
+ return 0;
+}
+
+static int pka_drv_unregister_device(struct pka_device *pka_dev)
+{
+ if (!pka_dev)
+ return -EINVAL;
+
+ if (pka_dev->shim) {
+ PKA_DEBUG(PKA_DRIVER,
+ "unregister device shim %u\n",
+ pka_dev->shim->shim_id);
+ return pka_dev_unregister_shim(pka_dev->shim);
+ }
+
+ return 0;
+}
+
+/*
+ * Note that this function must be serialized because it calls
+ * 'pka_dev_register_ring' which manipulates common counters for
+ * vfio devices.
+ */
+static int pka_drv_register_ring_device(struct pka_ring_device *ring_dev)
+{
+ uint32_t ring_id;
+ uint32_t shim_id;
+
+ ring_id = ring_dev->device_id;
+ shim_id = ring_dev->parent_device_id;
+
+ ring_dev->ring = pka_dev_register_ring(ring_id, shim_id);
+ if (!ring_dev->ring) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to register ring device %u\n", ring_id);
+ return -EFAULT;
+ }
+
+ return 0;
+}
+
+static int pka_drv_unregister_ring_device(struct pka_ring_device *ring_dev)
+{
+ uint32_t ring_id;
+
+ if (!ring_dev)
+ return -EINVAL;
+
+ ring_id = ring_dev->ring->ring_id;
+
+ if (ring_dev->ring) {
+ PKA_DEBUG(PKA_DRIVER, "unregister ring device %u\n", ring_id);
+ return pka_dev_unregister_ring(ring_dev->ring);
+ }
+
+ return 0;
+}
+
+static const struct of_device_id pka_ring_match[] = {
+ { .compatible = PKA_RING_DEVICE_COMPAT },
+ {},
+};
+
+static int pka_drv_rng_read(struct hwrng *rng, void *data, size_t max,
+ bool wait)
+{
+ int ret;
+
+ struct pka_device *pka_dev = container_of(rng, struct pka_device, rng);
+ uint32_t *buffer = data;
+
+ ret = pka_dev_trng_read(pka_dev->shim, buffer, max);
+ if (ret) {
+ PKA_DEBUG(PKA_DRIVER,
+ "%s: failed to read random bytes ret=%d",
+ rng->name, ret);
+ return 0;
+ }
+
+ return max;
+}
+
+static int pka_drv_probe_device(struct pka_info *info)
+{
+ struct pka_device *pka_dev;
+ struct device *dev = info->dev;
+ struct device_node *of_node = dev->of_node;
+ struct platform_device *pdev = to_platform_device(dev);
+ struct hwrng *trng;
+ const struct acpi_device_id *aid;
+ struct pka_drv_plat_info *plat_info;
+ uint64_t wndw_ram_off_mask;
+ int ret;
+ enum pka_mem_res_idx acpi_mem_idx;
+
+ if (!info)
+ return -EINVAL;
+
+ pka_dev = kzalloc(sizeof(*pka_dev), GFP_KERNEL);
+ if (!pka_dev)
+ return -ENOMEM;
+
+ mutex_lock(&pka_drv_lock);
+ pka_device_cnt += 1;
+ if (pka_device_cnt > PKA_DRIVER_DEV_MAX) {
+ PKA_DEBUG(PKA_DRIVER,
+ "cannot support %u devices\n", pka_device_cnt);
+ kfree(pka_dev);
+ mutex_unlock(&pka_drv_lock);
+ return -EPERM;
+ }
+ pka_dev->device_id = pka_device_cnt - 1;
+ mutex_unlock(&pka_drv_lock);
+
+ pka_dev->info = info;
+ pka_dev->device = dev;
+ info->flag = PKA_DRIVER_FLAG_DEVICE;
+ mutex_init(&pka_dev->mutex);
+
+ for (acpi_mem_idx = PKA_ACPI_EIP154_IDX;
+ acpi_mem_idx < PKA_DEVICE_RES_CNT; acpi_mem_idx++) {
+ pka_dev->resource[acpi_mem_idx] =
+ platform_get_resource(pdev, IORESOURCE_MEM, acpi_mem_idx);
+ }
+
+ /* Window ram offset mask is platform dependent */
+ aid = acpi_match_device(pka_drv_acpi_ids, dev);
+ if (!aid)
+ return -ENODEV;
+
+ plat_info = (struct pka_drv_plat_info *)aid->driver_data;
+ if (plat_info->type <= PKA_PLAT_TYPE_BF2) {
+ wndw_ram_off_mask = PKA_WINDOW_RAM_OFFSET_MASK1;
+ } else {
+ PKA_ERROR(PKA_DRIVER, "Invalid platform type: %d\n",
+ (int)plat_info->type);
+ return -EINVAL;
+ }
+
+ /* Set interrupts */
+ ret = platform_get_irq(pdev, 0);
+ pka_dev->irq = ret;
+ if (ret == -ENXIO && of_node) {
+ pka_dev->irq = PKA_IRQ_NONE;
+ } else if (ret < 0) {
+ PKA_ERROR(PKA_DRIVER,
+ "failed to get device %u IRQ\n", pka_dev->device_id);
+ return ret;
+ }
+
+ /* Register IRQ */
+ ret = pka_drv_register_irq(pka_dev);
+ if (ret) {
+ PKA_ERROR(PKA_DRIVER,
+ "failed to register device %u IRQ\n",
+ pka_dev->device_id);
+ return ret;
+ }
+
+ /* Firmware version */
+ pka_dev->fw_id = plat_info->fw_id;
+
+ mutex_lock(&pka_drv_lock);
+ ret = pka_drv_register_device(pka_dev, wndw_ram_off_mask);
+ if (ret) {
+ PKA_DEBUG(PKA_DRIVER, "failed to register shim id=%u\n",
+ pka_dev->device_id);
+ mutex_unlock(&pka_drv_lock);
+ return ret;
+ }
+ mutex_unlock(&pka_drv_lock);
+
+ /* Setup the TRNG, if needed */
+ if (pka_dev_has_trng(pka_dev->shim)) {
+ trng = &pka_dev->rng;
+ trng->name = pdev->name;
+ trng->read = pka_drv_rng_read;
+
+ ret = hwrng_register(&pka_dev->rng);
+ if (ret) {
+ PKA_ERROR(PKA_DRIVER,
+ "failed to register trng\n");
+ return ret;
+ }
+ }
+
+ info->priv = pka_dev;
+
+#ifdef BUG_SW_1127083_FIXED
+ /*
+ * Create platform devices (pka-ring) from current node.
+ * This code is reserverd for DT.
+ */
+ if (of_node) {
+ ret = of_platform_populate(of_node, pka_ring_match,
+ NULL, dev);
+ if (ret) {
+ PKA_ERROR(PKA_DRIVER,
+ "failed to create platform devices\n");
+ return ret;
+ }
+ }
+#endif
+
+ return 0;
+}
+
+static int pka_drv_remove_device(struct platform_device *pdev)
+{
+ struct pka_platdata *priv = platform_get_drvdata(pdev);
+ struct pka_info *info = priv->info;
+ struct pka_device *pka_dev = (struct pka_device *)info->priv;
+
+ if (!pka_dev) {
+ PKA_ERROR(PKA_DRIVER, "failed to unregister device\n");
+ return -EINVAL;
+ }
+
+ if (pka_dev_has_trng(pka_dev->shim))
+ hwrng_unregister(&pka_dev->rng);
+
+ if (pka_drv_unregister_device(pka_dev))
+ PKA_ERROR(PKA_DRIVER, "failed to unregister device\n");
+
+ return 0;
+}
+
+static int pka_drv_probe_ring_device(struct pka_info *info)
+{
+ struct pka_ring_device *ring_dev;
+ struct device *dev = info->dev;
+
+ int ret;
+
+ if (!info)
+ return -EINVAL;
+
+ ring_dev = kzalloc(sizeof(*ring_dev), GFP_KERNEL);
+ if (!ring_dev)
+ return -ENOMEM;
+
+ mutex_lock(&pka_drv_lock);
+ pka_ring_device_cnt += 1;
+ if (pka_ring_device_cnt > PKA_DRIVER_RING_DEV_MAX) {
+ PKA_DEBUG(PKA_DRIVER, "cannot support %u ring devices\n",
+ pka_ring_device_cnt);
+ kfree(ring_dev);
+ mutex_unlock(&pka_drv_lock);
+ return -EPERM;
+ }
+ ring_dev->device_id = pka_ring_device_cnt - 1;
+ ring_dev->parent_device_id = pka_device_cnt - 1;
+ mutex_unlock(&pka_drv_lock);
+
+ ring_dev->info = info;
+ ring_dev->device = dev;
+ info->flag = PKA_DRIVER_FLAG_RING_DEVICE;
+ mutex_init(&ring_dev->mutex);
+
+ ret = pka_drv_add_ring_device(ring_dev);
+ if (ret) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to add ring device %u\n",
+ ring_dev->device_id);
+ kfree(ring_dev);
+ return ret;
+ }
+
+ mutex_lock(&pka_drv_lock);
+ /* Register ring device */
+ ret = pka_drv_register_ring_device(ring_dev);
+ if (ret) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to register ring device %u\n",
+ ring_dev->device_id);
+ mutex_unlock(&pka_drv_lock);
+ goto err_register_ring;
+ }
+ mutex_unlock(&pka_drv_lock);
+
+ info->priv = ring_dev;
+
+ return 0;
+
+ err_register_ring:
+ pka_drv_del_ring_device(dev);
+ kfree(ring_dev);
+ return ret;
+}
+
+static int pka_drv_remove_ring_device(struct platform_device *pdev)
+{
+ struct pka_ring_device *ring_dev;
+ struct device *dev = &pdev->dev;
+ int ret;
+
+ ring_dev = pka_drv_del_ring_device(dev);
+ if (ring_dev) {
+ ret = pka_drv_unregister_ring_device(ring_dev);
+ if (ret) {
+ PKA_ERROR(PKA_DRIVER,
+ "failed to unregister vfio device\n");
+ return ret;
+ }
+ kfree(ring_dev);
+ }
+
+ return 0;
+}
+
+static int pka_drv_of_probe(struct platform_device *pdev,
+ struct pka_info *info)
+{
+#ifdef BUG_SW_1127083_FIXED
+ struct device *dev = &pdev->dev;
+
+ int error;
+
+ error = device_property_read_string(dev, "compatible", &info->compat);
+ if (error) {
+ PKA_DEBUG(PKA_DRIVER, "cannot retrieve compat for %s\n",
+ pdev->name);
+ return -EINVAL;
+ }
+
+ if (!strcmp(info->compat, pka_ring_compat)) {
+ PKA_PRINT(PKA_DRIVER, "probe ring device %s\n",
+ pdev->name);
+ error = pka_drv_probe_ring_device(info);
+ if (error) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to register ring device compat=%s\n",
+ info->compat);
+ return error;
+ }
+
+ } else if (!strcmp(info->compat, pka_compat)) {
+ PKA_PRINT(PKA_DRIVER, "probe device %s\n", pdev->name);
+ error = pka_drv_probe_device(info);
+ if (error) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to register device compat=%s\n",
+ info->compat);
+ return error;
+ }
+ }
+
+ return 0;
+#endif
+ return -EPERM;
+}
+
+static int pka_drv_acpi_probe(struct platform_device *pdev,
+ struct pka_info *info)
+{
+ struct acpi_device *adev;
+ struct device *dev = &pdev->dev;
+
+ int error;
+
+ if (acpi_disabled)
+ return -ENOENT;
+
+ adev = ACPI_COMPANION(dev);
+ if (!adev) {
+ PKA_DEBUG(PKA_DRIVER,
+ "ACPI companion device not found for %s\n",
+ pdev->name);
+ return -ENODEV;
+ }
+
+ info->acpihid = acpi_device_hid(adev);
+ if (WARN_ON(!info->acpihid))
+ return -EINVAL;
+
+ if (!strcmp(info->acpihid, pka_ring_acpihid_bf1)
+ || !strcmp(info->acpihid, pka_ring_acpihid_bf2)) {
+ error = pka_drv_probe_ring_device(info);
+ if (error) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to register ring device %s\n",
+ pdev->name);
+ return error;
+ }
+ PKA_DEBUG(PKA_DRIVER, "ring device %s probed\n",
+ pdev->name);
+
+ } else if (!strcmp(info->acpihid, pka_acpihid_bf1)
+ || !strcmp(info->acpihid, pka_acpihid_bf2)) {
+ error = pka_drv_probe_device(info);
+ if (error) {
+ PKA_DEBUG(PKA_DRIVER,
+ "failed to register device %s\n",
+ pdev->name);
+ return error;
+ }
+ PKA_PRINT(PKA_DRIVER, "device %s probed\n", pdev->name);
+ }
+
+ return 0;
+}
+
+static int pka_drv_probe(struct platform_device *pdev)
+{
+ struct pka_platdata *priv;
+ struct pka_info *info;
+ struct device *dev = &pdev->dev;
+
+ int ret;
+
+ priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+ if (!priv)
+ return -ENOMEM;
+
+ spin_lock_init(&priv->lock);
+ priv->pdev = pdev;
+ /* interrupt is disabled to begin with */
+ priv->irq_flags = 0;
+
+ info = kzalloc(sizeof(*info), GFP_KERNEL);
+ if (!info)
+ return -ENOMEM;
+
+ info->name = pdev->name;
+ info->version = PKA_DRIVER_VERSION;
+ info->module = THIS_MODULE;
+ info->dev = dev;
+
+ priv->info = info;
+
+ platform_set_drvdata(pdev, priv);
+
+ /*
+ * There can be two kernel build combinations. One build where
+ * ACPI is not selected and another one with the ACPI.
+ *
+ * In the first case, 'pka_drv_acpi_probe' will return since
+ * acpi_disabled is 1. DT user will not see any kind of messages
+ * from ACPI.
+ *
+ * In the second case, both DT and ACPI is compiled in but the
+ * system is booting with any of these combinations.
+ *
+ * If the firmware is DT type, then acpi_disabled is 1. The ACPI
+ * probe routine terminates immediately without any messages.
+ *
+ * If the firmware is ACPI type, then acpi_disabled is 0. All other
+ * checks are valid checks. We cannot claim that this system is DT.
+ */
+ ret = pka_drv_acpi_probe(pdev, info);
+ if (ret)
+ ret = pka_drv_of_probe(pdev, info);
+
+ if (ret) {
+ PKA_DEBUG(PKA_DRIVER, "unknown device\n");
+ return ret;
+ }
+
+ return 0;
+}
+
+static int pka_drv_remove(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+
+ /*
+ * Little hack here:
+ * The issue here is that the driver data structure which holds our
+ * initialized private data cannot be used when the 'pdev' arguments
+ * points to child device -i.e. vfio device. Indeed, during the probe
+ * function we set an initialized structure called 'priv' as driver
+ * data for all platform devices including parents devices and child
+ * devices. This driver data is unique to each device - see call to
+ * 'platform_set_drvdata()'. However, when we add the child device to
+ * a vfio group through 'vfio_add_group_dev()' call, this function
+ * creates a new driver data for the device - i.e. a 'vfio_device'
+ * structure which includes a field called 'device_data' to hold the
+ * aforementionned initialized private data. So, to retrieve our
+ * private data, we must call 'dev_get_drvdata()' which returns the
+ * 'vfio_device' struct and access its 'device_data' field. However,
+ * this cannot be done before determining if the 'pdev' is associated
+ * with a child device or a parent device.
+ * In order to deal with that we propose this little hack which uses
+ * the iommu_group to distinguich between parent and child devices.
+ * For now, let's say it is a customized solution that works for our
+ * case. Indeed, in the current design, the private data holds some
+ * infos that defines the type of the device. The intuitive way to do
+ * that is as following:
+ *
+ * struct pka_platdata *priv = platform_get_drvdata(pdev);
+ * struct pka_info *info = priv->info;
+ *
+ * if (info->flag == PKA_DRIVER_FLAG_RING_DEVICE)
+ * return pka_drv_remove_ring_device(info);
+ * if (info->flag == PKA_DRIVER_FLAG_DEVICE)
+ * return pka_drv_remove_ring_device(info);
+ *
+ * Since the returned private data of child devices -i.e vfio devices
+ * corresponds to 'vfio_device' structure, we cannot use it to
+ * differentiate between parent and child devices. This alternative
+ * solution is used instead.
+ */
+ if (dev->iommu_group) {
+ PKA_PRINT(PKA_DRIVER, "remove ring device %s\n",
+ pdev->name);
+ return pka_drv_remove_ring_device(pdev);
+ }
+
+ PKA_PRINT(PKA_DRIVER, "remove device %s\n", pdev->name);
+ return pka_drv_remove_device(pdev);
+}
+
+static const struct of_device_id pka_drv_match[] = {
+ { .compatible = PKA_DEVICE_COMPAT },
+ { .compatible = PKA_RING_DEVICE_COMPAT },
+ {}
+};
+
+MODULE_DEVICE_TABLE(of, pka_drv_match);
+
+MODULE_DEVICE_TABLE(acpi, pka_drv_acpi_ids);
+
+static struct platform_driver pka_drv = {
+ .driver = {
+ .name = PKA_DRIVER_NAME,
+ .of_match_table = of_match_ptr(pka_drv_match),
+ .acpi_match_table = ACPI_PTR(pka_drv_acpi_ids),
+ },
+ .probe = pka_drv_probe,
+ .remove = pka_drv_remove,
+};
+
+/* Initialize the module - Register the pka platform driver */
+static int __init pka_drv_register(void)
+{
+ int ret;
+
+ ret = pka_drv_init_class();
+ if (ret) {
+ PKA_ERROR(PKA_DRIVER, "failed to create class\n");
+ return ret;
+ }
+
+ ret = platform_driver_register(&pka_drv);
+ if (ret) {
+ PKA_ERROR(PKA_DRIVER, "failed to register platform driver\n");
+ return ret;
+ }
+
+ PKA_PRINT(PKA_DRIVER, "version: " PKA_DRIVER_VERSION "\n");
+
+ return 0;
+}
+
+/* Cleanup the module - unregister the pka platform driver */
+static void __exit pka_drv_unregister(void)
+{
+ platform_driver_unregister(&pka_drv);
+ pka_drv_destroy_class();
+}
+
+module_init(pka_drv_register);
+module_exit(pka_drv_unregister);
+
+MODULE_DESCRIPTION(PKA_DRIVER_DESCRIPTION);
+MODULE_VERSION(PKA_DRIVER_VERSION);
+MODULE_LICENSE("Dual BSD/GPL");
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_firmware.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_firmware.h
new file mode 100644
index 000000000..29ea27ce0
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_firmware.h
@@ -0,0 +1,4823 @@
+//
+// BSD LICENSE
+//
+// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved.
+// 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 Mellanox Technologies 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 __DRIVERS_MICA_PKA_FW_H__
+#define __DRIVERS_MICA_PKA_FW_H__
+
+#include <linux/types.h>
+
+//
+// Program binaries
+//
+
+// Align to PKA_BUFFER_RAM_SIZE. This is greater than the actual buffer
+// length so that the image is zero padded.
+static const uint32_t fw0_farm_img_data_buf[2048] =
+{
+ 0x137001C9, 0x692040FA, 0x55502301, 0x328C0200,
+ 0x5E7000C9, 0x3D7000C8, 0x3670001D, 0x5370001F,
+ 0x746A4010, 0x046B4014, 0x3C621FF8, 0x4B631FF4,
+ 0x2A684000, 0x5A694004, 0x4F601FF6, 0x3F611FF2,
+ 0x5A6A4008, 0x2A6B400C, 0x19621FFA, 0x6D631FF0,
+ 0x0F684034, 0x7070001E, 0x5D34003F, 0x08601FFE,
+ 0x0328000B, 0x52C40047, 0x69240027, 0x04880000,
+ 0x76800047, 0x3380002E, 0x36800047, 0x7A800039,
+ 0xB6800047, 0xDF80003B, 0xD7800027, 0x9B800035,
+ 0xDC80003D, 0xB980003F, 0xB5800041, 0xF36A4018,
+ 0xDA621FFC, 0x9997017D, 0xA4300002, 0xD9D00061,
+ 0xBC30FFFE, 0xFC800056, 0xF36A4018, 0x9A621FFC,
+ 0xD59701CC, 0xA4300002, 0x99D00061, 0xFC30FFFE,
+ 0x99800062, 0xD097026C, 0xD38C0400, 0x8B614018,
+ 0xBC800056, 0xFF97039F, 0xFC800056, 0x9A97039D,
+ 0xFC800056, 0x9D9703A3, 0xBC800056, 0xF89703A1,
+ 0xBC800056, 0xDC970367, 0xFC800056, 0x9D200003,
+ 0xFC800056, 0xB7200023, 0xBC800056, 0xFD7000C8,
+ 0xD2200021, 0xBA8C5000, 0x9B80006F, 0xF5707FC8,
+ 0x84702084, 0xF670001D, 0xDB200000, 0xB6010000,
+ 0xCF220001, 0xB197007F, 0xA0684084, 0xD3340020,
+ 0xA7CC0052, 0xFC20000F, 0xF18C0100, 0xA4300002,
+ 0x99D00061, 0xED601FFC, 0xD5681FF0, 0x926A4014,
+ 0xF6010000, 0xB18C0100, 0x9260400C, 0xF197007F,
+ 0x34681FFC, 0x7C30FFFE, 0x616A1FF6, 0x336B1FF8,
+ 0x44624000, 0x3B634010, 0x076A1FF2, 0x526B1FF4,
+ 0x62624004, 0x1D634014, 0x006A1FFA, 0x7A230000,
+ 0x03624008, 0x7A8C5000, 0x5A63401C, 0x086440C9,
+ 0x5B800003, 0x3B6B1FE4, 0x118B4000, 0x7F8C0480,
+ 0x17BC004B, 0x6D61401C, 0x518B4000, 0x36010000,
+ 0x3C30FFFE, 0x66500000, 0x66500000, 0x26500000,
+ 0x66500000, 0x24300002, 0x102A0002, 0x65614000,
+ 0xAD624010, 0xF4604008, 0xEE218808, 0x93800073,
+ 0xE5631FEC, 0x8B6B4000, 0x846A1FF4, 0xF3604000,
+ 0xC3614004, 0x95634008, 0xAD624010, 0xCB624014,
+ 0xBB218001, 0xD0970073, 0xFA068000, 0x8C6B4008,
+ 0xE6691FF2, 0x92634000, 0x83614004, 0xF4604008,
+ 0xAD624010, 0xD6218200, 0xD0970073, 0xBC6B1FEC,
+ 0x918B4000, 0xE2631FE4, 0xF0681FF2, 0xB56040A0,
+ 0xE5691FF4, 0xB3604000, 0xB4604008, 0xCC614010,
+ 0x138C0400, 0x6470081C, 0x5270881D, 0x20F000A3,
+ 0x7C30FFFE, 0x33490000, 0x34310001, 0x5D200003,
+ 0x48D40071, 0x0931FFFF, 0x146540B4, 0x706B1FFE,
+ 0x216A1FF6, 0x7E33FFFF, 0x56D000BA, 0x336B1FF8,
+ 0x44624000, 0x03624008, 0x3B634010, 0x7F8C0480,
+ 0x17BC004B, 0x5E70011F, 0x6470081C, 0x1270881D,
+ 0x08F000B8, 0x538000BC, 0x7F8C0480, 0x17BC004B,
+ 0x6C6840A0, 0x30694024, 0x2F090000, 0x7FC8017A,
+ 0x23024000, 0x6E2E0001, 0x4B624014, 0x2F31FFFB,
+ 0x47684028, 0x1370001F, 0x3734001F, 0x57184000,
+ 0x592C0001, 0x17020000, 0x24240008, 0x6934FFE0,
+ 0x04300005, 0x65691FF4, 0x506040A2, 0x366040A6,
+ 0x592C0001, 0x2F090000, 0x10C400DF, 0x7A6940A0,
+ 0x0E050000, 0x722DFFFF, 0x6A31FFFE, 0x30510000,
+ 0x30510000, 0x61691FFA, 0x4E050000, 0x322DFFFF,
+ 0x6A31FFFE, 0x30510000, 0x30510000, 0x592C0001,
+ 0x8434FFFE, 0xC4601FEC, 0xF526000C, 0xB0621FEA,
+ 0xD126005F, 0xBA200060, 0xBA230000, 0xCB0B2000,
+ 0xF22DFFFF, 0x816140AA, 0x8F2D0001, 0xEA072000,
+ 0xBF6B1FEA, 0xD4004000, 0xFA30FFFD, 0xAF0AC000,
+ 0xFA230000, 0xA6631FEA, 0x8B0B2000, 0xFA20000C,
+ 0xBA230000, 0xF4290007, 0xF9C400F9, 0x95250007,
+ 0x9B8000FA, 0xED210007, 0xCD084000, 0xB61B4000,
+ 0xF9634088, 0x986940AA, 0xBA30FFFD, 0xCF2D0001,
+ 0xAA072000, 0xF22A0008, 0xD5621FE8, 0xB5008000,
+ 0xEE2E0001, 0xA934FFE0, 0x84300005, 0xD92C0001,
+ 0xF46B1FF0, 0x8B691FEC, 0xA1601FEE, 0xCD074000,
+ 0x92634000, 0xDD33FFFE, 0xC7530000, 0x87530000,
+ 0xC7530000, 0x87530000, 0x85330002, 0xD5634008,
+ 0xB9070000, 0xE52B0003, 0xE4280004, 0x8FC00130,
+ 0x992C0001, 0xDA604010, 0xFF8C0480, 0x97BC004B,
+ 0xDE70011F, 0x9570001C, 0x9270881D, 0xE3F0011F,
+ 0x07691FFE, 0x66684024, 0x4931FFFF, 0x1BD0012F,
+ 0x40691FF6, 0x02140000, 0x3ED00177, 0x4D084000,
+ 0x51694028, 0x2135001F, 0x3930FFFB, 0x57184000,
+ 0x3BC80174, 0x592C0001, 0x40601FE2, 0x1370001F,
+ 0x75008000, 0x3E3CFFFF, 0x18218000, 0x6C110000,
+ 0x1D33FFFE, 0x50340010, 0x57C8013B, 0x0B41C000,
+ 0x27270002, 0x47530000, 0x5180013D, 0x07530000,
+ 0x4B41C000, 0x38681FEE, 0x3A6940A0, 0x5A604010,
+ 0x0B6B4000, 0x7904C000, 0x592C0001, 0x0434FFFE,
+ 0x43614004, 0x34604008, 0x2268401C, 0x7F8C0480,
+ 0x57BC004B, 0x1E70011F, 0x1570001C, 0x6D70821D,
+ 0x07F0014C, 0x7E340008, 0x73C8015E, 0x07691FFE,
+ 0x66684024, 0x0931FFFF, 0x30D0015E, 0x40691FF6,
+ 0x02140000, 0x7ED00177, 0x4D084000, 0x11694028,
+ 0x3930FFFB, 0x6135001F, 0x57184000, 0x3BC80174,
+ 0x592C0001, 0x00601FE2, 0x1370001F, 0x6D691FE8,
+ 0x9F20000E, 0xF4310001, 0xC931FFFF, 0xB4D00166,
+ 0xE42CFFFF, 0x94800162, 0xBC694000, 0xC62207FA,
+ 0xCC6B4008, 0xA46140A8, 0xB26340A4, 0xE36240AC,
+ 0xB16040AE, 0xD77000B2, 0xFF8C0480, 0x97BC004B,
+ 0xF8700484, 0x9CE00171, 0xB8200001, 0xF6800071,
+ 0xBF200009, 0xD370001F, 0xF6800071, 0x9E200005,
+ 0x9370001F, 0xF6800071, 0xFB200007, 0x9370001F,
+ 0xF3C80071, 0x84631FE0, 0xBA230000, 0xE9631FFE,
+ 0x3F970099, 0x433C0001, 0x7CC80185, 0x033C0001,
+ 0x558001CA, 0x37681FFA, 0x136040A4, 0x5D8C0180,
+ 0x57BC004B, 0x1A700184, 0x39E0018A, 0x7D6940A8,
+ 0x096840A2, 0x65614000, 0x592C0001, 0x346B1FF0,
+ 0x5A604010, 0x15634008, 0x1D8C0180, 0x57BC004B,
+ 0x1570001C, 0x5270881D, 0x62691FFC, 0x322DFFFF,
+ 0x17C801AE, 0x54004000, 0x4034FFF0, 0x1A20000B,
+ 0x68CC01CA, 0x2A6A1FEC, 0x0100C000, 0x4D048000,
+ 0x936340A8, 0xF26340A4, 0xFF8C0480, 0x97BC004B,
+ 0xDA700184, 0xB4E001A5, 0xB26040A8, 0xCD048000,
+ 0xDD8C0180, 0x97BC004B, 0x99700284, 0xF0E001AB,
+ 0xB22DFFFF, 0xE8CC01A6, 0xD5681FF0, 0x8B691FEC,
+ 0xCE050000, 0xA16A1FF6, 0xB86B1FE2, 0xF26040A8,
+ 0x856140A4, 0xE36240AC, 0xF4681FFC, 0x862B0002,
+ 0xA42CFFFF, 0xD06340AE, 0xF96040B2, 0x968C5080,
+ 0xD7BC004B, 0xB8700484, 0x9CE001BE, 0xFE201FE8,
+ 0x85500001, 0xE4300002, 0xD36040A4, 0x9B200000,
+ 0xF66040A6, 0x9D8C0180, 0x97BC004B, 0xDA700184,
+ 0xD7E001C8, 0xB8200001, 0x9D6B1FE0, 0xD18B4000,
+ 0x87631FE6, 0xE6691FF2, 0xC06A1FFA, 0x83614004,
+ 0xE5691FF4, 0xB3621FDA, 0xAA614014, 0xD4004000,
+ 0x86240002, 0xC434FFFE, 0xE1601FD8, 0xBA054000,
+ 0xA26A1FF0, 0xCC614010, 0xC4624000, 0xAF060000,
+ 0xEF060000, 0xB1260002, 0x83624008, 0xD6218200,
+ 0x10970073, 0x516B1FF2, 0x6F060000, 0x39070000,
+ 0x74634004, 0x03624008, 0x10970073, 0x57020000,
+ 0x7B694008, 0x15681FF0, 0x3A098000, 0x7A068000,
+ 0x3197007F, 0x78681FD8, 0x476A1FF2, 0x00691FF6,
+ 0x736B1FF8, 0x2F060000, 0x21270001, 0x6537FFFE,
+ 0x2F05C000, 0x746B1FF0, 0x59611FF6, 0x3904C000,
+ 0x1E621FF2, 0x6E601FFA, 0x4C601FF0, 0x138C0400,
+ 0x5997017D, 0x01030000, 0x223F0001, 0x6DCC026A,
+ 0xB18C0100, 0xCF6A1FD8, 0xC3691FF0, 0x94004000,
+ 0xFA098000, 0x8D048000, 0xB197007F, 0xF6010000,
+ 0xEA684000, 0xBA098000, 0xBA068000, 0xF197007F,
+ 0xB36B1FF8, 0xC0691FF6, 0xE1270001, 0xA537FFFE,
+ 0xCE09C000, 0x996B1FD8, 0x876A1FF2, 0xD9611FF6,
+ 0xAF0AC000, 0xDE621FF2, 0xD38C0400, 0x9997017D,
+ 0xBC6B1FDA, 0xCF6A1FD8, 0xC3691FF0, 0x8F631FFA,
+ 0xFA098000, 0x9A611FF0, 0x81030000, 0xE23F0001,
+ 0x2DCC026A, 0x718C0100, 0x54004000, 0x0D048000,
+ 0x5260400C, 0x0D048000, 0x06240002, 0x66691FF2,
+ 0x446A1FF4, 0x3C30FFFE, 0x26500000, 0x66500000,
+ 0x24300002, 0x7197007F, 0x4B624014, 0x2A6B400C,
+ 0x77260001, 0x03691FF0, 0x21280001, 0x6D624010,
+ 0x34604008, 0x43614004, 0x52634000, 0x162A0001,
+ 0x1B058000, 0x6A31FFFE, 0x70510000, 0x30510000,
+ 0x6C078000, 0x1D33FFFE, 0x07530000, 0x47530000,
+ 0x3D218002, 0x50970073, 0x71260002, 0x2D624010,
+ 0x61691FFA, 0x1A6A4008, 0x03614004, 0x43624008,
+ 0x7B218001, 0x10970073, 0x30681FF2, 0x7C694000,
+ 0x04624000, 0x55604004, 0x526B1FF4, 0x22614008,
+ 0x5807C000, 0x27270002, 0x3B634010, 0x56218200,
+ 0x10970073, 0x7B694008, 0x43624008, 0x196B1FD8,
+ 0x25614000, 0x79070000, 0x73681FF4, 0x34634004,
+ 0x5A604010, 0x3B218001, 0x10970073, 0x62624004,
+ 0xA26A1FF0, 0xD8040000, 0xC4624000, 0x83624008,
+ 0xFC604014, 0xB6218018, 0x90970073, 0xE562400C,
+ 0xD38C0400, 0xB8200001, 0x9E6B1FE6, 0xD18B4000,
+ 0xA2631FE4, 0xD5681FF0, 0xD260400C, 0x84691FF8,
+ 0xF4611FDE, 0x846A1FF4, 0xB0621FDC, 0xFA0A4000,
+ 0x820E4000, 0xC5D40277, 0xE3024000, 0x92260003,
+ 0xB336FFFE, 0xC0601FE2, 0xCD048000, 0xA5601FE0,
+ 0xCD048000, 0xBA068000, 0xBB621FF0, 0xCD048000,
+ 0x25601FD6, 0x4B68400C, 0x76970077, 0x226A1FF0,
+ 0x4B68400C, 0x0D048000, 0x36970077, 0x656A1FF8,
+ 0x59681FE2, 0x346B1FF0, 0x3904C000, 0x40691FF6,
+ 0x3197007F, 0x538C0400, 0x476B4024, 0x22631FD2,
+ 0x4D378000, 0x23CC035A, 0x3C681FE0, 0x746B1FF0,
+ 0x3904C000, 0x66691FF2, 0x446A1FF4, 0x3197007F,
+ 0x19681FE2, 0x7C30FFFE, 0x45500001, 0x3C681FE0,
+ 0x66691FF2, 0x3197007F, 0x3D201FD8, 0x66500000,
+ 0xA6500000, 0xE6691FF2, 0xEA31FFFE, 0x87494000,
+ 0xF4310001, 0x80D4035D, 0x8931FFFF, 0xDB200000,
+ 0xC0601FD4, 0x99230001, 0x8F220001, 0xC100C000,
+ 0x97148000, 0xDCC802B2, 0xD9681FD4, 0x8D048000,
+ 0xC0601FD4, 0x8D074000, 0xBA054000, 0xFA068000,
+ 0xA9CC02AB, 0xD9681FE2, 0xF46B1FF0, 0xB904C000,
+ 0x8D210000, 0xCC6A1FDE, 0xDF970361, 0xBC30FFFE,
+ 0xE5480000, 0x8D388000, 0xA2300001, 0xD7D002C2,
+ 0x96250001, 0xF88002BE, 0xF63D0000, 0x94C802F4,
+ 0xD38C0400, 0x8B614018, 0x93218040, 0xD0970073,
+ 0xD9681FD4, 0x8F691FE2, 0xAA31FFFE, 0xC7494000,
+ 0xAA072000, 0xEE210001, 0xE56B4018, 0x9F3FFFFF,
+ 0xE1270001, 0x8D11C000, 0xB22DFFFF, 0xC1164000,
+ 0x996B1FD8, 0xD38C0400, 0xF0694024, 0x95611FD2,
+ 0xBAC802EC, 0xEF1F8000, 0xDEC802E5, 0x96621FD8,
+ 0xF0681FF2, 0x862107F6, 0xBC970360, 0xCF220001,
+ 0x0B624014, 0x7C681FD6, 0x74604008, 0x3B218001,
+ 0x50970073, 0x2A691FD6, 0x19681FE2, 0x446A1FF4,
+ 0x77260001, 0x1F970361, 0x31218010, 0x50970073,
+ 0x19681FE2, 0x4D210000, 0x446A1FF4, 0x37260001,
+ 0x5F970361, 0x13218040, 0x10970073, 0x798002B5,
+ 0x3C681FE0, 0x746B1FF0, 0x7904C000, 0x15604004,
+ 0x19681FE2, 0x7904C000, 0x73604000, 0x0C6A1FDE,
+ 0x7F6B1FDC, 0x1D634014, 0x2F0AC000, 0x570EC000,
+ 0x05D40302, 0x7602C000, 0x6D624010, 0x37218400,
+ 0x50970073, 0x0C691FD2, 0x2F1C4000, 0x44CC030F,
+ 0x6A31FFFE, 0x11484000, 0x033C0001, 0x492D0002,
+ 0x07494000, 0x57184000, 0x79C80350, 0x138C0400,
+ 0x40684020, 0x22300001, 0x18D0035A, 0x64300002,
+ 0x33D0031D, 0x6A684000, 0x5A694004, 0x15604004,
+ 0x25614000, 0x43684010, 0x73694014, 0x3C604014,
+ 0x4C614010, 0x0B6B4000, 0x15634008, 0x47631FD0,
+ 0xB2218020, 0xD0970073, 0xF1D00326, 0xBC681FE0,
+ 0xCF691FE2, 0xB3800328, 0x99681FE2, 0xEA691FE0,
+ 0xC46A1FF4, 0xB7260001, 0x9F970361, 0xD38C0400,
+ 0x916A4024, 0xF2218020, 0xD0970073, 0xBF681FD0,
+ 0xCE0A0000, 0xB7260001, 0xAA691FE0, 0xF46B1FF0,
+ 0xAF05C000, 0xCD1D0000, 0xE2CC033D, 0x99681FE2,
+ 0xAA691FE0, 0xE5601FE0, 0xD6611FE2, 0xBB681FDE,
+ 0xC7601FDC, 0x95621FDE, 0x99681FE2, 0xE6691FF2,
+ 0xBC970360, 0xF46A4010, 0xCD048000, 0xBC30FFFE,
+ 0xD38C0400, 0x844B0000, 0xA6500000, 0xE6500000,
+ 0xC13F0000, 0xBCC802B5, 0xB1218010, 0xD0970073,
+ 0xA22CFFFC, 0xD38C0400, 0xE6500000, 0xB98002B5,
+ 0xCF691FE2, 0xBC681FE0, 0x846A1FF4, 0xF197007F,
+ 0x8B624014, 0xF8200001, 0xCD210000, 0xAA6B400C,
+ 0xAD631FF0, 0xF6800071, 0xD2200017, 0xAD210007,
+ 0xDC800357, 0x9D200003, 0x8321001F, 0xDC800357,
+ 0x046A1FF4, 0x6D624010, 0x4B624014, 0x33604000,
+ 0x43614004, 0x34604008, 0x118B4000, 0x47631FE6,
+ 0x56681FF6, 0x04691FF8, 0x046A1FF4, 0x6E601FCC,
+ 0x3B611FCA, 0x7C621FF8, 0x52260003, 0x3336FFFE,
+ 0x7C621FCE, 0x346B1FF0, 0x2C078000, 0x6C078000,
+ 0x2E631FF6, 0x6C078000, 0x6D631FF0, 0x1097026C,
+ 0x033C0001, 0x72C8037C, 0x433C0001, 0x3980039A,
+ 0x55681FF0, 0x256A1FCE, 0x2C088000, 0x76970077,
+ 0x83691FF0, 0xE56A1FCE, 0xF5034000, 0x94004000,
+ 0xEC078000, 0x92634000, 0xAC088000, 0xEC088000,
+ 0xD4970084, 0x83691FF0, 0xA56A1FCE, 0xD4004000,
+ 0xAC088000, 0xFC30FFFE, 0xC5500001, 0xA7280002,
+ 0xE4300002, 0xAC088000, 0xAC088000, 0xCC601FF0,
+ 0x94970084, 0xE1691FCC, 0xC36A1FCA, 0x99611FF6,
+ 0xBC621FF8, 0xF8200001, 0xD38C0400, 0x9E6B1FE6,
+ 0xD18B4000, 0xAC220000, 0xBE8003A4, 0xD8224000,
+ 0x3E8003A4, 0x79228000, 0x7E8003A4, 0x0D22C000,
+ 0x7F621FFE, 0x07631FE6, 0x3F970099, 0x526B1FF4,
+ 0x44270003, 0x2537FFFE, 0x22631FBE, 0x76010000,
+ 0x033C0001, 0x718C0100, 0x67CC04E2, 0x3E6A40A2,
+ 0x6B6840A8, 0x37260001, 0x1A970658, 0x70681FF2,
+ 0x046A1FF4, 0x5A970658, 0x77260001, 0x3336FFFE,
+ 0x276240A2, 0x416240A6, 0x7D6940A8, 0x2D6A1FBE,
+ 0x70611FBC, 0x13201FC0, 0x13230010, 0x5B058000,
+ 0x2A410000, 0x5F2C0002, 0x452FFFFF, 0x2BCC03BF,
+ 0x56681FC0, 0x2E32FFFC, 0x36970077, 0x7B970638,
+ 0x4F691FD4, 0x30681FF2, 0x0F220001, 0x7197061F,
+ 0x306B1FFE, 0x7E33FFFF, 0x74D0052F, 0x3B6B1FBE,
+ 0x66691FF2, 0x0B6A1FD6, 0x2F05C000, 0x7797062A,
+ 0x00691FC0, 0x4F220001, 0x7E97063D, 0x2D691FDE,
+ 0x0A220004, 0x7E97063D, 0x6A6A1FDA, 0x21691FFA,
+ 0x7797062A, 0x2E691FD8, 0x3B6B1FBE, 0x70681FF2,
+ 0x89220002, 0xF904C000, 0xF904C000, 0xB197061F,
+ 0xD2970628, 0xB06B1FFE, 0xA1691FFA, 0xE31BC000,
+ 0xCAD403EF, 0xBB6B1FBE, 0xA26A1FC6, 0xEF05C000,
+ 0xAF05C000, 0xF797062A, 0xDF8003F2, 0x80691FC0,
+ 0xD5681FC6, 0xB0970614, 0x8B691FDA, 0xF0681FC4,
+ 0xA26A1FC6, 0xD46040AC, 0xE46140A8, 0xA46240A4,
+ 0xBA8C5000, 0xD4700384, 0xFA970605, 0x8D21889C,
+ 0xC5614092, 0xBA8C5000, 0xB1700080, 0xCF691FE2,
+ 0xB597064B, 0xE9204096, 0xC0502A27, 0xA15030A7,
+ 0xE9204096, 0xAA504A52, 0x995024A5, 0xD1970642,
+ 0xEF502E27, 0xBF502084, 0xB7970646, 0xC450292F,
+ 0x91970642, 0xE76B4080, 0xF2370020, 0xA2CC0444,
+ 0xE9503548, 0xA1501CE4, 0xB7970646, 0xF85024A9,
+ 0x91970642, 0xE150A148, 0xC55035A4, 0xB7970646,
+ 0x94502530, 0xD1970642, 0xC7502929, 0x8C5035B3,
+ 0xF7970646, 0xBF502108, 0x91970642, 0xF55025A9,
+ 0x2E502CA6, 0x77970646, 0x4A50288A, 0x11970642,
+ 0x7150B4EB, 0x0C509525, 0x37970646, 0x7B501086,
+ 0x51970642, 0x27502D67, 0x215035AD, 0x77970646,
+ 0x2350198F, 0x51970642, 0x676B4080, 0x00631FEE,
+ 0x715098C4, 0x1E509DB1, 0x37970646, 0x4A50316C,
+ 0x11970642, 0x40509148, 0x4F502CC6, 0x37970646,
+ 0x20503590, 0x51970642, 0x7A5099AB, 0x01194000,
+ 0x5CC80447, 0x3597064B, 0x2D204098, 0x615030A7,
+ 0x37970646, 0x595024A5, 0x51970642, 0x35800408,
+ 0x7A8C5000, 0x34200013, 0x398004E3, 0x7A8C5000,
+ 0x716A4080, 0x3B681FDE, 0x24360020, 0x4ECC04F2,
+ 0x2D6A1FBE, 0x76970077, 0x7B970638, 0x0F220001,
+ 0x6D691FDE, 0x3E97063D, 0x0C691FD2, 0x7B6B1FBE,
+ 0x37681FFA, 0x4F220001, 0x7904C000, 0x3197061F,
+ 0x12970628, 0x7B6B1FBE, 0x66691FF2, 0x086A1FD0,
+ 0x6F05C000, 0x2F05C000, 0x3797062A, 0x6E691FD8,
+ 0xBB6B1FBE, 0xF0681FF2, 0xCF220001, 0xB904C000,
+ 0xF904C000, 0xB197061F, 0x92970628, 0xD8700090,
+ 0xFA970605, 0xBA8C5000, 0xA9204096, 0xEA504A52,
+ 0x815029E5, 0xE9204096, 0xEA504A52, 0xBC502491,
+ 0xD1970642, 0x8150292A, 0xB95020B1, 0xF7970646,
+ 0x9D501264, 0xD1970642, 0xC0502D04, 0xBD5040B0,
+ 0xB7970646, 0xD25024E5, 0xD1970642, 0x8B50A088,
+ 0xDC504130, 0xB7970646, 0xAC502D4B, 0xD1970642,
+ 0x2A504A52, 0x45502924, 0x77970646, 0x27502CEB,
+ 0x51970642, 0x24502E0B, 0x3D5011AA, 0x77970646,
+ 0x7F502108, 0x11970642, 0x2A504A52, 0x45502E6B,
+ 0x37970646, 0x555020C8, 0x51970642, 0x3250AD0B,
+ 0x66502925, 0x11970642, 0x03501E52, 0x5550166B,
+ 0x37970646, 0x4C5019AA, 0x51970642, 0x2A504A52,
+ 0x115020C6, 0x77970646, 0x595024A5, 0x11970642,
+ 0x6A504A52, 0x01502D0F, 0x37970646, 0x4E502884,
+ 0x91970642, 0xCA50296A, 0xD3502188, 0x91970642,
+ 0xE650A509, 0xA4502944, 0x91970642, 0xEA504A52,
+ 0xD95024C9, 0x91970642, 0xAD50A549, 0xD5502144,
+ 0xB7970646, 0xD1502669, 0xD1970642, 0x95681FC6,
+ 0xFA8C5000, 0xA76B4080, 0xBC30FFFE, 0xDF370008,
+ 0x80CC04B7, 0xF320001B, 0xF98004E3, 0x85500001,
+ 0xB06B1FFE, 0xED204098, 0xE31BC000, 0x8DD404C4,
+ 0xFF5010E4, 0xAD204098, 0xB35014E5, 0xF7970646,
+ 0xAB5018E6, 0xD1970642, 0xF18C0100, 0xB180051F,
+ 0xEB5018E6, 0xB46B1FF0, 0x96681FF6, 0xC4691FF8,
+ 0xCC631FCA, 0xAE601FCC, 0x9D611FCE, 0xF0681FC4,
+ 0xA5691FF4, 0xF46B1FC6, 0xCF2D0001, 0x9D611FF8,
+ 0xED631FF0, 0x8F601FF6, 0xBA8C5000, 0xD097026C,
+ 0x956B1FCA, 0xC06A1FCC, 0xC4691FCE, 0xAD631FF0,
+ 0xB8621FF6, 0xDD611FF8, 0xD38C0400, 0x833C0001,
+ 0xE7CC04E2, 0x80691FC0, 0xBA97065F, 0xE5691FC2,
+ 0x3A97065F, 0x7180051F, 0x433C0001, 0x3423001F,
+ 0x44601FEC, 0x00631FEE, 0x2D6A1FBE, 0x47691FFE,
+ 0x55681FF0, 0x01194000, 0x14038000, 0x43D404ED,
+ 0x3A068000, 0x4E06C000, 0x76970077, 0x1D681FEC,
+ 0x596B1FEE, 0x1480052B, 0x0F6A1FEE, 0x4E6B4090,
+ 0x33320005, 0x4D1EC000, 0x6D360001, 0x12C804FB,
+ 0x1920000D, 0x5A230007, 0x598004E4, 0x2D6A1FBE,
+ 0x55681FF0, 0x07691FFE, 0x14038000, 0x7A068000,
+ 0x01194000, 0x47D40503, 0x4E06C000, 0x36970077,
+ 0x61691FFA, 0x15681FF0, 0x046A1FF4, 0x55970616,
+ 0x6D6A1FBE, 0x166B1FFA, 0x15681FF0, 0x6C078000,
+ 0x34634004, 0x4D048000, 0x74604008, 0x26691FF2,
+ 0x446A1FF4, 0x25614000, 0x0B624014, 0x72218020,
+ 0x266A1FFE, 0x50970073, 0x411A8000, 0x0FD40529,
+ 0x3B6B1FBE, 0x55681FF0, 0x5807C000, 0x3904C000,
+ 0x7C30FFFE, 0x05500001, 0x31800529, 0x6D6A1FBE,
+ 0x80691FC0, 0xD1681FFE, 0xD4038000, 0xA3180000,
+ 0xE8D40526, 0xBA068000, 0x8E06C000, 0xD5681FF0,
+ 0xD5970616, 0xBA230000, 0xB8200001, 0xD38C0400,
+ 0xBC634018, 0xDE6B1FE6, 0xD18B4000, 0xAD691FDE,
+ 0xCF220001, 0xBE97063D, 0xA16A1FC0, 0xE1691FFA,
+ 0xB797062A, 0xFB6B1FBE, 0xE1691FFA, 0x8F6A1FD8,
+ 0xAF05C000, 0xF797062A, 0xC76A1FC4, 0x80691FF6,
+ 0xF797062A, 0xBB6B1FBE, 0x80691FF6, 0xEA6A1FDA,
+ 0xAF05C000, 0xF797062A, 0xD1681FFE, 0xA3180000,
+ 0xD3D0054C, 0xAD691FDE, 0xB3681FC2, 0xF6970617,
+ 0xED691FDE, 0x95681FC6, 0xB6970617, 0xDA800558,
+ 0xBB6B1FBE, 0xE1691FFA, 0xC46A1FC2, 0xAF05C000,
+ 0xEF05C000, 0xB797062A, 0xBB6B1FBE, 0xC0691FF6,
+ 0xA26A1FC6, 0xEF05C000, 0xEF05C000, 0xB797062A,
+ 0x98700090, 0xFA970605, 0xFA8C5000, 0xB1700080,
+ 0xE9204096, 0xAA504A52, 0xB15024E4, 0xE9204096,
+ 0x2A504A52, 0x425030A6, 0x51970642, 0x1450B12C,
+ 0x515020F0, 0x37970646, 0x085028B1, 0x51970642,
+ 0x7E50A90A, 0x3E50AD8C, 0x11970642, 0x5050456B,
+ 0x2850BD4A, 0x77970646, 0x676B4080, 0x00631FEE,
+ 0x71700080, 0x0E50352B, 0x11970642, 0x596B1FEE,
+ 0x316A4080, 0x63330006, 0x6BD4057A, 0x35320006,
+ 0x35D005B1, 0x518004F8, 0x6A504A52, 0x0B502D8B,
+ 0x77970646, 0x37502531, 0x11970642, 0x7C50252B,
+ 0xB950210B, 0xF7970646, 0xED5018E5, 0x91970642,
+ 0xEA504A52, 0x99503CCF, 0xB7970646, 0xD1502669,
+ 0xD1970642, 0x8F50A52F, 0x835018CB, 0xD1970642,
+ 0xAA504A52, 0xD2503E69, 0xF7970646, 0x9250112C,
+ 0xD1970642, 0xBF50B5ED, 0x8950326C, 0xD1970642,
+ 0xAA504A52, 0xC15035AA, 0xD1970642, 0xB250B50D,
+ 0x92502533, 0xD1970642, 0xC3501E52, 0x9650166D,
+ 0xD1970642, 0xBB970638, 0xBB6B1FBE, 0xE6691FF2,
+ 0x0B6A1FD6, 0x6F05C000, 0x7797062A, 0x3B6B1FBE,
+ 0x66691FF2, 0x086A1FD0, 0x2F05C000, 0x6F05C000,
+ 0x7797062A, 0x3A970605, 0x3A8C5000, 0x69204096,
+ 0x2A504A52, 0x515020C6, 0x69204096, 0x2A504A52,
+ 0x5580049A, 0x3B970638, 0x3B6B1FBE, 0x66691FF2,
+ 0x0B6A1FD6, 0x6F05C000, 0x7797062A, 0x08691FDC,
+ 0x1D681FDA, 0x70970614, 0x4B691FDA, 0x09220002,
+ 0x7E97063D, 0x08691FDC, 0x15681FC6, 0x76970617,
+ 0x03691FC6, 0x6A220003, 0x7E97063D, 0x3A970605,
+ 0x7A8C5000, 0x31700080, 0x29204096, 0x6A504A52,
+ 0x7F502084, 0x29204096, 0x2A504A52, 0x6C503611,
+ 0x11970642, 0x6A504A52, 0x46502D07, 0x37970646,
+ 0x6C5034AD, 0x11970642, 0x2A504A52, 0x595024A5,
+ 0x37970646, 0x665029B0, 0x51970642, 0x27503144,
+ 0x1A50252F, 0x77970646, 0x4150194A, 0x11970642,
+ 0x745010C8, 0x0750318C, 0x37970646, 0x695028D1,
+ 0x91970642, 0xD2502569, 0xEC5019AD, 0xB7970646,
+ 0xDD501264, 0x91970642, 0x9F50B08C, 0xE8502D29,
+ 0xF7970646, 0xAD5019A6, 0x91970642, 0xEA504A52,
+ 0xB550166C, 0xF7970646, 0xDE502191, 0x91970642,
+ 0xF250AD0B, 0xAD502953, 0x91970642, 0xEA504A52,
+ 0xA950326B, 0xF7970646, 0xDE5011AB, 0x91970642,
+ 0x9950B585, 0xD2502533, 0xD1970642, 0xAA504A52,
+ 0xC75035A9, 0x91970642, 0xB950B54D, 0xC5502E6B,
+ 0x11970642, 0x43501E52, 0x5650166D, 0x11970642,
+ 0x7880059D, 0x2D6A1FBE, 0x00691FC0, 0x4B624014,
+ 0x4B32FFFE, 0x3A098000, 0x25614000, 0x456140A4,
+ 0x0F691FD4, 0x696A1FDC, 0x62614008, 0x25691FF4,
+ 0x62624004, 0x0F2D0001, 0x0C614010, 0x518B4000,
+ 0x046A1FF4, 0x6E2E0001, 0x6D624010, 0x25614000,
+ 0x34604008, 0x538C0400, 0x5570001C, 0x1270881D,
+ 0x5B058000, 0x0D048000, 0x118B4000, 0x73604000,
+ 0xB3681FF4, 0xE2614008, 0xDA604010, 0x938C0400,
+ 0xEA624018, 0x97020000, 0xB4218080, 0xD3800073,
+ 0xED684008, 0x99800634, 0xA5631FEC, 0xE5614000,
+ 0x83624008, 0xF5008000, 0xE9218800, 0x90970073,
+ 0xC46A1FF4, 0x9A970658, 0xAD684008, 0xFC6B1FEC,
+ 0xB26040A8, 0xFA8C5000, 0xDA700184, 0x918B4000,
+ 0x846A1FF4, 0xE9691FBC, 0xED624010, 0x856140A4,
+ 0xD18B4000, 0x94004000, 0xAA31FFFE, 0xD38C0400,
+ 0xBF424000, 0xD9800634, 0xD68C5080, 0x97BC004B,
+ 0xE9204096, 0x918B4000, 0x968C5080, 0xD7BC004B,
+ 0xE9204096, 0xAA504A52, 0x918B4000, 0xD6681FF6,
+ 0xB22DFFFF, 0xE3024000, 0xF736FFF0, 0xB0320003,
+ 0xFC30FFFE, 0xAF060000, 0x874A8000, 0xD4004000,
+ 0x9E34000F, 0xCD120000, 0xC1624090, 0x918B4000,
+ 0x8D048000, 0xFC30FFFE, 0xE6500000, 0xA6500000,
+ 0xE6500000, 0xA6500000, 0x918B4000, 0xE26A1FC6,
+ 0x246140A8, 0x646240A4, 0x718C0100, 0x1A700184,
+ 0x476A1FF2, 0x22624004, 0x046A1FF4, 0x4B624014,
+ 0x65614000, 0x22614008, 0x318C0100, 0x50694080,
+ 0x0C350001, 0x47CC066F, 0x518B4000, 0x2E2E0001,
+ 0x6D624010, 0x32218020, 0x13800073, 0x0079084F
+};
+
+static const uint32_t fw0_boot_img_data_buf[] =
+{
+ 0x3F200503, 0x6E210001, 0x6A710249, 0x38200001,
+ 0x5460B41C, 0x1397008C, 0x0D210000, 0x4931FFFF,
+ 0x6D390001, 0x242CFFFF, 0x00CC0007, 0x736AB1F8,
+ 0x2361B140, 0x6F3A0000, 0x4FCC0013, 0x1F200777,
+ 0x5860B438, 0x1F60B45C, 0x14800017, 0x5D200333,
+ 0x1860B438, 0x5F60B45C, 0x7E60B43C, 0x0520FFFF,
+ 0x3660B420, 0x4D210000, 0x6F68B420, 0x0561B422,
+ 0x4934FEFE, 0x22300001, 0x3660B420, 0x4661B424,
+ 0xA361B426, 0xE761B428, 0xC261B42A, 0x8161B42C,
+ 0xE461B42E, 0xAF61B434, 0x8A61B436, 0xD397008C,
+ 0xCE21A0CA, 0xB9228000, 0xBF424000, 0xE12D0100,
+ 0xA42CFFFF, 0xE8CC002A, 0xCB710449, 0x83B80032,
+ 0xD8224000, 0x98800033, 0xAC220000, 0xC3210045,
+ 0x8661B424, 0xFA230000, 0xF663B42C, 0x9397008C,
+ 0xA9232000, 0xC662B428, 0xD863B434, 0x9269B1F8,
+ 0xCE390000, 0xABCC0040, 0x89210777, 0xF5800041,
+ 0x8B210333, 0xF38C0078, 0xD6BC0076, 0x8E61B438,
+ 0xE42CFFFF, 0x87CC0039, 0x85710649, 0xD397008C,
+ 0xEB21A0C8, 0xAC220000, 0xBF424000, 0xC92D0002,
+ 0xBF424000, 0xCC2D00FE, 0xE42CFFFF, 0x89CC004A,
+ 0xC468B1F8, 0x8D223000, 0x98380000, 0xC0CC005D,
+ 0x96711049, 0xE5B8005A, 0xEF204000, 0xBF222000,
+ 0x91230071, 0xD2800078, 0xDB200000, 0x91230071,
+ 0xD2800078, 0xB7712049, 0x82B80063, 0xF9214000,
+ 0x3A230000, 0x7F222000, 0x79800065, 0x0D210000,
+ 0x7A230000, 0x0C20B424, 0x2C500011, 0x45500001,
+ 0x6850C400, 0x05500001, 0x0161B42C, 0x5363B42E,
+ 0x0E62B434, 0x7C230333, 0x738C0078, 0x16BC0076,
+ 0x7963B438, 0x1B200000, 0x3560B140, 0x69710149,
+ 0x3C8C0000, 0x73800074, 0x7971FF49, 0x33800074,
+ 0x15320001, 0x45367FFF, 0x75C8008B, 0x322A0008,
+ 0x4DC00087, 0x26500000, 0x26500000, 0x66500000,
+ 0xA6500000, 0xE6500000, 0xE6500000, 0xA6500000,
+ 0xE6500000, 0xB5C8008B, 0x9480007B, 0xD3260008,
+ 0xE6500000, 0x932EFFFF, 0x8BCC0088, 0xD18B4000,
+ 0x8468B1F8, 0xDE34000F, 0xDBC80093, 0xA028000A,
+ 0xFAC40093, 0x8124000A, 0x918B4000, 0xF920000A,
+ 0x918B4000, 0xE0000000, 0xE0000000, 0xA0000000
+};
+
+static const uint32_t fw0_master_img_data_buf[] =
+{
+ 0x3F200503, 0x6E210001, 0x5E605FF4, 0x2D615FF6,
+ 0x5B200000, 0x3260B148, 0x0D205FE0, 0x5C215FE8,
+ 0x7D230008, 0x2F090000, 0x23C000F3, 0x78200001,
+ 0x1460B41C, 0x719700B0, 0x539700BA, 0x0E208000,
+ 0x7560B140, 0x20000000, 0x20000000, 0x60000000,
+ 0x25685FFE, 0x5269B1F8, 0x626B5FFA, 0x353C4600,
+ 0x2CCC0012, 0x793B0000, 0x48D4001D, 0x1B3700FF,
+ 0x5763B47A, 0x1D200333, 0x1860B438, 0x5F60B45C,
+ 0xBE60B43C, 0xFC230003, 0xF722B400, 0x8520FFFF,
+ 0xE9408000, 0x8D210000, 0xB0488000, 0xF1260002,
+ 0xFF418000, 0x8934FEFE, 0xA2300001, 0xD02A0002,
+ 0xA9408000, 0xFE260020, 0xC52FFFFF, 0x8CCC0023,
+ 0xDB200000, 0x9F60B406, 0xB660B416, 0xF560B426,
+ 0x9C60B436, 0xD460B446, 0xFD60B456, 0xA16B5FFC,
+ 0x80210100, 0xE2222F00, 0xF4370080, 0x9FC8003E,
+ 0xCD210000, 0x8D223000, 0x8C20B424, 0xEC500011,
+ 0x85500001, 0xE850C400, 0xC5500001, 0xAA410000,
+ 0xDF2C0002, 0xA6500000, 0x8E62B434, 0xC8205E90,
+ 0xE6220164, 0xAF970F80, 0x9269B1F8, 0xEA220333,
+ 0x9B200000, 0xF38C0078, 0xD1BC00EB, 0xAF62B438,
+ 0xD060B424, 0xB560B426, 0xB9610102, 0xC835000F,
+ 0x9C610100, 0xC568B400, 0xF969B420, 0x99605FCA,
+ 0xA9615FCE, 0xFA3400FF, 0xD6380200, 0x9A605FCC,
+ 0xF235FF00, 0xAB390002, 0x84615FD0, 0xC1970F0D,
+ 0x38200001, 0x57605EA0, 0x502001A0, 0x2B60010C,
+ 0x7A203000, 0x0E60010E, 0x38200001, 0x7260B148,
+ 0x58695EA0, 0x39228000, 0x14004000, 0x433C0001,
+ 0x26CC006F, 0x4262B140, 0x50800075, 0x14004000,
+ 0x463C0004, 0x2DCC0075, 0x2C68B140, 0x543C4000,
+ 0x3560B140, 0x4835000F, 0x4931FFFF, 0x002D0079,
+ 0x26894000, 0x528C1D78, 0x5F800098, 0x378C1D7A,
+ 0x5F800098, 0x3E8C1DF8, 0x1F800098, 0x5B8C1DFA,
+ 0x9F800098, 0xF48C1D7C, 0xDF800098, 0x918C1D7E,
+ 0xDF800098, 0x988C1DFC, 0x9F800098, 0xFD8C1DFE,
+ 0xDF800098, 0xB18C1D79, 0x9F800098, 0xD48C1D7B,
+ 0x9F800098, 0xDD8C1DF9, 0xDF800098, 0xB88C1DFB,
+ 0xDF800098, 0x978C1D7D, 0x9F800098, 0xF28C1D7F,
+ 0x9F800098, 0xFB8C1DFD, 0xDF800098, 0x9E8C1DFF,
+ 0x95B000E9, 0xC8BC0BF6, 0xFDD80CC3, 0x90A00BF7,
+ 0xEBA40C1D, 0xA5A80C38, 0x8CF80EFB, 0xD3E80CE1,
+ 0x17E00107, 0x796A5EA0, 0x7F2300A6, 0x2B360002,
+ 0x5DC800A6, 0x38AC0E86, 0x38215EA2, 0x63220014,
+ 0x44970F9D, 0x3EC80068, 0x30884000, 0x58380000,
+ 0x36C80101, 0x78215EA2, 0x63220014, 0x27800FC0,
+ 0x5B200000, 0x3360B000, 0x3460B008, 0x4F220001,
+ 0x2B2D0008, 0x6D62B010, 0x7B60B01C, 0x08228800,
+ 0x0C62B01C, 0x518B4000, 0x4468B1F8, 0x36635E96,
+ 0x5E34000F, 0x01030000, 0x012B000A, 0x45C000C1,
+ 0x3920000A, 0x41030000, 0x4D210000, 0x0931FFFF,
+ 0x6D390001, 0x242CFFFF, 0x01CC00C3, 0x6361B140,
+ 0x79228000, 0x36010000, 0x10310008, 0x4D39A0CA,
+ 0x3F424000, 0x6C220000, 0x7F424000, 0x06220020,
+ 0x7C2DFFBA, 0x3F424000, 0x2C220000, 0x582DFF7C,
+ 0x3F424000, 0x6B2D0008, 0x7F424000, 0x0F220001,
+ 0x2B2D0008, 0x7F424000, 0x6C220000, 0x0D2D000C,
+ 0x7F424000, 0x08228800, 0x3F424000, 0x43220400,
+ 0xA462B144, 0xD7020000, 0xE13A0200, 0xA462B144,
+ 0xD92C0001, 0x852FFFFF, 0x80CC00C8, 0xEF6B5E96,
+ 0xD18B4000, 0x8222008D, 0x988000FC, 0xE4220089,
+ 0x988000FC, 0xC6220083, 0xD88000FC, 0x85220085,
+ 0xD88000FC, 0xA9220005, 0x988000FC, 0xE0220087,
+ 0x988000FC, 0xCC220007, 0xD88000FC, 0xA6220011,
+ 0x988000FC, 0xC122008B, 0xD88000FC, 0xAD22000B,
+ 0xEA625FF2, 0x99635FF0, 0xB1320008, 0xC562B148,
+ 0xB3D00102, 0xD18B4000, 0xF8200001, 0xB19700B0,
+ 0xD39700BA, 0xBC8C0000, 0x95800105, 0xF9695F20,
+ 0xFE20011B, 0x8E35C000, 0x91C8010E, 0xC9685F24,
+ 0x823D4000, 0xC5CC00A1, 0xDF2300A1, 0xB96A5EA0,
+ 0xE1210080, 0xB336FFFE, 0xA0625EA0, 0xFB655F21,
+ 0x9A8000AB, 0xF9695F20, 0xC9685F24, 0x8E35C000,
+ 0x973DC000, 0xF2C8010F, 0xD18B4000, 0xA9970F20,
+ 0xFBC801BB, 0x90605F24, 0x80685FFC, 0xCD210000,
+ 0x24615F2E, 0x7F340003, 0x5F2C012D, 0x30884000,
+ 0x5B200000, 0x3160B122, 0x30800131, 0x4A6BB124,
+ 0x5C695F22, 0x1B200000, 0x3B370001, 0x4ECC0137,
+ 0x3C65B123, 0x70800131, 0x5C800124, 0x1A800127,
+ 0x7B9700FB, 0x2868B122, 0x3D69B124, 0x7734001F,
+ 0x34310001, 0x6C110000, 0x62D401B1, 0x216B5FFC,
+ 0x0E645F20, 0x4537FF00, 0x67330008, 0x180B0000,
+ 0x4EC001AE, 0x3E6A5F24, 0x3F215F26, 0x462E0040,
+ 0x29408000, 0x7930FFFB, 0x4E2C4000, 0x0F970FDD,
+ 0x7A695F26, 0x1B2C000C, 0x29350003, 0x49CC01AA,
+ 0x7F215F26, 0x1122FFFE, 0x21970FF3, 0x5F695F24,
+ 0x1C2C0004, 0x524A0000, 0x422D0042, 0x3F424000,
+ 0x6E2E0001, 0x0B420000, 0x26971027, 0x64970C53,
+ 0x2C685F26, 0x7E695F28, 0x5B60B408, 0x2861B40A,
+ 0x09685F24, 0x5221B40E, 0x7D60B40C, 0x30510000,
+ 0x52200021, 0x3A60B404, 0x10200040, 0x5360B414,
+ 0x91200164, 0xC7210152, 0xFF2300A6, 0xA9800C7A,
+ 0xEF685F20, 0xB86A5FE8, 0xBA3400FF, 0xD3605F22,
+ 0xEE2E0001, 0xA1625FE8, 0x81030000, 0xF930FFFB,
+ 0xA72C4010, 0xD24A0000, 0xDC2C0004, 0xB3490000,
+ 0xD63B0400, 0x8F2D0001, 0xBA0A4000, 0xF9C40175,
+ 0x8D210000, 0xEA410000, 0xC9685F24, 0xB563B120,
+ 0xBE2C0038, 0xE6500000, 0xE6500000, 0xA6500000,
+ 0xE6500000, 0x802CFFF6, 0x924A0000, 0xE22CFFCA,
+ 0x0A6B5F2E, 0x5B368000, 0x63CC018A, 0x393B0000,
+ 0x50C801A6, 0x392F003C, 0x1D40C000, 0x46685F30,
+ 0x50605F24, 0x158001A6, 0x32605F2E, 0x793B0000,
+ 0x26CC018F, 0x5F605F30, 0x76800191, 0x392F003C,
+ 0x5D40C000, 0x39695F20, 0x2B68B124, 0x4F220001,
+ 0x3A230000, 0x6C3500FF, 0x6C0B4000, 0x2C12C000,
+ 0x17148000, 0x4FCC019F, 0x5A9700F7, 0x11230191,
+ 0x71635F24, 0x10200040, 0x198001B4, 0x69970F20,
+ 0x9EC801B9, 0xD0605F24, 0xEF685F20, 0xBE6A5F24,
+ 0xFA3400FF, 0x9780013E, 0xBA215FDA, 0xE4970F39,
+ 0xDE2301B3, 0xB78001C0, 0xAF685F20, 0xFF9700F5,
+ 0xBA3400FF, 0xF18001AF, 0xFB9700FB, 0xB7380400,
+ 0xD460B120, 0x89685F24, 0x86970F33, 0xDB200000,
+ 0xB96A5EA0, 0xED645F21, 0xCC3A0001, 0xA0625EA0,
+ 0x988000A6, 0xD523019F, 0xDE8001BC, 0x9F23011B,
+ 0xF1635F24, 0xBC2000C0, 0xAD645F21, 0xD88000A6,
+ 0xB5695F32, 0xCE208000, 0xD4150000, 0xB7C801C5,
+ 0xD18B4000, 0xBA605F32, 0xB62001C8, 0xDA8000AB,
+ 0xCC685FD8, 0x9F215FD8, 0x98380000, 0xDAC801ED,
+ 0xA0970F5B, 0xF9605F34, 0xF6010000, 0x9F2C0034,
+ 0xE5480000, 0x9E6A5FEC, 0x81030000, 0xDE34000F,
+ 0xAE2E0001, 0xC7625FEC, 0xEC220000, 0x8A625F3A,
+ 0xBA62013E, 0xC6330004, 0xFF37000F, 0x9A2F01DD,
+ 0xD18B4000, 0xB48003B5, 0x9B80053F, 0xF08006DD,
+ 0x138006EA, 0x53800200, 0x53800200, 0x13800200,
+ 0x53800200, 0x13800200, 0x13800200, 0x53800200,
+ 0x53800200, 0x13800200, 0x13800200, 0x4B800BC6,
+ 0x13800200, 0x79605F34, 0x7A605F32, 0x188000A6,
+ 0x682200C1, 0x15800203, 0x2C2200A3, 0x55800203,
+ 0x2722008F, 0x55800203, 0x45220085, 0x15800203,
+ 0x0B2200C0, 0x55800203, 0x6A2200A0, 0x15800203,
+ 0x492200A1, 0x15800203, 0x23220081, 0x55800203,
+ 0xA0220087, 0xD5800203, 0xEC220000, 0xA3685F32,
+ 0xEF625F38, 0xB3230208, 0x8B341000, 0xE8CC02A0,
+ 0xFB97035E, 0xA0685F34, 0xB66A5F38, 0xDA230218,
+ 0xBC2C0035, 0xF3460000, 0xF6695F34, 0x9D800273,
+ 0xE860013C, 0xB5635F46, 0xBB97035E, 0xF9200215,
+ 0x9C605F36, 0xDE970393, 0xC9CC0263, 0x90970236,
+ 0x856A010C, 0xFA680110, 0xFE2A01A0, 0xB5C801C8,
+ 0xD8380000, 0x8DCC01C8, 0x94620110, 0xE7970C63,
+ 0x0D6A0110, 0x4C20B424, 0x6C500011, 0x05500001,
+ 0x6850C400, 0x05500001, 0x2D5001A0, 0x66500000,
+ 0x4E62B434, 0x0821022C, 0x172301C8, 0x6B940C7D,
+ 0x3E6B0112, 0x672201A0, 0x5C62010C, 0x1B200000,
+ 0x4D6A0110, 0x06600112, 0x23600110, 0x793B0000,
+ 0x0ACC0385, 0x588000A6, 0x79635F38, 0x201A4000,
+ 0x0262B140, 0x6F6B5EA0, 0x57020000, 0x1F3B0004,
+ 0x76635EA0, 0x0D388000, 0x3A605F32, 0x75008000,
+ 0x07300003, 0x75605F4A, 0x75008000, 0x3F30FFF8,
+ 0x4F384001, 0x36605F4C, 0x2832FFFF, 0x5D2E0D06,
+ 0x5D23024A, 0x078A4000, 0x13605F4E, 0x456A010C,
+ 0x102001A0, 0x4D210000, 0x4E0A0000, 0x26970DE4,
+ 0x6B970E02, 0x026B5F32, 0x0A685F4E, 0x7F37000F,
+ 0x343B0100, 0x576A5F34, 0x7263B144, 0x0B420000,
+ 0x1B695F46, 0x5F2C0002, 0x6A410000, 0x136A5F3A,
+ 0x5F2C0002, 0x0B420000, 0x31695F3C, 0x606B5F38,
+ 0x9F2C0002, 0xEA410000, 0xD18B4000, 0xBA20C000,
+ 0xFA605F32, 0xAE970C74, 0xA7220040, 0xCC20B424,
+ 0xEC500011, 0xA0500003, 0xA850C400, 0xC5500001,
+ 0x87500180, 0xE6500000, 0xCE62B434, 0x9E2000A6,
+ 0xC82100A6, 0xBF2300A6, 0x89800C7D, 0xD4635E9C,
+ 0xAD6B5FEE, 0xC5615E98, 0xEC2D0036, 0x91484000,
+ 0xB82F0001, 0xF4635FEE, 0xC0349FFF, 0x88404000,
+ 0xEC348000, 0xB9C80286, 0x912DFFFE, 0xE64A4000,
+ 0x2B2D0008, 0x51484000, 0x41625E9A, 0x30510000,
+ 0x58380000, 0x32C8029C, 0x10605E9E, 0x4A685E98,
+ 0x79215FDC, 0x2A970F4A, 0x21970E86, 0x49685E9E,
+ 0x0D6B5E9C, 0x58380000, 0x6BCC0290, 0x118B4000,
+ 0x586A5E9A, 0x1F215FD8, 0x1336FF00, 0x70D00297,
+ 0x2A970F4A, 0x4D6B5E9C, 0x778001C0, 0x31320008,
+ 0x3C2C0035, 0x73460000, 0x5F695E9E, 0x3D800274,
+ 0x7C9700F3, 0x3C209000, 0x3A605F32, 0x4480101D,
+ 0x8E208000, 0xFA605F32, 0xE480102C, 0xBD635F36,
+ 0xEC685F4A, 0xB9695F4C, 0x8B32FFFE, 0xCD048000,
+ 0xF0C402AB, 0x8F2D0001, 0xA0615F4C, 0xF5605F4A,
+ 0x93320002, 0xE4685F3A, 0xD88002B9, 0xBD635F36,
+ 0xD8380000, 0xBCD002B3, 0x99970354, 0xE4685F3A,
+ 0x8E390000, 0xDDC802B9, 0xE4300002, 0x88404000,
+ 0xBC30FFFE, 0xF6010000, 0xE72D01A0, 0x9F610106,
+ 0xCB32FFFE, 0x9CC80352, 0x94038000, 0xC3330001,
+ 0xAFD402C2, 0xEB2E0004, 0xD40C8000, 0xBD605F3A,
+ 0xD4038000, 0xBF37000F, 0x95C802C9, 0xF736FFF0,
+ 0xE42E0010, 0xAF6B5F40, 0xAC625F3E, 0xCD0B8000,
+ 0x94C402CE, 0xE0625F40, 0xDC6A5F42, 0x9B200000,
+ 0xE93600C0, 0xB5320006, 0x9BC802D6, 0xF12C0040,
+ 0x932EFFFF, 0xF88002D2, 0xEC600104, 0x85970CA6,
+ 0x9E2000A6, 0xE1970CAF, 0xEC970CB6, 0xA7970C63,
+ 0xE3690104, 0xB5680104, 0xAF2D0030, 0xE64A4000,
+ 0x092D0002, 0x704B4000, 0x493EFFFF, 0x0D1EC000,
+ 0x6CCC0322, 0x1A21B424, 0x18510041, 0x7160B428,
+ 0x4A2D0004, 0x30510000, 0x3851C010, 0x53510001,
+ 0x28220038, 0x4E62B434, 0x4C2102DB, 0x3F2300A6,
+ 0x6B940C7D, 0x3920003C, 0x3C60B348, 0x64970C53,
+ 0x27970C63, 0x50680106, 0x7B21B428, 0x356A5F3E,
+ 0x2A6B5FD0, 0x4251E000, 0x53510001, 0x1760B42C,
+ 0x492D0002, 0x30510000, 0x12200311, 0x5763B420,
+ 0x1060B424, 0x4E62B434, 0x6C685F4A, 0x39695F4C,
+ 0x5B60B408, 0x2861B40A, 0x226B5FCC, 0x7721B40C,
+ 0x4251E000, 0x13510001, 0x2B201061, 0x7D63B400,
+ 0x3A60B404, 0x6462B414, 0x5D200003, 0x3E605F50,
+ 0x7020031B, 0x21210325, 0x0A970C7D, 0x7F2300A6,
+ 0x0B940C7A, 0x67685F50, 0x4434FFFE, 0x3E605F50,
+ 0x18380000, 0x71C80320, 0x588000A6, 0x27685F50,
+ 0x4234FFFD, 0x3E605F50, 0x18380000, 0x65CC00A6,
+ 0xA46B5F36, 0xEE800CBD, 0xEA970C83, 0xB62301F2,
+ 0xEE800CBD, 0xBB2302DB, 0xA9800C83, 0xFD635F36,
+ 0xD8380000, 0xB3D0032B, 0x99970354, 0xE4685F3A,
+ 0x8E390000, 0xFBC80331, 0xE4300002, 0x88404000,
+ 0xFC30FFFE, 0xB6010000, 0xA72D01A0, 0xDF610106,
+ 0x8B32FFFE, 0xDCC80352, 0xEF6B5F40, 0xAC625F3E,
+ 0x8D0B8000, 0xF8C4033B, 0xE0625F40, 0x94038000,
+ 0xE6330003, 0x84D4033F, 0xAB2E0004, 0xD40C8000,
+ 0xBD605F3A, 0xE4970C53, 0xEC685F4A, 0xB9695F4C,
+ 0xDB60B408, 0xA861B40A, 0x90680106, 0xF56A5F3E,
+ 0xD221B40E, 0xB0510000, 0xBD60B40C, 0xD2200021,
+ 0xBA60B404, 0xE462B414, 0xC5685F36, 0xA6210341,
+ 0xFF2300A6, 0xA9800C7A, 0xA46B5F36, 0xF88000FB,
+ 0xB5635E90, 0xC16B5F34, 0xE00CC000, 0x844B0000,
+ 0x9F2C0002, 0xE5480000, 0xD4635F4A, 0xAC6B5E90,
+ 0xF6605F4C, 0x918B4000, 0xB96A5F40, 0xDB200000,
+ 0x17605F40, 0x6F3A0000, 0x7ECC0C95, 0x118B4000,
+ 0x4520FFFF, 0x2C2D0036, 0x264A4000, 0x772DFFFA,
+ 0x45625F42, 0x1D34003F, 0x17148000, 0x6CCC01F2,
+ 0x118B4000, 0x664A4000, 0x492D0002, 0x273607FC,
+ 0x57C801F4, 0x13320002, 0x2C088000, 0x4EC001F4,
+ 0x35008000, 0x62300001, 0x6FD40378, 0x2E2E0001,
+ 0x1F30FFFF, 0x518B4000, 0x76635E96, 0x33200102,
+ 0x7E97036D, 0x09600130, 0x06625F44, 0x73200102,
+ 0xBE97036D, 0xEF6B5E96, 0xEF600134, 0xA3625F46,
+ 0xD18B4000, 0xA469010C, 0x9768010E, 0xFD3D01A0,
+ 0xE6CC0390, 0x862E01A0, 0x9C62010C, 0xD8380000,
+ 0x90C8038F, 0xEC088000, 0xE8C001F0, 0x918B4000,
+ 0xD4620110, 0xA7630112, 0x988000A6, 0xD3680100,
+ 0xB6635E96, 0xDB6AB140, 0xEE210001, 0xBA230000,
+ 0xA1280001, 0xD80B0000, 0xCD11C000, 0x94038000,
+ 0xD7174000, 0xBEC803A1, 0xB4310001, 0xE1280001,
+ 0x3EC4039B, 0x6F6B5E96, 0x518B4000, 0x36635E96,
+ 0x6C220000, 0x05625E94, 0x0D6BB140, 0x45690100,
+ 0x78200001, 0x3602C000, 0x35160000, 0x5C6A5E94,
+ 0x02CC03AF, 0x6E2E0001, 0x45625E94, 0x1F30FFFF,
+ 0x722DFFFF, 0x01CC03A9, 0x2F6B5E96, 0x5C6A5E94,
+ 0x118B4000, 0x64625F4E, 0x512C03B8, 0x30884000,
+ 0x13800200, 0x7E8003C8, 0x5C800442, 0x3C800445,
+ 0x56800465, 0x1D800486, 0x3E8004EB, 0x7B8004EE,
+ 0x1B800509, 0x5E80050C, 0x7780052A, 0x13800200,
+ 0x53800200, 0x13800200, 0x13800200, 0x53800200,
+ 0x54230018, 0x0963013C, 0x1A970364, 0x7797037A,
+ 0x276A0130, 0x41030000, 0x4D0B8000, 0x2FC003D1,
+ 0x57020000, 0x106B013C, 0x28685F44, 0x5B695F46,
+ 0x32370020, 0x4DCC03D7, 0x6E2E0001, 0x09625F3C,
+ 0x360E0000, 0x420E4000, 0x4B32FFFE, 0x34970385,
+ 0x5797029D, 0x1B200000, 0x2A210120, 0x5F6A5F44,
+ 0x97970327, 0xDC200008, 0xCC210124, 0xBA6A5F46,
+ 0xD7970327, 0x969702A0, 0xA4685F3A, 0xE4210010,
+ 0xE4300002, 0xA7600128, 0xBA610104, 0xFB97035E,
+ 0xA6970CCB, 0xD0680130, 0xE0690134, 0x8E6A0120,
+ 0xFE6B0124, 0x9A60B010, 0xAA61B014, 0xFE680128,
+ 0x8E69012C, 0xEB2E0068, 0xC462B000, 0xBD2F0068,
+ 0xB463B004, 0xE06A0138, 0xDC2C0068, 0xB460B008,
+ 0xCA2D0068, 0x8461B00C, 0xAA62B018, 0xF168013C,
+ 0xBF2300A6, 0xCD388000, 0xFB60B01C, 0xAF940CD0,
+ 0xCA685F4E, 0x976A5F34, 0x98380000, 0xF5C8040D,
+ 0xF0884000, 0x8E208000, 0xA9408000, 0xDB200000,
+ 0xBF800419, 0xE4685F3A, 0xF069B024, 0xA02E0028,
+ 0xCE390000, 0x90D00409, 0xA4300002, 0xDC2C0068,
+ 0xAF090000, 0xEA31FFFE, 0xC768B028, 0xBF418000,
+ 0xB734001F, 0xE82E0002, 0xE9408000, 0xB5008000,
+ 0xDF2C0002, 0xA6500000, 0xA6500000, 0xC9970CD8,
+ 0x106A5F3C, 0x60685F34, 0x4B32FFFE, 0x33C80202,
+ 0x546B0104, 0x32695F3A, 0x09625F3C, 0x60625F40,
+ 0x600CC000, 0x272D01A0, 0x3A610104, 0x73490000,
+ 0x1F2C0002, 0x65480000, 0x63615F4A, 0x36605F4C,
+ 0x64970C53, 0x2C685F4A, 0x39695F4C, 0x7D60B40C,
+ 0x0E61B40E, 0x75680104, 0x4D210000, 0x2861B40A,
+ 0x1B60B408, 0x506A5F3C, 0x54200081, 0x3A60B404,
+ 0x6462B414, 0x21210430, 0x3F2300A6, 0x4B940C7A,
+ 0x11230202, 0x7880035E, 0x57230028, 0x0963013C,
+ 0x5B8003CA, 0x1A970364, 0x33200102, 0x7E97036D,
+ 0x49600130, 0x06625F44, 0x192C0001, 0x7E605F3C,
+ 0x2E32FFFC, 0x6B2E0004, 0x74970385, 0x1797029D,
+ 0x5B200000, 0x2A210120, 0x1F6A5F44, 0x57970327,
+ 0x1F6A5F44, 0x5C200008, 0x4C210124, 0x17970327,
+ 0x1F6A5F44, 0x72200010, 0x6D210128, 0x17970327,
+ 0x569702A0, 0x24685F3A, 0x23210018, 0x64300002,
+ 0x8160012C, 0xFA610104, 0xD823000A, 0x8963013C,
+ 0xD28003EB, 0x9A970364, 0xB797037A, 0xE8685F44,
+ 0xF60E0000, 0x8B32FFFE, 0xB4970385, 0xD797029D,
+ 0x9B200000, 0xEA210120, 0xDF6A5F44, 0x97970327,
+ 0xFA6A5F46, 0x9C200008, 0x8C210124, 0xD7970327,
+ 0x969702A0, 0xE4685F3A, 0xE76A0130, 0x976B0134,
+ 0xA4300002, 0xE7600128, 0xD70EC000, 0x8B32FFFE,
+ 0xC9625F3C, 0xAA208009, 0xB9970210, 0xC1970D7E,
+ 0x1F680148, 0x61970E49, 0x4D210000, 0x316A5F5C,
+ 0x72200010, 0x2F800E66, 0x03208100, 0x6860013C,
+ 0x5A970364, 0x3797037A, 0x316B0130, 0x7E695F44,
+ 0x180B0000, 0x4EC001F4, 0x4434FFFE, 0x17C801F4,
+ 0x420E4000, 0x0B32FFFE, 0x34970385, 0x5797029D,
+ 0x1B200000, 0x6A210120, 0x5F6A5F44, 0x17970327,
+ 0x3A6A5F46, 0x5C200008, 0x4C210124, 0x17970327,
+ 0x569702A0, 0x016A0134, 0x09690124, 0x532EFFFF,
+ 0x820D8000, 0xEA31FFFE, 0xE72D01A0, 0xA64A4000,
+ 0xC92D0002, 0x87494000, 0xB168013C, 0xE01A4000,
+ 0xD3C801FA, 0xB2695F3A, 0x816A0134, 0xF2310002,
+ 0xB1610128, 0xF4340100, 0xFAC804BA, 0xB16B0130,
+ 0xF5008000, 0x8D0B8000, 0xB82F0001, 0xEE2E0001,
+ 0xA2300001, 0xFBD004B7, 0xEE2E0001, 0x820D8000,
+ 0x9761012C, 0xD70EC000, 0xCB32FFFE, 0x89625F3C,
+ 0xF168013C, 0xB9970210, 0x81970D7E, 0xC669015C,
+ 0xB968014C, 0xE2350100, 0xDCC804E4, 0xA1970E49,
+ 0xD1520000, 0xAB2E0004, 0xA3690168, 0xDF680148,
+ 0xCE390000, 0x91D004CD, 0xAF090000, 0xEA31FFFE,
+ 0x918004CE, 0xD8218000, 0xC2685F52, 0x952EFFFC,
+ 0xFF418000, 0xAA381000, 0x9B605F52, 0xC797101D,
+ 0xA06A0154, 0xD068015C, 0xCD210000, 0x8B32FFFE,
+ 0xB4340100, 0xF2200010, 0xFCC804E3, 0x8F970E67,
+ 0xDF680148, 0xAF69014C, 0xB16A5F5C, 0xEF090000,
+ 0x2A31FFFE, 0x7A0A4000, 0x75200018, 0x2F800E66,
+ 0x576A5F58, 0x202E0028, 0x11520000, 0x51520000,
+ 0x51520000, 0x11520000, 0x168004C6, 0x40208200,
+ 0x2860013C, 0x59800488, 0x70200088, 0x2860013C,
+ 0x5A970364, 0x21361F00, 0x31320008, 0x79620138,
+ 0x33200102, 0x7E97036D, 0x49600130, 0x366B0138,
+ 0x06625F44, 0x793B0000, 0x506B013C, 0x29CC04FD,
+ 0x7F800500, 0x13370040, 0x02CC0500, 0x592C0001,
+ 0x3E605F3C, 0x760E0000, 0x4B32FFFE, 0x34970385,
+ 0x5B200000, 0x2A210120, 0x1F6A5F44, 0x772303E6,
+ 0x54800327, 0x17200048, 0x2860013C, 0x568004F0,
+ 0x1A970364, 0x73200102, 0x7E97036D, 0x09600130,
+ 0x46625F44, 0x0D32FFFD, 0x34970385, 0x5797029D,
+ 0x1B200000, 0x6A210120, 0x5F6A5F44, 0x17970327,
+ 0x1F6A5F44, 0x5C200008, 0x4C210124, 0x17970327,
+ 0x569702A0, 0x36200522, 0x13605F4E, 0x55230400,
+ 0x8963013C, 0xD28003EB, 0xD669B020, 0xA02E0028,
+ 0xD1520000, 0x91520000, 0x91520000, 0xFF418000,
+ 0xD1230202, 0x8A800CD8, 0x9A970364, 0xD52001FF,
+ 0xBE97036D, 0xC9600130, 0xFE605F3C, 0x97020000,
+ 0xC6625F44, 0x8B32FFFE, 0xB4970385, 0xDB200000,
+ 0xAA210120, 0xDF6A5F44, 0xD7970327, 0x9B200000,
+ 0xBD605F3A, 0xE7600128, 0xE4210010, 0xBA610104,
+ 0xCC230808, 0x8963013C, 0x928003EB, 0xC1030000,
+ 0xA637FFF8, 0xEECC0200, 0xF52C0544, 0xB0884000,
+ 0xD580054C, 0xBC800593, 0x9A800604, 0xD3800200,
+ 0xD780061D, 0xB380064E, 0x93800200, 0xD3800200,
+ 0x8320FFFC, 0xF9970365, 0xE1361F00, 0xB2C801F6,
+ 0xF1320008, 0xB9620138, 0xBF2A0011, 0xD3C401F6,
+ 0xB797037A, 0xE2300001, 0xDCD00558, 0xA82E0002,
+ 0xB2347FFF, 0xD7C801F4, 0xD7680138, 0xA3625F46,
+ 0xF6010000, 0x92290003, 0xBAC40560, 0xDD200003,
+ 0x3C2C0003, 0x63018000, 0x6A072000, 0x393B0000,
+ 0x4ECC01F8, 0x3E695F44, 0x242E0010, 0x420E4000,
+ 0x442A0800, 0x3A6A5F46, 0x17C401F8, 0x6832FFFF,
+ 0x020E4000, 0x4B32FFFE, 0x74970385, 0x1797029D,
+ 0x5B200000, 0x2A210120, 0x0A6B5F42, 0x5F6A5F44,
+ 0x03330001, 0x76D00578, 0x74230579, 0x14800327,
+ 0x319702AF, 0x4A6B5F42, 0x5C200008, 0x0C210124,
+ 0x7A6A5F46, 0x05330002, 0x36D00581, 0x51230582,
+ 0x94800327, 0xF19702AF, 0xC56B5F3A, 0xBA6A5F46,
+ 0xED210128, 0xB5635F46, 0xB2200010, 0xD7970327,
+ 0xD69702A0, 0xAC6B5F46, 0xBE680128, 0xC16A0134,
+ 0x8160012C, 0xCB32FFFE, 0xDC635F3A, 0x89625F3C,
+ 0xE920E000, 0xBE2305FD, 0xBA800210, 0xE520FFF8,
+ 0xB9970365, 0xE1361F00, 0xF2C801F6, 0xB1320008,
+ 0xB9620138, 0xFF2A0011, 0xD3C401F6, 0x92200082,
+ 0xFE97036D, 0x89600130, 0x86625F44, 0xD2200082,
+ 0x3E97036D, 0x6F600134, 0x62300001, 0x3AD005A5,
+ 0x682E0002, 0x32347FFF, 0x17C801F4, 0x57680138,
+ 0x63625F46, 0x36010000, 0x12290003, 0x5FC405AD,
+ 0x1D200003, 0x792C0006, 0x63018000, 0x2A072000,
+ 0x793B0000, 0x0ECC01F8, 0x3E695F44, 0x76680134,
+ 0x242E0010, 0x4931FFFF, 0x420E4000, 0x042A0800,
+ 0x17C401F8, 0x57020000, 0x4B32FFFE, 0x360E0000,
+ 0x420E4000, 0x082E0005, 0x0B32FFFE, 0x74970385,
+ 0x1797029D, 0x5B200000, 0x6A210120, 0x0A6B5F42,
+ 0x5F6A5F44, 0x03330001, 0x3CD005CA, 0x6832FFFF,
+ 0x7D2305CD, 0x14800327, 0x319702AF, 0x5F6A5F44,
+ 0x109702A3, 0x4A6B5F42, 0x5C200008, 0x0C210124,
+ 0x7A6A5F46, 0x05330002, 0x34D005D6, 0x6832FFFF,
+ 0x322305D9, 0x54800327, 0x719702AF, 0x3A6A5F46,
+ 0x109702A3, 0x49690124, 0x7A6A5F46, 0x2A31FFFE,
+ 0x672D01A0, 0x11484000, 0x0B32FFFE, 0x420D8000,
+ 0xB04B4000, 0xDA340001, 0xF5C801FE, 0xBB370001,
+ 0xF5C801FE, 0x816A0134, 0xB2200010, 0xCA6B5F42,
+ 0xED210128, 0xA6330003, 0xB6D005ED, 0xD12305EE,
+ 0x94800327, 0xF19702AF, 0xE4685F3A, 0x816A0134,
+ 0xD3605F4E, 0xB6200028, 0x8B21012C, 0xE832FFFF,
+ 0x97970327, 0xD69702A0, 0xCA685F4E, 0x816A0134,
+ 0xBD605F3A, 0xFC209000, 0xCD32FFFD, 0x89625F3C,
+ 0xF9970210, 0x81970D7E, 0xB968014C, 0xE1970E49,
+ 0x0D210000, 0x716A5F5C, 0x75200018, 0x2F800E66,
+ 0x5A970364, 0x3797037A, 0x096B5F44, 0x570EC000,
+ 0x4B32FFFE, 0x34970385, 0x1797029D, 0x5B200000,
+ 0x2A210120, 0x5F6A5F44, 0x57970327, 0x1C200008,
+ 0x4C210124, 0x3A6A5F46, 0x17970327, 0x569702A0,
+ 0x056B5F3A, 0x416A0134, 0x45330002, 0x2063012C,
+ 0x0B32FFFE, 0x49625F3C, 0x5B20F000, 0x3E2305FD,
+ 0x7A800210, 0x0620FFF9, 0x39970365, 0x45625F42,
+ 0x892D0002, 0xF5200018, 0xFE97036D, 0xAF600134,
+ 0xC434FFFE, 0x97C801F4, 0xA82E0002, 0xE3625F46,
+ 0xF420013C, 0xB3508000, 0x85500001, 0xF1290002,
+ 0x91484000, 0xD4038000, 0xCD32FFFD, 0x970EC000,
+ 0xFF340003, 0x90605F48, 0x8B32FFFE, 0xF4970385,
+ 0x9797029D, 0xFA6A5F46, 0xE86B5F48, 0xB5008000,
+ 0xA832FFFF, 0xFB370001, 0xDBC8063C, 0xB60E0000,
+ 0xEA210120, 0x9B200000, 0x97970327, 0xE86B5F48,
+ 0xBA6A5F46, 0xFB370001, 0xCCCC0675, 0x96230675,
+ 0xE4685F3A, 0x9701C000, 0xB12C01A0, 0xC5500001,
+ 0xCB32FFFE, 0x902A0002, 0xAF970F80, 0xC92801A0,
+ 0xBD605F3A, 0xE6894000, 0xE520FFF8, 0xB9970365,
+ 0xC5625F42, 0xB5200018, 0xBE97036D, 0xC9600130,
+ 0x86625F44, 0xF5200018, 0xFE97036D, 0xAF600134,
+ 0x8434FFFE, 0xD7C801F4, 0xE82E0002, 0xA3625F46,
+ 0xF420013C, 0x81509000, 0x85500001, 0xF1290002,
+ 0x11484000, 0x7E695F44, 0x5C340002, 0x10605F48,
+ 0x6832FFFF, 0x14038000, 0x170EC000, 0x570EC000,
+ 0x420E4000, 0x0B32FFFE, 0x34970385, 0x5797029D,
+ 0x1B200000, 0x6A210120, 0x4A6B5F42, 0x1F6A5F44,
+ 0x43330001, 0x14D00674, 0x16230675, 0x54800327,
+ 0x319702AF, 0x4A6B5F42, 0x7A6A5F46, 0x1C200008,
+ 0x05330002, 0x56D00680, 0x63018000, 0x2832FFFF,
+ 0x420E4000, 0x0C210124, 0x34230686, 0x54800327,
+ 0x8C210124, 0xF19702AF, 0xFA6A5F46, 0x909702A3,
+ 0xFA6A5F46, 0x909702A3, 0x8A6B5F42, 0xFA6A5F46,
+ 0xED210128, 0xA6330003, 0xBED006AD, 0xE86B5F48,
+ 0xB5008000, 0xE832FFFF, 0xFB370001, 0x9FC80691,
+ 0xF60E0000, 0xB2200010, 0x97970327, 0xE86B5F48,
+ 0xBA6A5F46, 0xFB370001, 0xEDCC06B6, 0xA769013C,
+ 0xA0685F34, 0xFA6A5F46, 0xD13D9000, 0x86CC06AB,
+ 0xD72C0028, 0x844B0000, 0x9F2C0002, 0xF3490000,
+ 0x1F2C0002, 0x761B4000, 0x73490000, 0x1F2C0002,
+ 0x761B4000, 0x33490000, 0x36200028, 0x761B4000,
+ 0x7EC806AB, 0x372306B6, 0x14800327, 0x772306B6,
+ 0x11800644, 0x72200010, 0x719702AF, 0x3A6A5F46,
+ 0x509702A3, 0x286B5F48, 0x3A6A5F46, 0x7B370001,
+ 0x1CC80697, 0x509702A3, 0x569702A0, 0x3E6A5F48,
+ 0x24685F3A, 0x6B360002, 0x5EC806C0, 0x3A6A5F46,
+ 0x60690134, 0x2832FFFF, 0x020E4000, 0x4B32FFFE,
+ 0x09625F3C, 0x64300002, 0x4160012C, 0x3168013C,
+ 0x79970210, 0x36695F58, 0x0A2D0032, 0x51484000,
+ 0x5C340002, 0x0CCC06D6, 0x206A0154, 0x5D20A000,
+ 0x14038000, 0x43330001, 0x4CD406D0, 0x2E2E0001,
+ 0x682E0002, 0x3E33FFFF, 0x170EC000, 0x4B32FFFE,
+ 0x28625F5C, 0x4E970D6A, 0x41970D7E, 0x3968014C,
+ 0x21970E49, 0x4D210000, 0x716A5F5C, 0x35200018,
+ 0x6F800E66, 0x01030000, 0x2637FFF8, 0x6ECC0200,
+ 0xB32C06E2, 0xF0884000, 0xF38006ED, 0x978007A7,
+ 0xE38009AE, 0xAE800A87, 0x93800200, 0xD78007A7,
+ 0xD3800200, 0xAE800A87, 0x98380000, 0xEECC0200,
+ 0x8D800BC5, 0xC320FFFC, 0xF9970365, 0x892D0002,
+ 0xF5200018, 0xBE97036D, 0x89600130, 0xEF600134,
+ 0x8434FFFE, 0xD7C801F4, 0xE82E0002, 0xB1290002,
+ 0x91484000, 0xE3625F46, 0xDA340001, 0x90605F48,
+ 0xF5008000, 0xBA30FFFD, 0xB60E0000, 0xF60E0000,
+ 0x8B32FFFE, 0xF4970385, 0xD797029D, 0x9B200000,
+ 0xEA210120, 0x8A6B5F42, 0xBA6A5F46, 0xC3330001,
+ 0xF6D0070B, 0xB723070C, 0x94800327, 0xF19702AF,
+ 0xA897097D, 0xFA6A5F46, 0xF6200028, 0x8D210000,
+ 0xD7970327, 0x969702A0, 0x8D685F46, 0xDB695F46,
+ 0xBA30FFFD, 0xF50C4000, 0xE0600120, 0xAA31FFFE,
+ 0x90610124, 0xC16A0134, 0xFC30FFFE, 0xB12C01A0,
+ 0xE832FFFF, 0x8D210000, 0x844B0000, 0xDF2C0002,
+ 0x1419C000, 0x532EFFFF, 0x61CC071E, 0x1235FFFE,
+ 0x50C801FC, 0x26970CCB, 0x20690134, 0x4E6A0120,
+ 0x7E6B0124, 0x21208400, 0x2B2E0068, 0x7D2F0068,
+ 0x0C61B010, 0x4462B000, 0x7463B004, 0x3B60B01C,
+ 0x7F2300A6, 0x2F940CD0, 0x1669B020, 0x72310002,
+ 0x14D00737, 0x49970CD8, 0x558001FC, 0x09970CD8,
+ 0x0D685F46, 0x6C220000, 0x46600124, 0x36010000,
+ 0x6A31FFFE, 0x170D0000, 0x31610128, 0x630D4000,
+ 0x170D0000, 0x5761012C, 0x49625F3C, 0x38200001,
+ 0x4D60013E, 0x3C209000, 0x39970210, 0x5D20A000,
+ 0x4E970D6A, 0x14680164, 0x286A0148, 0x58380000,
+ 0x20D00E47, 0x6F69014C, 0x630E8000, 0x17610140,
+ 0x71620148, 0x3A098000, 0x3661014C, 0x6A31FFFE,
+ 0x31610144, 0x40208200, 0x4D970D6C, 0x35680168,
+ 0x0E6A014C, 0x58380000, 0x60D00E47, 0x09690148,
+ 0x71620148, 0x3A098000, 0x17610140, 0x7A098000,
+ 0x8B32FFFE, 0xC20D8000, 0xF661014C, 0x9B20F000,
+ 0xCD970D6C, 0x9F680148, 0x8E690140, 0xEC220000,
+ 0xD0620144, 0xA060014C, 0x970D0000, 0xD7610140,
+ 0x9930FFFC, 0xC6600148, 0xED208001, 0x8D970D6C,
+ 0xE86A0148, 0xB968014C, 0xB66B0154, 0xF6620140,
+ 0xB6010000, 0xFA30FFFD, 0xE7600144, 0xA2300001,
+ 0x8E0A0000, 0xC20D8000, 0xD0610148, 0x810FC000,
+ 0xC9630150, 0xA7208010, 0x8D970D6C, 0xD4680164,
+ 0x0E690140, 0x58380000, 0x60D00E47, 0x286A0148,
+ 0x7968014C, 0x106B0150, 0x10610148, 0x76620140,
+ 0x782F0001, 0x09630150, 0x0E0A0000, 0x50620144,
+ 0x2D208001, 0x4D970D6C, 0x466A0150, 0x366B0154,
+ 0x7968014C, 0x09690148, 0x170EC000, 0x5F620150,
+ 0x096A0144, 0x57610140, 0x4E0A0000, 0x31620148,
+ 0x200F0000, 0x5D33FFFE, 0x7E635F5C, 0x3C30FFFE,
+ 0x67600144, 0x00208200, 0x0D970D6C, 0x41970D7E,
+ 0xA3690168, 0xF16A5F5C, 0xCE390000, 0xA0D00E47,
+ 0xE8970E5E, 0xB5200018, 0xAF800E66, 0xE020FFFD,
+ 0xF9970365, 0x892D0002, 0xB5200018, 0xFE97036D,
+ 0x89600130, 0xEF600134, 0xC434FFFE, 0x97C801F4,
+ 0xE82E0002, 0xB1290002, 0x91484000, 0xE3625F46,
+ 0x9C340002, 0xD0605F48, 0xF5008000, 0xA3018000,
+ 0xBC30FFFE, 0xCD32FFFD, 0xF60E0000, 0x820E4000,
+ 0xCB32FFFE, 0xB4970385, 0x9797029D, 0xE897097D,
+ 0xBA6A5F46, 0xF6200028, 0xCD210000, 0xA832FFFF,
+ 0xD7970327, 0x9B200000, 0xBA6A5F46, 0xCD210000,
+ 0xE832FFFF, 0x97970327, 0x969702A0, 0xFA6A5F46,
+ 0x92970644, 0xDB695F46, 0xCD685F46, 0xAC31FFFD,
+ 0xF6610120, 0xB4310001, 0xAF090000, 0xD0610124,
+ 0xA6970CCB, 0xE0690134, 0xCE6A0120, 0x8C61B010,
+ 0xAB2E0068, 0xC462B000, 0xC362B008, 0xB8208808,
+ 0xFB60B01C, 0xBF2300A6, 0xAF940CD0, 0xF069B024,
+ 0x0E390000, 0x62D00889, 0x49690124, 0x21208400,
+ 0x4A2D0068, 0x0361B004, 0x3B60B01C, 0x7F2300A6,
+ 0x6F940CD0, 0x1669B020, 0x32310002, 0x5AD40889,
+ 0x1B695F46, 0x4E6A0120, 0x78208808, 0x020E4000,
+ 0x57620120, 0x2B2E0068, 0x0462B000, 0x4362B008,
+ 0x3B60B01C, 0x7F2300A6, 0x6F940CD0, 0x3069B024,
+ 0x0E390000, 0x62D00889, 0x61208400, 0x3B60B01C,
+ 0x7F2300A6, 0x2F940CD0, 0x1669B020, 0x72310002,
+ 0x9AD40889, 0xC9970CD8, 0xCD685F46, 0xAF690120,
+ 0xE7600128, 0xBC30FFFE, 0x970D0000, 0xD761012C,
+ 0xDD9703A3, 0xA8615F3C, 0x9B20F000, 0xD02A0002,
+ 0xA5C4088B, 0xDF695F48, 0xCA350002, 0xBCCC088B,
+ 0xF9970210, 0x83970956, 0xA0970961, 0xE06A0154,
+ 0xB968014C, 0xF96B0140, 0xDF620150, 0x89690148,
+ 0xA7630148, 0xD80B0000, 0xC6630144, 0x9F30FFFF,
+ 0xEF090000, 0x97610140, 0xAD208001, 0xCD970D6C,
+ 0x2A970970, 0x7968014C, 0x6F6A0140, 0x09690148,
+ 0x766B0154, 0x0E0A0000, 0x1762014C, 0x5F30FFFF,
+ 0x570D0000, 0x17610140, 0x22300001, 0x570D0000,
+ 0x10610148, 0x5B200000, 0x67600144, 0x09630150,
+ 0x7C209000, 0x0E970D6A, 0x1F680148, 0x4E690140,
+ 0x0E6A014C, 0x4D084000, 0x6060014C, 0x10610148,
+ 0x36620140, 0x76010000, 0x5F30FFFF, 0x170D0000,
+ 0x7E610150, 0x3F208800, 0x0D970D6C, 0x7968014C,
+ 0x2F6A0140, 0x49690148, 0x766B0154, 0x0E0A0000,
+ 0x5762014C, 0x1F30FFFF, 0x2F090000, 0x57610140,
+ 0x7C30FFFE, 0x0E0A0000, 0x31620148, 0x49630150,
+ 0x3C209000, 0x4E970D6A, 0x7968014C, 0x09690148,
+ 0x6F6A0140, 0x06600148, 0x0D084000, 0x54038000,
+ 0x360E0000, 0x5762014C, 0x64300002, 0x200F0000,
+ 0x20630140, 0x4E208000, 0x4E970D6A, 0x1D20A000,
+ 0x4E970D6A, 0x17680154, 0x0E6A014C, 0x76010000,
+ 0xB4310001, 0xF5D40863, 0xD92C0001, 0x9F2C0002,
+ 0xE060014C, 0xB6620140, 0xB6010000, 0xDF30FFFF,
+ 0xF50C4000, 0xA7600144, 0xB6010000, 0xDF30FFFF,
+ 0x970D0000, 0xD0610148, 0xC0208200, 0x8D970D6C,
+ 0xDF680148, 0x986B014C, 0xA06A0154, 0xC1600140,
+ 0xB6010000, 0xFC30FFFE, 0xDC605F5A, 0x8E09C000,
+ 0xB1610144, 0xCB32FFFE, 0xE8625F5C, 0xA1208400,
+ 0xCD970D6C, 0x81970D7E, 0xA8970E5E, 0xC16B5F58,
+ 0x056A0160, 0x7E2F0034, 0x654BC000, 0x0B420000,
+ 0x7E370004, 0x34CC0D3E, 0x316A5F5C, 0x75200018,
+ 0x6F800E66, 0x09970CD8, 0x168001FA, 0x6860013C,
+ 0x3B97035E, 0x61230939, 0x75635F46, 0x0C200891,
+ 0x5C605F36, 0x1E970393, 0x09CC0263, 0x50970236,
+ 0x2E230897, 0x75635F46, 0x7C800213, 0x1F680148,
+ 0x0E6A014C, 0x4E690140, 0x6060014C, 0x10620144,
+ 0x760E0000, 0x1F30FFFF, 0x2F090000, 0x57610140,
+ 0xB1620148, 0xED208001, 0xCD970D6C, 0xAA970970,
+ 0xC9690148, 0xB968014C, 0xAF6A0140, 0xF66B0154,
+ 0xD7610140, 0x8E0A0000, 0x8E0A0000, 0xD762014C,
+ 0xBC30FFFE, 0xC6600148, 0xDB200000, 0xA7600144,
+ 0xC9630150, 0xBC209000, 0x8E970D6A, 0xF968014C,
+ 0x89690148, 0xEF6A0140, 0xC6600148, 0x8D084000,
+ 0xA4300002, 0xF60E0000, 0xF6620140, 0xA2300001,
+ 0xE060014C, 0xB2200010, 0x94695F52, 0xEC220000,
+ 0xB5190000, 0xCD615F52, 0xD3695F6C, 0xAF238000,
+ 0xDC635F56, 0x91484000, 0x816B5F34, 0xC92D0002,
+ 0xFF424000, 0xBA1F0000, 0xA0C80D47, 0xCB235F7A,
+ 0x9249C000, 0xFE2F0002, 0xCD1D0000, 0xBFCC08D7,
+ 0xD249C000, 0x8E390000, 0x98CC0D47, 0xF2695F56,
+ 0x8E390000, 0xFED408DA, 0xCA625F56, 0x982F0006,
+ 0xAE2E0001, 0xEA8008CC, 0xC2685F52, 0xA36B5F52,
+ 0xDE34000F, 0xBC3700F0, 0xB9CC08E2, 0xCE1C8000,
+ 0x3ACC08E4, 0x628008E6, 0x4E1C8000, 0x1FCC08E6,
+ 0x6E32FFFC, 0x018008E7, 0x0F31FFFC, 0x60198000,
+ 0x6B615F56, 0x236B5F52, 0x31310004, 0x4835000F,
+ 0x3F37000F, 0x4E1F4000, 0x6CC808FC, 0x14004000,
+ 0x63645F52, 0x2931FFF8, 0x19394001, 0x49615F6A,
+ 0x36010000, 0x51310003, 0x6C615F68, 0x1F30FFFF,
+ 0x2A2C0D06, 0x6E2308FB, 0x70884000, 0x1C605F6C,
+ 0x686A0148, 0x2F69014C, 0x18680140, 0x420D8000,
+ 0x2A31FFFE, 0x6B615F60, 0x7E6B0148, 0x0E0A0000,
+ 0x750F8000, 0x0163014C, 0x3C30FFFE, 0x58605F62,
+ 0x4B32FFFE, 0x09625F66, 0x05970C69, 0x5A200051,
+ 0x3160B444, 0x64685F56, 0x456B5F60, 0x1E34000F,
+ 0x47300003, 0x36010000, 0x2434FF00, 0x600CC000,
+ 0x1060B448, 0x6C3500FF, 0x6361B44A, 0x23685F68,
+ 0x206B5F62, 0x506A5F66, 0x76010000, 0x2434FF00,
+ 0x600CC000, 0x3660B44C, 0x2C3500FF, 0x4561B44E,
+ 0xAF62B454, 0xC8200925, 0xD321090A, 0xBF2300A6,
+ 0xEF800C80, 0xAE210001, 0xBA61015E, 0xCE208000,
+ 0xC960015C, 0x89970E08, 0xA36B5F52, 0xC5685F6C,
+ 0xBF37000F, 0xF43B0100, 0xF263B144, 0x9F21085B,
+ 0xDF2C0002, 0xAA410000, 0xA4685F56, 0xC2230D47,
+ 0x9E34000F, 0xE3645F52, 0xC7300003, 0xBA605F68,
+ 0x82800D7E, 0xC3970956, 0xE0970961, 0xB968014C,
+ 0xEF6A0140, 0x89690148, 0xB66B0154, 0xCE0A0000,
+ 0x9762014C, 0xEF6A0140, 0xC9630150, 0x97610140,
+ 0xFC30FFFE, 0x8E0A0000, 0xB1620148, 0xDB200000,
+ 0xE7600144, 0xBC209000, 0x8E970D6A, 0xCE690140,
+ 0x9F680148, 0xE86A0148, 0xD7610140, 0x8D084000,
+ 0xE060014C, 0x9F30FFFF, 0xB60E0000, 0xF1620148,
+ 0x9B200000, 0xC78008BE, 0xDF680148, 0x8E6A014C,
+ 0x8E690140, 0xE060014C, 0xD0620144, 0xAF090000,
+ 0xF60E0000, 0x97610140, 0xB1620148, 0xED208001,
+ 0x0E800D6C, 0x7968014C, 0x49690148, 0x2F6A0140,
+ 0x57610140, 0x360E0000, 0x31620148, 0x57020000,
+ 0x4B32FFFE, 0x0E0A0000, 0x17680154, 0x50620144,
+ 0x010C0000, 0x68600150, 0x40208200, 0x0E800D6C,
+ 0x6F6A0140, 0x09690148, 0x3968014C, 0x71620148,
+ 0x17610140, 0x7C30FFFE, 0x4E0A0000, 0x17680154,
+ 0x10620144, 0x410C0000, 0x68600150, 0x00208200,
+ 0x4E800D6C, 0x32635F4E, 0x0A6B5F42, 0x7A6A5F46,
+ 0x9C200008, 0xCD210000, 0xC5330002, 0xA9D0098A,
+ 0xD4038000, 0x8B32FFFE, 0xBE33FFFF, 0xD70EC000,
+ 0xC6230995, 0x94800327, 0xB19702AF, 0xFA6A5F46,
+ 0x909702A3, 0xFA6A5F46, 0xD09702A3, 0xBA6A5F46,
+ 0xD09702A3, 0xBA6A5F46, 0x909702A3, 0xFA6A5F46,
+ 0x909702A3, 0xDF695F48, 0xFA6A5F46, 0x8C350001,
+ 0xA5C809A8, 0xF6200028, 0xD9970354, 0xAC685F4A,
+ 0xF9695F4C, 0x8B32FFFE, 0x8D048000, 0xE6C409A2,
+ 0x0F2D0001, 0x60615F4C, 0x75605F4A, 0x0520FFFF,
+ 0x4D210000, 0x3A6A5F46, 0x242309A9, 0x54800327,
+ 0x52970644, 0x3A6A5F46, 0x32200010, 0x4D210000,
+ 0x2B6B5F4E, 0x54800327, 0x4320FFFC, 0x39970365,
+ 0x61361F00, 0x32C801F6, 0x31320008, 0x79620138,
+ 0x3F2A0011, 0x53C401F6, 0x7797037A, 0x316B0130,
+ 0x36010000, 0x5235FFFE, 0x57C801F4, 0x1808C000,
+ 0x56C009BE, 0x2FCC01F4, 0x096B5F44, 0x682E0002,
+ 0x23625F46, 0x7E2F0002, 0x50635F44, 0x3E33FFFF,
+ 0x4B32FFFE, 0x170EC000, 0x0B32FFFE, 0x74970385,
+ 0x57680138, 0x3E695F44, 0x01030000, 0x652B0003,
+ 0x26C409CE, 0x5D200003, 0x7C2C0003, 0x2A072000,
+ 0x793B0000, 0x0ECC01F8, 0x1B695F46, 0x642E0010,
+ 0x35034000, 0x6C31FFFD, 0x4E09C000, 0x020E4000,
+ 0x042A0800, 0x57C401F8, 0x5797029D, 0x1B200000,
+ 0x6A210120, 0x0A6B5F42, 0x3A6A5F46, 0x43330001,
+ 0xACD009E3, 0xED2309E4, 0xD4800327, 0xB19702AF,
+ 0xCC970BA4, 0xBA6A5F46, 0xB6200028, 0xCD210000,
+ 0xD7970327, 0x969702A0, 0xBE695F44, 0xCD685F46,
+ 0x8931FFFF, 0xD70D0000, 0xD0610124, 0x9F30FFFF,
+ 0xD70D0000, 0xB6610120, 0xA6970CCB, 0xE0690134,
+ 0x8E6A0120, 0xCC61B010, 0xEB2E0068, 0x8462B000,
+ 0x8362B008, 0xF8208808, 0xFB60B01C, 0xBF2300A6,
+ 0xEF940CD0, 0xB069B024, 0x8E390000, 0xC6D00A0A,
+ 0x09690124, 0x61208400, 0x4A2D0068, 0x0361B004,
+ 0x7B60B01C, 0x3F2300A6, 0x2F940CD0, 0x5669B020,
+ 0x72310002, 0x05D00A0C, 0x09970CD8, 0x558001FC,
+ 0x09970CD8, 0x4D685F46, 0x7E695F44, 0x0E6A0120,
+ 0x46600124, 0x170D0000, 0x31610128, 0x46690130,
+ 0x176B0134, 0x7C30FFFE, 0x760E0000, 0x3662012C,
+ 0x28630130, 0x79610134, 0x6C220000, 0x09625F3C,
+ 0x6920E000, 0x39970210, 0x14680164, 0x67690150,
+ 0x98380000, 0xE0D00E47, 0xF66B0154, 0x896A0144,
+ 0xF968014C, 0x98610154, 0xB82F0001, 0xC9630150,
+ 0xCE690140, 0x9762014C, 0x81600140, 0xD4004000,
+ 0x820D8000, 0xD0610148, 0xE832FFFF, 0xAC088000,
+ 0xE7600144, 0x80208200, 0x8D970D6C, 0xF5680168,
+ 0xB66B0154, 0xD8380000, 0xE0D00E47, 0x8E6A014C,
+ 0x89690148, 0xC9630150, 0xF1620148, 0xBA098000,
+ 0xD7610140, 0x820D8000, 0xA832FFFF, 0xC20D8000,
+ 0xB661014C, 0xDB20F000, 0xCD970D6C, 0x9F680148,
+ 0xEF69014C, 0xAF6A0140, 0xBA230000, 0xC6630144,
+ 0xE060014C, 0x970D0000, 0x90610148, 0xF60E0000,
+ 0xB6620140, 0xED208001, 0xCD970D6C, 0xA86A0148,
+ 0xF968014C, 0x8E690140, 0xB66B0154, 0xF6620140,
+ 0xB60E0000, 0xDF30FFFF, 0xF60E0000, 0xB1620148,
+ 0xAF090000, 0xF1610144, 0xFE33FFFF, 0x89630150,
+ 0xE7208010, 0x8D970D6C, 0x82690164, 0xF968014C,
+ 0x0E390000, 0x60D00E47, 0x4E690140, 0x286A0148,
+ 0x506B0150, 0x10610148, 0x36620140, 0x782F0001,
+ 0x49630150, 0x2F090000, 0x31610144, 0x6D208001,
+ 0x0D970D6C, 0x466A0150, 0x766B0154, 0x3968014C,
+ 0x49690148, 0x170EC000, 0x1F620150, 0x600F0000,
+ 0x1D33FFFE, 0x7E635F5C, 0x5F6B0144, 0x17610140,
+ 0x180B0000, 0x67630148, 0x7C30FFFE, 0x180B0000,
+ 0x46630144, 0x00208200, 0x0D970D6C, 0x41970D7E,
+ 0xA3690168, 0xF16A5F5C, 0xCE390000, 0xA0D00E47,
+ 0xE8970E5E, 0xB5200018, 0xAF800E66, 0xE020FFFD,
+ 0xF9970365, 0xA1361F00, 0xB2C801F6, 0xF1320008,
+ 0xB9620138, 0xFF2A0011, 0xD3C401F6, 0xB797037A,
+ 0xF16B0130, 0xB6010000, 0x9235FFFE, 0xD7C801F4,
+ 0x9808C000, 0xDBC00A97, 0xEFCC01F4, 0x896B5F44,
+ 0xA82E0002, 0xE3625F46, 0xFE2F0002, 0x90635F44,
+ 0xC100C000, 0xBE33FFFF, 0xA00F0000, 0xCB32FFFE,
+ 0x170EC000, 0x4B32FFFE, 0x74970385, 0x17680138,
+ 0x7E695F44, 0x01030000, 0x252B0003, 0x64C40AA9,
+ 0x5D200003, 0x3F2C0005, 0x2A072000, 0x793B0000,
+ 0x0ECC01F8, 0x5B695F46, 0x642E0010, 0x2A31FFFE,
+ 0x420E4000, 0x042A0800, 0x17C401F8, 0x5797029D,
+ 0x1B200000, 0x4D210000, 0x5F6A5F44, 0x17970327,
+ 0x0C970BA4, 0x7A6A5F46, 0x76200028, 0x0D210000,
+ 0x6832FFFF, 0x17970327, 0x169702A0, 0x68685F44,
+ 0x1B695F46, 0x57020000, 0x75034000, 0x1F30FFFF,
+ 0x4931FFFF, 0x140C8000, 0x06600124, 0x750C4000,
+ 0x67600128, 0x200CC000, 0x20600120, 0x66970CCB,
+ 0x20690134, 0x496A0128, 0x5F610130, 0x0C61B010,
+ 0x6B2E0068, 0x0462B000, 0x0362B008, 0x78208808,
+ 0x3B60B01C, 0x7F2300A6, 0x6F940CD0, 0x3069B024,
+ 0x0E390000, 0x73D40ADC, 0x49970CD8, 0x168001FA,
+ 0x49690124, 0x21208400, 0x0A2D0068, 0x4361B004,
+ 0xBB60B01C, 0xFF2300A6, 0xEF940CD0, 0x9669B020,
+ 0xF2310002, 0xB0D40ADA, 0x8E6A0120, 0xF8208808,
+ 0xEB2E0068, 0x8462B000, 0x8362B008, 0xFB60B01C,
+ 0xBF2300A6, 0xEF940CD0, 0xF069B024, 0x8E390000,
+ 0xC8D00ADA, 0xA1208400, 0xBB60B01C, 0xFF2300A6,
+ 0xAF940CD0, 0xD669B020, 0xF2310002, 0xB0D40ADA,
+ 0x89970CD8, 0xCD685F46, 0xEF690120, 0xA7600128,
+ 0xD70D0000, 0x9761012C, 0xAC220000, 0xC9625F3C,
+ 0x9B20F000, 0xF9970210, 0xDF680148, 0x8E6A014C,
+ 0xCE690140, 0xA060014C, 0x90620144, 0xEF090000,
+ 0xD7610140, 0xB60E0000, 0xB1620148, 0xED208001,
+ 0x8D970D6C, 0xF968014C, 0xC9690148, 0xAF6A0140,
+ 0xD7610140, 0xA3018000, 0x970D0000, 0xD0610148,
+ 0x9F30FFFF, 0xCE0A0000, 0xD7680154, 0x90620144,
+ 0x810C0000, 0xE8600150, 0xC0208200, 0x8D970D6C,
+ 0xE06A0154, 0xB968014C, 0xB96B0140, 0xDF620150,
+ 0x09690148, 0x67630148, 0x580B0000, 0x06630144,
+ 0x5F30FFFF, 0x2F090000, 0x17610140, 0x6D208001,
+ 0x4D970D6C, 0x3968014C, 0x2F6A0140, 0x49690148,
+ 0x31620148, 0x4E0A0000, 0x57680154, 0x10620144,
+ 0x57610140, 0x010C0000, 0x28600150, 0x40208200,
+ 0x0D970D6C, 0x7968014C, 0x766B0154, 0x09690148,
+ 0x2F6A0140, 0x49630150, 0x57610140, 0x36695F58,
+ 0x4E0A0000, 0x1762014C, 0x2F2D0030, 0x664A4000,
+ 0x2F2D0006, 0x47494000, 0x673607FC, 0x13320002,
+ 0x79620154, 0x14038000, 0x03330001, 0x7ED40B49,
+ 0x6E2E0001, 0x282E0002, 0x10620144, 0x6832FFFF,
+ 0x31620148, 0x40351F00, 0x50310008, 0x39610158,
+ 0x6920E000, 0x0D970D6C, 0x3E680144, 0x4E6A014C,
+ 0x0E690140, 0x506B0150, 0x760E0000, 0x1762014C,
+ 0x0100C000, 0x43330001, 0x52D40B5C, 0x192C0001,
+ 0x5F2C0002, 0x1F30FFFF, 0x170D0000, 0x57610140,
+ 0x8D210000, 0xD0610148, 0xE920E000, 0x8D970D6C,
+ 0xD06B0150, 0x97680154, 0x8E6A014C, 0xC163014C,
+ 0xE8600150, 0x8E600154, 0x81030000, 0xC3330001,
+ 0xB4D40B6E, 0xD92C0001, 0xDF2C0002, 0x90620144,
+ 0xCE0A0000, 0xB6620140, 0x9F30FFFF, 0xF60E0000,
+ 0xB1620148, 0xED208001, 0xCD970D6C, 0x89690148,
+ 0x896A0144, 0xD06B0150, 0xD7610140, 0xB1620148,
+ 0xC100C000, 0xBE33FFFF, 0x89630150, 0xCE600154,
+ 0x01030000, 0x43330001, 0x5BD40B84, 0x192C0001,
+ 0x5F2C0002, 0x27600144, 0x00208200, 0x4D970D6C,
+ 0x68690144, 0x286A0148, 0x3968014C, 0x766B0154,
+ 0x36620140, 0x49630150, 0x4E600154, 0x01030000,
+ 0x43330001, 0x12D40B93, 0x192C0001, 0x5F2C0002,
+ 0x2060014C, 0x7A0A4000, 0x71620148, 0x3C30FFFE,
+ 0x0E0A0000, 0x50620144, 0x40208200, 0x0D970D6C,
+ 0x49690148, 0x206A0154, 0x186B014C, 0x57610140,
+ 0x9F620150, 0xFE33FFFF, 0xCE09C000, 0xA3800878,
+ 0xF2635F4E, 0x8A6B5F42, 0x9C200008, 0xCD210000,
+ 0xDF6A5F44, 0x85330002, 0x86D00BB0, 0xEC6B5F46,
+ 0xA832FFFF, 0xD70EC000, 0xEF230BC0, 0x94800327,
+ 0xF19702AF, 0x9F6A5F44, 0x909702A3, 0xDF6A5F44,
+ 0xAC685F4A, 0xF9695F4C, 0xCB32FFFE, 0x8D048000,
+ 0xA5C40BBB, 0xCF2D0001, 0xE0615F4C, 0xB5605F4A,
+ 0xFA6A5F46, 0x8520FFFF, 0x8D210000, 0xF19702AF,
+ 0xBA6A5F46, 0xF2200010, 0xCD210000, 0xAB6B5F4E,
+ 0xD4800327, 0x93800200, 0x81030000, 0xC637FFFF,
+ 0xEECC0200, 0xAE2C0BCB, 0xB0884000, 0xE9800BCC,
+ 0x9A970364, 0xDF20000E, 0xFE97036D, 0xA43C000E,
+ 0xEFCC01F4, 0x952001FF, 0xBE97036D, 0xFE605F3C,
+ 0xBF340003, 0xEFCC01F4, 0xC92E000E, 0x8B32FFFE,
+ 0xB4970385, 0xD797029D, 0xE822000E, 0x9B200000,
+ 0xCD210000, 0x97970327, 0xA0685F34, 0xC92101D8,
+ 0x1F610106, 0x7D2C0008, 0x73490000, 0x1F2C0002,
+ 0x65480000, 0x23615F4A, 0x36605F4C, 0x67685F3C,
+ 0x58695F40, 0x3C30FFFE, 0x1B605F3E, 0x6F090000,
+ 0x02C40BEE, 0x57605F40, 0x502001A0, 0x2A230BF3,
+ 0x6C600104, 0x3D635F36, 0x3D8002D7, 0x72200010,
+ 0x2C600104, 0x58800420, 0x529700EB, 0x2A220003,
+ 0x2F62B438, 0x56695FCA, 0x42685EDE, 0x2C220000,
+ 0x4A61B400, 0x2862B406, 0x18380000, 0x7CC8009C,
+ 0x15340080, 0x43C80C05, 0x6F200C16, 0x27230C06,
+ 0x5A8000AB, 0x1B605EDE, 0x24685EEC, 0x5E23009C,
+ 0x6C220000, 0x0A625EEC, 0x14695EDE, 0x5B6A5EF0,
+ 0x18380000, 0x7AC800F3, 0x60198000, 0x176A5F02,
+ 0x60198000, 0x396A5EA0, 0x1CD000AB, 0x5E36FDFF,
+ 0x20625EA0, 0x5A8000AB, 0x51215EDE, 0x2F220006,
+ 0x04970F9D, 0x77215EEC, 0x70510000, 0x30510000,
+ 0x70884000, 0x2F220030, 0x2F62B438, 0x70695FCE,
+ 0xAC685EF0, 0xEC220000, 0xE061B420, 0x8262B426,
+ 0xD8380000, 0x9FC8009D, 0x95340080, 0xEDC80C2B,
+ 0xE5200C31, 0xAF230C2C, 0x9A8000AB, 0xF5605EF0,
+ 0xA8685EFE, 0xFD23009D, 0xEC220000, 0x86625EFE,
+ 0xE1800C0A, 0xBF215EF0, 0xAF220006, 0xC4970F9D,
+ 0xBB215EFE, 0xF0510000, 0xF0510000, 0xB0884000,
+ 0xAF220300, 0xEF62B438, 0xF0695FCE, 0xA0685F02,
+ 0xEC220000, 0x8161B440, 0xA362B446, 0xD8380000,
+ 0x99C8009E, 0xD5340080, 0xCEC80C46, 0xAF200C4C,
+ 0xCF230C47, 0x9A8000AB, 0xB9605F02, 0xEC685F10,
+ 0xFB23009E, 0xAC220000, 0x82625F10, 0xE1800C0A,
+ 0xB3215F02, 0xEF220006, 0xC4970F9D, 0xBF215F10,
+ 0xF0510000, 0xB0510000, 0xB0884000, 0xC2685EDE,
+ 0x91215EDE, 0xD8380000, 0xC0D00C5F, 0xA1205EEC,
+ 0xA5518000, 0xE6500000, 0xD8695EA0, 0xA6500000,
+ 0xC0390200, 0x81615EA0, 0x918B4000, 0xC100C000,
+ 0x2F220006, 0x7F2300A6, 0x67800FC0, 0x2C685EF0,
+ 0x7F215EF0, 0x18380000, 0x00D00C5F, 0x6D205EFE,
+ 0x66800C58, 0x20685F02, 0x33215F02, 0x58380000,
+ 0x00D00C5F, 0x69205F10, 0x66800C58, 0x02685EDE,
+ 0x51215EDE, 0x18380000, 0x3FD40C57, 0x588000A6,
+ 0x2C685EF0, 0x7F215EF0, 0x58380000, 0x1ED000A6,
+ 0x2D205EFE, 0x66800C58, 0x7D605EEC, 0x0E615EEE,
+ 0x518B4000, 0x31605EFE, 0x0A615F00, 0x518B4000,
+ 0xB5605F10, 0xC6615F12, 0xD18B4000, 0xAC685EF0,
+ 0xCD210000, 0x98380000, 0xA5C80C94, 0xEF61B434,
+ 0xD16A5FCE, 0xA361B426, 0x8162B420, 0xD5340080,
+ 0x85C80C93, 0xD4635E9C, 0xFF215EF0, 0xAF220006,
+ 0xC4970F9D, 0x8D6B5E9C, 0x9A8000AB, 0xE3615EF0,
+ 0x918B4000, 0xD7620116, 0xC7200C98, 0x9A8000AB,
+ 0x86970C6F, 0xCE6A0116, 0xE620B404, 0xAC500011,
+ 0xE0500003, 0xA850C400, 0x85500001, 0xC7500180,
+ 0x26500000, 0x6462B414, 0x5E2000A6, 0x082100A6,
+ 0x7F2300A6, 0x29800C7A, 0x20690102, 0x5B200000,
+ 0x45350020, 0x14C801F2, 0x18218000, 0x6F615ED4,
+ 0x3D605EDA, 0x7E605EDC, 0x518B4000, 0x36695ED4,
+ 0x58380000, 0x3AC800F3, 0x0E390000, 0x49D400EF,
+ 0x3D605EDA, 0x518B4000, 0x76695ED4, 0x18380000,
+ 0x3AC800F3, 0x4E390000, 0x49D400EF, 0x3E605EDC,
+ 0x518B4000, 0x20685ED4, 0x33215ED4, 0x58380000,
+ 0x24D400F1, 0x70510000, 0x518B4000, 0x18695ECC,
+ 0x63685ED2, 0x0E390000, 0x27D4009B, 0x58380000,
+ 0x5CC8009B, 0x3E23009B, 0x1A8000AB, 0x5D215ECC,
+ 0x25518000, 0x5B200000, 0x7A605ED2, 0x118B4000,
+ 0x58695ECC, 0x3A605ED2, 0x0E390000, 0x58695EA0,
+ 0x09D400EF, 0x49390008, 0x41615EA0, 0x118B4000,
+ 0x396A5EA0, 0x4E685ECC, 0x5D215ECC, 0x1736FFF7,
+ 0x60625EA0, 0x18380000, 0x24D400F1, 0x70510000,
+ 0x918B4000, 0xC2685F52, 0xD8218000, 0xB6144000,
+ 0xE6CC00A0, 0x8D615F52, 0xBC2300A0, 0xEC200CE9,
+ 0xDA8000AB, 0xB4200400, 0x9360B144, 0xC3210200,
+ 0x8A68B144, 0xDE34000F, 0xF5190000, 0x8561B144,
+ 0xE3645F52, 0xB6010000, 0x90310008, 0xE839A0C8,
+ 0xB04B4000, 0xE72D002C, 0xC7494000, 0x97020000,
+ 0x83330001, 0xD0377F00, 0xC963010A, 0xB0320003,
+ 0xCD625F68, 0x97020000, 0x8832FFF8, 0xF83A4001,
+ 0xA8625F6A, 0xD7020000, 0xE832FFFF, 0x9D2E0D06,
+ 0xE2230D1A, 0x878A4000, 0xAA205F7A, 0xD18B4000,
+ 0xC9205F82, 0x918B4000, 0x8E205F8A, 0xD18B4000,
+ 0xA0205F92, 0xD18B4000, 0xE7205F9A, 0x918B4000,
+ 0xE3205FA2, 0x918B4000, 0xA4205FAA, 0xD18B4000,
+ 0x8A205FB2, 0xD18B4000, 0xCD205FBA, 0x918B4000,
+ 0x82205FC2, 0xD18B4000, 0xDC605F6C, 0xB3490000,
+ 0xDF2C0002, 0x844B0000, 0x9F2C0002, 0xD24A0000,
+ 0x1F2C0002, 0x65480000, 0x6F615F58, 0x1C635F56,
+ 0x6B625F5A, 0x1F605F5C, 0x27970E26, 0x716A5F5C,
+ 0x536B010C, 0x2F3A0000, 0x0BC80D36, 0x6C213000,
+ 0x3A098000, 0x6C0B4000, 0x5861010E, 0x32C00D31,
+ 0x7ECC0E45, 0x05685F5A, 0x29230D36, 0x79635F54,
+ 0x026B5F68, 0x66800E2B, 0x6769010A, 0x056B5F56,
+ 0x10310008, 0x4AC80D67, 0x576A5F58, 0x22390080,
+ 0x4B2E0035, 0x07458000, 0x01970D7E, 0x42685F52,
+ 0x24230D43, 0x4B341000, 0x59CC102C, 0x1D2000A0,
+ 0x40645F53, 0x36695F58, 0x1E970273, 0x4169010E,
+ 0x4D223000, 0x3A0A4000, 0x2CC80D63, 0x54680108,
+ 0x32620114, 0x58380000, 0x69C80D50, 0x00970C95,
+ 0x45970C69, 0x0169010E, 0x2D20B444, 0x6C500011,
+ 0x05500001, 0x6850C400, 0x45500001, 0x3135FFFF,
+ 0x2A410000, 0x6B6A0114, 0x5F2C0002, 0x26500000,
+ 0x6F62B454, 0x0A200D61, 0x1C210D61, 0x7F2300A6,
+ 0xAF800C80, 0xFA203000, 0xCE60010E, 0x8D210000,
+ 0xDB610108, 0x8D615F52, 0x988000A6, 0xEC220000,
+ 0xDB62015E, 0x918B4000, 0xAE210001, 0xFA61015E,
+ 0x8960015C, 0xDC635F56, 0xC9970E08, 0xA36B5F52,
+ 0xC5685F6C, 0xBF37000F, 0xB43B0100, 0xF263B144,
+ 0xB2695F56, 0xDF2C0002, 0xEA410000, 0x93695F5A,
+ 0x9F2C0002, 0xEA410000, 0xD0695F5C, 0x9F2C0002,
+ 0xEA410000, 0xA5800D47, 0x82685F52, 0xFA69B140,
+ 0x3C30FFFE, 0x53D0038F, 0x79635F54, 0x24300002,
+ 0x41030000, 0x1E34000F, 0x3E3CFFFF, 0x79228000,
+ 0x4D120000, 0x181D8000, 0x2361B140, 0x796A5EA0,
+ 0x38CC0D8F, 0x7636FFFB, 0x60625EA0, 0x2A3B2000,
+ 0x63685F32, 0x3A635F52, 0x0D344000, 0x6AC80D99,
+ 0x05685F36, 0x599700AB, 0x41685F54, 0x3F2300A6,
+ 0x1A8000AB, 0x42685F52, 0x7A69B140, 0x2F238000,
+ 0x5E34000F, 0x17020000, 0x093EFFFF, 0x4E138000,
+ 0x9419C000, 0xE361B140, 0xFF30FFF8, 0x9438A084,
+ 0xCC500020, 0xBD680118, 0x97695F54, 0xC218C000,
+ 0xE4600118, 0xBA1CC000, 0xB8CC0DE3, 0xF161011E,
+ 0xA3685F68, 0xE363011C, 0xC160011A, 0x85970C69,
+ 0xF96B011A, 0xAD20B444, 0x8E500041, 0xC5500001,
+ 0x87500180, 0xE6500000, 0xF602C000, 0x9336FF00,
+ 0x8162B44C, 0xDB3700FF, 0xF263B44E, 0xBF222000,
+ 0xEF62B454, 0x9F6B011E, 0x9B200000, 0xE760011E,
+ 0xB93B0000, 0xD2CC0DC3, 0xFF2300A6, 0xAC200DC6,
+ 0xFA210DC6, 0xAF800C80, 0x9B68011C, 0xFA69B140,
+ 0xCA6A0118, 0x8D1D0000, 0xA361B140, 0xEC1E0000,
+ 0x93620118, 0xE2C80DDF, 0xDB200000, 0xAE210001,
+ 0xD4038000, 0x97174000, 0xBECC0DD6, 0xD92C0001,
+ 0x8931FFFF, 0xC0800DD0, 0xD461011C, 0x87300003,
+ 0xB5695F32, 0xC160011A, 0xDB354000, 0xAAC80DAF,
+ 0xE9200DAF, 0xA46B5F36, 0x9A8000AB, 0xE3685F32,
+ 0x13695F36, 0x4D344000, 0x5DC800A6, 0x26894000,
+ 0x6F3A0000, 0x10C8038F, 0x3D635F36, 0x4D6B5F4A,
+ 0x6C600104, 0x1F610106, 0x2C625F3E, 0x71635F48,
+ 0x27970C63, 0x75680104, 0x676A0106, 0x286B5F48,
+ 0x7160B428, 0x1E21B42A, 0x30510000, 0x4100C000,
+ 0x2434FF00, 0x541A0000, 0x6062B42C, 0x1B3700FF,
+ 0x1363B42E, 0x756A5F3E, 0x73200041, 0x1060B424,
+ 0x4E62B434, 0x32210DEC, 0x3F2300A6, 0x6B940C7D,
+ 0xA46B5F36, 0xD18B4000, 0xFD635F36, 0xBC200120,
+ 0xCD210000, 0x86220020, 0x8E6B5F4C, 0xC4800DE8,
+ 0xF9635F54, 0xA76B5F6A, 0x9D200140, 0xCD210000,
+ 0x86220020, 0xFD605F60, 0xCE615F62, 0x89625F66,
+ 0xDB635F5E, 0x85970C69, 0xA4685F60, 0xF66A5F62,
+ 0x826B5F5E, 0xD060B448, 0xFF21B44A, 0xB0510000,
+ 0x8100C000, 0xE434FF00, 0xD41A0000, 0x8162B44C,
+ 0xDB3700FF, 0xB263B44E, 0x906A5F66, 0xF3200041,
+ 0x3160B444, 0x6F62B454, 0x46200E43, 0x17210E11,
+ 0x7F2300A6, 0x2F800C80, 0x39635F54, 0x5B200000,
+ 0x4B210140, 0x2722002C, 0x276B5F6A, 0x7D605F60,
+ 0x0E615F62, 0x49625F66, 0x5B635F5E, 0x05970C69,
+ 0x546A5F5E, 0x24685F60, 0x17695F62, 0x54038000,
+ 0x0537FF00, 0x4218C000, 0x5060B448, 0x0D3600FF,
+ 0x0262B44A, 0x6061B44C, 0x5B200000, 0x1360B44E,
+ 0x506A5F66, 0x11200011, 0x3160B444, 0x6F62B454,
+ 0x10210E2F, 0x7F2300A6, 0x4D940C80, 0x206B5F54,
+ 0x518B4000, 0x25210041, 0x2F800D3A, 0x44210021,
+ 0x6F800D3A, 0x176A5F58, 0x02690164, 0x602E0028,
+ 0x0E390000, 0x4BD00E5A, 0x6F090000, 0x2A31FFFE,
+ 0x75680168, 0x3F418000, 0x3734001F, 0x682E0002,
+ 0x29408000, 0x75008000, 0x5F2C0002, 0x26500000,
+ 0x26500000, 0x518B4000, 0x4E208000, 0x29408000,
+ 0x5B200000, 0x29800E53, 0x20685F58, 0x4D210000,
+ 0x972C0028, 0xE6500000, 0xE6500000, 0xA6500000,
+ 0xEA410000, 0x918B4000, 0xAE230D3E, 0xE73607FC,
+ 0xD0C8038F, 0xB9635F54, 0x816B5F58, 0xC9625F66,
+ 0xA00CC000, 0xC44B0000, 0xDF2C0002, 0xA5480000,
+ 0xF9635F62, 0xB66B010E, 0x9B605F64, 0xF60DC000,
+ 0x9B610108, 0xE4970C53, 0xC1685F62, 0x94695F64,
+ 0xBD60B40C, 0xCE61B40E, 0xD4680108, 0x906A5F66,
+ 0xF421B40A, 0x9B60B408, 0xB0510000, 0xD4200081,
+ 0x3A60B404, 0x6462B414, 0x41685F54, 0x10210E75,
+ 0x7F2300A6, 0x29800C7A, 0x36695F6E, 0x4E208000,
+ 0x54150000, 0x25C80E8B, 0x118B4000, 0x796A5EA0,
+ 0x39605F6E, 0x6D200E91, 0x7536FFFD, 0x20625EA0,
+ 0x5A8000AB, 0x2A685FDC, 0x36695F6E, 0x58380000,
+ 0x0AC80EF4, 0x54605F70, 0x712C0040, 0x33490000,
+ 0x17655F6E, 0x5C65B112, 0x6F31FFFB, 0x312D4010,
+ 0x664A4000, 0x2F6BB110, 0x092D0002, 0x6F0AC000,
+ 0x9BC00EE8, 0xF04B4000, 0xD62DFFF6, 0xB93B0000,
+ 0xF7D40EAD, 0x8D685F70, 0xA02D0012, 0xE64A4000,
+ 0xD42C0042, 0x844B0000, 0xB82DFFEE, 0xEF1F8000,
+ 0x9FCC0EEA, 0xD4004000, 0xFB215F72, 0x8F970FDD,
+ 0xFE695F72, 0xB92C0006, 0xA9350003, 0xDACC0EEF,
+ 0xBB215F72, 0xF422FFFC, 0xE1970FF3, 0x8D685F70,
+ 0xB9215FDC, 0xE0970F5B, 0xE6971027, 0xA4970C53,
+ 0xEC6B5F70, 0xA8685F72, 0xBD695F74, 0xD522B40A,
+ 0xBA63B408, 0xD1520000, 0xFD60B40C, 0x8E61B40E,
+ 0xD4200081, 0xBA60B404, 0x90200040, 0xD360B414,
+ 0xD0210EBA, 0xBF2300A6, 0x8B940C7A, 0xE0685F6E,
+ 0xBC695FEA, 0xFA3400FF, 0xF930FFFB, 0x852C401A,
+ 0xC44B0000, 0x8F2D0001, 0xB82F0001, 0xDD430000,
+ 0x802CFFF6, 0xD24A0000, 0xF92C0006, 0x844B0000,
+ 0xA5615FEA, 0xF82F0001, 0xEF0AC000, 0xA5C40EDD,
+ 0xFA230000, 0x9D430000, 0x976A5F6E, 0xCD685F70,
+ 0x0D3600FF, 0x5D3A1000, 0x4A62B130, 0x06970F33,
+ 0x4E208000, 0x39605F6E, 0x0C230E91, 0x7C800115,
+ 0x66210088, 0x34655F6F, 0x0D685F70, 0x76695F6E,
+ 0x3E2C0038, 0x65480000, 0x4E800E93, 0x3F9700F5,
+ 0x4D685F70, 0x39215FDC, 0x21230EE3, 0x63800F5B,
+ 0x396A5EA0, 0x5E350800, 0x6F615F6E, 0x1DC800A6,
+ 0x0A3A0002, 0x60625EA0, 0x588000A6, 0x2B68B148,
+ 0x62300001, 0x20D00F04, 0x21300007, 0x62D00F09,
+ 0x06300008, 0x7E3CFFFF, 0x4A64B148, 0x3F80009F,
+ 0x7A230000, 0x1363B148, 0x3C635FF2, 0x59635FF0,
+ 0x6D800EFE, 0x07710048, 0x29710149, 0x5471804B,
+ 0x01800F0B, 0x40685FFC, 0x736AB1F8, 0x2434FF00,
+ 0x46300008, 0x192C0001, 0x21361F00, 0x71320008,
+ 0x0E0A0000, 0x41C000F9, 0x7F225E90, 0x3930FFFB,
+ 0x0E2C4000, 0x4E0A0000, 0x63C000F3, 0x37605FD2,
+ 0x43625FD4, 0x122A000F, 0x0EC000ED, 0x518B4000,
+ 0x88685FD6, 0xFB695FD4, 0xD8380000, 0x8FC80F27,
+ 0xF3490000, 0x87615FD6, 0x918B4000, 0xF9290044,
+ 0xD1C00F2F, 0xAE685FD2, 0xA2615FD4, 0xF6010000,
+ 0x812D0044, 0xE1615FD2, 0xD18B4000, 0x9B1C0000,
+ 0xF7605FD2, 0xB4605FD4, 0x918B4000, 0xDE695FD6,
+ 0x98380000, 0xFAC800F3, 0xEA410000, 0x91605FD6,
+ 0x918B4000, 0xCE390000, 0xD7C800ED, 0xA64A4000,
+ 0xD8380000, 0xBAC800F3, 0x88404000, 0xEF3A0000,
+ 0xAEC80F47, 0xDB2C003A, 0xCB420000, 0x892E0038,
+ 0xC32CFFC6, 0xA9408000, 0x918B4000, 0xD12DFFFE,
+ 0xC8404000, 0x918B4000, 0x8E390000, 0xD7C800ED,
+ 0xA64A4000, 0xD8380000, 0xFAC800F3, 0x88404000,
+ 0xEF3A0000, 0xA0C80F58, 0xBE2C0038, 0xCB420000,
+ 0xAC2E003A, 0xC72CFFC8, 0xE9408000, 0x918B4000,
+ 0x892D0002, 0xC8404000, 0xD18B4000, 0x8E390000,
+ 0xD7C800ED, 0x98380000, 0xBAC800F3, 0xF6635E96,
+ 0x1B2C003A, 0x444B0000, 0x472CFFFE, 0x124A0000,
+ 0x793B0000, 0x20C80F6E, 0x2F3A0000, 0x4CC80F7B,
+ 0x5F2F0038, 0x2A42C000, 0x2C2E003A, 0x662FFFC8,
+ 0x08438000, 0x4B800F76, 0x7F424000, 0x2F3A0000,
+ 0x6BC80F74, 0x2C2E003A, 0x08438000, 0x4B800F76,
+ 0x092D0002, 0x7F424000, 0x66500000, 0x26500000,
+ 0x2F6B5E96, 0x662CFFC4, 0x518B4000, 0x092D0002,
+ 0x7F424000, 0x1F2F0038, 0x2A42C000, 0x4B800F76,
+ 0x95320001, 0xC5367FFF, 0xC6C80F93, 0xB22A0008,
+ 0xD7C00F8F, 0xA6500000, 0xA6500000, 0xE6500000,
+ 0xE6500000, 0xA6500000, 0xA6500000, 0xE6500000,
+ 0xA6500000, 0xC6C80F93, 0xEA800F83, 0x93260008,
+ 0xE6500000, 0x932EFFFF, 0xB8CC0F90, 0xD18B4000,
+ 0x93635E94, 0xC4970F9D, 0xCA6B5E94, 0x9A8000AB,
+ 0x93635E94, 0xC4970F9D, 0xC1030000, 0xAB685E94,
+ 0xDA8000AB, 0x91484000, 0xA7615E92, 0xD4605E90,
+ 0x06300008, 0x55D40FBE, 0x76635E96, 0x1634007F,
+ 0x5F30FFFF, 0x092D0002, 0x170D0000, 0x704B4000,
+ 0x62300001, 0x192C0001, 0x1B695E90, 0x6C1E0000,
+ 0x3FCC0FAE, 0x5B200000, 0x63024000, 0x1B368000,
+ 0x4035007F, 0x0D1D0000, 0x3E695E92, 0x4BC80FBC,
+ 0x31320008, 0x541A0000, 0x4F2D0001, 0x07464000,
+ 0x0100C000, 0x6F6B5E96, 0x58380000, 0x118B4000,
+ 0x7F424000, 0x28800FB8, 0x1B1C0000, 0x518B4000,
+ 0x14605E90, 0x51484000, 0x45625E94, 0x06300008,
+ 0x71D40FDB, 0x17020000, 0x06300008, 0x5634007F,
+ 0x6136007F, 0x2C1E0000, 0x17C800ED, 0x5F30FFFF,
+ 0x3A6A5E90, 0x67615E92, 0x492D0002, 0x170D0000,
+ 0x7F424000, 0x1C6A5E94, 0x3E695E92, 0x62300001,
+ 0x192C0001, 0x6C1E0000, 0x74CC0FD8, 0x1B200000,
+ 0x34380080, 0x70444000, 0x518B4000, 0x1B200000,
+ 0x46800FCC, 0x36635E96, 0x044B0000, 0x5F2C0002,
+ 0xA9434000, 0xD24A0000, 0xC92D0002, 0xBF424000,
+ 0xD71B8000, 0x9F2C0002, 0x924A0000, 0xC92D0002,
+ 0xFF424000, 0x971B8000, 0x9F2C0002, 0xD24A0000,
+ 0x892D0002, 0xFF424000, 0xF51AC000, 0xAF6B5E96,
+ 0xDF2C0002, 0x892D0002, 0x918B4000, 0xD4605E90,
+ 0xA7615E92, 0xF6635E96, 0xF3490000, 0x940C8000,
+ 0xA5480000, 0xCE390000, 0xE1C8101A, 0xA1340FFC,
+ 0xCFC81002, 0xAA280041, 0x96C01002, 0xCB240041,
+ 0xAA072000, 0xCF801007, 0xCC31FFFA, 0xA3024000,
+ 0xF436FFC0, 0xB5034000, 0xBC37003F, 0xFE695E92,
+ 0xD1484000, 0x8D048000, 0x88404000, 0xC92D0002,
+ 0x91484000, 0xD604C400, 0xC8404000, 0x80C4101A,
+ 0xC92D0002, 0x91484000, 0xAC220000, 0xE2048400,
+ 0x88404000, 0xC0C4101A, 0xC92D0002, 0x91484000,
+ 0xA2048400, 0xC8404000, 0xEF6B5E96, 0x8D685E90,
+ 0xD18B4000, 0x8A685F14, 0x99215F14, 0xD8380000,
+ 0x05D01023, 0x65518000, 0x518B4000, 0x0100C000,
+ 0x49220002, 0x3F2300A6, 0x27800FC0, 0x4A685F14,
+ 0x5D215F1A, 0x18380000, 0x05D01023, 0x518B4000,
+ 0x0A685F14, 0x59215F14, 0x58380000, 0x24D400F1,
+ 0x55340080, 0x0FC81034, 0x09220002, 0x42800F98,
+ 0x30510000, 0x4E685F1A, 0x54635E9C, 0x18380000,
+ 0x33CC103A, 0x518B4000, 0x5D215F1A, 0x09220002,
+ 0x60970F94, 0x0D6B5E9C, 0x29801035, 0x60000000,
+ 0x20000000
+};
+
+// Align to PKA_BUFFER_RAM_SIZE. This is greater than the actual buffer
+// length so that the image is zero padded.
+static const uint32_t fw1_farm_img_data_buf[2048] =
+{
+ 0x267001C9, 0x132040FA, 0x26502421, 0x032040D0,
+ 0x295046C7, 0x0D500000, 0x258C0200, 0x0F70AAC9,
+ 0x3B7000C8, 0x2D70001D, 0x2670001F, 0x296A4010,
+ 0x086B4014, 0x39621FF8, 0x16631FF4, 0x15684000,
+ 0x34694004, 0x1E601FF6, 0x3F611FF2, 0x346A4008,
+ 0x156B400C, 0x32621FFA, 0x1B631FF0, 0x219700BB,
+ 0x1E684034, 0x2170001E, 0x3A34003F, 0x281A0000,
+ 0x3F621FFE, 0x0628000B, 0x20C4004A, 0x1124002C,
+ 0x21884000, 0x2980004A, 0x30800033, 0x22800048,
+ 0x3480003E, 0x2980004A, 0x2C800040, 0x2C80002C,
+ 0x3980003A, 0x27800042, 0x21800044, 0x2A800046,
+ 0x276A4018, 0x34621FFC, 0x339701D9, 0x09300002,
+ 0x39D00063, 0x3930FFFE, 0x36800059, 0x276A4018,
+ 0x34621FFC, 0x2A97025F, 0x09300002, 0x39D00063,
+ 0x3930FFFE, 0x34800064, 0x2E970327, 0x268C0400,
+ 0x16614018, 0x36800059, 0x2F970733, 0x36800059,
+ 0x2A9706EF, 0x36800059, 0x29970735, 0x36800059,
+ 0x319706F1, 0x36800059, 0x3D970422, 0x36800059,
+ 0x27970767, 0x36800059, 0x3B7000C8, 0x24200021,
+ 0x358C5000, 0x26800073, 0x2B707FC8, 0x08702084,
+ 0x2D70001D, 0x36200000, 0x2D010000, 0x1E220001,
+ 0x2F970085, 0x01684084, 0x26340020, 0x0ECC0055,
+ 0x3920000F, 0x238C0100, 0x09300002, 0x39D00063,
+ 0x1B601FFC, 0x2A681FF0, 0x246A4014, 0x2D010000,
+ 0x2460400C, 0x2F970085, 0x29681FFC, 0x3930FFFE,
+ 0x036A1FF6, 0x276B1FF8, 0x08624000, 0x37634010,
+ 0x0D6A1FFE, 0x3F9700C3, 0x0E6A1FF2, 0x246B1FF4,
+ 0x05624004, 0x3A634014, 0x006A1FFA, 0x35230000,
+ 0x06624008, 0x358C5000, 0x3463401C, 0x106440C9,
+ 0x3C800006, 0x376B1FE4, 0x228B4000, 0x3C6B1FE6,
+ 0x228B4000, 0x3F8C0480, 0x24BC004E, 0x1B61401C,
+ 0x228B4000, 0x2D010000, 0x3930FFFE, 0x0D500000,
+ 0x0D500000, 0x0D500000, 0x0D500000, 0x09300002,
+ 0x202A0002, 0x0B614000, 0x1B624010, 0x29604008,
+ 0x1D218808, 0x23800079, 0x0B631FEC, 0x166B4000,
+ 0x086A1FF4, 0x27604000, 0x06614004, 0x2A634008,
+ 0x1B624010, 0x16624014, 0x37218001, 0x25970079,
+ 0x35068000, 0x186B4008, 0x0D691FF2, 0x24634000,
+ 0x06614004, 0x29604008, 0x1B624010, 0x2A320001,
+ 0x262EFFFF, 0x36058000, 0x1531FFFE, 0x214B4000,
+ 0x20250002, 0x0E494000, 0x2819C000, 0x07CC00A5,
+ 0x16624014, 0x2C218200, 0x25970079, 0x396B1FEC,
+ 0x228B4000, 0x37694008, 0x268C0400, 0x0D684024,
+ 0x04140000, 0x18D400B0, 0x36200000, 0x228B4000,
+ 0x00240001, 0x1A084000, 0x228B4000, 0x13684030,
+ 0x37380001, 0x21604030, 0x228B4000, 0x13684030,
+ 0x0834FFFE, 0x21604030, 0x228B4000, 0x386A40C4,
+ 0x3F694030, 0x1B360001, 0x1732FFF9, 0x18350001,
+ 0x1831FFFA, 0x011A4000, 0x228B4000, 0x07018000,
+ 0x28310006, 0x18350001, 0x0D614030, 0x2C320007,
+ 0x1B360001, 0x0A6240C4, 0x228B4000, 0x29604008,
+ 0x06614004, 0x16624014, 0x37218001, 0x268C0400,
+ 0x1B61401C, 0x2A694010, 0x27604000, 0x36064000,
+ 0x1B624010, 0x228B4000, 0x29604008, 0x06614004,
+ 0x16624014, 0x2D218018, 0x268C0400, 0x1B61401C,
+ 0x296A4010, 0x27604000, 0x2F260001, 0x1B624010,
+ 0x228B4000, 0x29604008, 0x06614004, 0x16624014,
+ 0x2C218200, 0x268C0400, 0x1B61401C, 0x246A4014,
+ 0x27604000, 0x1B624010, 0x228B4000, 0x1C2100FF,
+ 0x288000EE, 0x1A210000, 0x05631FE4, 0x24611FEC,
+ 0x21681FF2, 0x2B6040A0, 0x0B691FF4, 0x27604000,
+ 0x29604008, 0x18614010, 0x268C0400, 0x0970081C,
+ 0x2470881D, 0x01F000F9, 0x3930FFFE, 0x27490000,
+ 0x29310001, 0x3A200003, 0x1DD40075, 0x1231FFFF,
+ 0x286540B4, 0x216B1FFE, 0x036A1FF6, 0x3D33FFFF,
+ 0x3FD00110, 0x276B1FF8, 0x08624000, 0x06624008,
+ 0x37634010, 0x3F8C0480, 0x24BC004E, 0x3C70011F,
+ 0x0970081C, 0x2470881D, 0x13F0010E, 0x38800112,
+ 0x3F8C0480, 0x24BC004E, 0x196840A0, 0x21694024,
+ 0x1F090000, 0x30C801D6, 0x07024000, 0x1D2E0001,
+ 0x16624014, 0x1F31FFFB, 0x0E684028, 0x2670001F,
+ 0x2F34001F, 0x2E184000, 0x322C0001, 0x2E020000,
+ 0x09240008, 0x1334FFE0, 0x08300005, 0x0B691FF4,
+ 0x206040A2, 0x2D6040A6, 0x322C0001, 0x1F090000,
+ 0x25C40135, 0x356940A0, 0x1C050000, 0x252DFFFF,
+ 0x1531FFFE, 0x21510000, 0x21510000, 0x03691FFA,
+ 0x1C050000, 0x252DFFFF, 0x1531FFFE, 0x21510000,
+ 0x21510000, 0x322C0001, 0x16691FEC, 0x0834FFFE,
+ 0x2B3D00FF, 0x19CC013D, 0x27681FF4, 0x0B240003,
+ 0x0834FFFE, 0x08601FEC, 0x2B26000C, 0x21621FEA,
+ 0x2226005F, 0x35200060, 0x35230000, 0x160B2000,
+ 0x252DFFFF, 0x026140AA, 0x1E2D0001, 0x15072000,
+ 0x3F6B1FEA, 0x28004000, 0x3530FFFD, 0x1F0AC000,
+ 0x35230000, 0x0D631FEA, 0x160B2000, 0x3520000C,
+ 0x35230000, 0x29290007, 0x26C40155, 0x2A250007,
+ 0x23800156, 0x1B210007, 0x1A084000, 0x2D1B4000,
+ 0x33634088, 0x306940AA, 0x3530FFFD, 0x1E2D0001,
+ 0x15072000, 0x252A0008, 0x2A621FE8, 0x2B008000,
+ 0x1D2E0001, 0x1334FFE0, 0x08300005, 0x322C0001,
+ 0x296B1FF0, 0x16691FEC, 0x03601FEE, 0x1A074000,
+ 0x24634000, 0x3A33FFFE, 0x0E530000, 0x0E530000,
+ 0x0E530000, 0x0E530000, 0x0A330002, 0x2A634008,
+ 0x33070000, 0x0B2B0003, 0x09280004, 0x02C0018C,
+ 0x322C0001, 0x34604010, 0x3F8C0480, 0x24BC004E,
+ 0x3C70011F, 0x2A70001C, 0x2470881D, 0x09F0017B,
+ 0x0E691FFE, 0x0D684024, 0x1231FFFF, 0x37D0018B,
+ 0x00691FF6, 0x04140000, 0x3CD001D3, 0x1A084000,
+ 0x22694028, 0x0335001F, 0x3330FFFB, 0x2E184000,
+ 0x36C801D0, 0x322C0001, 0x00601FE2, 0x2670001F,
+ 0x2B008000, 0x3D3CFFFF, 0x30218000, 0x19110000,
+ 0x3A33FFFE, 0x20340010, 0x21C80197, 0x1641C000,
+ 0x0F270002, 0x0E530000, 0x23800199, 0x0E530000,
+ 0x1641C000, 0x31681FEE, 0x356940A0, 0x34604010,
+ 0x166B4000, 0x3304C000, 0x322C0001, 0x0834FFFE,
+ 0x06614004, 0x29604008, 0x0568401C, 0x3F8C0480,
+ 0x24BC004E, 0x3C70011F, 0x2A70001C, 0x1B70821D,
+ 0x19F001A8, 0x3D340008, 0x30C801BA, 0x0E691FFE,
+ 0x0D684024, 0x1231FFFF, 0x36D001BA, 0x00691FF6,
+ 0x04140000, 0x3CD001D3, 0x1A084000, 0x22694028,
+ 0x3330FFFB, 0x0335001F, 0x2E184000, 0x36C801D0,
+ 0x322C0001, 0x00601FE2, 0x2670001F, 0x1B691FE8,
+ 0x3E20000E, 0x29310001, 0x1231FFFF, 0x28D001C2,
+ 0x092CFFFF, 0x378001BE, 0x39694000, 0x0C2207FA,
+ 0x186B4008, 0x096140A8, 0x256340A4, 0x076240AC,
+ 0x236040AE, 0x2E7000B2, 0x3F8C0480, 0x24BC004E,
+ 0x31700484, 0x24E001CD, 0x31200001, 0x20800075,
+ 0x3F200009, 0x2670001F, 0x20800075, 0x3C200005,
+ 0x2670001F, 0x20800075, 0x37200007, 0x2670001F,
+ 0x20800075, 0x08631FE0, 0x35230000, 0x25671FFF,
+ 0x227001C4, 0x229700ED, 0x063C0001, 0x3BC801E2,
+ 0x063C0001, 0x3180022B, 0x2F681FFA, 0x266040A4,
+ 0x3A8C0180, 0x24BC004E, 0x34700184, 0x34E001E7,
+ 0x3B6940A8, 0x126840A2, 0x0B614000, 0x322C0001,
+ 0x296B1FF0, 0x34604010, 0x2A634008, 0x3A8C0180,
+ 0x24BC004E, 0x2A70001C, 0x2470881D, 0x05691FFC,
+ 0x2D3D0000, 0x3DC8022D, 0x252DFFFF, 0x28C8020D,
+ 0x28004000, 0x0034FFF0, 0x3420000B, 0x0ACC022B,
+ 0x156A1FEC, 0x0200C000, 0x1A048000, 0x266340A8,
+ 0x256340A4, 0x3F8C0480, 0x24BC004E, 0x34700184,
+ 0x24E00204, 0x256040A8, 0x1A048000, 0x3A8C0180,
+ 0x24BC004E, 0x32700284, 0x2CE0020A, 0x252DFFFF,
+ 0x17CC0205, 0x2A681FF0, 0x16691FEC, 0x1C050000,
+ 0x036A1FF6, 0x316B1FE2, 0x256040A8, 0x0A6140A4,
+ 0x076240AC, 0x29681FFC, 0x0C2B0002, 0x092CFFFF,
+ 0x206340AE, 0x336040B2, 0x2C8C5080, 0x24BC004E,
+ 0x31700484, 0x3EE0021D, 0x06691FF0, 0x3D201FE8,
+ 0x096140A8, 0x0A500001, 0x09300002, 0x266040A4,
+ 0x36200000, 0x2D6040A6, 0x3A8C0180, 0x24BC004E,
+ 0x34700184, 0x35E00229, 0x31200001, 0x3A6B1FE0,
+ 0x228B4000, 0x06691FF0, 0x156A1FEC, 0x28004000,
+ 0x1A048000, 0x03601FEE, 0x268C0400, 0x2F970085,
+ 0x2D010000, 0x268C0400, 0x2C970259, 0x1E691FE2,
+ 0x252DFFFF, 0x37C8021E, 0x2C611FE2, 0x3297024D,
+ 0x1B360001, 0x0DCC0246, 0x28200078, 0x31681FEE,
+ 0x06691FF0, 0x2C970259, 0x2A681FF0, 0x2E230237,
+ 0x2D010000, 0x2A800259, 0x2A681FF0, 0x1D691FEE,
+ 0x2C970259, 0x31681FEE, 0x2E230237, 0x2D010000,
+ 0x2A800259, 0x2C681FF6, 0x252DFFFF, 0x07024000,
+ 0x2F36FFF0, 0x21320003, 0x3930FFFE, 0x1F060000,
+ 0x0E4A8000, 0x28004000, 0x3C34000F, 0x1A120000,
+ 0x228B4000, 0x0A6140A4, 0x256040A8, 0x3A8C0180,
+ 0x24BC004E, 0x34700184, 0x228B4000, 0x0E631FE6,
+ 0x2B9702A1, 0x239702AF, 0x39681FD6, 0x0E6A1FF2,
+ 0x00691FF6, 0x276B1FF8, 0x1F060000, 0x03270001,
+ 0x0B37FFFE, 0x1F05C000, 0x296B1FF0, 0x32611FF6,
+ 0x3304C000, 0x3C621FF2, 0x1D601FFA, 0x18601FF0,
+ 0x268C0400, 0x339701D9, 0x02030000, 0x053F0001,
+ 0x1FCC029E, 0x238C0100, 0x166A1FD6, 0x06691FF0,
+ 0x28004000, 0x35098000, 0x1A048000, 0x2F970085,
+ 0x2D010000, 0x15684000, 0x35098000, 0x35068000,
+ 0x2F970085, 0x276B1FF8, 0x00691FF6, 0x03270001,
+ 0x0B37FFFE, 0x1C09C000, 0x3A6B1FD6, 0x0E6A1FF2,
+ 0x32611FF6, 0x1F0AC000, 0x3C621FF2, 0x268C0400,
+ 0x339701D9, 0x326B1FD8, 0x166A1FD6, 0x06691FF0,
+ 0x1E631FFA, 0x35098000, 0x34611FF0, 0x02030000,
+ 0x053F0001, 0x1FCC029E, 0x238C0100, 0x1A210000,
+ 0x3C9702E6, 0x22970312, 0x2A681FF0, 0x2460400C,
+ 0x268C0400, 0x31200001, 0x2B800077, 0x37200007,
+ 0x2480029E, 0x0B631FEC, 0x0D691FF2, 0x006A1FFA,
+ 0x06614004, 0x0B691FF4, 0x2C621FD8, 0x15614014,
+ 0x2D3D0000, 0x29C8029F, 0x28004000, 0x0C240002,
+ 0x0834FFFE, 0x0B601FD6, 0x228B4000, 0x0B631FEC,
+ 0x39681FD6, 0x0D691FF2, 0x086A1FF4, 0x28004000,
+ 0x2F970085, 0x399700A9, 0x0F280002, 0x1BC0029F,
+ 0x0C240002, 0x39604014, 0x2F9700B3, 0x0B691FF4,
+ 0x39681FD6, 0x35054000, 0x056A1FF0, 0x18614010,
+ 0x08624000, 0x1F060000, 0x1F060000, 0x23260002,
+ 0x06624008, 0x0B62400C, 0x2C218200, 0x25970079,
+ 0x226B1FF2, 0x086A1FF4, 0x3304C000, 0x2D010000,
+ 0x2F970085, 0x399700A9, 0x0F280002, 0x1BC0029F,
+ 0x0C240002, 0x39604014, 0x35068000, 0x1B624010,
+ 0x39681FD6, 0x396A400C, 0x186B4008, 0x1F060000,
+ 0x2A681FF0, 0x29634004, 0x06624008, 0x27604000,
+ 0x2C218200, 0x25970079, 0x166A1FD6, 0x3A69400C,
+ 0x2A681FF0, 0x35068000, 0x2F970085, 0x229700B7,
+ 0x396B1FEC, 0x228B4000, 0x0B631FEC, 0x2A681FF0,
+ 0x1A048000, 0x2460400C, 0x1A048000, 0x0C240002,
+ 0x19044000, 0x086A1FF4, 0x0D691FF2, 0x3930FFFE,
+ 0x0D500000, 0x0D500000, 0x09300002, 0x2F970085,
+ 0x399700A9, 0x39604014, 0x1B684008, 0x156B400C,
+ 0x2F260001, 0x06691FF0, 0x03280001, 0x1B624010,
+ 0x29604008, 0x06614004, 0x24634000, 0x2C2A0001,
+ 0x36058000, 0x1531FFFE, 0x21510000, 0x21510000,
+ 0x19078000, 0x3A33FFFE, 0x0E530000, 0x0E530000,
+ 0x3B218002, 0x25970079, 0x23260002, 0x1B624010,
+ 0x246A4014, 0x03691FFA, 0x1B684008, 0x319700CB,
+ 0x396B1FEC, 0x228B4000, 0x0B631FEC, 0x2F9700B3,
+ 0x166B4000, 0x1668400C, 0x2763400C, 0x0D691FF2,
+ 0x246A4014, 0x219700E1, 0x3A6B1FD6, 0x0D691FF2,
+ 0x1668400C, 0x1F05C000, 0x086A1FF4, 0x319700CB,
+ 0x2A681FF0, 0x086A1FF4, 0x2D010000, 0x269700D6,
+ 0x229700B7, 0x396B1FEC, 0x228B4000, 0x05631FE4,
+ 0x2A681FF0, 0x2460400C, 0x08691FF8, 0x29611FDE,
+ 0x086A1FF4, 0x21621FDC, 0x350A4000, 0x040E4000,
+ 0x0CD40332, 0x07024000, 0x24260003, 0x2736FFFE,
+ 0x00601FE2, 0x1A048000, 0x0B601FE0, 0x1A048000,
+ 0x35068000, 0x37621FF0, 0x1A048000, 0x0B601FD6,
+ 0x1668400C, 0x2897007D, 0x056A1FF0, 0x1668400C,
+ 0x1A048000, 0x2897007D, 0x0B6A1FF8, 0x32681FE2,
+ 0x296B1FF0, 0x3304C000, 0x00691FF6, 0x2F970085,
+ 0x268C0400, 0x0E6B4024, 0x05631FD2, 0x1A378000,
+ 0x07CC0415, 0x39681FE0, 0x296B1FF0, 0x3304C000,
+ 0x0D691FF2, 0x086A1FF4, 0x2F970085, 0x32681FE2,
+ 0x3930FFFE, 0x0A500001, 0x39681FE0, 0x0D691FF2,
+ 0x2F970085, 0x3B201FD8, 0x0D500000, 0x0D500000,
+ 0x0D691FF2, 0x1531FFFE, 0x0E494000, 0x29310001,
+ 0x05D40418, 0x1231FFFF, 0x36200000, 0x00601FD4,
+ 0x32230001, 0x1E220001, 0x0200C000, 0x2E148000,
+ 0x31C8036D, 0x32681FD4, 0x1A048000, 0x00601FD4,
+ 0x1A074000, 0x35054000, 0x35068000, 0x02CC0366,
+ 0x32681FE2, 0x296B1FF0, 0x3304C000, 0x1A210000,
+ 0x186A1FDE, 0x3397041C, 0x3930FFFE, 0x0B480000,
+ 0x1A388000, 0x05300001, 0x24D0037D, 0x2C250001,
+ 0x25800379, 0x2D3D0000, 0x35C803AF, 0x268C0400,
+ 0x16614018, 0x26218040, 0x25970079, 0x32681FD4,
+ 0x1E691FE2, 0x1531FFFE, 0x0E494000, 0x15072000,
+ 0x1D210001, 0x0B6B4018, 0x3E3FFFFF, 0x03270001,
+ 0x1A11C000, 0x252DFFFF, 0x02164000, 0x326B1FD8,
+ 0x268C0400, 0x21694024, 0x2A611FD2, 0x3BC803A7,
+ 0x1F1F8000, 0x3AC803A0, 0x2C621FD8, 0x21681FF2,
+ 0x0C2107F6, 0x3297041B, 0x1E220001, 0x16624014,
+ 0x39681FD6, 0x29604008, 0x37218001, 0x25970079,
+ 0x15691FD6, 0x32681FE2, 0x086A1FF4, 0x2F260001,
+ 0x3397041C, 0x23218010, 0x25970079, 0x32681FE2,
+ 0x1A210000, 0x086A1FF4, 0x2F260001, 0x3397041C,
+ 0x26218040, 0x25970079, 0x2C800370, 0x39681FE0,
+ 0x296B1FF0, 0x3304C000, 0x2A604004, 0x32681FE2,
+ 0x3304C000, 0x27604000, 0x186A1FDE, 0x3F6B1FDC,
+ 0x3A634014, 0x1F0AC000, 0x2E0EC000, 0x1AD403BD,
+ 0x2D02C000, 0x1B624010, 0x2F218400, 0x25970079,
+ 0x18691FD2, 0x1F1C4000, 0x0DCC03CA, 0x1531FFFE,
+ 0x22484000, 0x063C0001, 0x122D0002, 0x0E494000,
+ 0x2E184000, 0x2DC8040B, 0x268C0400, 0x00684020,
+ 0x05300001, 0x30D00415, 0x09300002, 0x22D003D8,
+ 0x15684000, 0x34694004, 0x2A604004, 0x0B614000,
+ 0x06684010, 0x27694014, 0x39604014, 0x18614010,
+ 0x166B4000, 0x2A634008, 0x0E631FD0, 0x25218020,
+ 0x25970079, 0x2DD003E1, 0x39681FE0, 0x1E691FE2,
+ 0x2A8003E3, 0x32681FE2, 0x15691FE0, 0x086A1FF4,
+ 0x2F260001, 0x3397041C, 0x268C0400, 0x226A4024,
+ 0x25218020, 0x25970079, 0x3F681FD0, 0x1C0A0000,
+ 0x2F260001, 0x15691FE0, 0x296B1FF0, 0x1F05C000,
+ 0x1A1D0000, 0x00CC03F8, 0x32681FE2, 0x15691FE0,
+ 0x0B601FE0, 0x2C611FE2, 0x37681FDE, 0x0E601FDC,
+ 0x2A621FDE, 0x32681FE2, 0x0D691FF2, 0x3297041B,
+ 0x296A4010, 0x1A048000, 0x3930FFFE, 0x268C0400,
+ 0x084B0000, 0x0D500000, 0x0D500000, 0x023F0000,
+ 0x26C80370, 0x23218010, 0x25970079, 0x052CFFFC,
+ 0x268C0400, 0x0D500000, 0x2C800370, 0x1E691FE2,
+ 0x39681FE0, 0x086A1FF4, 0x2F970085, 0x16624014,
+ 0x31200001, 0x1A210000, 0x156B400C, 0x1B631FF0,
+ 0x20800075, 0x24200017, 0x1B210007, 0x3D800412,
+ 0x3A200003, 0x0621001F, 0x3D800412, 0x086A1FF4,
+ 0x1B624010, 0x16624014, 0x27604000, 0x06614004,
+ 0x29604008, 0x228B4000, 0x0E631FE6, 0x2C681FF6,
+ 0x08691FF8, 0x086A1FF4, 0x1D601FCC, 0x37611FCA,
+ 0x39621FF8, 0x24260003, 0x2736FFFE, 0x39621FCE,
+ 0x296B1FF0, 0x19078000, 0x19078000, 0x1D631FF6,
+ 0x19078000, 0x1B631FF0, 0x2E970327, 0x063C0001,
+ 0x28C80437, 0x063C0001, 0x2A800455, 0x2A681FF0,
+ 0x0B6A1FCE, 0x19088000, 0x2897007D, 0x06691FF0,
+ 0x0B6A1FCE, 0x2B034000, 0x28004000, 0x19078000,
+ 0x24634000, 0x19088000, 0x19088000, 0x2097008A,
+ 0x06691FF0, 0x0B6A1FCE, 0x28004000, 0x19088000,
+ 0x3930FFFE, 0x0A500001, 0x0F280002, 0x09300002,
+ 0x19088000, 0x19088000, 0x18601FF0, 0x2097008A,
+ 0x03691FCC, 0x066A1FCA, 0x32611FF6, 0x39621FF8,
+ 0x31200001, 0x268C0400, 0x2B800077, 0x0D601FD0,
+ 0x296A4010, 0x15684000, 0x2C621FD8, 0x08601FDA,
+ 0x10691FDC, 0x2A681FF0, 0x07024000, 0x36064000,
+ 0x36064000, 0x2897007D, 0x1E6A1FD8, 0x3A681FDA,
+ 0x1B624010, 0x27604000, 0x3F681FD0, 0x063C0001,
+ 0x09CC0471, 0x216B1FFE, 0x071BC000, 0x25D0046F,
+ 0x229706BB, 0x0D601FD0, 0x33800476, 0x379706AD,
+ 0x33800476, 0x0D3C0003, 0x08CC0476, 0x36970483,
+ 0x31200001, 0x0D601FD0, 0x3F681FD0, 0x35230000,
+ 0x2D010000, 0x293D000D, 0x0ACC047D, 0x34230007,
+ 0x3C800480, 0x2E3D000C, 0x36C80480, 0x2923001F,
+ 0x268C0400, 0x39634018, 0x2B800077, 0x08631FD6,
+ 0x37681FB2, 0x03691FFA, 0x086A1FF4, 0x2F970085,
+ 0x16624014, 0x2F681FFA, 0x226B1FF2, 0x136A1FDC,
+ 0x1D691FB4, 0x1A048000, 0x2A604004, 0x05614008,
+ 0x24634000, 0x25218020, 0x25970079, 0x3A681FB6,
+ 0x3930FFFE, 0x0A500001, 0x3A6B1FD6, 0x228B4000,
+ 0x1A048000, 0x3930FFFE, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x0D500000, 0x228B4000, 0x086A1FF4,
+ 0x1D2E0001, 0x1B624010, 0x0B614000, 0x29604008,
+ 0x268C0400, 0x2A70001C, 0x2470881D, 0x36058000,
+ 0x1A048000, 0x228B4000, 0x27604000, 0x27681FF4,
+ 0x05614008, 0x34604010, 0x268C0400, 0x15624018,
+ 0x2E020000, 0x29218080, 0x23800079, 0x08631FD6,
+ 0x387000C4, 0x249700EB, 0x246B1FF4, 0x08270003,
+ 0x0B37FFFE, 0x0D631FDC, 0x2D010000, 0x2A3D0001,
+ 0x238C0100, 0x1ACC0457, 0x3D6A40A2, 0x176840A8,
+ 0x2F260001, 0x27970498, 0x21681FF2, 0x086A1FF4,
+ 0x27970498, 0x2F260001, 0x2736FFFE, 0x0F6240A2,
+ 0x026240A6, 0x3A6B1FD6, 0x228B4000, 0x08631FD6,
+ 0x3A6B1FD6, 0x228B4000, 0x08631FD6, 0x136A1FDC,
+ 0x06691FF0, 0x3D201FB2, 0x2D230012, 0x35098000,
+ 0x36058000, 0x15410000, 0x3E2C0002, 0x0A2FFFFF,
+ 0x0FCC04D4, 0x37681FB2, 0x2897007D, 0x136A1FDC,
+ 0x3A681FB6, 0x1D32FFFC, 0x2897007D, 0x2E97052B,
+ 0x16691FB6, 0x21681FF2, 0x1E220001, 0x2A9704AA,
+ 0x1E220001, 0x1B691FB2, 0x3F970530, 0x3A6B1FD6,
+ 0x228B4000, 0x08631FD6, 0x3F6B1FDC, 0x0D691FF2,
+ 0x1D6A1FD4, 0x1F05C000, 0x2E97051D, 0x15691FBA,
+ 0x1E220001, 0x3F970530, 0x106A1FD0, 0x03691FFA,
+ 0x2E97051D, 0x216B1FFE, 0x03691FFA, 0x071BC000,
+ 0x1ED404FF, 0x3F6B1FDC, 0x036A1FC0, 0x1F05C000,
+ 0x1F05C000, 0x2E97051D, 0x34800502, 0x15691FBA,
+ 0x2C681FC0, 0x2697049F, 0x13691FD0, 0x34681FBE,
+ 0x036A1FC0, 0x286040AC, 0x096140A8, 0x096240A4,
+ 0x358C5000, 0x28700384, 0x3A6B1FD6, 0x228B4000,
+ 0x136A1FDC, 0x15691FBA, 0x16624014, 0x1632FFFE,
+ 0x35098000, 0x0B614000, 0x0A6140A4, 0x16691FB6,
+ 0x1D6A1FB8, 0x05614008, 0x0B691FF4, 0x05624004,
+ 0x1E2D0001, 0x18614010, 0x228B4000, 0x1B684008,
+ 0x2B800527, 0x0B631FEC, 0x0B614000, 0x06624008,
+ 0x2B008000, 0x13218800, 0x25970079, 0x086A1FF4,
+ 0x27970498, 0x1B684008, 0x396B1FEC, 0x256040A8,
+ 0x358C5000, 0x34700184, 0x228B4000, 0x086A1FF4,
+ 0x1D691FB4, 0x1B624010, 0x0A6140A4, 0x228B4000,
+ 0x28004000, 0x1531FFFE, 0x268C0400, 0x3F424000,
+ 0x2B800527, 0x2C8C5080, 0x24BC004E, 0x13204096,
+ 0x228B4000, 0x2C8C5080, 0x24BC004E, 0x13204096,
+ 0x3E500C63, 0x228B4000, 0x2C681FF6, 0x252DFFFF,
+ 0x07024000, 0x2F36FFF0, 0x21320003, 0x3930FFFE,
+ 0x1F060000, 0x0E4A8000, 0x28004000, 0x3C34000F,
+ 0x1A120000, 0x02624090, 0x228B4000, 0x036A1FC0,
+ 0x096140A8, 0x096240A4, 0x238C0100, 0x34700184,
+ 0x0E6A1FF2, 0x05624004, 0x086A1FF4, 0x16624014,
+ 0x0B614000, 0x05614008, 0x238C0100, 0x20694080,
+ 0x18350001, 0x03CC055B, 0x228B4000, 0x1D2E0001,
+ 0x1B624010, 0x25218020, 0x23800079, 0x08631FD6,
+ 0x16502DE7, 0x3F502084, 0x36970539, 0x13502931,
+ 0x35970535, 0x0F6B4080, 0x25370020, 0x0FCC071D,
+ 0x13503548, 0x03501CE4, 0x36970539, 0x315024A9,
+ 0x35970535, 0x0350A148, 0x0A5035A4, 0x36970539,
+ 0x3350252E, 0x35970535, 0x0E502929, 0x145035B0,
+ 0x36970539, 0x3F502108, 0x35970535, 0x2B5025A9,
+ 0x1D502CA6, 0x36970539, 0x1450288A, 0x35970535,
+ 0x2350B4EB, 0x18509525, 0x36970539, 0x37501086,
+ 0x35970535, 0x0F502D67, 0x035035AD, 0x36970539,
+ 0x1C501991, 0x35970535, 0x0F6B4080, 0x00631FEE,
+ 0x235098C4, 0x27509DAF, 0x36970539, 0x1450316C,
+ 0x35970535, 0x00509148, 0x1E502CC6, 0x36970539,
+ 0x1A50358E, 0x35970535, 0x355099AB, 0x3A6B1FD6,
+ 0x228B4000, 0x08631FD6, 0x30700090, 0x3A97050C,
+ 0x358C5000, 0x23700080, 0x13204096, 0x3E500C63,
+ 0x235024E4, 0x13204096, 0x3E500C63, 0x045030A6,
+ 0x35970535, 0x2850B12C, 0x395020EE, 0x36970539,
+ 0x0B5028AF, 0x35970535, 0x3D50A90A, 0x3D50AD8C,
+ 0x35970535, 0x29503D6B, 0x1850C54A, 0x36970539,
+ 0x0F6B4080, 0x00631FEE, 0x23700080, 0x1C50352B,
+ 0x35970535, 0x326B1FEE, 0x236A4080, 0x07330006,
+ 0x14D405B9, 0x2B320006, 0x27D005DE, 0x3220000D,
+ 0x21800457, 0x3E500C63, 0x16502D8B, 0x36970539,
+ 0x3450252F, 0x35970535, 0x3950252B, 0x3350210B,
+ 0x36970539, 0x1B5018E5, 0x35970535, 0x3E500C63,
+ 0x205044D1, 0x36970539, 0x3D502409, 0x35970535,
+ 0x0550A531, 0x065018CB, 0x35970535, 0x3E500C63,
+ 0x32504409, 0x36970539, 0x2450112C, 0x35970535,
+ 0x3650B62D, 0x0D50300C, 0x35970535, 0x3E500C63,
+ 0x025035AA, 0x35970535, 0x2550B50D, 0x3B502520,
+ 0x35970535, 0x1B501C63, 0x3350140D, 0x35970535,
+ 0x3A6B1FD6, 0x228B4000, 0x2E97052B, 0x3F6B1FDC,
+ 0x0D691FF2, 0x1D6A1FD4, 0x1F05C000, 0x2E97051D,
+ 0x1E691FB8, 0x3F681FD0, 0x2697049F, 0x13691FD0,
+ 0x12220002, 0x3F970530, 0x1E691FB8, 0x2C681FC0,
+ 0x249704A2, 0x00691FC0, 0x15220003, 0x3F970530,
+ 0x3A97050C, 0x358C5000, 0x23700080, 0x13204096,
+ 0x3E500C63, 0x3F502084, 0x13204096, 0x3E500C63,
+ 0x0B5035CF, 0x35970535, 0x3E500C63, 0x0C502D07,
+ 0x36970539, 0x195034AD, 0x35970535, 0x3E500C63,
+ 0x325024A5, 0x36970539, 0x165029AE, 0x35970535,
+ 0x0F503144, 0x2F502531, 0x36970539, 0x0250194A,
+ 0x35970535, 0x295010C8, 0x0E50318C, 0x36970539,
+ 0x085028CF, 0x35970535, 0x24502569, 0x195019AD,
+ 0x36970539, 0x25501004, 0x35970535, 0x3E50B08C,
+ 0x11502D29, 0x36970539, 0x1B5019A6, 0x35970535,
+ 0x3E500C63, 0x3450140C, 0x36970539, 0x2750218F,
+ 0x35970535, 0x2550AD0B, 0x04502940, 0x35970535,
+ 0x3E500C63, 0x0C50300B, 0x36970539, 0x3C5011AB,
+ 0x35970535, 0x3250B585, 0x3B502520, 0x35970535,
+ 0x3E500C63, 0x0E5035A9, 0x35970535, 0x3350B54D,
+ 0x15502C0B, 0x35970535, 0x1B501C63, 0x3350140D,
+ 0x35970535, 0x3A6B1FD6, 0x228B4000, 0x08631FD6,
+ 0x2E97052B, 0x03691FCC, 0x3F6B1FDC, 0x2F681FFA,
+ 0x1E220001, 0x3304C000, 0x2A9704AA, 0x2897051B,
+ 0x08691FCE, 0x3F6B1FDC, 0x21681FF2, 0x1E220001,
+ 0x3304C000, 0x3304C000, 0x2A9704AA, 0x2897051B,
+ 0x30700090, 0x3A97050C, 0x358C5000, 0x13204096,
+ 0x3E500C63, 0x0B502A25, 0x13204096, 0x3E500C63,
+ 0x2250248F, 0x35970535, 0x0250292A, 0x285020AF,
+ 0x36970539, 0x25501004, 0x35970535, 0x00502D04,
+ 0x295038AE, 0x36970539, 0x245024E5, 0x35970535,
+ 0x1650A088, 0x2A50392E, 0x36970539, 0x19502D4B,
+ 0x35970535, 0x3E500C63, 0x0A502924, 0x36970539,
+ 0x0F502CEB, 0x35970535, 0x00502DCB, 0x3B5011AA,
+ 0x36970539, 0x3F502108, 0x35970535, 0x3E500C63,
+ 0x15502C0B, 0x36970539, 0x2A5020C8, 0x35970535,
+ 0x2550AD0B, 0x0D502925, 0x35970535, 0x1B501C63,
+ 0x3550140B, 0x36970539, 0x185019AA, 0x35970535,
+ 0x3A6B1FD6, 0x228B4000, 0x08631FD6, 0x21681FF2,
+ 0x10691FDC, 0x086A1FF4, 0x19044000, 0x27604000,
+ 0x27970498, 0x21681FF2, 0x35054000, 0x19044000,
+ 0x27970498, 0x07024000, 0x39694000, 0x29681FCA,
+ 0x2F970085, 0x3A97050C, 0x13204096, 0x268C0400,
+ 0x3E500C63, 0x225020C6, 0x36970539, 0x325024A5,
+ 0x35970535, 0x3E500C63, 0x0E502D0C, 0x36970539,
+ 0x1C502884, 0x35970535, 0x3E500C63, 0x335021A8,
+ 0x36970539, 0x00502C2B, 0x35970535, 0x1450296A,
+ 0x30502028, 0x35970535, 0x0D50A509, 0x09502944,
+ 0x35970535, 0x3E500C63, 0x325024C9, 0x35970535,
+ 0x1B50A549, 0x2A502144, 0x36970539, 0x3D502409,
+ 0x35970535, 0x358C5000, 0x0F6B4080, 0x3E370008,
+ 0x0CCC06AB, 0x2720001B, 0x21800457, 0x3A6B1FD6,
+ 0x228B4000, 0x08631FD6, 0x2C681FC0, 0x3930FFFE,
+ 0x0A500001, 0x1B204098, 0x1A5000E4, 0x1B204098,
+ 0x025004E5, 0x36970539, 0x325008E6, 0x35970535,
+ 0x238C0100, 0x3A6B1FD6, 0x228B4000, 0x08631FD6,
+ 0x2C681FC0, 0x3930FFFE, 0x358C5000, 0x0A500001,
+ 0x1B204098, 0x175018E6, 0x296B1FF0, 0x2C681FF6,
+ 0x08691FF8, 0x10631FC4, 0x18601FC6, 0x3C611FC8,
+ 0x3F6B1FDC, 0x39681FD6, 0x18631FCA, 0x1D601FCC,
+ 0x34681FBE, 0x0B691FF4, 0x2F6B1FC0, 0x1E2D0001,
+ 0x3A611FF8, 0x1B631FF0, 0x1E601FF6, 0x358C5000,
+ 0x2E970327, 0x226B1FC4, 0x056A1FC6, 0x0E691FC8,
+ 0x1B631FF0, 0x31621FF6, 0x3A611FF8, 0x2A6B1FCA,
+ 0x006A1FCC, 0x0D631FDC, 0x24621FD6, 0x268C0400,
+ 0x02030000, 0x053F0001, 0x1CCC06ED, 0x15691FBA,
+ 0x2D97054B, 0x13691FBC, 0x2D97054B, 0x136A1FDC,
+ 0x15691FBA, 0x2A681FF0, 0x35068000, 0x2F970085,
+ 0x31200001, 0x3A6B1FD6, 0x228B4000, 0x19220000,
+ 0x3C8006F3, 0x00220080, 0x3C8006F3, 0x09661FFF,
+ 0x0E631FE6, 0x309704B3, 0x249704CE, 0x2E9704CB,
+ 0x309704E9, 0x2E97052B, 0x18691FD2, 0x14220004,
+ 0x3F970530, 0x08691FCE, 0x3F6B1FDC, 0x21681FF2,
+ 0x12220002, 0x3304C000, 0x3304C000, 0x2A9704AA,
+ 0x2897051B, 0x3A97050C, 0x1A21889C, 0x0A614092,
+ 0x358C5000, 0x23700080, 0x1E691FE2, 0x3797053E,
+ 0x13204096, 0x095029E7, 0x035030A7, 0x13204096,
+ 0x095029E7, 0x325024A5, 0x35970535, 0x3397055F,
+ 0x02194000, 0x3CC80720, 0x3797053E, 0x1B204098,
+ 0x035030A7, 0x36970539, 0x325024A5, 0x35970535,
+ 0x3C800713, 0x358C5000, 0x29200013, 0x21800457,
+ 0x358C5000, 0x236A4080, 0x09360020, 0x04CC0729,
+ 0x35970633, 0x358C5000, 0x29970676, 0x31200001,
+ 0x21800457, 0x1E6A1FEE, 0x1C6B4090, 0x27320005,
+ 0x1A1EC000, 0x1B360001, 0x28C80731, 0x3220000D,
+ 0x21800457, 0x3D200002, 0x21800457, 0x0F220040,
+ 0x24800737, 0x162200C0, 0x24800737, 0x09661FFF,
+ 0x0E631FE6, 0x309704B3, 0x249704CE, 0x2E9704CB,
+ 0x166A1FBA, 0x03691FFA, 0x2E97051D, 0x3F6B1FDC,
+ 0x03691FFA, 0x0B6A1FCE, 0x1F05C000, 0x2E97051D,
+ 0x1B6A1FBE, 0x00691FF6, 0x2E97051D, 0x3F6B1FDC,
+ 0x00691FF6, 0x106A1FD0, 0x1F05C000, 0x2E97051D,
+ 0x22681FFE, 0x07180000, 0x2CD00756, 0x1B691FB2,
+ 0x3F681FBC, 0x249704A2, 0x1B691FB2, 0x2C681FC0,
+ 0x249704A2, 0x2B800762, 0x3F6B1FDC, 0x03691FFA,
+ 0x106A1FBC, 0x1F05C000, 0x1F05C000, 0x2E97051D,
+ 0x3F6B1FDC, 0x00691FF6, 0x036A1FC0, 0x1F05C000,
+ 0x1F05C000, 0x2E97051D, 0x39970595, 0x358C5000,
+ 0x29970676, 0x31200001, 0x21800457, 0x0C220020,
+ 0x29800769, 0x09661FFF, 0x0E631FE6, 0x309704B3,
+ 0x249704CE, 0x2E9704CB, 0x309704E9, 0x2E97052B,
+ 0x18691FD2, 0x12220002, 0x3F970530, 0x32681FD4,
+ 0x18691FD2, 0x27604000, 0x06614004, 0x24681FCE,
+ 0x29604008, 0x238C0100, 0x25218020, 0x1B61401C,
+ 0x27604000, 0x29604008, 0x12220002, 0x268C0400,
+ 0x15624018, 0x26218040, 0x1B61401C, 0x3A97050C,
+ 0x1A21889C, 0x0A614092, 0x358C5000, 0x23700080,
+ 0x1E691FE2, 0x3797053E, 0x13204096, 0x358C5000,
+ 0x2A5020A4, 0x13204096, 0x1F50A4A4, 0x35970535,
+ 0x145028E6, 0x1A503108, 0x35970535, 0x358C5000,
+ 0x2150ACE6, 0x17503529, 0x0F6B4080, 0x13204096,
+ 0x25370020, 0x0FCC071D, 0x1B50C1AC, 0x31502549,
+ 0x35970535, 0x3E500C63, 0x3C502168, 0x35970535,
+ 0x04502D09, 0x3D5011AC, 0x35970535, 0x0D50A509,
+ 0x0E5029D0, 0x35970535, 0x2450214C, 0x1050196B,
+ 0x35970535, 0x3E500C63, 0x12501D29, 0x35970535,
+ 0x3E500C63, 0x14509510, 0x35970535, 0x3E500C63,
+ 0x3F509DE7, 0x35970535, 0x0F6B4080, 0x00631FEE,
+ 0x02194000, 0x38C807B8, 0x3797053E, 0x3F80078A,
+ 0x358C5000, 0x236A4080, 0x09360020, 0x16CC07C7,
+ 0x30700090, 0x02501865, 0x35970535, 0x1B501C63,
+ 0x35970535, 0x38501463, 0x35970535, 0x2C681FC0,
+ 0x268C0400, 0x31200001, 0x21800457, 0x1E6A1FEE,
+ 0x1C6B4090, 0x27320005, 0x1A1EC000, 0x1B360001,
+ 0x35C807BC, 0x3220000D, 0x21800457, 0x1E79084F
+};
+
+static const uint32_t fw1_boot_img_data_buf[] =
+{
+ 0x36200000, 0x11210002, 0x15710249, 0x31200001,
+ 0x2860B41C, 0x21970074, 0x1A210000, 0x1231FFFF,
+ 0x1B390001, 0x092CFFFF, 0x00CC0007, 0x0761B140,
+ 0x3A200333, 0x3060B438, 0x3E60B45C, 0x3D60B43C,
+ 0x0A20FFFF, 0x2D60B420, 0x1A210000, 0x1F68B420,
+ 0x0A61B422, 0x1234FEFE, 0x05300001, 0x2D60B420,
+ 0x0C61B424, 0x0761B426, 0x0F61B428, 0x0461B42A,
+ 0x0261B42C, 0x0961B42E, 0x1F61B434, 0x1461B436,
+ 0x21970074, 0x1C21A0CA, 0x33228000, 0x3F424000,
+ 0x032D0100, 0x092CFFFF, 0x18CC0023, 0x16710449,
+ 0x1CB8002B, 0x30224000, 0x2C80002C, 0x19220000,
+ 0x06210045, 0x0C61B424, 0x35230000, 0x2D63B42C,
+ 0x21970074, 0x13232000, 0x0C62B428, 0x3063B434,
+ 0x16210333, 0x278C0078, 0x37BC005E, 0x1C61B438,
+ 0x092CFFFF, 0x0CCC0032, 0x0A710649, 0x21970074,
+ 0x1721A0C8, 0x19220000, 0x3F424000, 0x122D0002,
+ 0x3F424000, 0x182D00FE, 0x092CFFFF, 0x0FCC003E,
+ 0x1A223000, 0x2F712049, 0x1FB8004B, 0x33214000,
+ 0x35230000, 0x3F222000, 0x2880004D, 0x1A210000,
+ 0x35230000, 0x1820B424, 0x19500011, 0x0A500001,
+ 0x1150C400, 0x0A500001, 0x0261B42C, 0x2663B42E,
+ 0x1C62B434, 0x39230333, 0x278C0078, 0x37BC005E,
+ 0x3363B438, 0x36200000, 0x2B60B140, 0x13710149,
+ 0x398C0000, 0x3C80005C, 0x3371FF49, 0x3C80005C,
+ 0x2A320001, 0x0A367FFF, 0x2CC80073, 0x252A0008,
+ 0x0EC0006F, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x2CC80073, 0x35800063, 0x26260008,
+ 0x0D500000, 0x262EFFFF, 0x11CC0070, 0x228B4000,
+ 0x0868B1F8, 0x3C34000F, 0x0128000A, 0x26C4007A,
+ 0x0224000A, 0x228B4000, 0x3320000A, 0x228B4000,
+ 0x01000000, 0x01000000, 0x01000000
+};
+
+static const uint32_t fw1_master_img_data_buf[] =
+{
+ 0x36200000, 0x11210002, 0x3C605FF4, 0x1B615FF6,
+ 0x36200000, 0x2560B148, 0x1A205FE0, 0x38215FE8,
+ 0x3B230008, 0x1F090000, 0x15C00104, 0x31200001,
+ 0x2860B41C, 0x2A9700B9, 0x329700C7, 0x1C208000,
+ 0x2B60B140, 0x01000000, 0x19220000, 0x0B685FFE,
+ 0x2469B1F8, 0x2B3C4600, 0x1ECC0013, 0x1D2E0001,
+ 0x28038000, 0x01000000, 0x0A2FFFFF, 0x1BCC0019,
+ 0x0B685FFE, 0x2469B1F8, 0x2B3C4600, 0x22C80021,
+ 0x25800013, 0x056B5FFA, 0x333B0000, 0x14D40026,
+ 0x363700FF, 0x2E63B47A, 0x3A200333, 0x3060B438,
+ 0x3E60B45C, 0x3D60B43C, 0x39230003, 0x2F22B400,
+ 0x0A20FFFF, 0x13408000, 0x1A210000, 0x21488000,
+ 0x23260002, 0x3F418000, 0x1234FEFE, 0x05300001,
+ 0x202A0002, 0x13408000, 0x3D260020, 0x0A2FFFFF,
+ 0x17CC002C, 0x36200000, 0x3E60B406, 0x2D60B416,
+ 0x2B60B426, 0x3860B436, 0x2860B446, 0x3B60B456,
+ 0x036B5FFC, 0x00210100, 0x05222F00, 0x29370080,
+ 0x27C80047, 0x1A210000, 0x1A223000, 0x1820B424,
+ 0x19500011, 0x0A500001, 0x1150C400, 0x0A500001,
+ 0x15410000, 0x3E2C0002, 0x0D500000, 0x1C62B434,
+ 0x10205E90, 0x0D220164, 0x0D970F97, 0x2469B1F8,
+ 0x15220333, 0x36200000, 0x278C0078, 0x30BC00FC,
+ 0x1F62B438, 0x2060B424, 0x2B60B426, 0x33610102,
+ 0x1035000F, 0x38610100, 0x0A68B400, 0x3369B420,
+ 0x32605FCA, 0x13615FCE, 0x353400FF, 0x2C380200,
+ 0x34605FCC, 0x2535FF00, 0x17390002, 0x08615FD0,
+ 0x1E970F24, 0x31200001, 0x2E605EA0, 0x202001A0,
+ 0x1760010C, 0x35203000, 0x1C60010E, 0x31200001,
+ 0x2560B148, 0x30695EA0, 0x33228000, 0x28004000,
+ 0x063C0001, 0x1FCC0078, 0x0462B140, 0x2280007E,
+ 0x28004000, 0x0C3C0004, 0x19CC007E, 0x1968B140,
+ 0x283C4000, 0x2B60B140, 0x1035000F, 0x1231FFFF,
+ 0x0B2D0082, 0x0D894000, 0x248C1D78, 0x318000A1,
+ 0x2F8C1D7A, 0x318000A1, 0x3D8C1DF8, 0x318000A1,
+ 0x368C1DFA, 0x318000A1, 0x298C1D7C, 0x318000A1,
+ 0x228C1D7E, 0x318000A1, 0x308C1DFC, 0x318000A1,
+ 0x3B8C1DFE, 0x318000A1, 0x238C1D79, 0x318000A1,
+ 0x288C1D7B, 0x318000A1, 0x3A8C1DF9, 0x318000A1,
+ 0x318C1DFB, 0x318000A1, 0x2E8C1D7D, 0x318000A1,
+ 0x258C1D7F, 0x318000A1, 0x378C1DFD, 0x318000A1,
+ 0x3C8C1DFF, 0x35B000FA, 0x07BC0C07, 0x29D80CD4,
+ 0x3FA00C08, 0x1DA40C2E, 0x1CA80C49, 0x11F80F12,
+ 0x39E80CF2, 0x32E00118, 0x336A5EA0, 0x362300AF,
+ 0x17360002, 0x33C800AF, 0x20AC0E9D, 0x31215EA2,
+ 0x07220014, 0x14970FB4, 0x27C80071, 0x21884000,
+ 0x30380000, 0x32C80112, 0x31215EA2, 0x07220014,
+ 0x1D800FD7, 0x36200000, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x0D500000, 0x36200000, 0x2760B000,
+ 0x2960B008, 0x1E220001, 0x1B62B010, 0x3760B01C,
+ 0x10228800, 0x1862B01C, 0x228B4000, 0x0868B1F8,
+ 0x2D635E96, 0x3C34000F, 0x02030000, 0x022B000A,
+ 0x05C000CE, 0x3320000A, 0x02030000, 0x1A210000,
+ 0x1231FFFF, 0x1B390001, 0x092CFFFF, 0x1DCC00D0,
+ 0x0761B140, 0x33228000, 0x2D010000, 0x20310008,
+ 0x1A39A0CA, 0x3F424000, 0x19220000, 0x3F424000,
+ 0x0C220020, 0x392DFFBA, 0x3F424000, 0x3860B150,
+ 0x1A22C000, 0x22520000, 0x22520000, 0x19220000,
+ 0x302DFF7C, 0x3F424000, 0x172D0008, 0x3F424000,
+ 0x1E220001, 0x172D0008, 0x3F424000, 0x19220000,
+ 0x1A2D000C, 0x3F424000, 0x10228800, 0x3F424000,
+ 0x06220400, 0x0962B144, 0x2E020000, 0x033A0200,
+ 0x0962B144, 0x322C0001, 0x0A2FFFFF, 0x17CC00D5,
+ 0x1F6B5E96, 0x228B4000, 0x0422008D, 0x2480010D,
+ 0x09220089, 0x2480010D, 0x0C220083, 0x2480010D,
+ 0x0A220085, 0x2480010D, 0x13220005, 0x2480010D,
+ 0x01220087, 0x2480010D, 0x18220007, 0x2480010D,
+ 0x0D220011, 0x2480010D, 0x0222008B, 0x2480010D,
+ 0x1B22000B, 0x15625FF2, 0x32635FF0, 0x23320008,
+ 0x0A62B148, 0x33D00113, 0x228B4000, 0x31200001,
+ 0x2A9700B9, 0x329700C7, 0x398C0000, 0x35800116,
+ 0x33695F20, 0x3A20012C, 0x1C35C000, 0x36C8011F,
+ 0x12685F24, 0x043D4000, 0x08CC00AA, 0x3C2300AA,
+ 0x336A5EA0, 0x03210080, 0x2736FFFE, 0x01625EA0,
+ 0x37655F21, 0x288000B4, 0x33695F20, 0x12685F24,
+ 0x1C35C000, 0x2E3DC000, 0x3FC80120, 0x228B4000,
+ 0x01970F37, 0x26C801CC, 0x20605F24, 0x00685FFC,
+ 0x1A210000, 0x09615F2E, 0x3F340003, 0x212C013E,
+ 0x21884000, 0x36200000, 0x2360B122, 0x3D800142,
+ 0x146BB124, 0x38695F22, 0x36200000, 0x37370001,
+ 0x03CC0148, 0x3965B123, 0x3D800142, 0x2C800135,
+ 0x28800138, 0x2597010C, 0x1168B122, 0x3B69B124,
+ 0x2F34001F, 0x29310001, 0x19110000, 0x19D401C2,
+ 0x036B5FFC, 0x1C645F20, 0x0A37FF00, 0x0F330008,
+ 0x300B0000, 0x08C001BF, 0x3D6A5F24, 0x3F215F26,
+ 0x0C2E0040, 0x13408000, 0x3330FFFB, 0x1C2C4000,
+ 0x02970FF4, 0x35695F26, 0x362C000C, 0x13350003,
+ 0x06CC01BB, 0x3F215F26, 0x2222FFFE, 0x1C97100A,
+ 0x3E695F24, 0x382C0004, 0x244A0000, 0x042D0042,
+ 0x3F424000, 0x1D2E0001, 0x16420000, 0x1797103E,
+ 0x0E970C64, 0x19685F26, 0x3D695F28, 0x3660B408,
+ 0x1161B40A, 0x12685F24, 0x2421B40E, 0x3B60B40C,
+ 0x21510000, 0x24200021, 0x3560B404, 0x20200040,
+ 0x2660B414, 0x36200175, 0x0F210163, 0x362300AF,
+ 0x1D800C8B, 0x1F685F20, 0x316A5FE8, 0x353400FF,
+ 0x26605F22, 0x1D2E0001, 0x03625FE8, 0x02030000,
+ 0x3330FFFB, 0x0F2C4010, 0x244A0000, 0x382C0004,
+ 0x27490000, 0x2C3B0400, 0x1E2D0001, 0x350A4000,
+ 0x36C40186, 0x1A210000, 0x15410000, 0x12685F24,
+ 0x2B63B120, 0x3D2C0038, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x0D500000, 0x002CFFF6, 0x244A0000,
+ 0x052CFFCA, 0x146B5F2E, 0x36368000, 0x13CC019B,
+ 0x333B0000, 0x34C801B7, 0x332F003C, 0x3A40C000,
+ 0x0C685F30, 0x20605F24, 0x3E8001B7, 0x25605F2E,
+ 0x333B0000, 0x17CC01A0, 0x3E605F30, 0x278001A2,
+ 0x332F003C, 0x3A40C000, 0x33695F20, 0x1768B124,
+ 0x1E220001, 0x35230000, 0x193500FF, 0x190B4000,
+ 0x1912C000, 0x2E148000, 0x04CC01B0, 0x28970108,
+ 0x282301A2, 0x23635F24, 0x20200040, 0x258001C5,
+ 0x01970F37, 0x20C801CA, 0x20605F24, 0x1F685F20,
+ 0x3D6A5F24, 0x353400FF, 0x3980014F, 0x35215FDA,
+ 0x03970F50, 0x2D2301C4, 0x3B8001D1, 0x1F685F20,
+ 0x20970106, 0x353400FF, 0x2F8001C0, 0x2597010C,
+ 0x2F380400, 0x2860B120, 0x12685F24, 0x15970F4A,
+ 0x36200000, 0x336A5EA0, 0x1B645F21, 0x183A0001,
+ 0x01625EA0, 0x398000AF, 0x302301B0, 0x2B8001CD,
+ 0x3923012C, 0x23635F24, 0x392000C0, 0x1B645F21,
+ 0x398000AF, 0x2B695F32, 0x1C208000, 0x28150000,
+ 0x30C801D6, 0x228B4000, 0x35605F32, 0x392001D9,
+ 0x288000B4, 0x18685FD8, 0x3E215FD8, 0x30380000,
+ 0x2BC801FE, 0x1D970F72, 0x33605F34, 0x2D010000,
+ 0x3E2C0034, 0x0B480000, 0x3C6A5FEC, 0x02030000,
+ 0x3C34000F, 0x1D2E0001, 0x0E625FEC, 0x19220000,
+ 0x14625F3A, 0x3562013E, 0x0C330004, 0x3F37000F,
+ 0x3E2F01EE, 0x228B4000, 0x358003C6, 0x3A800550,
+ 0x2B8006EE, 0x328006FB, 0x32800211, 0x32800211,
+ 0x32800211, 0x32800211, 0x32800211, 0x32800211,
+ 0x32800211, 0x32800211, 0x32800211, 0x32800211,
+ 0x02800BD7, 0x32800211, 0x33605F34, 0x35605F32,
+ 0x398000AF, 0x112200C1, 0x38800214, 0x192200A3,
+ 0x38800214, 0x0F22008F, 0x38800214, 0x0A220085,
+ 0x38800214, 0x162200C0, 0x38800214, 0x152200A0,
+ 0x38800214, 0x122200A1, 0x38800214, 0x07220081,
+ 0x38800214, 0x01220087, 0x38800214, 0x19220000,
+ 0x07685F32, 0x1F625F38, 0x33230219, 0x16341000,
+ 0x05CC02B1, 0x3697036F, 0x01685F34, 0x2D6A5F38,
+ 0x35230229, 0x392C0035, 0x27460000, 0x2D695F34,
+ 0x32800284, 0x1160013C, 0x2B635F46, 0x3697036F,
+ 0x39200226, 0x38605F36, 0x3B9703A4, 0x00CC0274,
+ 0x37970247, 0x0A6A010C, 0x35680110, 0x3D2A01A0,
+ 0x3FC801D9, 0x30380000, 0x0ECC01D9, 0x28620110,
+ 0x1D970C74, 0x1A6A0110, 0x1820B424, 0x19500011,
+ 0x0A500001, 0x1150C400, 0x0A500001, 0x1B5001A0,
+ 0x0D500000, 0x1C62B434, 0x0421023D, 0x3A2301D9,
+ 0x12940C8E, 0x3D6B0112, 0x0F2201A0, 0x3862010C,
+ 0x36200000, 0x1A6A0110, 0x0C600112, 0x07600110,
+ 0x333B0000, 0x0BCC0396, 0x398000AF, 0x33635F38,
+ 0x011A4000, 0x0462B140, 0x1F6B5EA0, 0x2E020000,
+ 0x3E3B0004, 0x2D635EA0, 0x1A388000, 0x35605F32,
+ 0x2B008000, 0x0E300003, 0x2B605F4A, 0x2B008000,
+ 0x3F30FFF8, 0x1E384001, 0x2D605F4C, 0x1132FFFF,
+ 0x2E2E0D17, 0x2E23025B, 0x0E8A4000, 0x26605F4E,
+ 0x0A6A010C, 0x202001A0, 0x1A210000, 0x1C0A0000,
+ 0x11970DFB, 0x06970E19, 0x046B5F32, 0x14685F4E,
+ 0x3F37000F, 0x293B0100, 0x2E6A5F34, 0x2563B144,
+ 0x16420000, 0x36695F46, 0x3E2C0002, 0x15410000,
+ 0x266A5F3A, 0x3E2C0002, 0x16420000, 0x23695F3C,
+ 0x016B5F38, 0x3E2C0002, 0x15410000, 0x228B4000,
+ 0x3520C000, 0x35605F32, 0x13970C85, 0x0F220040,
+ 0x1820B424, 0x19500011, 0x01500003, 0x1150C400,
+ 0x0A500001, 0x0E500180, 0x0D500000, 0x1C62B434,
+ 0x352000AF, 0x192100AF, 0x362300AF, 0x17800C8E,
+ 0x28635E9C, 0x1B6B5FEE, 0x0A615E98, 0x192D0036,
+ 0x22484000, 0x312F0001, 0x29635FEE, 0x00349FFF,
+ 0x10404000, 0x19348000, 0x27C80297, 0x222DFFFE,
+ 0x0D4A4000, 0x172D0008, 0x22484000, 0x02625E9A,
+ 0x21510000, 0x30380000, 0x24C802AD, 0x20605E9E,
+ 0x14685E98, 0x33215FDC, 0x02970F61, 0x12970E9D,
+ 0x12685E9E, 0x1A6B5E9C, 0x30380000, 0x16CC02A1,
+ 0x228B4000, 0x306A5E9A, 0x3E215FD8, 0x2636FF00,
+ 0x28D002A8, 0x02970F61, 0x1A6B5E9C, 0x3B8001D1,
+ 0x23320008, 0x392C0035, 0x27460000, 0x3E695E9E,
+ 0x35800285, 0x2B970104, 0x39209000, 0x35605F32,
+ 0x14801034, 0x1C208000, 0x35605F32, 0x05801043,
+ 0x3B635F36, 0x19685F4A, 0x33695F4C, 0x1632FFFE,
+ 0x1A048000, 0x33C402BC, 0x1E2D0001, 0x01615F4C,
+ 0x2B605F4A, 0x26320002, 0x09685F3A, 0x2C8002CA,
+ 0x3B635F36, 0x30380000, 0x28D002C4, 0x33970365,
+ 0x09685F3A, 0x1C390000, 0x26C802CA, 0x09300002,
+ 0x10404000, 0x3930FFFE, 0x2D010000, 0x0F2D01A0,
+ 0x3E610106, 0x1632FFFE, 0x39C80363, 0x28038000,
+ 0x06330001, 0x0BD402D3, 0x172E0004, 0x280C8000,
+ 0x3B605F3A, 0x28038000, 0x3F37000F, 0x35C802DA,
+ 0x2F36FFF0, 0x092E0010, 0x1F6B5F40, 0x19625F3E,
+ 0x1A0B8000, 0x3CC402DF, 0x01625F40, 0x386A5F42,
+ 0x36200000, 0x133600C0, 0x2B320006, 0x37C802E7,
+ 0x232C0040, 0x262EFFFF, 0x308002E3, 0x19600104,
+ 0x1E970CB7, 0x352000AF, 0x0F970CC0, 0x0E970CC7,
+ 0x1D970C74, 0x07690104, 0x2B680104, 0x1F2D0030,
+ 0x0D4A4000, 0x122D0002, 0x214B4000, 0x123EFFFF,
+ 0x1A1EC000, 0x0DCC0333, 0x3421B424, 0x30510041,
+ 0x2360B428, 0x142D0004, 0x21510000, 0x3151C010,
+ 0x26510001, 0x11220038, 0x1C62B434, 0x1F2102EC,
+ 0x362300AF, 0x12940C8E, 0x3320003C, 0x3960B348,
+ 0x0E970C64, 0x1D970C74, 0x20680106, 0x3721B428,
+ 0x2B6A5F3E, 0x156B5FD0, 0x0451E000, 0x26510001,
+ 0x2E60B42C, 0x122D0002, 0x21510000, 0x24200311,
+ 0x2E63B420, 0x2060B424, 0x1C62B434, 0x19685F4A,
+ 0x33695F4C, 0x3660B408, 0x1161B40A, 0x056B5FCC,
+ 0x2F21B40C, 0x0451E000, 0x26510001, 0x17201061,
+ 0x3B63B400, 0x3560B404, 0x0962B414, 0x3A200003,
+ 0x3D605F50, 0x2620032C, 0x1C210336, 0x11970C8E,
+ 0x362300AF, 0x18940C8B, 0x0F685F50, 0x0834FFFE,
+ 0x3D605F50, 0x30380000, 0x37C80331, 0x398000AF,
+ 0x0F685F50, 0x0434FFFD, 0x3D605F50, 0x30380000,
+ 0x02CC00AF, 0x096B5F36, 0x01800CCE, 0x07970C94,
+ 0x25230203, 0x01800CCE, 0x302302EC, 0x01800C94,
+ 0x3B635F36, 0x30380000, 0x35D0033C, 0x33970365,
+ 0x09685F3A, 0x1C390000, 0x2BC80342, 0x09300002,
+ 0x10404000, 0x3930FFFE, 0x2D010000, 0x0F2D01A0,
+ 0x3E610106, 0x1632FFFE, 0x39C80363, 0x1F6B5F40,
+ 0x19625F3E, 0x1A0B8000, 0x20C4034C, 0x01625F40,
+ 0x28038000, 0x0D330003, 0x04D40350, 0x172E0004,
+ 0x280C8000, 0x3B605F3A, 0x0E970C64, 0x19685F4A,
+ 0x33695F4C, 0x3660B408, 0x1161B40A, 0x20680106,
+ 0x2B6A5F3E, 0x2421B40E, 0x21510000, 0x3B60B40C,
+ 0x24200021, 0x3560B404, 0x0962B414, 0x0A685F36,
+ 0x12210352, 0x362300AF, 0x1D800C8B, 0x096B5F36,
+ 0x2380010C, 0x2B635E90, 0x026B5F34, 0x010CC000,
+ 0x084B0000, 0x3E2C0002, 0x0B480000, 0x28635F4A,
+ 0x196B5E90, 0x2D605F4C, 0x228B4000, 0x336A5F40,
+ 0x36200000, 0x2E605F40, 0x1F3A0000, 0x37CC0CA6,
+ 0x228B4000, 0x0A20FFFF, 0x192D0036, 0x0D4A4000,
+ 0x2F2DFFFA, 0x0A625F42, 0x3A34003F, 0x2E148000,
+ 0x11CC0203, 0x228B4000, 0x0D4A4000, 0x122D0002,
+ 0x0F3607FC, 0x26C80205, 0x26320002, 0x19088000,
+ 0x14C00205, 0x2B008000, 0x05300001, 0x11D40389,
+ 0x1D2E0001, 0x3E30FFFF, 0x228B4000, 0x2D635E96,
+ 0x27200102, 0x2297037E, 0x12600130, 0x0C625F44,
+ 0x27200102, 0x2297037E, 0x1F6B5E96, 0x1F600134,
+ 0x07625F46, 0x228B4000, 0x0969010C, 0x2E68010E,
+ 0x3B3D01A0, 0x0CCC03A1, 0x0C2E01A0, 0x3862010C,
+ 0x30380000, 0x3AC803A0, 0x19088000, 0x19C00201,
+ 0x228B4000, 0x28620110, 0x0F630112, 0x398000AF,
+ 0x26680100, 0x2D635E96, 0x366AB140, 0x1D210001,
+ 0x35230000, 0x03280001, 0x300B0000, 0x1A11C000,
+ 0x28038000, 0x2E174000, 0x22C803B2, 0x29310001,
+ 0x03280001, 0x3AC403AC, 0x1F6B5E96, 0x228B4000,
+ 0x2D635E96, 0x19220000, 0x0A625E94, 0x1A6BB140,
+ 0x0A690100, 0x31200001, 0x2D02C000, 0x2B160000,
+ 0x386A5E94, 0x08CC03C0, 0x1D2E0001, 0x0A625E94,
+ 0x3E30FFFF, 0x252DFFFF, 0x1DCC03BA, 0x1F6B5E96,
+ 0x386A5E94, 0x228B4000, 0x09625F4E, 0x352C03C9,
+ 0x21884000, 0x32800211, 0x298003D9, 0x2C800453,
+ 0x26800456, 0x33800476, 0x2E800497, 0x2F8004FC,
+ 0x238004FF, 0x2980051A, 0x2880051D, 0x3B80053B,
+ 0x32800211, 0x32800211, 0x32800211, 0x32800211,
+ 0x32800211, 0x28230018, 0x1263013C, 0x20970375,
+ 0x2197038B, 0x0F6A0130, 0x02030000, 0x1A0B8000,
+ 0x15C003E2, 0x2E020000, 0x206B013C, 0x11685F44,
+ 0x36695F46, 0x25370020, 0x13CC03E8, 0x1D2E0001,
+ 0x12625F3C, 0x2D0E0000, 0x040E4000, 0x1632FFFE,
+ 0x36970396, 0x249702AE, 0x36200000, 0x15210120,
+ 0x3E6A5F44, 0x32970338, 0x38200008, 0x18210124,
+ 0x356A5F46, 0x32970338, 0x389702B1, 0x09685F3A,
+ 0x09210010, 0x09300002, 0x0F600128, 0x35610104,
+ 0x3697036F, 0x1F970CDC, 0x20680130, 0x01690134,
+ 0x1C6A0120, 0x3D6B0124, 0x3460B010, 0x1561B014,
+ 0x3D680128, 0x1C69012C, 0x172E0068, 0x0862B000,
+ 0x3B2F0068, 0x2963B004, 0x016A0138, 0x382C0068,
+ 0x2960B008, 0x142D0068, 0x0861B00C, 0x1562B018,
+ 0x2368013C, 0x362300AF, 0x1A388000, 0x3760B01C,
+ 0x1E940CE1, 0x14685F4E, 0x2E6A5F34, 0x30380000,
+ 0x34C8041E, 0x21884000, 0x1C208000, 0x13408000,
+ 0x36200000, 0x3580042A, 0x09685F3A, 0x2169B024,
+ 0x012E0028, 0x1C390000, 0x3FD0041A, 0x09300002,
+ 0x382C0068, 0x1F090000, 0x1531FFFE, 0x0E68B028,
+ 0x3F418000, 0x2F34001F, 0x112E0002, 0x13408000,
+ 0x2B008000, 0x3E2C0002, 0x0D500000, 0x0D500000,
+ 0x13970CE9, 0x206A5F3C, 0x01685F34, 0x1632FFFE,
+ 0x33C80213, 0x286B0104, 0x25695F3A, 0x12625F3C,
+ 0x01625F40, 0x010CC000, 0x0F2D01A0, 0x35610104,
+ 0x27490000, 0x3E2C0002, 0x0B480000, 0x07615F4A,
+ 0x2D605F4C, 0x0E970C64, 0x19685F4A, 0x33695F4C,
+ 0x3B60B40C, 0x1C61B40E, 0x2B680104, 0x1A210000,
+ 0x1161B40A, 0x3660B408, 0x206A5F3C, 0x28200081,
+ 0x3560B404, 0x0962B414, 0x14210441, 0x362300AF,
+ 0x18940C8B, 0x36230213, 0x3080036F, 0x2E230028,
+ 0x1263013C, 0x228003DB, 0x20970375, 0x27200102,
+ 0x2297037E, 0x12600130, 0x0C625F44, 0x322C0001,
+ 0x3D605F3C, 0x1D32FFFC, 0x172E0004, 0x36970396,
+ 0x249702AE, 0x36200000, 0x15210120, 0x3E6A5F44,
+ 0x32970338, 0x3E6A5F44, 0x38200008, 0x18210124,
+ 0x32970338, 0x3E6A5F44, 0x25200010, 0x1B210128,
+ 0x32970338, 0x389702B1, 0x09685F3A, 0x07210018,
+ 0x09300002, 0x0260012C, 0x35610104, 0x3023000A,
+ 0x1263013C, 0x368003FC, 0x20970375, 0x2197038B,
+ 0x11685F44, 0x2D0E0000, 0x1632FFFE, 0x36970396,
+ 0x249702AE, 0x36200000, 0x15210120, 0x3E6A5F44,
+ 0x32970338, 0x356A5F46, 0x38200008, 0x18210124,
+ 0x32970338, 0x389702B1, 0x09685F3A, 0x0F6A0130,
+ 0x2E6B0134, 0x09300002, 0x0F600128, 0x2E0EC000,
+ 0x1632FFFE, 0x12625F3C, 0x15208009, 0x32970221,
+ 0x0C970D8F, 0x3E680148, 0x1F970E60, 0x1A210000,
+ 0x236A5F5C, 0x25200010, 0x0E800E7D, 0x06208100,
+ 0x1160013C, 0x20970375, 0x2197038B, 0x236B0130,
+ 0x3D695F44, 0x300B0000, 0x14C00205, 0x0834FFFE,
+ 0x26C80205, 0x040E4000, 0x1632FFFE, 0x36970396,
+ 0x249702AE, 0x36200000, 0x15210120, 0x3E6A5F44,
+ 0x32970338, 0x356A5F46, 0x38200008, 0x18210124,
+ 0x32970338, 0x389702B1, 0x026A0134, 0x12690124,
+ 0x262EFFFF, 0x040D8000, 0x1531FFFE, 0x0F2D01A0,
+ 0x0D4A4000, 0x122D0002, 0x0E494000, 0x2368013C,
+ 0x011A4000, 0x2EC8020B, 0x25695F3A, 0x026A0134,
+ 0x25310002, 0x23610128, 0x29340100, 0x22C804CB,
+ 0x236B0130, 0x2B008000, 0x1A0B8000, 0x312F0001,
+ 0x1D2E0001, 0x05300001, 0x28D004C8, 0x1D2E0001,
+ 0x040D8000, 0x2E61012C, 0x2E0EC000, 0x1632FFFE,
+ 0x12625F3C, 0x2368013C, 0x32970221, 0x0C970D8F,
+ 0x0C69015C, 0x3368014C, 0x05350100, 0x2CC804F5,
+ 0x1F970E60, 0x22520000, 0x172E0004, 0x07690168,
+ 0x3E680148, 0x1C390000, 0x3DD004DE, 0x1F090000,
+ 0x1531FFFE, 0x368004DF, 0x30218000, 0x04685F52,
+ 0x2A2EFFFC, 0x3F418000, 0x15381000, 0x36605F52,
+ 0x12971034, 0x016A0154, 0x2068015C, 0x1A210000,
+ 0x1632FFFE, 0x29340100, 0x25200010, 0x2BC804F4,
+ 0x04970E7E, 0x3E680148, 0x1F69014C, 0x236A5F5C,
+ 0x1F090000, 0x1531FFFE, 0x350A4000, 0x2B200018,
+ 0x0E800E7D, 0x2E6A5F58, 0x012E0028, 0x22520000,
+ 0x22520000, 0x22520000, 0x22520000, 0x388004D7,
+ 0x00208200, 0x1160013C, 0x26800499, 0x21200088,
+ 0x1160013C, 0x20970375, 0x03361F00, 0x23320008,
+ 0x33620138, 0x27200102, 0x2297037E, 0x12600130,
+ 0x2D6B0138, 0x0C625F44, 0x333B0000, 0x206B013C,
+ 0x0CCC050E, 0x2B800511, 0x26370040, 0x10CC0511,
+ 0x322C0001, 0x3D605F3C, 0x2D0E0000, 0x1632FFFE,
+ 0x36970396, 0x36200000, 0x15210120, 0x3E6A5F44,
+ 0x3B2303F7, 0x34800338, 0x2E200048, 0x1160013C,
+ 0x38800501, 0x20970375, 0x27200102, 0x2297037E,
+ 0x12600130, 0x0C625F44, 0x1A32FFFD, 0x36970396,
+ 0x249702AE, 0x36200000, 0x15210120, 0x3E6A5F44,
+ 0x32970338, 0x3E6A5F44, 0x38200008, 0x18210124,
+ 0x32970338, 0x389702B1, 0x39200533, 0x26605F4E,
+ 0x2A230400, 0x1263013C, 0x368003FC, 0x2C69B020,
+ 0x012E0028, 0x22520000, 0x22520000, 0x22520000,
+ 0x3F418000, 0x36230213, 0x15800CE9, 0x20970375,
+ 0x2A2001FF, 0x2297037E, 0x12600130, 0x3D605F3C,
+ 0x2E020000, 0x0C625F44, 0x1632FFFE, 0x36970396,
+ 0x36200000, 0x15210120, 0x3E6A5F44, 0x32970338,
+ 0x36200000, 0x3B605F3A, 0x0F600128, 0x09210010,
+ 0x35610104, 0x18230808, 0x1263013C, 0x368003FC,
+ 0x02030000, 0x0D37FFF8, 0x09CC0211, 0x3F2C0555,
+ 0x21884000, 0x3E80055D, 0x3E8005A4, 0x20800615,
+ 0x32800211, 0x2480062E, 0x3380065F, 0x32800211,
+ 0x32800211, 0x0620FFFC, 0x2C970376, 0x03361F00,
+ 0x2DC80207, 0x23320008, 0x33620138, 0x3F2A0011,
+ 0x2EC40207, 0x2197038B, 0x05300001, 0x39D00569,
+ 0x112E0002, 0x25347FFF, 0x26C80205, 0x2E680138,
+ 0x07625F46, 0x2D010000, 0x24290003, 0x21C40571,
+ 0x3A200003, 0x392C0003, 0x07018000, 0x15072000,
+ 0x333B0000, 0x14CC0209, 0x3D695F44, 0x092E0010,
+ 0x040E4000, 0x082A0800, 0x356A5F46, 0x26C40209,
+ 0x1132FFFF, 0x040E4000, 0x1632FFFE, 0x36970396,
+ 0x249702AE, 0x36200000, 0x15210120, 0x146B5F42,
+ 0x3E6A5F44, 0x06330001, 0x23D00589, 0x2C23058A,
+ 0x34800338, 0x2F9702C0, 0x146B5F42, 0x38200008,
+ 0x18210124, 0x356A5F46, 0x0A330002, 0x32D00592,
+ 0x36230593, 0x34800338, 0x2F9702C0, 0x0A6B5F3A,
+ 0x356A5F46, 0x1B210128, 0x2B635F46, 0x25200010,
+ 0x32970338, 0x389702B1, 0x196B5F46, 0x3D680128,
+ 0x026A0134, 0x0260012C, 0x1632FFFE, 0x38635F3A,
+ 0x12625F3C, 0x1320E000, 0x3E23060E, 0x34800221,
+ 0x0B20FFF8, 0x2C970376, 0x03361F00, 0x2DC80207,
+ 0x23320008, 0x33620138, 0x3F2A0011, 0x2EC40207,
+ 0x24200082, 0x2297037E, 0x12600130, 0x0C625F44,
+ 0x24200082, 0x2297037E, 0x1F600134, 0x05300001,
+ 0x2AD005B6, 0x112E0002, 0x25347FFF, 0x26C80205,
+ 0x2E680138, 0x07625F46, 0x2D010000, 0x24290003,
+ 0x21C405BE, 0x3A200003, 0x332C0006, 0x07018000,
+ 0x15072000, 0x333B0000, 0x14CC0209, 0x3D695F44,
+ 0x2D680134, 0x092E0010, 0x1231FFFF, 0x040E4000,
+ 0x082A0800, 0x26C40209, 0x2E020000, 0x1632FFFE,
+ 0x2D0E0000, 0x040E4000, 0x102E0005, 0x1632FFFE,
+ 0x36970396, 0x249702AE, 0x36200000, 0x15210120,
+ 0x146B5F42, 0x3E6A5F44, 0x06330001, 0x2DD005DB,
+ 0x1132FFFF, 0x242305DE, 0x34800338, 0x2F9702C0,
+ 0x3E6A5F44, 0x329702B4, 0x146B5F42, 0x38200008,
+ 0x18210124, 0x356A5F46, 0x0A330002, 0x28D005E7,
+ 0x1132FFFF, 0x2F2305EA, 0x34800338, 0x2F9702C0,
+ 0x356A5F46, 0x329702B4, 0x12690124, 0x356A5F46,
+ 0x1531FFFE, 0x0F2D01A0, 0x22484000, 0x1632FFFE,
+ 0x040D8000, 0x214B4000, 0x34340001, 0x23C8020F,
+ 0x37370001, 0x23C8020F, 0x026A0134, 0x25200010,
+ 0x146B5F42, 0x1B210128, 0x0D330003, 0x32D005FE,
+ 0x362305FF, 0x34800338, 0x2F9702C0, 0x09685F3A,
+ 0x026A0134, 0x26605F4E, 0x2D200028, 0x1621012C,
+ 0x1132FFFF, 0x32970338, 0x389702B1, 0x14685F4E,
+ 0x026A0134, 0x3B605F3A, 0x39209000, 0x1A32FFFD,
+ 0x12625F3C, 0x32970221, 0x0C970D8F, 0x3368014C,
+ 0x1F970E60, 0x1A210000, 0x236A5F5C, 0x2B200018,
+ 0x0E800E7D, 0x20970375, 0x2197038B, 0x126B5F44,
+ 0x2E0EC000, 0x1632FFFE, 0x36970396, 0x249702AE,
+ 0x36200000, 0x15210120, 0x3E6A5F44, 0x32970338,
+ 0x38200008, 0x18210124, 0x356A5F46, 0x32970338,
+ 0x389702B1, 0x0A6B5F3A, 0x026A0134, 0x0A330002,
+ 0x0163012C, 0x1632FFFE, 0x12625F3C, 0x3620F000,
+ 0x3E23060E, 0x34800221, 0x0C20FFF9, 0x2C970376,
+ 0x0A625F42, 0x122D0002, 0x2B200018, 0x2297037E,
+ 0x1F600134, 0x0834FFFE, 0x26C80205, 0x112E0002,
+ 0x07625F46, 0x2920013C, 0x27508000, 0x0A500001,
+ 0x23290002, 0x22484000, 0x28038000, 0x1A32FFFD,
+ 0x2E0EC000, 0x3F340003, 0x20605F48, 0x1632FFFE,
+ 0x36970396, 0x249702AE, 0x356A5F46, 0x116B5F48,
+ 0x2B008000, 0x1132FFFF, 0x37370001, 0x21C8064D,
+ 0x2D0E0000, 0x15210120, 0x36200000, 0x32970338,
+ 0x116B5F48, 0x356A5F46, 0x37370001, 0x1DCC0686,
+ 0x29230686, 0x09685F3A, 0x2E01C000, 0x232C01A0,
+ 0x0A500001, 0x1632FFFE, 0x202A0002, 0x0D970F97,
+ 0x122801A0, 0x3B605F3A, 0x0D894000, 0x0B20FFF8,
+ 0x2C970376, 0x0A625F42, 0x2B200018, 0x2297037E,
+ 0x12600130, 0x0C625F44, 0x2B200018, 0x2297037E,
+ 0x1F600134, 0x0834FFFE, 0x26C80205, 0x112E0002,
+ 0x07625F46, 0x2920013C, 0x02509000, 0x0A500001,
+ 0x23290002, 0x22484000, 0x3D695F44, 0x38340002,
+ 0x20605F48, 0x1132FFFF, 0x28038000, 0x2E0EC000,
+ 0x2E0EC000, 0x040E4000, 0x1632FFFE, 0x36970396,
+ 0x249702AE, 0x36200000, 0x15210120, 0x146B5F42,
+ 0x3E6A5F44, 0x06330001, 0x26D00685, 0x29230686,
+ 0x34800338, 0x2F9702C0, 0x146B5F42, 0x356A5F46,
+ 0x38200008, 0x0A330002, 0x38D00691, 0x07018000,
+ 0x1132FFFF, 0x040E4000, 0x18210124, 0x3D230697,
+ 0x34800338, 0x18210124, 0x2F9702C0, 0x356A5F46,
+ 0x329702B4, 0x356A5F46, 0x329702B4, 0x146B5F42,
+ 0x356A5F46, 0x1B210128, 0x0D330003, 0x22D006BE,
+ 0x116B5F48, 0x2B008000, 0x1132FFFF, 0x37370001,
+ 0x34C806A2, 0x2D0E0000, 0x25200010, 0x32970338,
+ 0x116B5F48, 0x356A5F46, 0x37370001, 0x0CCC06C7,
+ 0x0F69013C, 0x01685F34, 0x356A5F46, 0x223D9000,
+ 0x1ECC06BC, 0x2E2C0028, 0x084B0000, 0x3E2C0002,
+ 0x27490000, 0x3E2C0002, 0x2D1B4000, 0x27490000,
+ 0x3E2C0002, 0x2D1B4000, 0x27490000, 0x2D200028,
+ 0x2D1B4000, 0x2FC806BC, 0x382306C7, 0x34800338,
+ 0x382306C7, 0x36800655, 0x25200010, 0x2F9702C0,
+ 0x356A5F46, 0x329702B4, 0x116B5F48, 0x356A5F46,
+ 0x37370001, 0x31C806A8, 0x329702B4, 0x389702B1,
+ 0x3D6A5F48, 0x09685F3A, 0x17360002, 0x28C806D1,
+ 0x356A5F46, 0x01690134, 0x1132FFFF, 0x040E4000,
+ 0x1632FFFE, 0x12625F3C, 0x09300002, 0x0260012C,
+ 0x2368013C, 0x32970221, 0x2D695F58, 0x142D0032,
+ 0x22484000, 0x38340002, 0x19CC06E7, 0x016A0154,
+ 0x3A20A000, 0x28038000, 0x06330001, 0x19D406E1,
+ 0x1D2E0001, 0x112E0002, 0x3D33FFFF, 0x2E0EC000,
+ 0x1632FFFE, 0x11625F5C, 0x08970D7B, 0x0C970D8F,
+ 0x3368014C, 0x1F970E60, 0x1A210000, 0x236A5F5C,
+ 0x2B200018, 0x0E800E7D, 0x02030000, 0x0D37FFF8,
+ 0x09CC0211, 0x332C06F3, 0x21884000, 0x388006FE,
+ 0x328007B8, 0x138009BF, 0x01800A98, 0x32800211,
+ 0x328007B8, 0x32800211, 0x01800A98, 0x30380000,
+ 0x09CC0211, 0x05800BD6, 0x0620FFFC, 0x2C970376,
+ 0x122D0002, 0x2B200018, 0x2297037E, 0x12600130,
+ 0x1F600134, 0x0834FFFE, 0x26C80205, 0x112E0002,
+ 0x23290002, 0x22484000, 0x07625F46, 0x34340001,
+ 0x20605F48, 0x2B008000, 0x3530FFFD, 0x2D0E0000,
+ 0x2D0E0000, 0x1632FFFE, 0x36970396, 0x249702AE,
+ 0x36200000, 0x15210120, 0x146B5F42, 0x356A5F46,
+ 0x06330001, 0x3FD0071C, 0x3B23071D, 0x34800338,
+ 0x2F9702C0, 0x1497098E, 0x356A5F46, 0x2D200028,
+ 0x1A210000, 0x32970338, 0x389702B1, 0x1A685F46,
+ 0x36695F46, 0x3530FFFD, 0x2B0C4000, 0x01600120,
+ 0x1531FFFE, 0x20610124, 0x026A0134, 0x3930FFFE,
+ 0x232C01A0, 0x1132FFFF, 0x1A210000, 0x084B0000,
+ 0x3E2C0002, 0x2819C000, 0x262EFFFF, 0x02CC072F,
+ 0x2435FFFE, 0x28C8020D, 0x1F970CDC, 0x01690134,
+ 0x1C6A0120, 0x3D6B0124, 0x03208400, 0x172E0068,
+ 0x3B2F0068, 0x1861B010, 0x0862B000, 0x2963B004,
+ 0x3760B01C, 0x362300AF, 0x1E940CE1, 0x2C69B020,
+ 0x25310002, 0x37D00748, 0x13970CE9, 0x2280020D,
+ 0x13970CE9, 0x1A685F46, 0x19220000, 0x0C600124,
+ 0x2D010000, 0x1531FFFE, 0x2E0D0000, 0x23610128,
+ 0x070D4000, 0x2E0D0000, 0x2E61012C, 0x12625F3C,
+ 0x31200001, 0x1A60013E, 0x39209000, 0x32970221,
+ 0x3A20A000, 0x08970D7B, 0x28680164, 0x116A0148,
+ 0x30380000, 0x1BD00E5E, 0x1F69014C, 0x070E8000,
+ 0x2E610140, 0x23620148, 0x35098000, 0x2D61014C,
+ 0x1531FFFE, 0x23610144, 0x00208200, 0x0E970D7D,
+ 0x2B680168, 0x1C6A014C, 0x30380000, 0x1BD00E5E,
+ 0x12690148, 0x23620148, 0x35098000, 0x2E610140,
+ 0x35098000, 0x1632FFFE, 0x040D8000, 0x2D61014C,
+ 0x3620F000, 0x0E970D7D, 0x3E680148, 0x1C690140,
+ 0x19220000, 0x20620144, 0x0160014C, 0x2E0D0000,
+ 0x2E610140, 0x3230FFFC, 0x0C600148, 0x1B208001,
+ 0x0E970D7D, 0x116A0148, 0x3368014C, 0x2D6B0154,
+ 0x2D620140, 0x2D010000, 0x3530FFFD, 0x0F600144,
+ 0x05300001, 0x1C0A0000, 0x040D8000, 0x20610148,
+ 0x020FC000, 0x12630150, 0x0F208010, 0x0E970D7D,
+ 0x28680164, 0x1C690140, 0x30380000, 0x1BD00E5E,
+ 0x116A0148, 0x3368014C, 0x206B0150, 0x20610148,
+ 0x2D620140, 0x312F0001, 0x12630150, 0x1C0A0000,
+ 0x20620144, 0x1B208001, 0x0E970D7D, 0x0C6A0150,
+ 0x2D6B0154, 0x3368014C, 0x12690148, 0x2E0EC000,
+ 0x3E620150, 0x126A0144, 0x2E610140, 0x1C0A0000,
+ 0x23620148, 0x010F0000, 0x3A33FFFE, 0x3D635F5C,
+ 0x3930FFFE, 0x0F600144, 0x00208200, 0x0E970D7D,
+ 0x0C970D8F, 0x07690168, 0x236A5F5C, 0x1C390000,
+ 0x1BD00E5E, 0x06970E75, 0x2B200018, 0x0E800E7D,
+ 0x0120FFFD, 0x2C970376, 0x122D0002, 0x2B200018,
+ 0x2297037E, 0x12600130, 0x1F600134, 0x0834FFFE,
+ 0x26C80205, 0x112E0002, 0x23290002, 0x22484000,
+ 0x07625F46, 0x38340002, 0x20605F48, 0x2B008000,
+ 0x07018000, 0x3930FFFE, 0x1A32FFFD, 0x2D0E0000,
+ 0x040E4000, 0x1632FFFE, 0x36970396, 0x249702AE,
+ 0x1497098E, 0x356A5F46, 0x2D200028, 0x1A210000,
+ 0x1132FFFF, 0x32970338, 0x36200000, 0x356A5F46,
+ 0x1A210000, 0x1132FFFF, 0x32970338, 0x389702B1,
+ 0x356A5F46, 0x30970655, 0x36695F46, 0x1A685F46,
+ 0x1931FFFD, 0x2D610120, 0x29310001, 0x1F090000,
+ 0x20610124, 0x1F970CDC, 0x01690134, 0x1C6A0120,
+ 0x1861B010, 0x172E0068, 0x0862B000, 0x0662B008,
+ 0x31208808, 0x3760B01C, 0x362300AF, 0x1E940CE1,
+ 0x2169B024, 0x1C390000, 0x1AD0089A, 0x12690124,
+ 0x03208400, 0x142D0068, 0x0661B004, 0x3760B01C,
+ 0x362300AF, 0x1E940CE1, 0x2C69B020, 0x25310002,
+ 0x2BD4089A, 0x36695F46, 0x1C6A0120, 0x31208808,
+ 0x040E4000, 0x2E620120, 0x172E0068, 0x0862B000,
+ 0x0662B008, 0x3760B01C, 0x362300AF, 0x1E940CE1,
+ 0x2169B024, 0x1C390000, 0x1AD0089A, 0x03208400,
+ 0x3760B01C, 0x362300AF, 0x1E940CE1, 0x2C69B020,
+ 0x25310002, 0x2BD4089A, 0x13970CE9, 0x1A685F46,
+ 0x1F690120, 0x0F600128, 0x3930FFFE, 0x2E0D0000,
+ 0x2E61012C, 0x289703B4, 0x11615F3C, 0x3620F000,
+ 0x202A0002, 0x19C4089C, 0x3E695F48, 0x14350002,
+ 0x2BCC089C, 0x32970221, 0x07970967, 0x1E970972,
+ 0x016A0154, 0x3368014C, 0x336B0140, 0x3E620150,
+ 0x12690148, 0x0F630148, 0x300B0000, 0x0C630144,
+ 0x3E30FFFF, 0x1F090000, 0x2E610140, 0x1B208001,
+ 0x0E970D7D, 0x1B970981, 0x3368014C, 0x1F6A0140,
+ 0x12690148, 0x2D6B0154, 0x1C0A0000, 0x2E62014C,
+ 0x3E30FFFF, 0x2E0D0000, 0x2E610140, 0x05300001,
+ 0x2E0D0000, 0x20610148, 0x36200000, 0x0F600144,
+ 0x12630150, 0x39209000, 0x08970D7B, 0x3E680148,
+ 0x1C690140, 0x1C6A014C, 0x1A084000, 0x0160014C,
+ 0x20610148, 0x2D620140, 0x2D010000, 0x3E30FFFF,
+ 0x2E0D0000, 0x3D610150, 0x3F208800, 0x0E970D7D,
+ 0x3368014C, 0x1F6A0140, 0x12690148, 0x2D6B0154,
+ 0x1C0A0000, 0x2E62014C, 0x3E30FFFF, 0x1F090000,
+ 0x2E610140, 0x3930FFFE, 0x1C0A0000, 0x23620148,
+ 0x12630150, 0x39209000, 0x08970D7B, 0x3368014C,
+ 0x12690148, 0x1F6A0140, 0x0C600148, 0x1A084000,
+ 0x28038000, 0x2D0E0000, 0x2E62014C, 0x09300002,
+ 0x010F0000, 0x01630140, 0x1C208000, 0x08970D7B,
+ 0x3A20A000, 0x08970D7B, 0x2E680154, 0x1C6A014C,
+ 0x2D010000, 0x29310001, 0x39D40874, 0x322C0001,
+ 0x3E2C0002, 0x0160014C, 0x2D620140, 0x2D010000,
+ 0x3E30FFFF, 0x2B0C4000, 0x0F600144, 0x2D010000,
+ 0x3E30FFFF, 0x2E0D0000, 0x20610148, 0x00208200,
+ 0x0E970D7D, 0x3E680148, 0x306B014C, 0x016A0154,
+ 0x02600140, 0x2D010000, 0x3930FFFE, 0x38605F5A,
+ 0x1C09C000, 0x23610144, 0x1632FFFE, 0x11625F5C,
+ 0x03208400, 0x0E970D7D, 0x0C970D8F, 0x06970E75,
+ 0x026B5F58, 0x0A6A0160, 0x3D2F0034, 0x0B4BC000,
+ 0x16420000, 0x3D370004, 0x3ECC0D4F, 0x236A5F5C,
+ 0x2B200018, 0x0E800E7D, 0x13970CE9, 0x2480020B,
+ 0x1160013C, 0x3697036F, 0x1F23094A, 0x2B635F46,
+ 0x122008A2, 0x38605F36, 0x3B9703A4, 0x00CC0274,
+ 0x37970247, 0x142308A8, 0x2B635F46, 0x3E800224,
+ 0x3E680148, 0x1C6A014C, 0x1C690140, 0x0160014C,
+ 0x20620144, 0x2D0E0000, 0x3E30FFFF, 0x1F090000,
+ 0x2E610140, 0x23620148, 0x1B208001, 0x0E970D7D,
+ 0x1B970981, 0x12690148, 0x3368014C, 0x1F6A0140,
+ 0x2D6B0154, 0x2E610140, 0x1C0A0000, 0x1C0A0000,
+ 0x2E62014C, 0x3930FFFE, 0x0C600148, 0x36200000,
+ 0x0F600144, 0x12630150, 0x39209000, 0x08970D7B,
+ 0x3368014C, 0x12690148, 0x1F6A0140, 0x0C600148,
+ 0x1A084000, 0x09300002, 0x2D0E0000, 0x2D620140,
+ 0x05300001, 0x0160014C, 0x25200010, 0x28695F52,
+ 0x19220000, 0x2B190000, 0x1A615F52, 0x26695F6C,
+ 0x1F238000, 0x38635F56, 0x22484000, 0x026B5F34,
+ 0x122D0002, 0x3F424000, 0x351F0000, 0x1DC80D58,
+ 0x16235F7A, 0x2449C000, 0x3D2F0002, 0x1A1D0000,
+ 0x36CC08E8, 0x2449C000, 0x1C390000, 0x2CCC0D58,
+ 0x25695F56, 0x1C390000, 0x3CD408EB, 0x14625F56,
+ 0x302F0006, 0x1D2E0001, 0x018008DD, 0x04685F52,
+ 0x076B5F52, 0x3C34000F, 0x393700F0, 0x27CC08F3,
+ 0x1C1C8000, 0x21CC08F5, 0x118008F7, 0x1C1C8000,
+ 0x2ACC08F7, 0x1D32FFFC, 0x1E8008F8, 0x1E31FFFC,
+ 0x01198000, 0x17615F56, 0x076B5F52, 0x23310004,
+ 0x1035000F, 0x3F37000F, 0x1C1F4000, 0x0DC8090D,
+ 0x28004000, 0x07645F52, 0x1331FFF8, 0x32394001,
+ 0x12615F6A, 0x2D010000, 0x22310003, 0x19615F68,
+ 0x3E30FFFF, 0x012C0D17, 0x0F23090C, 0x21884000,
+ 0x38605F6C, 0x116A0148, 0x1F69014C, 0x30680140,
+ 0x040D8000, 0x1531FFFE, 0x17615F60, 0x3D6B0148,
+ 0x1C0A0000, 0x2B0F8000, 0x0263014C, 0x3930FFFE,
+ 0x30605F62, 0x1632FFFE, 0x12625F66, 0x15970C7A,
+ 0x34200051, 0x2360B444, 0x09685F56, 0x0A6B5F60,
+ 0x3C34000F, 0x0E300003, 0x2D010000, 0x0934FF00,
+ 0x010CC000, 0x2060B448, 0x193500FF, 0x0761B44A,
+ 0x07685F68, 0x016B5F62, 0x206A5F66, 0x2D010000,
+ 0x0934FF00, 0x010CC000, 0x2D60B44C, 0x193500FF,
+ 0x0A61B44E, 0x1F62B454, 0x0F200936, 0x3221091B,
+ 0x362300AF, 0x0B800C91, 0x1D210001, 0x3561015E,
+ 0x1C208000, 0x1260015C, 0x00970E1F, 0x076B5F52,
+ 0x0A685F6C, 0x3F37000F, 0x293B0100, 0x2563B144,
+ 0x3921086C, 0x3E2C0002, 0x15410000, 0x09685F56,
+ 0x18230D58, 0x3C34000F, 0x07645F52, 0x0E300003,
+ 0x35605F68, 0x0A800D8F, 0x07970967, 0x1E970972,
+ 0x3368014C, 0x1F6A0140, 0x12690148, 0x2D6B0154,
+ 0x1C0A0000, 0x2E62014C, 0x1F6A0140, 0x12630150,
+ 0x2E610140, 0x3930FFFE, 0x1C0A0000, 0x23620148,
+ 0x36200000, 0x0F600144, 0x39209000, 0x08970D7B,
+ 0x1C690140, 0x3E680148, 0x116A0148, 0x2E610140,
+ 0x1A084000, 0x0160014C, 0x3E30FFFF, 0x2D0E0000,
+ 0x23620148, 0x36200000, 0x198008CF, 0x3E680148,
+ 0x1C6A014C, 0x1C690140, 0x0160014C, 0x20620144,
+ 0x1F090000, 0x2D0E0000, 0x2E610140, 0x23620148,
+ 0x1B208001, 0x08800D7D, 0x3368014C, 0x12690148,
+ 0x1F6A0140, 0x2E610140, 0x2D0E0000, 0x23620148,
+ 0x2E020000, 0x1632FFFE, 0x1C0A0000, 0x2E680154,
+ 0x20620144, 0x020C0000, 0x11600150, 0x00208200,
+ 0x08800D7D, 0x1F6A0140, 0x12690148, 0x3368014C,
+ 0x23620148, 0x2E610140, 0x3930FFFE, 0x1C0A0000,
+ 0x2E680154, 0x20620144, 0x020C0000, 0x11600150,
+ 0x00208200, 0x08800D7D, 0x25635F4E, 0x146B5F42,
+ 0x356A5F46, 0x38200008, 0x1A210000, 0x0A330002,
+ 0x07D0099B, 0x28038000, 0x1632FFFE, 0x3D33FFFF,
+ 0x2E0EC000, 0x062309A6, 0x34800338, 0x2F9702C0,
+ 0x356A5F46, 0x329702B4, 0x356A5F46, 0x329702B4,
+ 0x356A5F46, 0x329702B4, 0x356A5F46, 0x329702B4,
+ 0x356A5F46, 0x329702B4, 0x3E695F48, 0x356A5F46,
+ 0x18350001, 0x1FC809B9, 0x2D200028, 0x33970365,
+ 0x19685F4A, 0x33695F4C, 0x1632FFFE, 0x1A048000,
+ 0x19C409B3, 0x1E2D0001, 0x01615F4C, 0x2B605F4A,
+ 0x0A20FFFF, 0x1A210000, 0x356A5F46, 0x162309BA,
+ 0x34800338, 0x30970655, 0x356A5F46, 0x25200010,
+ 0x1A210000, 0x176B5F4E, 0x34800338, 0x0620FFFC,
+ 0x2C970376, 0x03361F00, 0x2DC80207, 0x23320008,
+ 0x33620138, 0x3F2A0011, 0x2EC40207, 0x2197038B,
+ 0x236B0130, 0x2D010000, 0x2435FFFE, 0x26C80205,
+ 0x3008C000, 0x3BC009CF, 0x17CC0205, 0x126B5F44,
+ 0x112E0002, 0x07625F46, 0x3D2F0002, 0x20635F44,
+ 0x3D33FFFF, 0x1632FFFE, 0x2E0EC000, 0x1632FFFE,
+ 0x36970396, 0x2E680138, 0x3D695F44, 0x02030000,
+ 0x0B2B0003, 0x19C409DF, 0x3A200003, 0x392C0003,
+ 0x15072000, 0x333B0000, 0x14CC0209, 0x36695F46,
+ 0x092E0010, 0x2B034000, 0x1931FFFD, 0x1C09C000,
+ 0x040E4000, 0x082A0800, 0x26C40209, 0x249702AE,
+ 0x36200000, 0x15210120, 0x146B5F42, 0x356A5F46,
+ 0x06330001, 0x0BD009F4, 0x0F2309F5, 0x34800338,
+ 0x2F9702C0, 0x0C970BB5, 0x356A5F46, 0x2D200028,
+ 0x1A210000, 0x32970338, 0x389702B1, 0x3D695F44,
+ 0x1A685F46, 0x1231FFFF, 0x2E0D0000, 0x20610124,
+ 0x3E30FFFF, 0x2E0D0000, 0x2D610120, 0x1F970CDC,
+ 0x01690134, 0x1C6A0120, 0x1861B010, 0x172E0068,
+ 0x0862B000, 0x0662B008, 0x31208808, 0x3760B01C,
+ 0x362300AF, 0x1E940CE1, 0x2169B024, 0x1C390000,
+ 0x18D00A1B, 0x12690124, 0x03208400, 0x142D0068,
+ 0x0661B004, 0x3760B01C, 0x362300AF, 0x1E940CE1,
+ 0x2C69B020, 0x25310002, 0x1ED00A1D, 0x13970CE9,
+ 0x2280020D, 0x13970CE9, 0x1A685F46, 0x3D695F44,
+ 0x1C6A0120, 0x0C600124, 0x2E0D0000, 0x23610128,
+ 0x0C690130, 0x2E6B0134, 0x3930FFFE, 0x2D0E0000,
+ 0x2D62012C, 0x11630130, 0x33610134, 0x19220000,
+ 0x12625F3C, 0x1320E000, 0x32970221, 0x28680164,
+ 0x0F690150, 0x30380000, 0x1BD00E5E, 0x2D6B0154,
+ 0x126A0144, 0x3368014C, 0x30610154, 0x312F0001,
+ 0x12630150, 0x1C690140, 0x2E62014C, 0x02600140,
+ 0x28004000, 0x040D8000, 0x20610148, 0x1132FFFF,
+ 0x19088000, 0x0F600144, 0x00208200, 0x0E970D7D,
+ 0x2B680168, 0x2D6B0154, 0x30380000, 0x1BD00E5E,
+ 0x1C6A014C, 0x12690148, 0x12630150, 0x23620148,
+ 0x35098000, 0x2E610140, 0x040D8000, 0x1132FFFF,
+ 0x040D8000, 0x2D61014C, 0x3620F000, 0x0E970D7D,
+ 0x3E680148, 0x1F69014C, 0x1F6A0140, 0x35230000,
+ 0x0C630144, 0x0160014C, 0x2E0D0000, 0x20610148,
+ 0x2D0E0000, 0x2D620140, 0x1B208001, 0x0E970D7D,
+ 0x116A0148, 0x3368014C, 0x1C690140, 0x2D6B0154,
+ 0x2D620140, 0x2D0E0000, 0x3E30FFFF, 0x2D0E0000,
+ 0x23620148, 0x1F090000, 0x23610144, 0x3D33FFFF,
+ 0x12630150, 0x0F208010, 0x0E970D7D, 0x04690164,
+ 0x3368014C, 0x1C390000, 0x1BD00E5E, 0x1C690140,
+ 0x116A0148, 0x206B0150, 0x20610148, 0x2D620140,
+ 0x312F0001, 0x12630150, 0x1F090000, 0x23610144,
+ 0x1B208001, 0x0E970D7D, 0x0C6A0150, 0x2D6B0154,
+ 0x3368014C, 0x12690148, 0x2E0EC000, 0x3E620150,
+ 0x010F0000, 0x3A33FFFE, 0x3D635F5C, 0x3E6B0144,
+ 0x2E610140, 0x300B0000, 0x0F630148, 0x3930FFFE,
+ 0x300B0000, 0x0C630144, 0x00208200, 0x0E970D7D,
+ 0x0C970D8F, 0x07690168, 0x236A5F5C, 0x1C390000,
+ 0x1BD00E5E, 0x06970E75, 0x2B200018, 0x0E800E7D,
+ 0x0120FFFD, 0x2C970376, 0x03361F00, 0x2DC80207,
+ 0x23320008, 0x33620138, 0x3F2A0011, 0x2EC40207,
+ 0x2197038B, 0x236B0130, 0x2D010000, 0x2435FFFE,
+ 0x26C80205, 0x3008C000, 0x3FC00AA8, 0x17CC0205,
+ 0x126B5F44, 0x112E0002, 0x07625F46, 0x3D2F0002,
+ 0x20635F44, 0x0200C000, 0x3D33FFFF, 0x010F0000,
+ 0x1632FFFE, 0x2E0EC000, 0x1632FFFE, 0x36970396,
+ 0x2E680138, 0x3D695F44, 0x02030000, 0x0B2B0003,
+ 0x16C40ABA, 0x3A200003, 0x3F2C0005, 0x15072000,
+ 0x333B0000, 0x14CC0209, 0x36695F46, 0x092E0010,
+ 0x1531FFFE, 0x040E4000, 0x082A0800, 0x26C40209,
+ 0x249702AE, 0x36200000, 0x1A210000, 0x3E6A5F44,
+ 0x32970338, 0x0C970BB5, 0x356A5F46, 0x2D200028,
+ 0x1A210000, 0x1132FFFF, 0x32970338, 0x389702B1,
+ 0x11685F44, 0x36695F46, 0x2E020000, 0x2B034000,
+ 0x3E30FFFF, 0x1231FFFF, 0x280C8000, 0x0C600124,
+ 0x2B0C4000, 0x0F600128, 0x010CC000, 0x01600120,
+ 0x1F970CDC, 0x01690134, 0x126A0128, 0x3E610130,
+ 0x1861B010, 0x172E0068, 0x0862B000, 0x0662B008,
+ 0x31208808, 0x3760B01C, 0x362300AF, 0x1E940CE1,
+ 0x2169B024, 0x1C390000, 0x26D40AED, 0x13970CE9,
+ 0x2480020B, 0x12690124, 0x03208400, 0x142D0068,
+ 0x0661B004, 0x3760B01C, 0x362300AF, 0x1E940CE1,
+ 0x2C69B020, 0x25310002, 0x20D40AEB, 0x1C6A0120,
+ 0x31208808, 0x172E0068, 0x0862B000, 0x0662B008,
+ 0x3760B01C, 0x362300AF, 0x1E940CE1, 0x2169B024,
+ 0x1C390000, 0x11D00AEB, 0x03208400, 0x3760B01C,
+ 0x362300AF, 0x1E940CE1, 0x2C69B020, 0x25310002,
+ 0x20D40AEB, 0x13970CE9, 0x1A685F46, 0x1F690120,
+ 0x0F600128, 0x2E0D0000, 0x2E61012C, 0x19220000,
+ 0x12625F3C, 0x3620F000, 0x32970221, 0x3E680148,
+ 0x1C6A014C, 0x1C690140, 0x0160014C, 0x20620144,
+ 0x1F090000, 0x2E610140, 0x2D0E0000, 0x23620148,
+ 0x1B208001, 0x0E970D7D, 0x3368014C, 0x12690148,
+ 0x1F6A0140, 0x2E610140, 0x07018000, 0x2E0D0000,
+ 0x20610148, 0x3E30FFFF, 0x1C0A0000, 0x2E680154,
+ 0x20620144, 0x020C0000, 0x11600150, 0x00208200,
+ 0x0E970D7D, 0x016A0154, 0x3368014C, 0x336B0140,
+ 0x3E620150, 0x12690148, 0x0F630148, 0x300B0000,
+ 0x0C630144, 0x3E30FFFF, 0x1F090000, 0x2E610140,
+ 0x1B208001, 0x0E970D7D, 0x3368014C, 0x1F6A0140,
+ 0x12690148, 0x23620148, 0x1C0A0000, 0x2E680154,
+ 0x20620144, 0x2E610140, 0x020C0000, 0x11600150,
+ 0x00208200, 0x0E970D7D, 0x3368014C, 0x2D6B0154,
+ 0x12690148, 0x1F6A0140, 0x12630150, 0x2E610140,
+ 0x2D695F58, 0x1C0A0000, 0x2E62014C, 0x1F2D0030,
+ 0x0D4A4000, 0x1F2D0006, 0x0E494000, 0x0F3607FC,
+ 0x26320002, 0x33620154, 0x28038000, 0x06330001,
+ 0x22D40B5A, 0x1D2E0001, 0x112E0002, 0x20620144,
+ 0x1132FFFF, 0x23620148, 0x00351F00, 0x20310008,
+ 0x33610158, 0x1320E000, 0x0E970D7D, 0x3D680144,
+ 0x1C6A014C, 0x1C690140, 0x206B0150, 0x2D0E0000,
+ 0x2E62014C, 0x0200C000, 0x06330001, 0x25D40B6D,
+ 0x322C0001, 0x3E2C0002, 0x3E30FFFF, 0x2E0D0000,
+ 0x2E610140, 0x1A210000, 0x20610148, 0x1320E000,
+ 0x0E970D7D, 0x206B0150, 0x2E680154, 0x1C6A014C,
+ 0x0263014C, 0x11600150, 0x1C600154, 0x02030000,
+ 0x06330001, 0x3DD40B7F, 0x322C0001, 0x3E2C0002,
+ 0x20620144, 0x1C0A0000, 0x2D620140, 0x3E30FFFF,
+ 0x2D0E0000, 0x23620148, 0x1B208001, 0x0E970D7D,
+ 0x12690148, 0x126A0144, 0x206B0150, 0x2E610140,
+ 0x23620148, 0x0200C000, 0x3D33FFFF, 0x12630150,
+ 0x1C600154, 0x02030000, 0x06330001, 0x22D40B95,
+ 0x322C0001, 0x3E2C0002, 0x0F600144, 0x00208200,
+ 0x0E970D7D, 0x11690144, 0x116A0148, 0x3368014C,
+ 0x2D6B0154, 0x2D620140, 0x12630150, 0x1C600154,
+ 0x02030000, 0x06330001, 0x23D40BA4, 0x322C0001,
+ 0x3E2C0002, 0x0160014C, 0x350A4000, 0x23620148,
+ 0x3930FFFE, 0x1C0A0000, 0x20620144, 0x00208200,
+ 0x0E970D7D, 0x12690148, 0x016A0154, 0x306B014C,
+ 0x2E610140, 0x3E620150, 0x3D33FFFF, 0x1C09C000,
+ 0x09800889, 0x25635F4E, 0x146B5F42, 0x38200008,
+ 0x1A210000, 0x3E6A5F44, 0x0A330002, 0x1BD00BC1,
+ 0x196B5F46, 0x1132FFFF, 0x2E0EC000, 0x0B230BD1,
+ 0x34800338, 0x2F9702C0, 0x3E6A5F44, 0x329702B4,
+ 0x3E6A5F44, 0x19685F4A, 0x33695F4C, 0x1632FFFE,
+ 0x1A048000, 0x1AC40BCC, 0x1E2D0001, 0x01615F4C,
+ 0x2B605F4A, 0x356A5F46, 0x0A20FFFF, 0x1A210000,
+ 0x2F9702C0, 0x356A5F46, 0x25200010, 0x1A210000,
+ 0x176B5F4E, 0x34800338, 0x32800211, 0x02030000,
+ 0x0C37FFFF, 0x09CC0211, 0x0F2C0BDC, 0x21884000,
+ 0x07800BDD, 0x20970375, 0x3E20000E, 0x2297037E,
+ 0x093C000E, 0x17CC0205, 0x2A2001FF, 0x2297037E,
+ 0x3D605F3C, 0x3F340003, 0x17CC0205, 0x122E000E,
+ 0x1632FFFE, 0x36970396, 0x249702AE, 0x1122000E,
+ 0x36200000, 0x1A210000, 0x32970338, 0x01685F34,
+ 0x122101D8, 0x3E610106, 0x3B2C0008, 0x27490000,
+ 0x3E2C0002, 0x0B480000, 0x07615F4A, 0x2D605F4C,
+ 0x0F685F3C, 0x30695F40, 0x3930FFFE, 0x36605F3E,
+ 0x1F090000, 0x10C40BFF, 0x2E605F40, 0x202001A0,
+ 0x04230C04, 0x19600104, 0x3B635F36, 0x328002E8,
+ 0x25200010, 0x19600104, 0x24800431, 0x369700FC,
+ 0x15220003, 0x1F62B438, 0x2C695FCA, 0x04685EDE,
+ 0x19220000, 0x1461B400, 0x1162B406, 0x30380000,
+ 0x36C800A5, 0x2A340080, 0x19C80C16, 0x1E200C27,
+ 0x1B230C17, 0x288000B4, 0x36605EDE, 0x09685EEC,
+ 0x332300A5, 0x19220000, 0x14625EEC, 0x28695EDE,
+ 0x366A5EF0, 0x30380000, 0x27C80104, 0x01198000,
+ 0x2E6A5F02, 0x01198000, 0x336A5EA0, 0x24D000B4,
+ 0x3C36FDFF, 0x01625EA0, 0x288000B4, 0x22215EDE,
+ 0x1F220006, 0x14970FB4, 0x2F215EEC, 0x21510000,
+ 0x21510000, 0x21884000, 0x1F220030, 0x1F62B438,
+ 0x21695FCE, 0x19685EF0, 0x19220000, 0x0161B420,
+ 0x0462B426, 0x30380000, 0x3AC800A6, 0x2A340080,
+ 0x09C80C3C, 0x17200C42, 0x0B230C3D, 0x288000B4,
+ 0x2B605EF0, 0x11685EFE, 0x3F2300A6, 0x19220000,
+ 0x0C625EFE, 0x17800C1B, 0x3F215EF0, 0x1F220006,
+ 0x14970FB4, 0x37215EFE, 0x21510000, 0x21510000,
+ 0x21884000, 0x1F220300, 0x1F62B438, 0x21695FCE,
+ 0x01685F02, 0x19220000, 0x0261B440, 0x0762B446,
+ 0x30380000, 0x3DC800A7, 0x2A340080, 0x08C80C57,
+ 0x0B200C5D, 0x02230C58, 0x288000B4, 0x33605F02,
+ 0x19685F10, 0x382300A7, 0x19220000, 0x04625F10,
+ 0x17800C1B, 0x27215F02, 0x1F220006, 0x14970FB4,
+ 0x3F215F10, 0x21510000, 0x21510000, 0x21884000,
+ 0x04685EDE, 0x22215EDE, 0x30380000, 0x1AD00C70,
+ 0x03205EEC, 0x0B518000, 0x0D500000, 0x30695EA0,
+ 0x0D500000, 0x00390200, 0x02615EA0, 0x228B4000,
+ 0x0200C000, 0x1F220006, 0x362300AF, 0x1D800FD7,
+ 0x19685EF0, 0x3F215EF0, 0x30380000, 0x1AD00C70,
+ 0x1B205EFE, 0x0C800C69, 0x01685F02, 0x27215F02,
+ 0x30380000, 0x1AD00C70, 0x13205F10, 0x0C800C69,
+ 0x04685EDE, 0x22215EDE, 0x30380000, 0x36D40C68,
+ 0x398000AF, 0x19685EF0, 0x3F215EF0, 0x30380000,
+ 0x35D000AF, 0x1B205EFE, 0x0C800C69, 0x3B605EEC,
+ 0x1C615EEE, 0x228B4000, 0x23605EFE, 0x14615F00,
+ 0x228B4000, 0x2B605F10, 0x0C615F12, 0x228B4000,
+ 0x19685EF0, 0x1A210000, 0x30380000, 0x0AC80CA5,
+ 0x1F61B434, 0x226A5FCE, 0x0761B426, 0x0262B420,
+ 0x2A340080, 0x0DC80CA4, 0x28635E9C, 0x3F215EF0,
+ 0x1F220006, 0x14970FB4, 0x1A6B5E9C, 0x288000B4,
+ 0x07615EF0, 0x228B4000, 0x2E620116, 0x0F200CA9,
+ 0x288000B4, 0x19970C80, 0x1C6A0116, 0x0D20B404,
+ 0x19500011, 0x01500003, 0x1150C400, 0x0A500001,
+ 0x0E500180, 0x0D500000, 0x0962B414, 0x352000AF,
+ 0x192100AF, 0x362300AF, 0x1D800C8B, 0x01690102,
+ 0x36200000, 0x0A350020, 0x20C80203, 0x30218000,
+ 0x1F615ED4, 0x3B605EDA, 0x3D605EDC, 0x228B4000,
+ 0x2D695ED4, 0x30380000, 0x27C80104, 0x1C390000,
+ 0x1DD40100, 0x3B605EDA, 0x228B4000, 0x2D695ED4,
+ 0x30380000, 0x27C80104, 0x1C390000, 0x1DD40100,
+ 0x3D605EDC, 0x228B4000, 0x01685ED4, 0x27215ED4,
+ 0x30380000, 0x16D40102, 0x21510000, 0x228B4000,
+ 0x30695ECC, 0x07685ED2, 0x1C390000, 0x06D400A4,
+ 0x30380000, 0x31C800A4, 0x342300A4, 0x288000B4,
+ 0x3A215ECC, 0x0B518000, 0x36200000, 0x35605ED2,
+ 0x228B4000, 0x30695ECC, 0x35605ED2, 0x1C390000,
+ 0x30695EA0, 0x1DD40100, 0x12390008, 0x02615EA0,
+ 0x228B4000, 0x336A5EA0, 0x1C685ECC, 0x3A215ECC,
+ 0x2E36FFF7, 0x01625EA0, 0x30380000, 0x16D40102,
+ 0x21510000, 0x228B4000, 0x04685F52, 0x30218000,
+ 0x2D144000, 0x04CC00A9, 0x1A615F52, 0x302300A9,
+ 0x06200CFA, 0x288000B4, 0x29200400, 0x2660B144,
+ 0x06210200, 0x1468B144, 0x3C34000F, 0x2B190000,
+ 0x0A61B144, 0x07645F52, 0x2D010000, 0x20310008,
+ 0x1139A0C8, 0x214B4000, 0x0F2D002C, 0x0E494000,
+ 0x2E020000, 0x06330001, 0x20377F00, 0x1263010A,
+ 0x21320003, 0x1A625F68, 0x2E020000, 0x1032FFF8,
+ 0x313A4001, 0x11625F6A, 0x2E020000, 0x1132FFFF,
+ 0x2E2E0D17, 0x04230D2B, 0x0E8A4000, 0x15205F7A,
+ 0x228B4000, 0x12205F82, 0x228B4000, 0x1C205F8A,
+ 0x228B4000, 0x01205F92, 0x228B4000, 0x0F205F9A,
+ 0x228B4000, 0x07205FA2, 0x228B4000, 0x09205FAA,
+ 0x228B4000, 0x14205FB2, 0x228B4000, 0x1A205FBA,
+ 0x228B4000, 0x04205FC2, 0x228B4000, 0x38605F6C,
+ 0x27490000, 0x3E2C0002, 0x084B0000, 0x3E2C0002,
+ 0x244A0000, 0x3E2C0002, 0x0B480000, 0x1F615F58,
+ 0x38635F56, 0x17625F5A, 0x3E605F5C, 0x1E970E3D,
+ 0x236A5F5C, 0x266B010C, 0x1F3A0000, 0x01C80D47,
+ 0x19213000, 0x35098000, 0x190B4000, 0x3061010E,
+ 0x39C00D42, 0x27CC0E5C, 0x0A685F5A, 0x04230D47,
+ 0x33635F54, 0x046B5F68, 0x07800E42, 0x0F69010A,
+ 0x0A6B5F56, 0x20310008, 0x08C80D78, 0x2E6A5F58,
+ 0x05390080, 0x162E0035, 0x0E458000, 0x0C970D8F,
+ 0x04685F52, 0x1B230D54, 0x16341000, 0x3ECC1043,
+ 0x3A2000A0, 0x00645F53, 0x2D695F58, 0x34970284,
+ 0x0269010E, 0x1A223000, 0x350A4000, 0x0BC80D74,
+ 0x28680108, 0x25620114, 0x30380000, 0x12C80D61,
+ 0x0A970CA6, 0x15970C7A, 0x0269010E, 0x1B20B444,
+ 0x19500011, 0x0A500001, 0x1150C400, 0x0A500001,
+ 0x2335FFFF, 0x15410000, 0x176A0114, 0x3E2C0002,
+ 0x0D500000, 0x1F62B454, 0x0B200D72, 0x27210D72,
+ 0x362300AF, 0x0B800C91, 0x35203000, 0x1C60010E,
+ 0x1A210000, 0x36610108, 0x1A615F52, 0x398000AF,
+ 0x19220000, 0x3662015E, 0x228B4000, 0x1D210001,
+ 0x3561015E, 0x1260015C, 0x38635F56, 0x00970E1F,
+ 0x076B5F52, 0x0A685F6C, 0x3F37000F, 0x293B0100,
+ 0x2563B144, 0x25695F56, 0x3E2C0002, 0x15410000,
+ 0x26695F5A, 0x3E2C0002, 0x15410000, 0x20695F5C,
+ 0x3E2C0002, 0x15410000, 0x17800D58, 0x04685F52,
+ 0x3569B140, 0x3930FFFE, 0x3CD003A0, 0x33635F54,
+ 0x09300002, 0x02030000, 0x3C34000F, 0x3D3CFFFF,
+ 0x33228000, 0x1A120000, 0x301D8000, 0x0761B140,
+ 0x336A5EA0, 0x2BCC0DA0, 0x2D36FFFB, 0x01625EA0,
+ 0x3D3CFFFF, 0x3A225F7A, 0x3530FFFD, 0x1F060000,
+ 0x22520000, 0x22520000, 0x153B2000, 0x07685F32,
+ 0x35635F52, 0x1A344000, 0x09C80DB0, 0x0A685F36,
+ 0x2E9700B4, 0x02685F54, 0x362300AF, 0x288000B4,
+ 0x04685F52, 0x3569B140, 0x1F238000, 0x3C34000F,
+ 0x2E020000, 0x123EFFFF, 0x1C138000, 0x2819C000,
+ 0x0761B140, 0x3F30FFF8, 0x2838A084, 0x18500020,
+ 0x3B680118, 0x2E695F54, 0x0418C000, 0x09600118,
+ 0x351CC000, 0x2BCC0DFA, 0x2361011E, 0x07685F68,
+ 0x0763011C, 0x0260011A, 0x15970C7A, 0x336B011A,
+ 0x1B20B444, 0x1C500041, 0x0A500001, 0x0E500180,
+ 0x0D500000, 0x2D02C000, 0x2636FF00, 0x0262B44C,
+ 0x363700FF, 0x2563B44E, 0x3F222000, 0x1F62B454,
+ 0x3E6B011E, 0x36200000, 0x0F60011E, 0x333B0000,
+ 0x3ECC0DDA, 0x362300AF, 0x08200DDD, 0x24210DDD,
+ 0x0B800C91, 0x3668011C, 0x3569B140, 0x146A0118,
+ 0x1A1D0000, 0x0761B140, 0x191E0000, 0x26620118,
+ 0x19C80DF6, 0x36200000, 0x1D210001, 0x28038000,
+ 0x2E174000, 0x39CC0DED, 0x322C0001, 0x1231FFFF,
+ 0x07800DE7, 0x2861011C, 0x0E300003, 0x2B695F32,
+ 0x0260011A, 0x36354000, 0x1FC80DC6, 0x19200DC6,
+ 0x096B5F36, 0x288000B4, 0x07685F32, 0x26695F36,
+ 0x1A344000, 0x33C800AF, 0x0D894000, 0x1F3A0000,
+ 0x3AC803A0, 0x3B635F36, 0x1A6B5F4A, 0x19600104,
+ 0x3E610106, 0x19625F3E, 0x23635F48, 0x1D970C74,
+ 0x2B680104, 0x0F6A0106, 0x116B5F48, 0x2360B428,
+ 0x3C21B42A, 0x21510000, 0x0200C000, 0x0934FF00,
+ 0x281A0000, 0x0162B42C, 0x363700FF, 0x2663B42E,
+ 0x2B6A5F3E, 0x27200041, 0x2060B424, 0x1C62B434,
+ 0x36210E03, 0x362300AF, 0x12940C8E, 0x096B5F36,
+ 0x228B4000, 0x3B635F36, 0x39200120, 0x1A210000,
+ 0x0C220020, 0x1C6B5F4C, 0x1A800DFF, 0x33635F54,
+ 0x0F6B5F6A, 0x3A200140, 0x1A210000, 0x0C220020,
+ 0x3B605F60, 0x1C615F62, 0x12625F66, 0x36635F5E,
+ 0x15970C7A, 0x09685F60, 0x2D6A5F62, 0x046B5F5E,
+ 0x2060B448, 0x3F21B44A, 0x21510000, 0x0200C000,
+ 0x0934FF00, 0x281A0000, 0x0262B44C, 0x363700FF,
+ 0x2563B44E, 0x206A5F66, 0x27200041, 0x2360B444,
+ 0x1F62B454, 0x16200E5A, 0x21210E28, 0x362300AF,
+ 0x0B800C91, 0x33635F54, 0x36200000, 0x16210140,
+ 0x0F22002C, 0x0F6B5F6A, 0x3B605F60, 0x1C615F62,
+ 0x12625F66, 0x36635F5E, 0x15970C7A, 0x286A5F5E,
+ 0x09685F60, 0x2E695F62, 0x28038000, 0x0A37FF00,
+ 0x0418C000, 0x2060B448, 0x1A3600FF, 0x0462B44A,
+ 0x0161B44C, 0x36200000, 0x2660B44E, 0x206A5F66,
+ 0x22200011, 0x2360B444, 0x1F62B454, 0x2A210E46,
+ 0x362300AF, 0x0E940C91, 0x016B5F54, 0x228B4000,
+ 0x0B210041, 0x08800D4B, 0x08210021, 0x08800D4B,
+ 0x2E6A5F58, 0x04690164, 0x012E0028, 0x1C390000,
+ 0x01D00E71, 0x1F090000, 0x1531FFFE, 0x2B680168,
+ 0x3F418000, 0x2F34001F, 0x112E0002, 0x13408000,
+ 0x2B008000, 0x3E2C0002, 0x0D500000, 0x0D500000,
+ 0x228B4000, 0x1C208000, 0x13408000, 0x36200000,
+ 0x1C800E6A, 0x01685F58, 0x1A210000, 0x2E2C0028,
+ 0x0D500000, 0x0D500000, 0x0D500000, 0x15410000,
+ 0x228B4000, 0x0A230D4F, 0x0F3607FC, 0x3AC803A0,
+ 0x33635F54, 0x026B5F58, 0x12625F66, 0x010CC000,
+ 0x084B0000, 0x3E2C0002, 0x0B480000, 0x33635F62,
+ 0x2D6B010E, 0x36605F64, 0x2D0DC000, 0x36610108,
+ 0x0E970C64, 0x02685F62, 0x28695F64, 0x3B60B40C,
+ 0x1C61B40E, 0x28680108, 0x206A5F66, 0x2921B40A,
+ 0x3660B408, 0x21510000, 0x28200081, 0x3560B404,
+ 0x0962B414, 0x02685F54, 0x20210E8C, 0x362300AF,
+ 0x1D800C8B, 0x2D695F6E, 0x1C208000, 0x28150000,
+ 0x17C80EA2, 0x228B4000, 0x336A5EA0, 0x33605F6E,
+ 0x14200EA8, 0x2B36FFFD, 0x01625EA0, 0x288000B4,
+ 0x15685FDC, 0x2D695F6E, 0x30380000, 0x08C80F0B,
+ 0x28605F70, 0x232C0040, 0x27490000, 0x2E655F6E,
+ 0x3865B112, 0x1F31FFFB, 0x232D4010, 0x0D4A4000,
+ 0x1F6BB110, 0x122D0002, 0x1F0AC000, 0x24C00EFF,
+ 0x214B4000, 0x2C2DFFF6, 0x333B0000, 0x25D40EC4,
+ 0x1A685F70, 0x012D0012, 0x0D4A4000, 0x282C0042,
+ 0x084B0000, 0x312DFFEE, 0x1F1F8000, 0x3CCC0F01,
+ 0x28004000, 0x37215F72, 0x02970FF4, 0x3D695F72,
+ 0x332C0006, 0x13350003, 0x3DCC0F06, 0x37215F72,
+ 0x2922FFFC, 0x1C97100A, 0x1A685F70, 0x33215FDC,
+ 0x1D970F72, 0x1797103E, 0x0E970C64, 0x196B5F70,
+ 0x11685F72, 0x3B695F74, 0x2A22B40A, 0x3563B408,
+ 0x22520000, 0x3B60B40C, 0x1C61B40E, 0x28200081,
+ 0x3560B404, 0x20200040, 0x2660B414, 0x21210ED1,
+ 0x362300AF, 0x18940C8B, 0x01685F6E, 0x39695FEA,
+ 0x353400FF, 0x3330FFFB, 0x0A2C401A, 0x084B0000,
+ 0x1E2D0001, 0x312F0001, 0x3A430000, 0x002CFFF6,
+ 0x244A0000, 0x332C0006, 0x084B0000, 0x0B615FEA,
+ 0x312F0001, 0x1F0AC000, 0x17C40EF4, 0x35230000,
+ 0x3A430000, 0x2E6A5F6E, 0x1A685F70, 0x1A3600FF,
+ 0x3A3A1000, 0x1462B130, 0x15970F4A, 0x1C208000,
+ 0x33605F6E, 0x17230EA8, 0x33800126, 0x0D210088,
+ 0x29655F6F, 0x1A685F70, 0x2D695F6E, 0x3D2C0038,
+ 0x0B480000, 0x13800EAA, 0x20970106, 0x1A685F70,
+ 0x33215FDC, 0x19230EFA, 0x1B800F72, 0x336A5EA0,
+ 0x3C350800, 0x1F615F6E, 0x33C800AF, 0x143A0002,
+ 0x01625EA0, 0x398000AF, 0x1768B148, 0x05300001,
+ 0x1DD00F1B, 0x03300007, 0x19D00F20, 0x0C300008,
+ 0x3D3CFFFF, 0x1464B148, 0x388000A8, 0x35230000,
+ 0x2663B148, 0x39635FF2, 0x32635FF0, 0x19800F15,
+ 0x0E710048, 0x13710149, 0x2871804B, 0x1E800F22,
+ 0x00685FFC, 0x276AB1F8, 0x0934FF00, 0x0C300008,
+ 0x322C0001, 0x03361F00, 0x23320008, 0x1C0A0000,
+ 0x1DC0010A, 0x3F225E90, 0x3330FFFB, 0x1C2C4000,
+ 0x1C0A0000, 0x15C00104, 0x2F605FD2, 0x06625FD4,
+ 0x242A000F, 0x03C000FE, 0x228B4000, 0x10685FD6,
+ 0x37695FD4, 0x30380000, 0x04C80F3E, 0x27490000,
+ 0x0E615FD6, 0x228B4000, 0x33290044, 0x28C00F46,
+ 0x1D685FD2, 0x05615FD4, 0x2D010000, 0x022D0044,
+ 0x03615FD2, 0x228B4000, 0x361C0000, 0x2F605FD2,
+ 0x29605FD4, 0x228B4000, 0x3C695FD6, 0x30380000,
+ 0x27C80104, 0x15410000, 0x22605FD6, 0x228B4000,
+ 0x1C390000, 0x31C800FE, 0x0D4A4000, 0x30380000,
+ 0x27C80104, 0x10404000, 0x1F3A0000, 0x07C80F5E,
+ 0x362C003A, 0x16420000, 0x122E0038, 0x062CFFC6,
+ 0x13408000, 0x228B4000, 0x222DFFFE, 0x10404000,
+ 0x228B4000, 0x1C390000, 0x31C800FE, 0x0D4A4000,
+ 0x30380000, 0x27C80104, 0x10404000, 0x1F3A0000,
+ 0x06C80F6F, 0x3D2C0038, 0x16420000, 0x192E003A,
+ 0x0E2CFFC8, 0x13408000, 0x228B4000, 0x122D0002,
+ 0x10404000, 0x228B4000, 0x1C390000, 0x31C800FE,
+ 0x30380000, 0x27C80104, 0x2D635E96, 0x362C003A,
+ 0x084B0000, 0x0E2CFFFE, 0x244A0000, 0x333B0000,
+ 0x19C80F85, 0x1F3A0000, 0x0BC80F92, 0x3E2F0038,
+ 0x1542C000, 0x192E003A, 0x0D2FFFC8, 0x10438000,
+ 0x1D800F8D, 0x3F424000, 0x1F3A0000, 0x11C80F8B,
+ 0x192E003A, 0x10438000, 0x1D800F8D, 0x122D0002,
+ 0x3F424000, 0x0D500000, 0x0D500000, 0x1F6B5E96,
+ 0x0D2CFFC4, 0x228B4000, 0x122D0002, 0x3F424000,
+ 0x3E2F0038, 0x1542C000, 0x1D800F8D, 0x2A320001,
+ 0x0A367FFF, 0x03C80FAA, 0x252A0008, 0x32C00FA6,
+ 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x03C80FAA, 0x0F800F9A, 0x26260008, 0x0D500000,
+ 0x262EFFFF, 0x36CC0FA7, 0x228B4000, 0x26635E94,
+ 0x14970FB4, 0x146B5E94, 0x288000B4, 0x26635E94,
+ 0x14970FB4, 0x02030000, 0x17685E94, 0x288000B4,
+ 0x22484000, 0x0F615E92, 0x28605E90, 0x0C300008,
+ 0x2BD40FD5, 0x2D635E96, 0x2C34007F, 0x3E30FFFF,
+ 0x122D0002, 0x2E0D0000, 0x214B4000, 0x05300001,
+ 0x322C0001, 0x36695E90, 0x191E0000, 0x3ECC0FC5,
+ 0x36200000, 0x07024000, 0x36368000, 0x0035007F,
+ 0x1A1D0000, 0x3D695E92, 0x1AC80FD3, 0x23320008,
+ 0x281A0000, 0x1E2D0001, 0x0E464000, 0x0200C000,
+ 0x1F6B5E96, 0x30380000, 0x228B4000, 0x3F424000,
+ 0x00800FCF, 0x361C0000, 0x228B4000, 0x28605E90,
+ 0x22484000, 0x0A625E94, 0x0C300008, 0x3FD40FF2,
+ 0x2E020000, 0x0C300008, 0x2C34007F, 0x0336007F,
+ 0x191E0000, 0x31C800FE, 0x3E30FFFF, 0x356A5E90,
+ 0x0F615E92, 0x122D0002, 0x2E0D0000, 0x3F424000,
+ 0x386A5E94, 0x3D695E92, 0x05300001, 0x322C0001,
+ 0x191E0000, 0x2ECC0FEF, 0x36200000, 0x29380080,
+ 0x21444000, 0x228B4000, 0x36200000, 0x16800FE3,
+ 0x2D635E96, 0x084B0000, 0x3E2C0002, 0x13434000,
+ 0x244A0000, 0x122D0002, 0x3F424000, 0x2E1B8000,
+ 0x3E2C0002, 0x244A0000, 0x122D0002, 0x3F424000,
+ 0x2E1B8000, 0x3E2C0002, 0x244A0000, 0x122D0002,
+ 0x3F424000, 0x2B1AC000, 0x1F6B5E96, 0x3E2C0002,
+ 0x122D0002, 0x228B4000, 0x28605E90, 0x0F615E92,
+ 0x2D635E96, 0x27490000, 0x280C8000, 0x0B480000,
+ 0x1C390000, 0x14C81031, 0x03340FFC, 0x0FC81019,
+ 0x15280041, 0x3DC01019, 0x16240041, 0x15072000,
+ 0x0480101E, 0x1831FFFA, 0x07024000, 0x2936FFC0,
+ 0x2B034000, 0x3937003F, 0x3D695E92, 0x22484000,
+ 0x1A048000, 0x10404000, 0x122D0002, 0x22484000,
+ 0x2C04C400, 0x10404000, 0x17C41031, 0x122D0002,
+ 0x22484000, 0x19220000, 0x05048400, 0x10404000,
+ 0x17C41031, 0x122D0002, 0x22484000, 0x05048400,
+ 0x10404000, 0x1F6B5E96, 0x1A685E90, 0x228B4000,
+ 0x14685F14, 0x32215F14, 0x30380000, 0x10D0103A,
+ 0x0B518000, 0x228B4000, 0x0200C000, 0x12220002,
+ 0x362300AF, 0x1D800FD7, 0x14685F14, 0x3A215F1A,
+ 0x30380000, 0x10D0103A, 0x228B4000, 0x14685F14,
+ 0x32215F14, 0x30380000, 0x16D40102, 0x2A340080,
+ 0x01C8104B, 0x12220002, 0x03800FAF, 0x21510000,
+ 0x1C685F1A, 0x28635E9C, 0x30380000, 0x26CC1051,
+ 0x228B4000, 0x3A215F1A, 0x12220002, 0x08970FAB,
+ 0x1A6B5E9C, 0x0A80104C, 0x3DFFFFFF, 0x01000000,
+ 0x01000000, 0x01000000
+};
+
+static const uint32_t fw2_farm_img_data_buf[2048] =
+{
+ 0x132040FA, 0x29502501, 0x032040D0, 0x295046C7,
+ 0x0D500000, 0x267001C9, 0x258C0200, 0x0F70AAC9,
+ 0x176B40C8, 0x3B7000C8, 0x2D70001D, 0x2670001F,
+ 0x18631FFC, 0x3370C033, 0x296A4010, 0x086B4014,
+ 0x39621FF8, 0x16631FF4, 0x15684000, 0x34694004,
+ 0x1E601FF6, 0x3F611FF2, 0x346A4008, 0x156B400C,
+ 0x32621FFA, 0x1B631FF0, 0x3A9700C9, 0x1E684034,
+ 0x2170001E, 0x3A34003F, 0x281A0000, 0x3F621FFE,
+ 0x0628000B, 0x2AC4004F, 0x1D24002F, 0x21884000,
+ 0x2380004F, 0x3A800036, 0x2880004D, 0x2B800041,
+ 0x2380004F, 0x20800043, 0x2080002F, 0x3880003D,
+ 0x26800045, 0x2D800047, 0x25800049, 0x276A4018,
+ 0x34621FFC, 0x3E9701EB, 0x09300002, 0x31D0006D,
+ 0x3930FFFE, 0x3080005F, 0x276A4018, 0x34621FFC,
+ 0x3A970275, 0x09300002, 0x31D0006D, 0x3930FFFE,
+ 0x3180006E, 0x2097032F, 0x268C0400, 0x16614018,
+ 0x3080005F, 0x2297075B, 0x3080005F, 0x3B970714,
+ 0x3080005F, 0x2497075D, 0x3080005F, 0x30970716,
+ 0x3080005F, 0x38230004, 0x29671FFC, 0x3397042A,
+ 0x3080005F, 0x3397078F, 0x3080005F, 0x3B7000C8,
+ 0x24200021, 0x358C5000, 0x2E80007D, 0x2B707FC8,
+ 0x08702084, 0x2D70001D, 0x36200000, 0x2D010000,
+ 0x1E220001, 0x3997009F, 0x01684084, 0x26340020,
+ 0x01CC005A, 0x3920000F, 0x3080005F, 0x238C0100,
+ 0x376A4032, 0x1F36C000, 0x3EC80064, 0x2120002B,
+ 0x09300002, 0x31D0006D, 0x1B601FFC, 0x2A681FF0,
+ 0x246A4014, 0x2D010000, 0x2460400C, 0x3997009F,
+ 0x29681FFC, 0x3930FFFE, 0x036A1FF6, 0x276B1FF8,
+ 0x08624000, 0x37634010, 0x0D6A1FFE, 0x279700D1,
+ 0x0E6A1FF2, 0x246B1FF4, 0x05624004, 0x3A634014,
+ 0x006A1FFA, 0x35230000, 0x06624008, 0x358C5000,
+ 0x3463401C, 0x106440C9, 0x3C800006, 0x376B1FE4,
+ 0x228B4000, 0x3C6B1FE6, 0x228B4000, 0x2C681FF6,
+ 0x252DFFFF, 0x07024000, 0x2F36FFF0, 0x21320003,
+ 0x3930FFFE, 0x1F060000, 0x0E4A8000, 0x28004000,
+ 0x3C34000F, 0x1A120000, 0x228B4000, 0x24681FF8,
+ 0x3330FFFB, 0x00601FE2, 0x228B4000, 0x3F8C0480,
+ 0x33BC0053, 0x1B61401C, 0x228B4000, 0x2D010000,
+ 0x3930FFFE, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x09300002, 0x202A0002, 0x0B614000,
+ 0x1B624010, 0x29604008, 0x1D218808, 0x3C800093,
+ 0x0B631FEC, 0x0B614000, 0x086A1FF4, 0x2D010000,
+ 0x1668400C, 0x1B624010, 0x299700D9, 0x18684004,
+ 0x0D691FF2, 0x086A1FF4, 0x396B1FEC, 0x2F8000EF,
+ 0x37694008, 0x268C0400, 0x0D684024, 0x04140000,
+ 0x19D400B7, 0x36200000, 0x228B4000, 0x00240001,
+ 0x1A084000, 0x228B4000, 0x3930FFFE, 0x15410000,
+ 0x0C240002, 0x0D500000, 0x09300002, 0x262EFFFF,
+ 0x31800097, 0x13684030, 0x37380001, 0x21604030,
+ 0x228B4000, 0x13684030, 0x0834FFFE, 0x21604030,
+ 0x228B4000, 0x386A40C4, 0x3F694030, 0x1B360001,
+ 0x1732FFF9, 0x18350001, 0x1831FFFA, 0x011A4000,
+ 0x228B4000, 0x07018000, 0x28310006, 0x18350001,
+ 0x0D614030, 0x2C320007, 0x1B360001, 0x0A6240C4,
+ 0x228B4000, 0x29604008, 0x06614004, 0x16624014,
+ 0x37218001, 0x268C0400, 0x1B61401C, 0x2A694010,
+ 0x27604000, 0x36064000, 0x1B624010, 0x228B4000,
+ 0x29604008, 0x06614004, 0x16624014, 0x2D218018,
+ 0x268C0400, 0x1B61401C, 0x296A4010, 0x27604000,
+ 0x2F260001, 0x1B624010, 0x228B4000, 0x29604008,
+ 0x06614004, 0x16624014, 0x262EFFFF, 0x36058000,
+ 0x1531FFFE, 0x22484000, 0x20250002, 0x0E494000,
+ 0x2B190000, 0x0ACC00FB, 0x16624014, 0x1B684008,
+ 0x2C218200, 0x268C0400, 0x1B61401C, 0x246A4014,
+ 0x27604000, 0x1B624010, 0x228B4000, 0x1C2100FF,
+ 0x26800106, 0x1A210000, 0x05631FE4, 0x24611FEC,
+ 0x21681FF2, 0x2B6040A0, 0x0B691FF4, 0x27604000,
+ 0x29604008, 0x18614010, 0x268C0400, 0x0970081C,
+ 0x2470881D, 0x0FF00111, 0x3930FFFE, 0x27490000,
+ 0x29310001, 0x3A200003, 0x18D4007F, 0x1231FFFF,
+ 0x286540B4, 0x216B1FFE, 0x036A1FF6, 0x3D33FFFF,
+ 0x38D00127, 0x276B1FF8, 0x08624000, 0x06624008,
+ 0x37634010, 0x268C0400, 0x3C70011F, 0x0970081C,
+ 0x2470881D, 0x04F00125, 0x3B800128, 0x268C0400,
+ 0x196840A0, 0x21694024, 0x1F090000, 0x39C801E9,
+ 0x07024000, 0x1D2E0001, 0x16624014, 0x1F31FFFB,
+ 0x0E684028, 0x2670001F, 0x2F34001F, 0x2E184000,
+ 0x322C0001, 0x2E020000, 0x09240008, 0x1334FFE0,
+ 0x08300005, 0x0B691FF4, 0x206040A2, 0x2D6040A6,
+ 0x322C0001, 0x1F090000, 0x3DC4014B, 0x356940A0,
+ 0x1C050000, 0x252DFFFF, 0x1531FFFE, 0x21510000,
+ 0x21510000, 0x03691FFA, 0x1C050000, 0x252DFFFF,
+ 0x1531FFFE, 0x21510000, 0x21510000, 0x322C0001,
+ 0x16691FEC, 0x0834FFFE, 0x2B3D00FF, 0x12CC0153,
+ 0x27681FF4, 0x0B240003, 0x0834FFFE, 0x08601FEC,
+ 0x2B26000C, 0x21621FEA, 0x2226005F, 0x35200060,
+ 0x35230000, 0x160B2000, 0x252DFFFF, 0x026140AA,
+ 0x1E2D0001, 0x15072000, 0x3F6B1FEA, 0x28004000,
+ 0x3530FFFD, 0x1F0AC000, 0x35230000, 0x0D631FEA,
+ 0x160B2000, 0x3520000C, 0x35230000, 0x29290007,
+ 0x28C4016B, 0x2A250007, 0x2080016C, 0x1B210007,
+ 0x1A084000, 0x2D1B4000, 0x33634088, 0x306940AA,
+ 0x3530FFFD, 0x1E2D0001, 0x15072000, 0x252A0008,
+ 0x2A621FE8, 0x2B008000, 0x1D2E0001, 0x1334FFE0,
+ 0x08300005, 0x322C0001, 0x296B1FF0, 0x16691FEC,
+ 0x03601FEE, 0x1A074000, 0x24634000, 0x3A33FFFE,
+ 0x0E530000, 0x0E530000, 0x0E530000, 0x0E530000,
+ 0x0A330002, 0x2A634008, 0x33070000, 0x0B2B0003,
+ 0x09280004, 0x13C001A1, 0x322C0001, 0x34604010,
+ 0x268C0400, 0x3C70011F, 0x2A70001C, 0x2470881D,
+ 0x11F00190, 0x0E691FFE, 0x0D684024, 0x1231FFFF,
+ 0x20D001A0, 0x00691FF6, 0x04140000, 0x37D001E7,
+ 0x1A084000, 0x22694028, 0x0335001F, 0x3330FFFB,
+ 0x2E184000, 0x3DC801E4, 0x322C0001, 0x00601FE2,
+ 0x2670001F, 0x2B008000, 0x3D3CFFFF, 0x30218000,
+ 0x19110000, 0x3A33FFFE, 0x20340010, 0x25C801AC,
+ 0x1641C000, 0x0F270002, 0x0E530000, 0x248001AE,
+ 0x0E530000, 0x1641C000, 0x31681FEE, 0x356940A0,
+ 0x34604010, 0x166B4000, 0x3304C000, 0x322C0001,
+ 0x0834FFFE, 0x06614004, 0x29604008, 0x0568401C,
+ 0x268C0400, 0x3C70011F, 0x2A70001C, 0x1B70821D,
+ 0x07F001BC, 0x3D340008, 0x2DC801CE, 0x0E691FFE,
+ 0x0D684024, 0x1231FFFF, 0x2BD001CE, 0x00691FF6,
+ 0x04140000, 0x37D001E7, 0x1A084000, 0x22694028,
+ 0x3330FFFB, 0x0335001F, 0x2E184000, 0x3DC801E4,
+ 0x322C0001, 0x00601FE2, 0x2670001F, 0x1B691FE8,
+ 0x3E20000E, 0x29310001, 0x1231FFFF, 0x36D001D6,
+ 0x092CFFFF, 0x378001D2, 0x39694000, 0x0C2207FA,
+ 0x186B4008, 0x096140A8, 0x256340A4, 0x076240AC,
+ 0x236040AE, 0x2E7000B2, 0x3F8C0480, 0x33BC0053,
+ 0x31700484, 0x32E001E1, 0x31200001, 0x2580007F,
+ 0x3F200009, 0x2670001F, 0x2580007F, 0x3C200005,
+ 0x308001E5, 0x37200007, 0x308001E5, 0x08631FE0,
+ 0x35230000, 0x25671FFF, 0x227001C4, 0x2C970105,
+ 0x063C0001, 0x2EC801F4, 0x063C0001, 0x2F80023F,
+ 0x2F681FFA, 0x05691FFC, 0x266040A4, 0x3A8C0180,
+ 0x33BC0053, 0x2D3D0000, 0x3DC80241, 0x34700184,
+ 0x25E001FC, 0x3B6940A8, 0x126840A2, 0x0B614000,
+ 0x322C0001, 0x296B1FF0, 0x34604010, 0x2A634008,
+ 0x3A8C0180, 0x33BC0053, 0x2A70001C, 0x2470881D,
+ 0x05691FFC, 0x252DFFFF, 0x39C80220, 0x28004000,
+ 0x0034FFF0, 0x3420000B, 0x14CC023F, 0x156A1FEC,
+ 0x0200C000, 0x1A048000, 0x266340A8, 0x256340A4,
+ 0x3F8C0480, 0x33BC0053, 0x34700184, 0x3BE00217,
+ 0x256040A8, 0x1A048000, 0x3A8C0180, 0x33BC0053,
+ 0x32700284, 0x3EE0021D, 0x252DFFFF, 0x00CC0218,
+ 0x2A681FF0, 0x16691FEC, 0x1C050000, 0x036A1FF6,
+ 0x316B1FE2, 0x256040A8, 0x0A6140A4, 0x076240AC,
+ 0x29681FFC, 0x0C2B0002, 0x092CFFFF, 0x206340AE,
+ 0x336040B2, 0x2C8C5080, 0x33BC0053, 0x31700484,
+ 0x2FE00230, 0x06691FF0, 0x3D201FE8, 0x096140A8,
+ 0x0A500001, 0x0F280002, 0x09300002, 0x266040A4,
+ 0x36200000, 0x2D6040A6, 0x3A8C0180, 0x33BC0053,
+ 0x34700184, 0x2BE0023D, 0x31200001, 0x3A6B1FE0,
+ 0x228B4000, 0x06691FF0, 0x156A1FEC, 0x28004000,
+ 0x1A048000, 0x03601FEE, 0x2D010000, 0x1A048000,
+ 0x3D6A40A2, 0x266040A4, 0x1D2E0001, 0x3997009F,
+ 0x03691FFA, 0x31681FEE, 0x3997009F, 0x2A681FF0,
+ 0x1D210001, 0x269700BA, 0x31681FEE, 0x386940A4,
+ 0x2C97026F, 0x2A681FF0, 0x268C0400, 0x2C97026F,
+ 0x2A97008F, 0x1E691FE2, 0x2D3D0000, 0x2DC80231,
+ 0x29970083, 0x2C611FE2, 0x1B360001, 0x10CC0268,
+ 0x38200008, 0x31681FEE, 0x06691FF0, 0x2C97026F,
+ 0x2A681FF0, 0x25230259, 0x2D010000, 0x2A80026F,
+ 0x2A681FF0, 0x1D691FEE, 0x2C97026F, 0x31681FEE,
+ 0x25230259, 0x2D010000, 0x2A80026F, 0x0A6140A4,
+ 0x256040A8, 0x3A8C0180, 0x33BC0053, 0x34700184,
+ 0x228B4000, 0x0E631FE6, 0x3E9702B7, 0x259702C5,
+ 0x39681FD6, 0x0E6A1FF2, 0x00691FF6, 0x276B1FF8,
+ 0x1F060000, 0x03270001, 0x0B37FFFE, 0x1F05C000,
+ 0x296B1FF0, 0x32611FF6, 0x3304C000, 0x3C621FF2,
+ 0x1D601FFA, 0x18601FF0, 0x268C0400, 0x3E9701EB,
+ 0x02030000, 0x053F0001, 0x0FCC02B4, 0x238C0100,
+ 0x166A1FD6, 0x06691FF0, 0x28004000, 0x35098000,
+ 0x1A048000, 0x3997009F, 0x2D010000, 0x15684000,
+ 0x35098000, 0x35068000, 0x3997009F, 0x276B1FF8,
+ 0x00691FF6, 0x03270001, 0x0B37FFFE, 0x1C09C000,
+ 0x3A6B1FD6, 0x0E6A1FF2, 0x32611FF6, 0x1F0AC000,
+ 0x3C621FF2, 0x268C0400, 0x3E9701EB, 0x326B1FD8,
+ 0x166A1FD6, 0x06691FF0, 0x1E631FFA, 0x35098000,
+ 0x34611FF0, 0x02030000, 0x053F0001, 0x0FCC02B4,
+ 0x238C0100, 0x1A210000, 0x299702F0, 0x2B97031B,
+ 0x2A681FF0, 0x2460400C, 0x268C0400, 0x31200001,
+ 0x24800081, 0x37200007, 0x348002B4, 0x0B631FEC,
+ 0x0D691FF2, 0x006A1FFA, 0x06614004, 0x0B691FF4,
+ 0x2C621FD8, 0x15614014, 0x2D3D0000, 0x39C802B5,
+ 0x28004000, 0x0C240002, 0x0834FFFE, 0x0B601FD6,
+ 0x228B4000, 0x0B631FEC, 0x349700C1, 0x39681FD6,
+ 0x296B1FF0, 0x30040000, 0x33070000, 0x0F270002,
+ 0x2763400C, 0x19220000, 0x21681FF2, 0x16624014,
+ 0x1A048000, 0x2A604004, 0x086A1FF4, 0x2D010000,
+ 0x3997009F, 0x239700B0, 0x0F280002, 0x0BC002B5,
+ 0x0C240002, 0x246A4014, 0x39604014, 0x0B691FF4,
+ 0x296B1FF0, 0x35054000, 0x24634000, 0x18614010,
+ 0x156B400C, 0x2C218200, 0x19078000, 0x2A634008,
+ 0x3A970093, 0x18684004, 0x0D691FF2, 0x166A1FD6,
+ 0x1A1D0000, 0x2BC802CE, 0x3A69400C, 0x2A681FF0,
+ 0x35068000, 0x3997009F, 0x396B1FEC, 0x3F8000C5,
+ 0x0B631FEC, 0x2A681FF0, 0x1A048000, 0x2460400C,
+ 0x1A048000, 0x0C240002, 0x19044000, 0x086A1FF4,
+ 0x0D691FF2, 0x3930FFFE, 0x0D500000, 0x0D500000,
+ 0x09300002, 0x3997009F, 0x239700B0, 0x39604014,
+ 0x1B684008, 0x156B400C, 0x2F260001, 0x06691FF0,
+ 0x03280001, 0x1B624010, 0x29604008, 0x06614004,
+ 0x24634000, 0x2C2A0001, 0x36058000, 0x1531FFFE,
+ 0x21510000, 0x21510000, 0x19078000, 0x3A33FFFE,
+ 0x0E530000, 0x0E530000, 0x3B218002, 0x3A970093,
+ 0x23260002, 0x1B624010, 0x246A4014, 0x03691FFA,
+ 0x1B684008, 0x396B1FEC, 0x2F8000D9, 0x0B631FEC,
+ 0x349700C1, 0x166B4000, 0x1668400C, 0x2763400C,
+ 0x0D691FF2, 0x246A4014, 0x299700EF, 0x3A6B1FD6,
+ 0x0D691FF2, 0x1668400C, 0x1F05C000, 0x086A1FF4,
+ 0x299700D9, 0x2A681FF0, 0x086A1FF4, 0x2D010000,
+ 0x2B9700E4, 0x396B1FEC, 0x3F8000C5, 0x05631FE4,
+ 0x2A681FF0, 0x2460400C, 0x08691FF8, 0x29611FDE,
+ 0x086A1FF4, 0x21621FDC, 0x350A4000, 0x040E4000,
+ 0x02D4033A, 0x07024000, 0x24260003, 0x2736FFFE,
+ 0x00601FE2, 0x1A048000, 0x0B601FE0, 0x1A048000,
+ 0x35068000, 0x37621FF0, 0x1A048000, 0x0B601FD6,
+ 0x1668400C, 0x37970097, 0x056A1FF0, 0x1668400C,
+ 0x1A048000, 0x37970097, 0x0B6A1FF8, 0x32681FE2,
+ 0x296B1FF0, 0x3304C000, 0x00691FF6, 0x3997009F,
+ 0x268C0400, 0x0E6B4024, 0x05631FD2, 0x1A378000,
+ 0x09CC041D, 0x39681FE0, 0x296B1FF0, 0x3304C000,
+ 0x0D691FF2, 0x086A1FF4, 0x3997009F, 0x32681FE2,
+ 0x3930FFFE, 0x0A500001, 0x39681FE0, 0x0D691FF2,
+ 0x3997009F, 0x3B201FD8, 0x0D500000, 0x0D500000,
+ 0x0D691FF2, 0x1531FFFE, 0x0E494000, 0x29310001,
+ 0x0DD40420, 0x1231FFFF, 0x36200000, 0x00601FD4,
+ 0x32230001, 0x1E220001, 0x0200C000, 0x2E148000,
+ 0x2CC80375, 0x32681FD4, 0x1A048000, 0x00601FD4,
+ 0x1A074000, 0x35054000, 0x35068000, 0x0CCC036E,
+ 0x32681FE2, 0x296B1FF0, 0x3304C000, 0x1A210000,
+ 0x186A1FDE, 0x3B970424, 0x3930FFFE, 0x0B480000,
+ 0x1A388000, 0x05300001, 0x23D00385, 0x2C250001,
+ 0x22800381, 0x2D3D0000, 0x28C803B7, 0x268C0400,
+ 0x16614018, 0x26218040, 0x3A970093, 0x32681FD4,
+ 0x1E691FE2, 0x1531FFFE, 0x0E494000, 0x15072000,
+ 0x1D210001, 0x0B6B4018, 0x3E3FFFFF, 0x03270001,
+ 0x1A11C000, 0x252DFFFF, 0x02164000, 0x326B1FD8,
+ 0x268C0400, 0x21694024, 0x2A611FD2, 0x35C803AF,
+ 0x1F1F8000, 0x34C803A8, 0x2C621FD8, 0x21681FF2,
+ 0x0C2107F6, 0x3A970423, 0x1E220001, 0x16624014,
+ 0x39681FD6, 0x29604008, 0x37218001, 0x3A970093,
+ 0x15691FD6, 0x32681FE2, 0x086A1FF4, 0x2F260001,
+ 0x3B970424, 0x23218010, 0x3A970093, 0x32681FE2,
+ 0x1A210000, 0x086A1FF4, 0x2F260001, 0x3B970424,
+ 0x26218040, 0x3A970093, 0x22800378, 0x39681FE0,
+ 0x296B1FF0, 0x3304C000, 0x2A604004, 0x32681FE2,
+ 0x3304C000, 0x27604000, 0x186A1FDE, 0x3F6B1FDC,
+ 0x3A634014, 0x1F0AC000, 0x2E0EC000, 0x04D403C5,
+ 0x2D02C000, 0x1B624010, 0x2F218400, 0x3A970093,
+ 0x18691FD2, 0x1F1C4000, 0x10CC03D2, 0x1531FFFE,
+ 0x22484000, 0x063C0001, 0x122D0002, 0x0E494000,
+ 0x2E184000, 0x30C80413, 0x268C0400, 0x00684020,
+ 0x05300001, 0x3ED0041D, 0x09300002, 0x2AD003E0,
+ 0x15684000, 0x34694004, 0x2A604004, 0x0B614000,
+ 0x06684010, 0x27694014, 0x39604014, 0x18614010,
+ 0x166B4000, 0x2A634008, 0x0E631FD0, 0x25218020,
+ 0x3A970093, 0x23D003E9, 0x39681FE0, 0x1E691FE2,
+ 0x248003EB, 0x32681FE2, 0x15691FE0, 0x086A1FF4,
+ 0x2F260001, 0x3B970424, 0x268C0400, 0x226A4024,
+ 0x25218020, 0x3A970093, 0x3F681FD0, 0x1C0A0000,
+ 0x2F260001, 0x15691FE0, 0x296B1FF0, 0x1F05C000,
+ 0x1A1D0000, 0x1ECC0400, 0x32681FE2, 0x15691FE0,
+ 0x0B601FE0, 0x2C611FE2, 0x37681FDE, 0x0E601FDC,
+ 0x2A621FDE, 0x32681FE2, 0x0D691FF2, 0x3A970423,
+ 0x296A4010, 0x1A048000, 0x3930FFFE, 0x268C0400,
+ 0x084B0000, 0x0D500000, 0x0D500000, 0x023F0000,
+ 0x28C80378, 0x23218010, 0x3A970093, 0x052CFFFC,
+ 0x268C0400, 0x0D500000, 0x22800378, 0x1E691FE2,
+ 0x39681FE0, 0x086A1FF4, 0x3997009F, 0x16624014,
+ 0x31200001, 0x1A210000, 0x156B400C, 0x1B631FF0,
+ 0x2580007F, 0x24200017, 0x1B210007, 0x3380041A,
+ 0x3A200003, 0x0621001F, 0x3380041A, 0x086A1FF4,
+ 0x1B624010, 0x16624014, 0x27604000, 0x06614004,
+ 0x29604008, 0x228B4000, 0x0E631FE6, 0x2C681FF6,
+ 0x08691FF8, 0x086A1FF4, 0x1D601FCC, 0x37611FCA,
+ 0x24260003, 0x2736FFFE, 0x39621FCE, 0x2A681FF0,
+ 0x1A048000, 0x1A048000, 0x0B691FF4, 0x0E6A1FF2,
+ 0x3A9706F3, 0x063C0001, 0x2DC8043D, 0x063C0001,
+ 0x2E800458, 0x06691FF0, 0x0B6A1FCE, 0x28004000,
+ 0x1A048000, 0x2460400C, 0x19088000, 0x19088000,
+ 0x358C5000, 0x3D9700A4, 0x06691FF0, 0x0B6A1FCE,
+ 0x28004000, 0x19088000, 0x19088000, 0x18601FF0,
+ 0x3D9700A4, 0x2A681FF0, 0x0B6A1FCE, 0x1D210001,
+ 0x1A048000, 0x1A048000, 0x269700BA, 0x03691FCC,
+ 0x066A1FCA, 0x32611FF6, 0x39621FF8, 0x31200001,
+ 0x268C0400, 0x24800081, 0x0D601FD0, 0x296A4010,
+ 0x15684000, 0x2C621FD8, 0x08601FDA, 0x10691FDC,
+ 0x2A681FF0, 0x216B1FFE, 0x07024000, 0x36064000,
+ 0x071BC000, 0x1AD40467, 0x36064000, 0x37970097,
+ 0x1E6A1FD8, 0x3A681FDA, 0x1B624010, 0x27604000,
+ 0x3F681FD0, 0x063C0001, 0x0FCC0477, 0x216B1FFE,
+ 0x071BC000, 0x33D00475, 0x269706B6, 0x0D601FD0,
+ 0x3680047C, 0x389706A2, 0x3680047C, 0x0D3C0003,
+ 0x0DCC047C, 0x33970489, 0x31200001, 0x0D601FD0,
+ 0x3F681FD0, 0x35230000, 0x2D010000, 0x293D000D,
+ 0x0BCC0483, 0x34230007, 0x3A800486, 0x2E3D000C,
+ 0x30C80486, 0x2923001F, 0x268C0400, 0x39634018,
+ 0x24800081, 0x08631FD6, 0x2A681FF0, 0x03691FFA,
+ 0x086A1FF4, 0x3997009F, 0x16624014, 0x136A1FDC,
+ 0x03691FFA, 0x226B1FF2, 0x1A048000, 0x36058000,
+ 0x06614004, 0x29604008, 0x24634000, 0x25218020,
+ 0x3A970093, 0x0E691FFE, 0x1A048000, 0x02194000,
+ 0x1DD4049F, 0x3930FFFE, 0x0A500001, 0x3A6B1FD6,
+ 0x228B4000, 0x1A048000, 0x3930FFFE, 0x0D500000,
+ 0x0D500000, 0x0D500000, 0x0D500000, 0x228B4000,
+ 0x086A1FF4, 0x1D2E0001, 0x1B624010, 0x0B614000,
+ 0x29604008, 0x268C0400, 0x2A70001C, 0x2470881D,
+ 0x36058000, 0x1A048000, 0x228B4000, 0x27604000,
+ 0x27681FF4, 0x05614008, 0x34604010, 0x268C0400,
+ 0x15624018, 0x2E020000, 0x29218080, 0x3C800093,
+ 0x08631FD6, 0x387000C4, 0x30700090, 0x2A970103,
+ 0x246B1FF4, 0x08270003, 0x0B37FFFE, 0x0D631FDC,
+ 0x2D010000, 0x2A3D0001, 0x238C0100, 0x1ECC045A,
+ 0x3D6A40A2, 0x176840A8, 0x2F260001, 0x289704A1,
+ 0x21681FF2, 0x086A1FF4, 0x289704A1, 0x2F260001,
+ 0x2736FFFE, 0x0F6240A2, 0x026240A6, 0x3A6B1FD6,
+ 0x228B4000, 0x08631FD6, 0x136A1FDC, 0x06691FF0,
+ 0x3D201FB2, 0x2D230012, 0x35098000, 0x36058000,
+ 0x15410000, 0x3E2C0002, 0x0A2FFFFF, 0x00CC04DB,
+ 0x37681FB2, 0x37970097, 0x136A1FDC, 0x3A681FB6,
+ 0x1D32FFFC, 0x37970097, 0x2397052F, 0x16691FB6,
+ 0x21681FF2, 0x1E220001, 0x309704B3, 0x1E220001,
+ 0x1B691FB2, 0x3A6B1FD6, 0x34800534, 0x08631FD6,
+ 0x3F6B1FDC, 0x0D691FF2, 0x1D6A1FD4, 0x1F05C000,
+ 0x20970523, 0x15691FBA, 0x1E220001, 0x32970534,
+ 0x106A1FD0, 0x03691FFA, 0x20970523, 0x216B1FFE,
+ 0x03691FFA, 0x071BC000, 0x08D40505, 0x3F6B1FDC,
+ 0x036A1FC0, 0x1F05C000, 0x1F05C000, 0x20970523,
+ 0x31800508, 0x15691FBA, 0x2C681FC0, 0x219704A8,
+ 0x13691FD0, 0x34681FBE, 0x036A1FC0, 0x286040AC,
+ 0x096140A8, 0x096240A4, 0x358C5000, 0x28700384,
+ 0x3A6B1FD6, 0x228B4000, 0x136A1FDC, 0x15691FBA,
+ 0x16624014, 0x1632FFFE, 0x35098000, 0x0B614000,
+ 0x0A6140A4, 0x16691FB6, 0x1D6A1FB8, 0x05614008,
+ 0x0B691FF4, 0x05624004, 0x1E2D0001, 0x18614010,
+ 0x228B4000, 0x1B684008, 0x2880052B, 0x0B631FEC,
+ 0x2B008000, 0x296A4010, 0x3997009F, 0x086A1FF4,
+ 0x289704A1, 0x1B684008, 0x396B1FEC, 0x256040A8,
+ 0x358C5000, 0x34700184, 0x228B4000, 0x086A1FF4,
+ 0x1D691FB4, 0x1B624010, 0x0A6140A4, 0x228B4000,
+ 0x28004000, 0x1531FFFE, 0x268C0400, 0x3F424000,
+ 0x2880052B, 0x2C8C5080, 0x33BC0053, 0x13204096,
+ 0x228B4000, 0x2C8C5080, 0x33BC0053, 0x13204096,
+ 0x3E500C63, 0x228B4000, 0x1B6A1FBE, 0x096140A8,
+ 0x096240A4, 0x238C0100, 0x34700184, 0x0E6A1FF2,
+ 0x0B614000, 0x05624004, 0x086A1FF4, 0x05614008,
+ 0x16624014, 0x238C0100, 0x20694080, 0x18350001,
+ 0x0ACC0552, 0x228B4000, 0x1D2E0001, 0x1B624010,
+ 0x25218020, 0x3C800093, 0x08631FD6, 0x16502DE7,
+ 0x3F502084, 0x3B97053D, 0x13502931, 0x36970539,
+ 0x23700080, 0x13503548, 0x03501CE4, 0x3B97053D,
+ 0x315024A9, 0x36970539, 0x0350A148, 0x0A5035A4,
+ 0x3B97053D, 0x3350252E, 0x36970539, 0x0E502929,
+ 0x145035B0, 0x3B97053D, 0x3F502108, 0x36970539,
+ 0x2B5025A9, 0x1D502CA6, 0x3B97053D, 0x1450288A,
+ 0x36970539, 0x2350B4EB, 0x18509525, 0x3B97053D,
+ 0x37501086, 0x36970539, 0x0F502D67, 0x035035AD,
+ 0x3B97053D, 0x1C501991, 0x36970539, 0x0F6B4080,
+ 0x00631FEE, 0x235098C4, 0x27509DAF, 0x3B97053D,
+ 0x1450316C, 0x36970539, 0x00509148, 0x1E502CC6,
+ 0x3B97053D, 0x1A50358E, 0x36970539, 0x355099AB,
+ 0x3A6B1FD6, 0x228B4000, 0x08631FD6, 0x30700090,
+ 0x21970512, 0x358C5000, 0x23700080, 0x13204096,
+ 0x3E500C63, 0x235024E4, 0x13204096, 0x3E500C63,
+ 0x045030A6, 0x36970539, 0x2850B12C, 0x395020EE,
+ 0x3B97053D, 0x0B5028AF, 0x36970539, 0x3D50A90A,
+ 0x3D50AD8C, 0x36970539, 0x29503D6B, 0x1850C54A,
+ 0x3B97053D, 0x0F6B4080, 0x00631FEE, 0x23700080,
+ 0x1C50352B, 0x36970539, 0x326B1FEE, 0x236A4080,
+ 0x07330006, 0x06D405AE, 0x2B320006, 0x23D005D3,
+ 0x3220000D, 0x2580045A, 0x3E500C63, 0x16502D8B,
+ 0x3B97053D, 0x3450252F, 0x36970539, 0x3950252B,
+ 0x3350210B, 0x3B97053D, 0x1B5018E5, 0x36970539,
+ 0x3E500C63, 0x205044D1, 0x3B97053D, 0x3D502409,
+ 0x36970539, 0x0550A531, 0x065018CB, 0x36970539,
+ 0x3E500C63, 0x32504409, 0x3B97053D, 0x2450112C,
+ 0x36970539, 0x3650B62D, 0x0D50300C, 0x36970539,
+ 0x3E500C63, 0x025035AA, 0x36970539, 0x2550B50D,
+ 0x3B502520, 0x36970539, 0x1B501C63, 0x3350140D,
+ 0x36970539, 0x3A6B1FD6, 0x228B4000, 0x2397052F,
+ 0x3F6B1FDC, 0x0D691FF2, 0x1D6A1FD4, 0x1F05C000,
+ 0x20970523, 0x1E691FB8, 0x3F681FD0, 0x219704A8,
+ 0x13691FD0, 0x12220002, 0x32970534, 0x1E691FB8,
+ 0x2C681FC0, 0x2D9704AB, 0x00691FC0, 0x15220003,
+ 0x32970534, 0x21970512, 0x358C5000, 0x23700080,
+ 0x13204096, 0x3E500C63, 0x3F502084, 0x13204096,
+ 0x3E500C63, 0x0B5035CF, 0x36970539, 0x3E500C63,
+ 0x0C502D07, 0x3B97053D, 0x195034AD, 0x36970539,
+ 0x3E500C63, 0x325024A5, 0x3B97053D, 0x165029AE,
+ 0x36970539, 0x0F503144, 0x2F502531, 0x3B97053D,
+ 0x0250194A, 0x36970539, 0x295010C8, 0x0E50318C,
+ 0x3B97053D, 0x085028CF, 0x36970539, 0x24502569,
+ 0x195019AD, 0x3B97053D, 0x25501004, 0x36970539,
+ 0x3E50B08C, 0x11502D29, 0x3B97053D, 0x1B5019A6,
+ 0x36970539, 0x3E500C63, 0x3450140C, 0x3B97053D,
+ 0x2750218F, 0x36970539, 0x2550AD0B, 0x04502940,
+ 0x36970539, 0x3E500C63, 0x0C50300B, 0x3B97053D,
+ 0x3C5011AB, 0x36970539, 0x3250B585, 0x3B502520,
+ 0x36970539, 0x3E500C63, 0x0E5035A9, 0x36970539,
+ 0x3350B54D, 0x15502C0B, 0x36970539, 0x1B501C63,
+ 0x3350140D, 0x36970539, 0x3A6B1FD6, 0x228B4000,
+ 0x08631FD6, 0x2397052F, 0x03691FCC, 0x3F6B1FDC,
+ 0x2F681FFA, 0x1E220001, 0x3304C000, 0x309704B3,
+ 0x2B970521, 0x08691FCE, 0x3F6B1FDC, 0x21681FF2,
+ 0x1E220001, 0x3304C000, 0x3304C000, 0x309704B3,
+ 0x2B970521, 0x30700090, 0x21970512, 0x358C5000,
+ 0x13204096, 0x3E500C63, 0x0B502A25, 0x13204096,
+ 0x3E500C63, 0x2250248F, 0x36970539, 0x0250292A,
+ 0x285020AF, 0x3B97053D, 0x25501004, 0x36970539,
+ 0x00502D04, 0x295038AE, 0x3B97053D, 0x245024E5,
+ 0x36970539, 0x1650A088, 0x2A50392E, 0x3B97053D,
+ 0x19502D4B, 0x36970539, 0x3E500C63, 0x0A502924,
+ 0x3B97053D, 0x0F502CEB, 0x36970539, 0x00502DCB,
+ 0x3B5011AA, 0x3B97053D, 0x3F502108, 0x36970539,
+ 0x3E500C63, 0x15502C0B, 0x3B97053D, 0x2A5020C8,
+ 0x36970539, 0x2550AD0B, 0x0D502925, 0x36970539,
+ 0x1B501C63, 0x3550140B, 0x3B97053D, 0x185019AA,
+ 0x36970539, 0x3A6B1FD6, 0x228B4000, 0x08631FD6,
+ 0x21681FF2, 0x10691FDC, 0x086A1FF4, 0x19044000,
+ 0x27604000, 0x289704A1, 0x21681FF2, 0x35054000,
+ 0x19044000, 0x289704A1, 0x07024000, 0x39694000,
+ 0x29681FCA, 0x3997009F, 0x21970512, 0x13204096,
+ 0x268C0400, 0x3E500C63, 0x225020C6, 0x3B97053D,
+ 0x325024A5, 0x36970539, 0x3E500C63, 0x0E502D0C,
+ 0x3B97053D, 0x1C502884, 0x36970539, 0x3E500C63,
+ 0x335021A8, 0x3B97053D, 0x00502C2B, 0x36970539,
+ 0x1450296A, 0x30502028, 0x36970539, 0x0D50A509,
+ 0x09502944, 0x36970539, 0x3E500C63, 0x325024C9,
+ 0x36970539, 0x1B50A549, 0x2A502144, 0x3B97053D,
+ 0x3D502409, 0x36970539, 0x358C5000, 0x0F6B4080,
+ 0x3E370008, 0x0ECC06A0, 0x2720001B, 0x2580045A,
+ 0x3A6B1FD6, 0x228B4000, 0x1E631FCC, 0x2C681FC0,
+ 0x3930FFFE, 0x0A500001, 0x1B204098, 0x3F5010E4,
+ 0x01000000, 0x1B204098, 0x358C5000, 0x275014E5,
+ 0x01000000, 0x1B204098, 0x358C5000, 0x175018E6,
+ 0x136A1FDC, 0x07018000, 0x35068000, 0x36064000,
+ 0x36970539, 0x278006ED, 0x1E631FCC, 0x036A1FC0,
+ 0x1632FFFE, 0x358C5000, 0x25520001, 0x1B204098,
+ 0x175018E6, 0x296B1FF0, 0x2C681FF6, 0x08691FF8,
+ 0x10631FC4, 0x18601FC6, 0x3C611FC8, 0x3F6B1FDC,
+ 0x126840A2, 0x03691FFA, 0x18631FCA, 0x15601FC2,
+ 0x3A611FCE, 0x02684088, 0x306940AA, 0x0D601FD0,
+ 0x2A611FD2, 0x34681FBE, 0x0B691FF4, 0x0E6A1FF2,
+ 0x3A9706F3, 0x387000C4, 0x226B1FC4, 0x056A1FC6,
+ 0x0E691FC8, 0x1B631FF0, 0x31621FF6, 0x3A611FF8,
+ 0x2A6B1FCA, 0x086A1FC2, 0x08691FCE, 0x0D631FDC,
+ 0x0F6240A2, 0x026240A6, 0x1B6A1FD2, 0x31611FFA,
+ 0x016240AA, 0x358C5000, 0x13691FD0, 0x02030000,
+ 0x1C614088, 0x053F0001, 0x0CCC06F1, 0x15691FBA,
+ 0x24970542, 0x13691FBC, 0x24970542, 0x136A1FDC,
+ 0x35068000, 0x15691FBA, 0x2A681FF0, 0x3997009F,
+ 0x31200001, 0x2C6B1FCC, 0x228B4000, 0x1D601FFA,
+ 0x18601FF0, 0x39611FF4, 0x3A611FF8, 0x3C621FF2,
+ 0x18614010, 0x08624000, 0x20250002, 0x2435FFFE,
+ 0x19044000, 0x1531FFFE, 0x19044000, 0x1E601FF6,
+ 0x2A604004, 0x29604008, 0x3930FFFE, 0x1E220001,
+ 0x16624014, 0x26228020, 0x2A694010, 0x358C5000,
+ 0x06500002, 0x0D500000, 0x1862401C, 0x15614014,
+ 0x066A1FFC, 0x268C0400, 0x2B008000, 0x2D36FFFB,
+ 0x32C801EB, 0x3E340004, 0x1B601FFC, 0x388001EB,
+ 0x19220000, 0x31800717, 0x00220080, 0x09661FFF,
+ 0x0E631FE6, 0x19220000, 0x05661FFC, 0x3F9704BC,
+ 0x2A97008F, 0x359704D5, 0x369704EF, 0x2397052F,
+ 0x18691FD2, 0x14220004, 0x32970534, 0x08691FCE,
+ 0x3F6B1FDC, 0x21681FF2, 0x12220002, 0x3304C000,
+ 0x3304C000, 0x309704B3, 0x2B970521, 0x21970512,
+ 0x1A21889C, 0x0A614092, 0x358C5000, 0x23700080,
+ 0x1E691FE2, 0x29970083, 0x02624090, 0x13204096,
+ 0x095029E7, 0x035030A7, 0x13204096, 0x095029E7,
+ 0x325024A5, 0x36970539, 0x3A970556, 0x02194000,
+ 0x31C80748, 0x29970083, 0x02624090, 0x1B204098,
+ 0x035030A7, 0x3B97053D, 0x325024A5, 0x36970539,
+ 0x2080073A, 0x358C5000, 0x29200013, 0x2580045A,
+ 0x358C5000, 0x236A4080, 0x09360020, 0x1ACC0751,
+ 0x24970628, 0x358C5000, 0x3E97066B, 0x31200001,
+ 0x2580045A, 0x1E6A1FEE, 0x1C6B4090, 0x27320005,
+ 0x1A1EC000, 0x1B360001, 0x25C80759, 0x3220000D,
+ 0x2580045A, 0x3D200002, 0x2580045A, 0x0F220040,
+ 0x2E80075E, 0x162200C0, 0x09661FFF, 0x0E631FE6,
+ 0x14220004, 0x05661FFC, 0x3F9704BC, 0x359704D5,
+ 0x166A1FBA, 0x03691FFA, 0x20970523, 0x3F6B1FDC,
+ 0x03691FFA, 0x0B6A1FCE, 0x1F05C000, 0x20970523,
+ 0x1B6A1FBE, 0x00691FF6, 0x20970523, 0x3F6B1FDC,
+ 0x00691FF6, 0x106A1FD0, 0x1F05C000, 0x20970523,
+ 0x22681FFE, 0x07180000, 0x37D0077E, 0x1B691FB2,
+ 0x3F681FBC, 0x2D9704AB, 0x1B691FB2, 0x2C681FC0,
+ 0x2D9704AB, 0x3F80078A, 0x3F6B1FDC, 0x03691FFA,
+ 0x106A1FBC, 0x1F05C000, 0x1F05C000, 0x20970523,
+ 0x3F6B1FDC, 0x00691FF6, 0x036A1FC0, 0x1F05C000,
+ 0x1F05C000, 0x20970523, 0x2597058A, 0x358C5000,
+ 0x3E97066B, 0x31200001, 0x2580045A, 0x0C220020,
+ 0x2E800791, 0x09661FFF, 0x0E631FE6, 0x3F9704BC,
+ 0x359704D5, 0x369704EF, 0x2397052F, 0x18691FD2,
+ 0x12220002, 0x32970534, 0x32681FD4, 0x18691FD2,
+ 0x27604000, 0x06614004, 0x24681FCE, 0x29604008,
+ 0x238C0100, 0x25218020, 0x1B61401C, 0x27604000,
+ 0x29604008, 0x12220002, 0x268C0400, 0x15624018,
+ 0x26218040, 0x1B61401C, 0x21970512, 0x1A21889C,
+ 0x0A614092, 0x358C5000, 0x23700080, 0x1E691FE2,
+ 0x29970083, 0x02624090, 0x13204096, 0x358C5000,
+ 0x2A5020A4, 0x13204096, 0x1F50A4A4, 0x36970539,
+ 0x145028E6, 0x1A503108, 0x36970539, 0x358C5000,
+ 0x2150ACE6, 0x17503529, 0x0F6B4080, 0x13204096,
+ 0x25370020, 0x04CC0745, 0x1B50C1AC, 0x31502549,
+ 0x36970539, 0x3E500C63, 0x3C502168, 0x36970539,
+ 0x04502D09, 0x3D5011AC, 0x36970539, 0x0D50A509,
+ 0x0E5029D0, 0x36970539, 0x2450214C, 0x1050196B,
+ 0x36970539, 0x3E500C63, 0x12501D29, 0x36970539,
+ 0x3E500C63, 0x14509510, 0x36970539, 0x3E500C63,
+ 0x3F509DE7, 0x36970539, 0x0F6B4080, 0x00631FEE,
+ 0x02194000, 0x34C807E1, 0x29970083, 0x02624090,
+ 0x378007B2, 0x358C5000, 0x236A4080, 0x09360020,
+ 0x1ACC07F2, 0x30700090, 0x02501865, 0x36970539,
+ 0x1B501C63, 0x36970539, 0x38501463, 0x36970539,
+ 0x2C681FC0, 0x268C0400, 0x36200000, 0x2A641FFC,
+ 0x31200001, 0x2580045A, 0x1E6A1FEE, 0x1C6B4090,
+ 0x27320005, 0x1A1EC000, 0x1B360001, 0x39C807E5,
+ 0x3220000D, 0x2580045A, 0x01000000, 0x01000000,
+ 0x1E79084F
+};
+
+static const uint32_t fw2_boot_img_data_buf[] =
+{
+ 0x36200000, 0x16210003, 0x15710249, 0x31200001,
+ 0x2860B41C, 0x2A97008F, 0x1A210000, 0x1231FFFF,
+ 0x1B390001, 0x092CFFFF, 0x00CC0007, 0x0761B140,
+ 0x3A200333, 0x3060B438, 0x3E60B45C, 0x3D60B43C,
+ 0x0A20FFFF, 0x2D60B420, 0x1A210000, 0x1F68B420,
+ 0x0A61B422, 0x1234FEFE, 0x05300001, 0x2D60B420,
+ 0x0C61B424, 0x0761B426, 0x0F61B428, 0x0461B42A,
+ 0x0261B42C, 0x0961B42E, 0x1F61B434, 0x1461B436,
+ 0x2A97008F, 0x1C21A0CA, 0x33228000, 0x3F424000,
+ 0x032D0100, 0x092CFFFF, 0x18CC0023, 0x156AA0CA,
+ 0x2C320007, 0x133600C0, 0x123A0004, 0x3C66B149,
+ 0x11B8002F, 0x30224000, 0x3C800030, 0x19220000,
+ 0x06210045, 0x0C61B424, 0x35230000, 0x2D63B42C,
+ 0x2A97008F, 0x13232000, 0x0C62B428, 0x3063B434,
+ 0x16210333, 0x278C0078, 0x2BBC0077, 0x1C61B438,
+ 0x092CFFFF, 0x01CC0036, 0x386AB148, 0x2636FF00,
+ 0x193A0300, 0x0A62B148, 0x268C0400, 0x3B69B148,
+ 0x343E0100, 0x0A62B148, 0x06350080, 0x09CC0054,
+ 0x1C21A0CA, 0x0D4A4000, 0x2A97008F, 0x0E262000,
+ 0x1ED40079, 0x3F424000, 0x032D0100, 0x092CFFFF,
+ 0x13CC004D, 0x2E60B42C, 0x2560B42E, 0x2E800027,
+ 0x2A97008F, 0x1721A0C8, 0x19220000, 0x3F424000,
+ 0x122D0002, 0x3F424000, 0x182D00FE, 0x092CFFFF,
+ 0x05CC0057, 0x1A223000, 0x2F712049, 0x05B80064,
+ 0x33214000, 0x35230000, 0x3F222000, 0x3F800066,
+ 0x1A210000, 0x35230000, 0x1820B424, 0x19500011,
+ 0x0A500001, 0x1150C400, 0x0A500001, 0x0261B42C,
+ 0x2663B42E, 0x1C62B434, 0x39230333, 0x278C0078,
+ 0x2BBC0077, 0x3363B438, 0x36200000, 0x2B60B140,
+ 0x13710149, 0x398C0000, 0x20800075, 0x3371FF49,
+ 0x20800075, 0x2F71FD49, 0x20800075, 0x2A320001,
+ 0x0A367FFF, 0x21C8008E, 0x252A0008, 0x1EC0008A,
+ 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x21C8008E, 0x2280007E, 0x26260008, 0x0D500000,
+ 0x262EFFFF, 0x1ACC008B, 0x228B4000, 0x0868B1F8,
+ 0x3C34000F, 0x0128000A, 0x33C40095, 0x0224000A,
+ 0x228B4000, 0x3320000A, 0x228B4000, 0x01000000,
+ 0x01000000, 0x01000000
+};
+
+static const uint32_t fw2_master_img_data_buf[] =
+{
+ 0x36200000, 0x16210003, 0x3C605FF4, 0x1B615FF6,
+ 0x36200000, 0x2560B148, 0x1A205FE0, 0x38215FE8,
+ 0x3B230008, 0x1F090000, 0x10C0010E, 0x31200001,
+ 0x2860B41C, 0x2A9700B9, 0x329700C7, 0x1C208000,
+ 0x2B60B140, 0x01000000, 0x19220000, 0x0B685FFE,
+ 0x2469B1F8, 0x2B3C4600, 0x1ECC0013, 0x1D2E0001,
+ 0x28038000, 0x01000000, 0x0A2FFFFF, 0x1BCC0019,
+ 0x0B685FFE, 0x2469B1F8, 0x2B3C4600, 0x22C80021,
+ 0x25800013, 0x056B5FFA, 0x333B0000, 0x14D40026,
+ 0x363700FF, 0x2E63B47A, 0x3A200333, 0x3060B438,
+ 0x3E60B45C, 0x3D60B43C, 0x39230003, 0x2F22B400,
+ 0x0A20FFFF, 0x13408000, 0x1A210000, 0x21488000,
+ 0x23260002, 0x3F418000, 0x1234FEFE, 0x05300001,
+ 0x202A0002, 0x13408000, 0x3D260020, 0x0A2FFFFF,
+ 0x17CC002C, 0x36200000, 0x3E60B406, 0x2D60B416,
+ 0x2B60B426, 0x3860B436, 0x2860B446, 0x3B60B456,
+ 0x036B5FFC, 0x00210100, 0x05222F00, 0x29370080,
+ 0x27C80047, 0x1A210000, 0x1A223000, 0x1820B424,
+ 0x19500011, 0x0A500001, 0x1150C400, 0x0A500001,
+ 0x15410000, 0x3E2C0002, 0x0D500000, 0x1C62B434,
+ 0x10205E90, 0x0D220164, 0x0F970FF0, 0x2469B1F8,
+ 0x15220333, 0x36200000, 0x278C0078, 0x26BC0106,
+ 0x1F62B438, 0x2060B424, 0x2B60B426, 0x33610102,
+ 0x1035000F, 0x38610100, 0x0A68B400, 0x3369B420,
+ 0x32605FCA, 0x13615FCE, 0x353400FF, 0x2C380200,
+ 0x34605FCC, 0x2535FF00, 0x17390002, 0x08615FD0,
+ 0x12970F7D, 0x31200001, 0x2E605EA0, 0x202001A0,
+ 0x1760010C, 0x35203000, 0x1C60010E, 0x31200001,
+ 0x2560B148, 0x30695EA0, 0x33228000, 0x28004000,
+ 0x063C0001, 0x1FCC0078, 0x0462B140, 0x2280007E,
+ 0x28004000, 0x0C3C0004, 0x19CC007E, 0x1968B140,
+ 0x283C4000, 0x2B60B140, 0x1035000F, 0x1231FFFF,
+ 0x0B2D0082, 0x0D894000, 0x248C1D78, 0x318000A1,
+ 0x2F8C1D7A, 0x318000A1, 0x3D8C1DF8, 0x318000A1,
+ 0x368C1DFA, 0x318000A1, 0x298C1D7C, 0x318000A1,
+ 0x228C1D7E, 0x318000A1, 0x308C1DFC, 0x318000A1,
+ 0x3B8C1DFE, 0x318000A1, 0x238C1D79, 0x318000A1,
+ 0x288C1D7B, 0x318000A1, 0x3A8C1DF9, 0x318000A1,
+ 0x318C1DFB, 0x318000A1, 0x2E8C1D7D, 0x318000A1,
+ 0x258C1D7F, 0x318000A1, 0x378C1DFD, 0x318000A1,
+ 0x3C8C1DFF, 0x2EB00104, 0x05BC0C60, 0x33D80D2D,
+ 0x35A00C61, 0x18A40C87, 0x04A80CA2, 0x08F80F6B,
+ 0x35E80D4B, 0x31E00122, 0x336A5EA0, 0x362300AF,
+ 0x17360002, 0x33C800AF, 0x21AC0EF6, 0x31215EA2,
+ 0x07220014, 0x1D97100D, 0x27C80071, 0x21884000,
+ 0x30380000, 0x3AC8011C, 0x31215EA2, 0x07220014,
+ 0x19801030, 0x36200000, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x0D500000, 0x36200000, 0x2760B000,
+ 0x2960B008, 0x1E220001, 0x1B62B010, 0x3760B01C,
+ 0x10228800, 0x1862B01C, 0x228B4000, 0x0868B1F8,
+ 0x2D635E96, 0x3C34000F, 0x02030000, 0x022B000A,
+ 0x05C000CE, 0x3320000A, 0x02030000, 0x1A210000,
+ 0x1231FFFF, 0x1B390001, 0x092CFFFF, 0x1DCC00D0,
+ 0x0761B140, 0x33228000, 0x2D010000, 0x20310008,
+ 0x1A39A0CA, 0x3F424000, 0x19220000, 0x3F424000,
+ 0x0C220020, 0x392DFFBA, 0x3F424000, 0x3860B150,
+ 0x022D0044, 0x28200014, 0x0D4A4000, 0x092CFFFF,
+ 0x2BC800E7, 0x06360100, 0x21C800E2, 0x28004000,
+ 0x0C300008, 0x3C34000F, 0x1A22C000, 0x22520000,
+ 0x22520000, 0x19220000, 0x2B2DFF38, 0x3F424000,
+ 0x172D0008, 0x3F424000, 0x1E220001, 0x172D0008,
+ 0x3F424000, 0x19220000, 0x1A2D000C, 0x3F424000,
+ 0x10228800, 0x3F424000, 0x06220400, 0x0962B144,
+ 0x2E020000, 0x033A0200, 0x0962B144, 0x322C0001,
+ 0x0A2FFFFF, 0x17CC00D5, 0x1F6B5E96, 0x228B4000,
+ 0x0422008D, 0x32800117, 0x09220089, 0x32800117,
+ 0x0C220083, 0x32800117, 0x0A220085, 0x32800117,
+ 0x13220005, 0x32800117, 0x01220087, 0x32800117,
+ 0x18220007, 0x32800117, 0x0D220011, 0x32800117,
+ 0x0222008B, 0x32800117, 0x1B22000B, 0x15625FF2,
+ 0x32635FF0, 0x23320008, 0x0A62B148, 0x3BD0011D,
+ 0x228B4000, 0x31200001, 0x2A9700B9, 0x329700C7,
+ 0x398C0000, 0x35800120, 0x33695F20, 0x2C200136,
+ 0x1C35C000, 0x36C80129, 0x12685F24, 0x043D4000,
+ 0x08CC00AA, 0x3C2300AA, 0x336A5EA0, 0x03210080,
+ 0x2736FFFE, 0x01625EA0, 0x37655F21, 0x288000B4,
+ 0x33695F20, 0x12685F24, 0x1C35C000, 0x2E3DC000,
+ 0x3AC8012A, 0x228B4000, 0x0C970F90, 0x30C801D6,
+ 0x20605F24, 0x00685FFC, 0x1A210000, 0x09615F2E,
+ 0x3F340003, 0x372C0148, 0x21884000, 0x36200000,
+ 0x2360B122, 0x3580014C, 0x146BB124, 0x38695F22,
+ 0x36200000, 0x37370001, 0x15CC0152, 0x3965B123,
+ 0x3580014C, 0x2980013F, 0x3D800142, 0x33970116,
+ 0x1168B122, 0x3B69B124, 0x2F34001F, 0x29310001,
+ 0x19110000, 0x11D401CC, 0x036B5FFC, 0x1C645F20,
+ 0x0A37FF00, 0x0F330008, 0x300B0000, 0x1EC001C9,
+ 0x3D6A5F24, 0x3F215F26, 0x0C2E0040, 0x13408000,
+ 0x3330FFFB, 0x1C2C4000, 0x0B97104D, 0x35695F26,
+ 0x362C000C, 0x13350003, 0x1ECC01C5, 0x3F215F26,
+ 0x2222FFFE, 0x16971063, 0x3E695F24, 0x382C0004,
+ 0x244A0000, 0x042D0042, 0x3F424000, 0x1D2E0001,
+ 0x16420000, 0x12971097, 0x1B970CBD, 0x19685F26,
+ 0x3D695F28, 0x3660B408, 0x1161B40A, 0x12685F24,
+ 0x2421B40E, 0x3B60B40C, 0x21510000, 0x24200021,
+ 0x3560B404, 0x20200040, 0x2660B414, 0x3320017F,
+ 0x0721016D, 0x362300AF, 0x11800CE4, 0x1F685F20,
+ 0x316A5FE8, 0x353400FF, 0x26605F22, 0x1D2E0001,
+ 0x03625FE8, 0x02030000, 0x3330FFFB, 0x0F2C4010,
+ 0x244A0000, 0x382C0004, 0x27490000, 0x2C3B0400,
+ 0x1E2D0001, 0x350A4000, 0x23C40190, 0x1A210000,
+ 0x15410000, 0x12685F24, 0x2B63B120, 0x3D2C0038,
+ 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x002CFFF6, 0x244A0000, 0x052CFFCA, 0x146B5F2E,
+ 0x36368000, 0x1DCC01A5, 0x333B0000, 0x22C801C1,
+ 0x332F003C, 0x3A40C000, 0x0C685F30, 0x20605F24,
+ 0x288001C1, 0x25605F2E, 0x333B0000, 0x12CC01AA,
+ 0x3E605F30, 0x2F8001AC, 0x332F003C, 0x3A40C000,
+ 0x33695F20, 0x1768B124, 0x1E220001, 0x35230000,
+ 0x193500FF, 0x190B4000, 0x1912C000, 0x2E148000,
+ 0x01CC01BA, 0x3E970112, 0x202301AC, 0x23635F24,
+ 0x20200040, 0x208001CF, 0x0C970F90, 0x3BC801D4,
+ 0x20605F24, 0x1F685F20, 0x3D6A5F24, 0x353400FF,
+ 0x2C800159, 0x35215FDA, 0x03970FA9, 0x282301CE,
+ 0x3E8001DB, 0x1F685F20, 0x35970110, 0x353400FF,
+ 0x2A8001CA, 0x33970116, 0x2F380400, 0x2860B120,
+ 0x12685F24, 0x06970FA3, 0x36200000, 0x336A5EA0,
+ 0x1B645F21, 0x183A0001, 0x01625EA0, 0x398000AF,
+ 0x352301BA, 0x3D8001D7, 0x2F230136, 0x23635F24,
+ 0x392000C0, 0x1B645F21, 0x398000AF, 0x2B695F32,
+ 0x1C208000, 0x28150000, 0x30C801E0, 0x228B4000,
+ 0x35605F32, 0x3A2001E3, 0x288000B4, 0x18685FD8,
+ 0x3E215FD8, 0x30380000, 0x22C80208, 0x0B970FCB,
+ 0x33605F34, 0x2D010000, 0x3E2C0034, 0x0B480000,
+ 0x3C6A5FEC, 0x02030000, 0x3C34000F, 0x1D2E0001,
+ 0x0E625FEC, 0x19220000, 0x14625F3A, 0x3562013E,
+ 0x0C330004, 0x3F37000F, 0x2B2F01F8, 0x228B4000,
+ 0x2C8003D3, 0x3E80055D, 0x2A80073F, 0x3A80074F,
+ 0x3780021B, 0x3780021B, 0x3780021B, 0x3780021B,
+ 0x3780021B, 0x3780021B, 0x3780021B, 0x3780021B,
+ 0x3780021B, 0x3780021B, 0x00800C30, 0x3780021B,
+ 0x33605F34, 0x35605F32, 0x398000AF, 0x112200C1,
+ 0x3D80021E, 0x192200A3, 0x3D80021E, 0x0F22008F,
+ 0x3D80021E, 0x0A220085, 0x3D80021E, 0x162200C0,
+ 0x3D80021E, 0x152200A0, 0x3D80021E, 0x122200A1,
+ 0x3D80021E, 0x07220081, 0x3D80021E, 0x01220087,
+ 0x3D80021E, 0x19220000, 0x07685F32, 0x1F625F38,
+ 0x30230223, 0x16341000, 0x00CC02BB, 0x2997037C,
+ 0x01685F34, 0x2D6A5F38, 0x23230233, 0x392C0035,
+ 0x27460000, 0x2D695F34, 0x3780028E, 0x1160013C,
+ 0x2B635F46, 0x2997037C, 0x2C200230, 0x38605F36,
+ 0x229703B1, 0x05CC027E, 0x22970251, 0x0A6A010C,
+ 0x35680110, 0x3D2A01A0, 0x3CC801E3, 0x30380000,
+ 0x0DCC01E3, 0x28620110, 0x0B970CCD, 0x1A6A0110,
+ 0x1820B424, 0x19500011, 0x0A500001, 0x1150C400,
+ 0x0A500001, 0x1B5001A0, 0x0D500000, 0x1C62B434,
+ 0x11210247, 0x392301E3, 0x18940CE7, 0x3D6B0112,
+ 0x0F2201A0, 0x3862010C, 0x36200000, 0x1A6A0110,
+ 0x0C600112, 0x07600110, 0x333B0000, 0x07CC03A3,
+ 0x398000AF, 0x33635F38, 0x011A4000, 0x0462B140,
+ 0x1F6B5EA0, 0x2E020000, 0x3E3B0004, 0x2D635EA0,
+ 0x1A388000, 0x35605F32, 0x2B008000, 0x0E300003,
+ 0x2B605F4A, 0x2B008000, 0x3F30FFF8, 0x1E384001,
+ 0x2D605F4C, 0x1132FFFF, 0x2C2E0D70, 0x20230265,
+ 0x0E8A4000, 0x26605F4E, 0x0A6A010C, 0x202001A0,
+ 0x1A210000, 0x1C0A0000, 0x14970E54, 0x07970E72,
+ 0x046B5F32, 0x14685F4E, 0x3F37000F, 0x293B0100,
+ 0x2E6A5F34, 0x2563B144, 0x16420000, 0x36695F46,
+ 0x3E2C0002, 0x15410000, 0x266A5F3A, 0x3E2C0002,
+ 0x16420000, 0x23695F3C, 0x016B5F38, 0x3E2C0002,
+ 0x15410000, 0x228B4000, 0x3520C000, 0x35605F32,
+ 0x14970CDE, 0x0F220040, 0x1820B424, 0x19500011,
+ 0x01500003, 0x1150C400, 0x0A500001, 0x0E500180,
+ 0x0D500000, 0x1C62B434, 0x352000AF, 0x192100AF,
+ 0x362300AF, 0x1D800CE7, 0x28635E9C, 0x1B6B5FEE,
+ 0x0A615E98, 0x192D0036, 0x22484000, 0x312F0001,
+ 0x29635FEE, 0x00349FFF, 0x10404000, 0x19348000,
+ 0x27C802A1, 0x222DFFFE, 0x0D4A4000, 0x172D0008,
+ 0x22484000, 0x02625E9A, 0x21510000, 0x30380000,
+ 0x32C802B7, 0x20605E9E, 0x14685E98, 0x33215FDC,
+ 0x1C970FBA, 0x13970EF6, 0x12685E9E, 0x1A6B5E9C,
+ 0x30380000, 0x13CC02AB, 0x228B4000, 0x306A5E9A,
+ 0x3E215FD8, 0x2636FF00, 0x3ED002B2, 0x1C970FBA,
+ 0x1A6B5E9C, 0x3E8001DB, 0x23320008, 0x392C0035,
+ 0x27460000, 0x3E695E9E, 0x3080028F, 0x2E97010E,
+ 0x39209000, 0x35605F32, 0x0280108D, 0x1C208000,
+ 0x35605F32, 0x1680109C, 0x19685F4A, 0x33695F4C,
+ 0x1632FFFE, 0x1A048000, 0x19220000, 0x29058400,
+ 0x2B605F4A, 0x01615F4C, 0x228B4000, 0x3B635F36,
+ 0x0A625E94, 0x379702BE, 0x386A5E94, 0x09685F3A,
+ 0x3B8002D7, 0x3B635F36, 0x30380000, 0x31D002D1,
+ 0x21970372, 0x09685F3A, 0x1C390000, 0x31C802D7,
+ 0x09300002, 0x10404000, 0x3930FFFE, 0x2D010000,
+ 0x0F2D01A0, 0x3E610106, 0x1632FFFE, 0x26C80370,
+ 0x28038000, 0x06330001, 0x01D402E0, 0x172E0004,
+ 0x280C8000, 0x3B605F3A, 0x28038000, 0x3F37000F,
+ 0x37C802E7, 0x2F36FFF0, 0x092E0010, 0x1F6B5F40,
+ 0x19625F3E, 0x1A0B8000, 0x36C402EC, 0x01625F40,
+ 0x386A5F42, 0x36200000, 0x133600C0, 0x2B320006,
+ 0x28C802F4, 0x232C0040, 0x262EFFFF, 0x2F8002F0,
+ 0x19600104, 0x09970D10, 0x352000AF, 0x00970D19,
+ 0x0F970D20, 0x0B970CCD, 0x07690104, 0x2B680104,
+ 0x1F2D0030, 0x0D4A4000, 0x122D0002, 0x214B4000,
+ 0x123EFFFF, 0x1A1EC000, 0x11CC0340, 0x3421B424,
+ 0x30510041, 0x2360B428, 0x142D0004, 0x21510000,
+ 0x3151C010, 0x26510001, 0x11220038, 0x1C62B434,
+ 0x062102F9, 0x362300AF, 0x18940CE7, 0x3320003C,
+ 0x3960B348, 0x1B970CBD, 0x0B970CCD, 0x20680106,
+ 0x3721B428, 0x2B6A5F3E, 0x156B5FD0, 0x0451E000,
+ 0x26510001, 0x2E60B42C, 0x122D0002, 0x21510000,
+ 0x24200311, 0x2E63B420, 0x2060B424, 0x1C62B434,
+ 0x19685F4A, 0x33695F4C, 0x3660B408, 0x1161B40A,
+ 0x056B5FCC, 0x2F21B40C, 0x0451E000, 0x26510001,
+ 0x17201061, 0x3B63B400, 0x3560B404, 0x0962B414,
+ 0x3A200003, 0x3D605F50, 0x3F200339, 0x06210343,
+ 0x1B970CE7, 0x362300AF, 0x14940CE4, 0x0F685F50,
+ 0x0834FFFE, 0x3D605F50, 0x30380000, 0x38C8033E,
+ 0x398000AF, 0x0F685F50, 0x0434FFFD, 0x3D605F50,
+ 0x30380000, 0x02CC00AF, 0x096B5F36, 0x08800D27,
+ 0x1E970CED, 0x2D23020D, 0x08800D27, 0x292302F9,
+ 0x18800CED, 0x3B635F36, 0x30380000, 0x2FD00349,
+ 0x21970372, 0x09685F3A, 0x1C390000, 0x2FC8034F,
+ 0x09300002, 0x10404000, 0x3930FFFE, 0x2D010000,
+ 0x0F2D01A0, 0x3E610106, 0x1632FFFE, 0x26C80370,
+ 0x1F6B5F40, 0x19625F3E, 0x1A0B8000, 0x39C40359,
+ 0x01625F40, 0x28038000, 0x0D330003, 0x00D4035D,
+ 0x172E0004, 0x280C8000, 0x3B605F3A, 0x1B970CBD,
+ 0x19685F4A, 0x33695F4C, 0x3660B408, 0x1161B40A,
+ 0x20680106, 0x2B6A5F3E, 0x2421B40E, 0x21510000,
+ 0x3B60B40C, 0x24200021, 0x3560B404, 0x0962B414,
+ 0x0A685F36, 0x1621035F, 0x362300AF, 0x11800CE4,
+ 0x096B5F36, 0x35800116, 0x2B635E90, 0x026B5F34,
+ 0x010CC000, 0x084B0000, 0x3E2C0002, 0x0B480000,
+ 0x28635F4A, 0x196B5E90, 0x2D605F4C, 0x228B4000,
+ 0x336A5F40, 0x36200000, 0x2E605F40, 0x1F3A0000,
+ 0x3BCC0CFF, 0x228B4000, 0x0A20FFFF, 0x192D0036,
+ 0x0D4A4000, 0x2F2DFFFA, 0x0A625F42, 0x3A34003F,
+ 0x2E148000, 0x19CC020D, 0x228B4000, 0x0D4A4000,
+ 0x122D0002, 0x0F3607FC, 0x23C8020F, 0x26320002,
+ 0x19088000, 0x11C0020F, 0x2B008000, 0x05300001,
+ 0x0DD40396, 0x1D2E0001, 0x3E30FFFF, 0x228B4000,
+ 0x2D635E96, 0x27200102, 0x2197038B, 0x12600130,
+ 0x0C625F44, 0x27200102, 0x2197038B, 0x1F6B5E96,
+ 0x1F600134, 0x07625F46, 0x228B4000, 0x0969010C,
+ 0x2E68010E, 0x3B3D01A0, 0x03CC03AE, 0x0C2E01A0,
+ 0x3862010C, 0x30380000, 0x3EC803AD, 0x19088000,
+ 0x1CC0020B, 0x228B4000, 0x28620110, 0x0F630112,
+ 0x398000AF, 0x26680100, 0x2D635E96, 0x366AB140,
+ 0x1D210001, 0x35230000, 0x03280001, 0x300B0000,
+ 0x1A11C000, 0x28038000, 0x2E174000, 0x26C803BF,
+ 0x29310001, 0x03280001, 0x23C403B9, 0x1F6B5E96,
+ 0x228B4000, 0x2D635E96, 0x19220000, 0x0A625E94,
+ 0x1A6BB140, 0x0A690100, 0x31200001, 0x2D02C000,
+ 0x2B160000, 0x386A5E94, 0x0CCC03CD, 0x1D2E0001,
+ 0x0A625E94, 0x3E30FFFF, 0x252DFFFF, 0x09CC03C7,
+ 0x1F6B5E96, 0x386A5E94, 0x228B4000, 0x09625F4E,
+ 0x292C03D6, 0x21884000, 0x3780021B, 0x208003E6,
+ 0x26800460, 0x2A800463, 0x30800483, 0x248004A4,
+ 0x36800509, 0x3C80050C, 0x2B800527, 0x2F80052A,
+ 0x27800548, 0x3780021B, 0x3780021B, 0x3780021B,
+ 0x3780021B, 0x3780021B, 0x28230018, 0x1263013C,
+ 0x28970382, 0x3E970398, 0x0F6A0130, 0x02030000,
+ 0x1A0B8000, 0x11C003EF, 0x2E020000, 0x206B013C,
+ 0x11685F44, 0x36695F46, 0x25370020, 0x04CC03F5,
+ 0x1D2E0001, 0x12625F3C, 0x2D0E0000, 0x040E4000,
+ 0x1632FFFE, 0x3A9703A3, 0x319702B8, 0x36200000,
+ 0x15210120, 0x3E6A5F44, 0x26970345, 0x38200008,
+ 0x18210124, 0x356A5F46, 0x26970345, 0x3D9702BB,
+ 0x09685F3A, 0x09210010, 0x09300002, 0x0F600128,
+ 0x35610104, 0x2997037C, 0x16970D35, 0x20680130,
+ 0x01690134, 0x1C6A0120, 0x3D6B0124, 0x3460B010,
+ 0x1561B014, 0x3D680128, 0x1C69012C, 0x172E0068,
+ 0x0862B000, 0x3B2F0068, 0x2963B004, 0x016A0138,
+ 0x382C0068, 0x2960B008, 0x142D0068, 0x0861B00C,
+ 0x1562B018, 0x2368013C, 0x362300AF, 0x1A388000,
+ 0x3760B01C, 0x1A940D3A, 0x14685F4E, 0x2E6A5F34,
+ 0x30380000, 0x38C8042B, 0x21884000, 0x1C208000,
+ 0x13408000, 0x36200000, 0x22800437, 0x09685F3A,
+ 0x2169B024, 0x012E0028, 0x1C390000, 0x3DD00427,
+ 0x09300002, 0x382C0068, 0x1F090000, 0x1531FFFE,
+ 0x0E68B028, 0x3F418000, 0x2F34001F, 0x112E0002,
+ 0x13408000, 0x2B008000, 0x3E2C0002, 0x0D500000,
+ 0x0D500000, 0x07970D42, 0x206A5F3C, 0x01685F34,
+ 0x1632FFFE, 0x3BC8021D, 0x286B0104, 0x25695F3A,
+ 0x12625F3C, 0x01625F40, 0x010CC000, 0x0F2D01A0,
+ 0x35610104, 0x27490000, 0x3E2C0002, 0x0B480000,
+ 0x07615F4A, 0x2D605F4C, 0x1B970CBD, 0x19685F4A,
+ 0x33695F4C, 0x3B60B40C, 0x1C61B40E, 0x2B680104,
+ 0x1A210000, 0x1161B40A, 0x3660B408, 0x206A5F3C,
+ 0x28200081, 0x3560B404, 0x0962B414, 0x1B21044E,
+ 0x362300AF, 0x14940CE4, 0x3E23021D, 0x2F80037C,
+ 0x2E230028, 0x1263013C, 0x288003E8, 0x28970382,
+ 0x27200102, 0x2197038B, 0x12600130, 0x0C625F44,
+ 0x322C0001, 0x3D605F3C, 0x1D32FFFC, 0x172E0004,
+ 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120,
+ 0x3E6A5F44, 0x26970345, 0x3E6A5F44, 0x38200008,
+ 0x18210124, 0x26970345, 0x3E6A5F44, 0x25200010,
+ 0x1B210128, 0x26970345, 0x3D9702BB, 0x09685F3A,
+ 0x07210018, 0x09300002, 0x0260012C, 0x35610104,
+ 0x3023000A, 0x1263013C, 0x2C800409, 0x28970382,
+ 0x3E970398, 0x11685F44, 0x2D0E0000, 0x1632FFFE,
+ 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120,
+ 0x3E6A5F44, 0x26970345, 0x356A5F46, 0x38200008,
+ 0x18210124, 0x26970345, 0x3D9702BB, 0x09685F3A,
+ 0x0F6A0130, 0x2E6B0134, 0x09300002, 0x0F600128,
+ 0x2E0EC000, 0x1632FFFE, 0x12625F3C, 0x15208009,
+ 0x3797022B, 0x0E970DE8, 0x3E680148, 0x0A970EB9,
+ 0x1A210000, 0x236A5F5C, 0x25200010, 0x00800ED6,
+ 0x06208100, 0x1160013C, 0x28970382, 0x3E970398,
+ 0x236B0130, 0x3D695F44, 0x300B0000, 0x11C0020F,
+ 0x0834FFFE, 0x23C8020F, 0x040E4000, 0x1632FFFE,
+ 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120,
+ 0x3E6A5F44, 0x26970345, 0x356A5F46, 0x38200008,
+ 0x18210124, 0x26970345, 0x3D9702BB, 0x026A0134,
+ 0x12690124, 0x262EFFFF, 0x040D8000, 0x1531FFFE,
+ 0x0F2D01A0, 0x0D4A4000, 0x122D0002, 0x0E494000,
+ 0x2368013C, 0x011A4000, 0x35C80215, 0x25695F3A,
+ 0x026A0134, 0x25310002, 0x23610128, 0x29340100,
+ 0x3DC804D8, 0x236B0130, 0x2B008000, 0x1A0B8000,
+ 0x312F0001, 0x1D2E0001, 0x05300001, 0x3FD004D5,
+ 0x1D2E0001, 0x040D8000, 0x2E61012C, 0x2E0EC000,
+ 0x1632FFFE, 0x12625F3C, 0x2368013C, 0x3797022B,
+ 0x0E970DE8, 0x0C69015C, 0x3368014C, 0x05350100,
+ 0x3EC80502, 0x0A970EB9, 0x22520000, 0x172E0004,
+ 0x07690168, 0x3E680148, 0x1C390000, 0x31D004EB,
+ 0x1F090000, 0x1531FFFE, 0x3C8004EC, 0x30218000,
+ 0x04685F52, 0x2A2EFFFC, 0x3F418000, 0x15381000,
+ 0x36605F52, 0x0497108D, 0x016A0154, 0x2068015C,
+ 0x1A210000, 0x1632FFFE, 0x29340100, 0x25200010,
+ 0x32C80501, 0x01970ED7, 0x3E680148, 0x1F69014C,
+ 0x236A5F5C, 0x1F090000, 0x1531FFFE, 0x350A4000,
+ 0x2B200018, 0x00800ED6, 0x2E6A5F58, 0x012E0028,
+ 0x22520000, 0x22520000, 0x22520000, 0x22520000,
+ 0x328004E4, 0x00208200, 0x1160013C, 0x2F8004A6,
+ 0x21200088, 0x1160013C, 0x28970382, 0x03361F00,
+ 0x23320008, 0x33620138, 0x27200102, 0x2197038B,
+ 0x12600130, 0x2D6B0138, 0x0C625F44, 0x333B0000,
+ 0x206B013C, 0x15CC051B, 0x2480051E, 0x26370040,
+ 0x1FCC051E, 0x322C0001, 0x3D605F3C, 0x2D0E0000,
+ 0x1632FFFE, 0x3A9703A3, 0x36200000, 0x15210120,
+ 0x3E6A5F44, 0x27230404, 0x20800345, 0x2E200048,
+ 0x1160013C, 0x3780050E, 0x28970382, 0x27200102,
+ 0x2197038B, 0x12600130, 0x0C625F44, 0x1A32FFFD,
+ 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120,
+ 0x3E6A5F44, 0x26970345, 0x3E6A5F44, 0x38200008,
+ 0x18210124, 0x26970345, 0x3D9702BB, 0x25200540,
+ 0x26605F4E, 0x2A230400, 0x1263013C, 0x2C800409,
+ 0x2C69B020, 0x012E0028, 0x22520000, 0x22520000,
+ 0x22520000, 0x3F418000, 0x3E23021D, 0x01800D42,
+ 0x28970382, 0x2A2001FF, 0x2197038B, 0x12600130,
+ 0x3D605F3C, 0x2E020000, 0x0C625F44, 0x1632FFFE,
+ 0x3A9703A3, 0x36200000, 0x15210120, 0x3E6A5F44,
+ 0x26970345, 0x36200000, 0x3B605F3A, 0x0F600128,
+ 0x09210010, 0x35610104, 0x18230808, 0x1263013C,
+ 0x2C800409, 0x02030000, 0x0D37FFF8, 0x0CCC021B,
+ 0x382C0562, 0x21884000, 0x3980056A, 0x208005B0,
+ 0x2580061F, 0x31800638, 0x2680067F, 0x268006B0,
+ 0x3780021B, 0x3780021B, 0x0620FFFC, 0x2F970383,
+ 0x03361F00, 0x23320008, 0x33620138, 0x3F2A0011,
+ 0x3BC40211, 0x3E970398, 0x05300001, 0x29D00575,
+ 0x112E0002, 0x25347FFF, 0x23C8020F, 0x2E680138,
+ 0x07625F46, 0x322C0001, 0x08280003, 0x22C4057D,
+ 0x36200000, 0x0D240005, 0x07018000, 0x15072000,
+ 0x333B0000, 0x02CC0213, 0x3D695F44, 0x092E0010,
+ 0x040E4000, 0x082A0800, 0x356A5F46, 0x30C40213,
+ 0x1132FFFF, 0x040E4000, 0x1632FFFE, 0x3A9703A3,
+ 0x319702B8, 0x36200000, 0x15210120, 0x146B5F42,
+ 0x3E6A5F44, 0x06330001, 0x33D00595, 0x3C230596,
+ 0x20800345, 0x2B9702CD, 0x146B5F42, 0x38200008,
+ 0x18210124, 0x356A5F46, 0x0A330002, 0x31D0059E,
+ 0x3523059F, 0x20800345, 0x2B9702CD, 0x0A6B5F3A,
+ 0x356A5F46, 0x1B210128, 0x2B635F46, 0x25200010,
+ 0x26970345, 0x3D9702BB, 0x196B5F46, 0x3D680128,
+ 0x026A0134, 0x0260012C, 0x1632FFFE, 0x38635F3A,
+ 0x12625F3C, 0x1320E000, 0x2B230618, 0x3180022B,
+ 0x0B20FFF8, 0x2F970383, 0x03361F00, 0x23320008,
+ 0x33620138, 0x3F2A0011, 0x3BC40211, 0x24200082,
+ 0x2197038B, 0x12600130, 0x0C625F44, 0x24200082,
+ 0x2197038B, 0x1F600134, 0x05300001, 0x3BD005C1,
+ 0x112E0002, 0x25347FFF, 0x23C8020F, 0x2E680138,
+ 0x07625F46, 0x3E2C0002, 0x09280004, 0x30C405C9,
+ 0x36200000, 0x3C2C0009, 0x07018000, 0x15072000,
+ 0x333B0000, 0x02CC0213, 0x3D695F44, 0x2D680134,
+ 0x092E0010, 0x1231FFFF, 0x082A0800, 0x30C40213,
+ 0x2E020000, 0x1632FFFE, 0x2D0E0000, 0x040E4000,
+ 0x102E0005, 0x1632FFFE, 0x3A9703A3, 0x319702B8,
+ 0x36200000, 0x15210120, 0x146B5F42, 0x3E6A5F44,
+ 0x06330001, 0x23D005E5, 0x1132FFFF, 0x242305E8,
+ 0x20800345, 0x2B9702CD, 0x3E6A5F44, 0x2E9702C7,
+ 0x146B5F42, 0x38200008, 0x18210124, 0x356A5F46,
+ 0x0A330002, 0x3DD005F1, 0x1132FFFF, 0x342305F4,
+ 0x20800345, 0x2B9702CD, 0x356A5F46, 0x2E9702C7,
+ 0x12690124, 0x356A5F46, 0x1531FFFE, 0x0F2D01A0,
+ 0x22484000, 0x1632FFFE, 0x040D8000, 0x214B4000,
+ 0x34340001, 0x36C80219, 0x37370001, 0x36C80219,
+ 0x026A0134, 0x25200010, 0x146B5F42, 0x1B210128,
+ 0x0D330003, 0x3BD00608, 0x3F230609, 0x20800345,
+ 0x2B9702CD, 0x09685F3A, 0x026A0134, 0x26605F4E,
+ 0x2D200028, 0x1621012C, 0x1132FFFF, 0x26970345,
+ 0x3D9702BB, 0x14685F4E, 0x026A0134, 0x3B605F3A,
+ 0x39209000, 0x1A32FFFD, 0x12625F3C, 0x3797022B,
+ 0x0E970DE8, 0x3368014C, 0x0A970EB9, 0x1A210000,
+ 0x236A5F5C, 0x2B200018, 0x00800ED6, 0x28970382,
+ 0x3E970398, 0x126B5F44, 0x2E0EC000, 0x1632FFFE,
+ 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120,
+ 0x3E6A5F44, 0x26970345, 0x38200008, 0x18210124,
+ 0x356A5F46, 0x26970345, 0x3D9702BB, 0x0A6B5F3A,
+ 0x026A0134, 0x0A330002, 0x0163012C, 0x1632FFFE,
+ 0x12625F3C, 0x3620F000, 0x2B230618, 0x3180022B,
+ 0x0B20FFF8, 0x2F970383, 0x0A625F42, 0x2B200018,
+ 0x2197038B, 0x12600130, 0x0C625F44, 0x2B200018,
+ 0x2197038B, 0x1F600134, 0x0834FFFE, 0x23C8020F,
+ 0x112E0002, 0x07625F46, 0x3A20A000, 0x1160013C,
+ 0x3D695F44, 0x28038000, 0x070E8000, 0x2E0EC000,
+ 0x040E4000, 0x1632FFFE, 0x3A9703A3, 0x319702B8,
+ 0x36200000, 0x15210120, 0x146B5F42, 0x3E6A5F44,
+ 0x06330001, 0x3ED00658, 0x3A230659, 0x20800345,
+ 0x2B9702CD, 0x146B5F42, 0x356A5F46, 0x38200008,
+ 0x0A330002, 0x3DD00662, 0x1132FFFF, 0x18210124,
+ 0x33230666, 0x20800345, 0x18210124, 0x2B9702CD,
+ 0x356A5F46, 0x2E9702C7, 0x25200010, 0x1B210128,
+ 0x146B5F42, 0x356A5F46, 0x0D330003, 0x3ED0066E,
+ 0x3A23066F, 0x20800345, 0x2B9702CD, 0x3D9702BB,
+ 0x09685F3A, 0x356A5F46, 0x1632FFFE, 0x12625F3C,
+ 0x09300002, 0x0260012C, 0x2368013C, 0x3797022B,
+ 0x0E970DE8, 0x3368014C, 0x0A970EB9, 0x1A210000,
+ 0x236A5F5C, 0x2B200018, 0x00800ED6, 0x0C20FFF9,
+ 0x2F970383, 0x0A625F42, 0x122D0002, 0x2B200018,
+ 0x2197038B, 0x1F600134, 0x0834FFFE, 0x23C8020F,
+ 0x112E0002, 0x07625F46, 0x2920013C, 0x27508000,
+ 0x0A500001, 0x23290002, 0x22484000, 0x28038000,
+ 0x1A32FFFD, 0x2E0EC000, 0x3F340003, 0x20605F48,
+ 0x1632FFFE, 0x3A9703A3, 0x319702B8, 0x356A5F46,
+ 0x116B5F48, 0x2B008000, 0x1132FFFF, 0x37370001,
+ 0x31C8069E, 0x2D0E0000, 0x15210120, 0x36200000,
+ 0x26970345, 0x116B5F48, 0x356A5F46, 0x37370001,
+ 0x1FCC06D7, 0x2B2306D7, 0x09685F3A, 0x2E01C000,
+ 0x232C01A0, 0x0A500001, 0x1632FFFE, 0x202A0002,
+ 0x0F970FF0, 0x122801A0, 0x3B605F3A, 0x0D894000,
+ 0x0B20FFF8, 0x2F970383, 0x0A625F42, 0x2B200018,
+ 0x2197038B, 0x12600130, 0x0C625F44, 0x2B200018,
+ 0x2197038B, 0x1F600134, 0x0834FFFE, 0x23C8020F,
+ 0x112E0002, 0x07625F46, 0x2920013C, 0x02509000,
+ 0x0A500001, 0x23290002, 0x22484000, 0x3D695F44,
+ 0x38340002, 0x20605F48, 0x1132FFFF, 0x28038000,
+ 0x2E0EC000, 0x2E0EC000, 0x040E4000, 0x1632FFFE,
+ 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120,
+ 0x146B5F42, 0x3E6A5F44, 0x06330001, 0x2FD006D6,
+ 0x2B2306D7, 0x20800345, 0x2B9702CD, 0x146B5F42,
+ 0x356A5F46, 0x38200008, 0x0A330002, 0x24D006E2,
+ 0x07018000, 0x1132FFFF, 0x040E4000, 0x18210124,
+ 0x222306E8, 0x20800345, 0x18210124, 0x2B9702CD,
+ 0x356A5F46, 0x2E9702C7, 0x356A5F46, 0x2E9702C7,
+ 0x146B5F42, 0x356A5F46, 0x1B210128, 0x0D330003,
+ 0x20D0070F, 0x116B5F48, 0x2B008000, 0x1132FFFF,
+ 0x37370001, 0x36C806F3, 0x2D0E0000, 0x25200010,
+ 0x26970345, 0x116B5F48, 0x356A5F46, 0x37370001,
+ 0x05CC0718, 0x0F69013C, 0x01685F34, 0x356A5F46,
+ 0x223D9000, 0x1CCC070D, 0x2E2C0028, 0x084B0000,
+ 0x3E2C0002, 0x27490000, 0x3E2C0002, 0x2D1B4000,
+ 0x27490000, 0x3E2C0002, 0x2D1B4000, 0x27490000,
+ 0x2D200028, 0x2D1B4000, 0x2DC8070D, 0x31230718,
+ 0x20800345, 0x31230718, 0x338006A6, 0x25200010,
+ 0x2B9702CD, 0x356A5F46, 0x2E9702C7, 0x116B5F48,
+ 0x356A5F46, 0x37370001, 0x33C806F9, 0x2E9702C7,
+ 0x3D9702BB, 0x3D6A5F48, 0x09685F3A, 0x17360002,
+ 0x37C80722, 0x356A5F46, 0x01690134, 0x1132FFFF,
+ 0x040E4000, 0x1632FFFE, 0x12625F3C, 0x09300002,
+ 0x0260012C, 0x2368013C, 0x3797022B, 0x2D695F58,
+ 0x142D0032, 0x22484000, 0x38340002, 0x10CC0738,
+ 0x016A0154, 0x3A20A000, 0x28038000, 0x06330001,
+ 0x13D40732, 0x1D2E0001, 0x112E0002, 0x3D33FFFF,
+ 0x2E0EC000, 0x1632FFFE, 0x11625F5C, 0x0B970DD4,
+ 0x0E970DE8, 0x3368014C, 0x0A970EB9, 0x1A210000,
+ 0x236A5F5C, 0x2B200018, 0x00800ED6, 0x02030000,
+ 0x052B000B, 0x3EC4021B, 0x372C0744, 0x21884000,
+ 0x2B800754, 0x0D800811, 0x18800A18, 0x0B800AF1,
+ 0x3780021B, 0x0D800811, 0x3780021B, 0x0B800AF1,
+ 0x2D800752, 0x3780021B, 0x2A800753, 0x30380000,
+ 0x0CCC021B, 0x1C800C2F, 0x3780021B, 0x3780021B,
+ 0x0620FFFC, 0x2F970383, 0x122D0002, 0x2B200018,
+ 0x2197038B, 0x12600130, 0x1F600134, 0x0834FFFE,
+ 0x23C8020F, 0x112E0002, 0x23290002, 0x22484000,
+ 0x07625F46, 0x34340001, 0x20605F48, 0x2B008000,
+ 0x3530FFFD, 0x2D0E0000, 0x2D0E0000, 0x1632FFFE,
+ 0x3A9703A3, 0x319702B8, 0x36200000, 0x15210120,
+ 0x146B5F42, 0x356A5F46, 0x06330001, 0x34D00772,
+ 0x30230773, 0x20800345, 0x2B9702CD, 0x1E9709E7,
+ 0x356A5F46, 0x2D200028, 0x1A210000, 0x26970345,
+ 0x3D9702BB, 0x1A685F46, 0x36695F46, 0x3530FFFD,
+ 0x2B0C4000, 0x01600120, 0x1531FFFE, 0x20610124,
+ 0x026A0134, 0x3930FFFE, 0x232C01A0, 0x1132FFFF,
+ 0x1A210000, 0x084B0000, 0x3E2C0002, 0x2819C000,
+ 0x262EFFFF, 0x0BCC0785, 0x2435FFFE, 0x3EC80217,
+ 0x16970D35, 0x01690134, 0x1C6A0120, 0x3D6B0124,
+ 0x03208400, 0x172E0068, 0x3B2F0068, 0x1861B010,
+ 0x0862B000, 0x2963B004, 0x3760B01C, 0x362300AF,
+ 0x1A940D3A, 0x2C69B020, 0x25310002, 0x2DD0079E,
+ 0x07970D42, 0x34800217, 0x07970D42, 0x1A685F46,
+ 0x19220000, 0x0C600124, 0x2D010000, 0x1531FFFE,
+ 0x2E0D0000, 0x23610128, 0x070D4000, 0x2E0D0000,
+ 0x2E61012C, 0x12625F3C, 0x31200001, 0x1A60013E,
+ 0x39209000, 0x3797022B, 0x3A20A000, 0x0B970DD4,
+ 0x28680164, 0x126A0144, 0x28038000, 0x1632FFFE,
+ 0x2E0EC000, 0x30380000, 0x08D00EB7, 0x1F69014C,
+ 0x070E8000, 0x2E610140, 0x23620148, 0x35098000,
+ 0x2D61014C, 0x1531FFFE, 0x23610144, 0x00208200,
+ 0x00970DD6, 0x2B680168, 0x1C6A014C, 0x30380000,
+ 0x08D00EB7, 0x12690148, 0x23620148, 0x35098000,
+ 0x2E610140, 0x35098000, 0x1632FFFE, 0x040D8000,
+ 0x2D61014C, 0x3620F000, 0x00970DD6, 0x3E680148,
+ 0x1C690140, 0x19220000, 0x20620144, 0x0160014C,
+ 0x2E0D0000, 0x2E610140, 0x3230FFFC, 0x0C600148,
+ 0x1B208001, 0x00970DD6, 0x116A0148, 0x3368014C,
+ 0x2D6B0154, 0x2D620140, 0x2D010000, 0x3530FFFD,
+ 0x0F600144, 0x05300001, 0x1C0A0000, 0x040D8000,
+ 0x20610148, 0x020FC000, 0x12630150, 0x0F208010,
+ 0x00970DD6, 0x28680164, 0x1C690140, 0x30380000,
+ 0x08D00EB7, 0x116A0148, 0x3368014C, 0x206B0150,
+ 0x20610148, 0x2D620140, 0x312F0001, 0x12630150,
+ 0x1C0A0000, 0x20620144, 0x1B208001, 0x00970DD6,
+ 0x0C6A0150, 0x2D6B0154, 0x3368014C, 0x12690148,
+ 0x2E0EC000, 0x3E620150, 0x126A0144, 0x2E610140,
+ 0x1C0A0000, 0x23620148, 0x010F0000, 0x3A33FFFE,
+ 0x3D635F5C, 0x3930FFFE, 0x0F600144, 0x00208200,
+ 0x00970DD6, 0x0E970DE8, 0x07690168, 0x236A5F5C,
+ 0x1C390000, 0x08D00EB7, 0x1B970ECE, 0x2B200018,
+ 0x00800ED6, 0x0120FFFD, 0x2F970383, 0x122D0002,
+ 0x2B200018, 0x2197038B, 0x12600130, 0x1F600134,
+ 0x0834FFFE, 0x23C8020F, 0x112E0002, 0x23290002,
+ 0x22484000, 0x07625F46, 0x38340002, 0x20605F48,
+ 0x2B008000, 0x07018000, 0x3930FFFE, 0x1A32FFFD,
+ 0x2D0E0000, 0x040E4000, 0x1632FFFE, 0x3A9703A3,
+ 0x319702B8, 0x1E9709E7, 0x356A5F46, 0x2D200028,
+ 0x1A210000, 0x1132FFFF, 0x26970345, 0x36200000,
+ 0x356A5F46, 0x1A210000, 0x1132FFFF, 0x26970345,
+ 0x3D9702BB, 0x356A5F46, 0x359706A6, 0x36695F46,
+ 0x1A685F46, 0x1931FFFD, 0x2D610120, 0x29310001,
+ 0x1F090000, 0x20610124, 0x16970D35, 0x01690134,
+ 0x1C6A0120, 0x1861B010, 0x172E0068, 0x0862B000,
+ 0x0662B008, 0x31208808, 0x3760B01C, 0x362300AF,
+ 0x1A940D3A, 0x2169B024, 0x1C390000, 0x10D008F3,
+ 0x12690124, 0x03208400, 0x142D0068, 0x0661B004,
+ 0x3760B01C, 0x362300AF, 0x1A940D3A, 0x2C69B020,
+ 0x25310002, 0x21D408F3, 0x36695F46, 0x1C6A0120,
+ 0x31208808, 0x040E4000, 0x2E620120, 0x172E0068,
+ 0x0862B000, 0x0662B008, 0x3760B01C, 0x362300AF,
+ 0x1A940D3A, 0x2169B024, 0x1C390000, 0x10D008F3,
+ 0x03208400, 0x3760B01C, 0x362300AF, 0x1A940D3A,
+ 0x2C69B020, 0x25310002, 0x21D408F3, 0x07970D42,
+ 0x1A685F46, 0x1F690120, 0x0F600128, 0x3930FFFE,
+ 0x2E0D0000, 0x2E61012C, 0x329703C1, 0x11615F3C,
+ 0x3620F000, 0x202A0002, 0x13C408F5, 0x3E695F48,
+ 0x14350002, 0x21CC08F5, 0x3797022B, 0x0A9709C0,
+ 0x089709CB, 0x016A0154, 0x3368014C, 0x336B0140,
+ 0x3E620150, 0x12690148, 0x0F630148, 0x300B0000,
+ 0x0C630144, 0x3E30FFFF, 0x1F090000, 0x2E610140,
+ 0x1B208001, 0x00970DD6, 0x1C9709DA, 0x3368014C,
+ 0x1F6A0140, 0x12690148, 0x2D6B0154, 0x1C0A0000,
+ 0x2E62014C, 0x3E30FFFF, 0x2E0D0000, 0x2E610140,
+ 0x05300001, 0x2E0D0000, 0x20610148, 0x36200000,
+ 0x0F600144, 0x12630150, 0x39209000, 0x0B970DD4,
+ 0x3E680148, 0x1C690140, 0x1C6A014C, 0x1A084000,
+ 0x0160014C, 0x20610148, 0x2D620140, 0x2D010000,
+ 0x3E30FFFF, 0x2E0D0000, 0x3D610150, 0x3F208800,
+ 0x00970DD6, 0x3368014C, 0x1F6A0140, 0x12690148,
+ 0x2D6B0154, 0x1C0A0000, 0x2E62014C, 0x3E30FFFF,
+ 0x1F090000, 0x2E610140, 0x3930FFFE, 0x1C0A0000,
+ 0x23620148, 0x12630150, 0x39209000, 0x0B970DD4,
+ 0x3368014C, 0x12690148, 0x1F6A0140, 0x0C600148,
+ 0x1A084000, 0x28038000, 0x2D0E0000, 0x2E62014C,
+ 0x09300002, 0x010F0000, 0x01630140, 0x1C208000,
+ 0x0B970DD4, 0x3A20A000, 0x0B970DD4, 0x2E680154,
+ 0x1C6A014C, 0x2D010000, 0x29310001, 0x2FD408CD,
+ 0x322C0001, 0x3E2C0002, 0x0160014C, 0x2D620140,
+ 0x2D010000, 0x3E30FFFF, 0x2B0C4000, 0x0F600144,
+ 0x2D010000, 0x3E30FFFF, 0x2E0D0000, 0x20610148,
+ 0x00208200, 0x00970DD6, 0x3E680148, 0x306B014C,
+ 0x016A0154, 0x02600140, 0x2D010000, 0x3930FFFE,
+ 0x38605F5A, 0x1C09C000, 0x23610144, 0x1632FFFE,
+ 0x11625F5C, 0x03208400, 0x00970DD6, 0x0E970DE8,
+ 0x1B970ECE, 0x026B5F58, 0x0A6A0160, 0x3D2F0034,
+ 0x0B4BC000, 0x16420000, 0x3D370004, 0x25CC0DA8,
+ 0x236A5F5C, 0x2B200018, 0x00800ED6, 0x07970D42,
+ 0x3F800215, 0x1160013C, 0x2997037C, 0x0C2309A3,
+ 0x2B635F46, 0x1E2008FB, 0x38605F36, 0x229703B1,
+ 0x05CC027E, 0x22970251, 0x0B230901, 0x2B635F46,
+ 0x3B80022E, 0x3E680148, 0x1C6A014C, 0x1C690140,
+ 0x0160014C, 0x20620144, 0x2D0E0000, 0x3E30FFFF,
+ 0x1F090000, 0x2E610140, 0x23620148, 0x1B208001,
+ 0x00970DD6, 0x1C9709DA, 0x12690148, 0x3368014C,
+ 0x1F6A0140, 0x2D6B0154, 0x2E610140, 0x1C0A0000,
+ 0x1C0A0000, 0x2E62014C, 0x3930FFFE, 0x0C600148,
+ 0x36200000, 0x0F600144, 0x12630150, 0x39209000,
+ 0x0B970DD4, 0x3368014C, 0x12690148, 0x1F6A0140,
+ 0x0C600148, 0x1A084000, 0x09300002, 0x2D0E0000,
+ 0x2D620140, 0x05300001, 0x0160014C, 0x25200010,
+ 0x28695F52, 0x19220000, 0x2B190000, 0x1A615F52,
+ 0x26695F6C, 0x1F238000, 0x38635F56, 0x22484000,
+ 0x026B5F34, 0x122D0002, 0x3F424000, 0x351F0000,
+ 0x0EC80DB1, 0x16235F7A, 0x2449C000, 0x3D2F0002,
+ 0x1A1D0000, 0x29CC0941, 0x2449C000, 0x1C390000,
+ 0x3FCC0DB1, 0x25695F56, 0x1C390000, 0x25D40944,
+ 0x14625F56, 0x302F0006, 0x1D2E0001, 0x03800936,
+ 0x04685F52, 0x076B5F52, 0x3C34000F, 0x393700F0,
+ 0x2DCC094C, 0x1C1C8000, 0x26CC094E, 0x06800950,
+ 0x1C1C8000, 0x3DCC0950, 0x1D32FFFC, 0x01800951,
+ 0x1E31FFFC, 0x01198000, 0x17615F56, 0x076B5F52,
+ 0x23310004, 0x1035000F, 0x3F37000F, 0x1C1F4000,
+ 0x0CC80966, 0x28004000, 0x07645F52, 0x1331FFF8,
+ 0x32394001, 0x12615F6A, 0x2D010000, 0x22310003,
+ 0x19615F68, 0x3E30FFFF, 0x032C0D70, 0x05230965,
+ 0x21884000, 0x38605F6C, 0x116A0148, 0x1F69014C,
+ 0x30680140, 0x040D8000, 0x1531FFFE, 0x17615F60,
+ 0x3D6B0148, 0x1C0A0000, 0x2B0F8000, 0x0263014C,
+ 0x3930FFFE, 0x30605F62, 0x1632FFFE, 0x12625F66,
+ 0x10970CD3, 0x34200051, 0x2360B444, 0x09685F56,
+ 0x0A6B5F60, 0x3C34000F, 0x0E300003, 0x2D010000,
+ 0x0934FF00, 0x010CC000, 0x2060B448, 0x193500FF,
+ 0x0761B44A, 0x07685F68, 0x016B5F62, 0x206A5F66,
+ 0x2D010000, 0x0934FF00, 0x010CC000, 0x2D60B44C,
+ 0x193500FF, 0x0A61B44E, 0x1F62B454, 0x1920098F,
+ 0x3E210974, 0x362300AF, 0x19800CEA, 0x1D210001,
+ 0x3561015E, 0x1C208000, 0x1260015C, 0x02970E78,
+ 0x076B5F52, 0x0A685F6C, 0x3F37000F, 0x293B0100,
+ 0x2563B144, 0x3C2108C5, 0x3E2C0002, 0x15410000,
+ 0x09685F56, 0x0B230DB1, 0x3C34000F, 0x07645F52,
+ 0x0E300003, 0x35605F68, 0x08800DE8, 0x0A9709C0,
+ 0x089709CB, 0x3368014C, 0x1F6A0140, 0x12690148,
+ 0x2D6B0154, 0x1C0A0000, 0x2E62014C, 0x1F6A0140,
+ 0x12630150, 0x2E610140, 0x3930FFFE, 0x1C0A0000,
+ 0x23620148, 0x36200000, 0x0F600144, 0x39209000,
+ 0x0B970DD4, 0x1C690140, 0x3E680148, 0x116A0148,
+ 0x2E610140, 0x1A084000, 0x0160014C, 0x3E30FFFF,
+ 0x2D0E0000, 0x23620148, 0x36200000, 0x18800928,
+ 0x3E680148, 0x1C6A014C, 0x1C690140, 0x0160014C,
+ 0x20620144, 0x1F090000, 0x2D0E0000, 0x2E610140,
+ 0x23620148, 0x1B208001, 0x06800DD6, 0x3368014C,
+ 0x12690148, 0x1F6A0140, 0x2E610140, 0x2D0E0000,
+ 0x23620148, 0x2E020000, 0x1632FFFE, 0x1C0A0000,
+ 0x2E680154, 0x20620144, 0x020C0000, 0x11600150,
+ 0x00208200, 0x06800DD6, 0x1F6A0140, 0x12690148,
+ 0x3368014C, 0x23620148, 0x2E610140, 0x3930FFFE,
+ 0x1C0A0000, 0x2E680154, 0x20620144, 0x020C0000,
+ 0x11600150, 0x00208200, 0x06800DD6, 0x25635F4E,
+ 0x146B5F42, 0x356A5F46, 0x38200008, 0x1A210000,
+ 0x0A330002, 0x0BD009F4, 0x28038000, 0x1632FFFE,
+ 0x3D33FFFF, 0x2E0EC000, 0x0A2309FF, 0x20800345,
+ 0x2B9702CD, 0x356A5F46, 0x2E9702C7, 0x356A5F46,
+ 0x2E9702C7, 0x356A5F46, 0x2E9702C7, 0x356A5F46,
+ 0x2E9702C7, 0x356A5F46, 0x2E9702C7, 0x3E695F48,
+ 0x356A5F46, 0x18350001, 0x17C80A12, 0x2D200028,
+ 0x21970372, 0x19685F4A, 0x33695F4C, 0x1632FFFE,
+ 0x1A048000, 0x0FC40A0C, 0x1E2D0001, 0x01615F4C,
+ 0x2B605F4A, 0x0A20FFFF, 0x1A210000, 0x356A5F46,
+ 0x15230A13, 0x20800345, 0x359706A6, 0x356A5F46,
+ 0x25200010, 0x1A210000, 0x176B5F4E, 0x20800345,
+ 0x0620FFFC, 0x2F970383, 0x03361F00, 0x38C80211,
+ 0x23320008, 0x33620138, 0x3F2A0011, 0x3BC40211,
+ 0x3E970398, 0x236B0130, 0x2D010000, 0x2435FFFE,
+ 0x23C8020F, 0x3008C000, 0x26C00A28, 0x12CC020F,
+ 0x126B5F44, 0x112E0002, 0x07625F46, 0x3D2F0002,
+ 0x20635F44, 0x3D33FFFF, 0x1632FFFE, 0x2E0EC000,
+ 0x1632FFFE, 0x3A9703A3, 0x2E680138, 0x3D695F44,
+ 0x02030000, 0x0B2B0003, 0x04C40A38, 0x3A200003,
+ 0x392C0003, 0x15072000, 0x333B0000, 0x02CC0213,
+ 0x36695F46, 0x092E0010, 0x2B034000, 0x1931FFFD,
+ 0x1C09C000, 0x040E4000, 0x082A0800, 0x30C40213,
+ 0x319702B8, 0x36200000, 0x15210120, 0x146B5F42,
+ 0x356A5F46, 0x06330001, 0x1BD00A4D, 0x14230A4E,
+ 0x20800345, 0x2B9702CD, 0x08970C0E, 0x356A5F46,
+ 0x2D200028, 0x1A210000, 0x26970345, 0x3D9702BB,
+ 0x3D695F44, 0x1A685F46, 0x1231FFFF, 0x2E0D0000,
+ 0x20610124, 0x3E30FFFF, 0x2E0D0000, 0x2D610120,
+ 0x16970D35, 0x01690134, 0x1C6A0120, 0x1861B010,
+ 0x172E0068, 0x0862B000, 0x0662B008, 0x31208808,
+ 0x3760B01C, 0x362300AF, 0x1A940D3A, 0x2169B024,
+ 0x1C390000, 0x14D00A74, 0x12690124, 0x03208400,
+ 0x142D0068, 0x0661B004, 0x3760B01C, 0x362300AF,
+ 0x1A940D3A, 0x2C69B020, 0x25310002, 0x1FD00A76,
+ 0x07970D42, 0x34800217, 0x07970D42, 0x1A685F46,
+ 0x3D695F44, 0x1C6A0120, 0x0C600124, 0x2E0D0000,
+ 0x23610128, 0x0C690130, 0x2E6B0134, 0x3930FFFE,
+ 0x2D0E0000, 0x2D62012C, 0x11630130, 0x33610134,
+ 0x19220000, 0x12625F3C, 0x1320E000, 0x3797022B,
+ 0x28680164, 0x0F690150, 0x30380000, 0x08D00EB7,
+ 0x2D6B0154, 0x126A0144, 0x3368014C, 0x30610154,
+ 0x312F0001, 0x12630150, 0x1C690140, 0x2E62014C,
+ 0x02600140, 0x28004000, 0x040D8000, 0x20610148,
+ 0x1132FFFF, 0x19088000, 0x0F600144, 0x00208200,
+ 0x00970DD6, 0x2B680168, 0x2D6B0154, 0x30380000,
+ 0x08D00EB7, 0x1C6A014C, 0x12690148, 0x12630150,
+ 0x23620148, 0x35098000, 0x2E610140, 0x040D8000,
+ 0x1132FFFF, 0x040D8000, 0x2D61014C, 0x3620F000,
+ 0x00970DD6, 0x3E680148, 0x1F69014C, 0x1F6A0140,
+ 0x35230000, 0x0C630144, 0x0160014C, 0x2E0D0000,
+ 0x20610148, 0x2D0E0000, 0x2D620140, 0x1B208001,
+ 0x00970DD6, 0x116A0148, 0x3368014C, 0x1C690140,
+ 0x2D6B0154, 0x2D620140, 0x2D0E0000, 0x3E30FFFF,
+ 0x2D0E0000, 0x23620148, 0x1F090000, 0x23610144,
+ 0x3D33FFFF, 0x12630150, 0x0F208010, 0x00970DD6,
+ 0x04690164, 0x3368014C, 0x1C390000, 0x08D00EB7,
+ 0x1C690140, 0x116A0148, 0x206B0150, 0x20610148,
+ 0x2D620140, 0x312F0001, 0x12630150, 0x1F090000,
+ 0x23610144, 0x1B208001, 0x00970DD6, 0x0C6A0150,
+ 0x2D6B0154, 0x3368014C, 0x12690148, 0x2E0EC000,
+ 0x3E620150, 0x010F0000, 0x3A33FFFE, 0x3D635F5C,
+ 0x3E6B0144, 0x2E610140, 0x300B0000, 0x0F630148,
+ 0x3930FFFE, 0x300B0000, 0x0C630144, 0x00208200,
+ 0x00970DD6, 0x0E970DE8, 0x07690168, 0x236A5F5C,
+ 0x1C390000, 0x08D00EB7, 0x1B970ECE, 0x2B200018,
+ 0x00800ED6, 0x0120FFFD, 0x2F970383, 0x03361F00,
+ 0x38C80211, 0x23320008, 0x33620138, 0x3F2A0011,
+ 0x3BC40211, 0x3E970398, 0x236B0130, 0x2D010000,
+ 0x2435FFFE, 0x23C8020F, 0x3008C000, 0x20C00B01,
+ 0x12CC020F, 0x126B5F44, 0x112E0002, 0x07625F46,
+ 0x3D2F0002, 0x20635F44, 0x0200C000, 0x3D33FFFF,
+ 0x010F0000, 0x1632FFFE, 0x2E0EC000, 0x1632FFFE,
+ 0x3A9703A3, 0x2E680138, 0x3D695F44, 0x02030000,
+ 0x0B2B0003, 0x09C40B13, 0x3A200003, 0x3F2C0005,
+ 0x15072000, 0x333B0000, 0x02CC0213, 0x36695F46,
+ 0x092E0010, 0x1531FFFE, 0x040E4000, 0x082A0800,
+ 0x30C40213, 0x319702B8, 0x36200000, 0x1A210000,
+ 0x3E6A5F44, 0x26970345, 0x08970C0E, 0x356A5F46,
+ 0x2D200028, 0x1A210000, 0x1132FFFF, 0x26970345,
+ 0x3D9702BB, 0x11685F44, 0x36695F46, 0x2E020000,
+ 0x2B034000, 0x3E30FFFF, 0x1231FFFF, 0x280C8000,
+ 0x0C600124, 0x2B0C4000, 0x0F600128, 0x010CC000,
+ 0x01600120, 0x16970D35, 0x01690134, 0x126A0128,
+ 0x3E610130, 0x1861B010, 0x172E0068, 0x0862B000,
+ 0x0662B008, 0x31208808, 0x3760B01C, 0x362300AF,
+ 0x1A940D3A, 0x2169B024, 0x1C390000, 0x32D40B46,
+ 0x07970D42, 0x3F800215, 0x12690124, 0x03208400,
+ 0x142D0068, 0x0661B004, 0x3760B01C, 0x362300AF,
+ 0x1A940D3A, 0x2C69B020, 0x25310002, 0x39D40B44,
+ 0x1C6A0120, 0x31208808, 0x172E0068, 0x0862B000,
+ 0x0662B008, 0x3760B01C, 0x362300AF, 0x1A940D3A,
+ 0x2169B024, 0x1C390000, 0x08D00B44, 0x03208400,
+ 0x3760B01C, 0x362300AF, 0x1A940D3A, 0x2C69B020,
+ 0x25310002, 0x39D40B44, 0x07970D42, 0x1A685F46,
+ 0x1F690120, 0x0F600128, 0x2E0D0000, 0x2E61012C,
+ 0x19220000, 0x12625F3C, 0x3620F000, 0x3797022B,
+ 0x3E680148, 0x1C6A014C, 0x1C690140, 0x0160014C,
+ 0x20620144, 0x1F090000, 0x2E610140, 0x2D0E0000,
+ 0x23620148, 0x1B208001, 0x00970DD6, 0x3368014C,
+ 0x12690148, 0x1F6A0140, 0x2E610140, 0x07018000,
+ 0x2E0D0000, 0x20610148, 0x3E30FFFF, 0x1C0A0000,
+ 0x2E680154, 0x20620144, 0x020C0000, 0x11600150,
+ 0x00208200, 0x00970DD6, 0x016A0154, 0x3368014C,
+ 0x336B0140, 0x3E620150, 0x12690148, 0x0F630148,
+ 0x300B0000, 0x0C630144, 0x3E30FFFF, 0x1F090000,
+ 0x2E610140, 0x1B208001, 0x00970DD6, 0x3368014C,
+ 0x1F6A0140, 0x12690148, 0x23620148, 0x1C0A0000,
+ 0x2E680154, 0x20620144, 0x2E610140, 0x020C0000,
+ 0x11600150, 0x00208200, 0x00970DD6, 0x3368014C,
+ 0x2D6B0154, 0x12690148, 0x1F6A0140, 0x12630150,
+ 0x2E610140, 0x2D695F58, 0x1C0A0000, 0x2E62014C,
+ 0x1F2D0030, 0x0D4A4000, 0x1F2D0006, 0x0E494000,
+ 0x0F3607FC, 0x26320002, 0x33620154, 0x28038000,
+ 0x06330001, 0x31D40BB3, 0x1D2E0001, 0x112E0002,
+ 0x20620144, 0x1132FFFF, 0x23620148, 0x00351F00,
+ 0x20310008, 0x33610158, 0x1320E000, 0x00970DD6,
+ 0x3D680144, 0x1C6A014C, 0x1C690140, 0x206B0150,
+ 0x2D0E0000, 0x2E62014C, 0x0200C000, 0x06330001,
+ 0x2BD40BC6, 0x322C0001, 0x3E2C0002, 0x3E30FFFF,
+ 0x2E0D0000, 0x2E610140, 0x1A210000, 0x20610148,
+ 0x1320E000, 0x00970DD6, 0x206B0150, 0x2E680154,
+ 0x1C6A014C, 0x0263014C, 0x11600150, 0x1C600154,
+ 0x02030000, 0x06330001, 0x30D40BD8, 0x322C0001,
+ 0x3E2C0002, 0x20620144, 0x1C0A0000, 0x2D620140,
+ 0x3E30FFFF, 0x2D0E0000, 0x23620148, 0x1B208001,
+ 0x00970DD6, 0x12690148, 0x126A0144, 0x206B0150,
+ 0x2E610140, 0x23620148, 0x0200C000, 0x3D33FFFF,
+ 0x12630150, 0x1C600154, 0x02030000, 0x06330001,
+ 0x30D40BEE, 0x322C0001, 0x3E2C0002, 0x0F600144,
+ 0x00208200, 0x00970DD6, 0x11690144, 0x116A0148,
+ 0x3368014C, 0x2D6B0154, 0x2D620140, 0x12630150,
+ 0x1C600154, 0x02030000, 0x06330001, 0x2FD40BFD,
+ 0x322C0001, 0x3E2C0002, 0x0160014C, 0x350A4000,
+ 0x23620148, 0x3930FFFE, 0x1C0A0000, 0x20620144,
+ 0x00208200, 0x00970DD6, 0x12690148, 0x016A0154,
+ 0x306B014C, 0x2E610140, 0x3E620150, 0x3D33FFFF,
+ 0x1C09C000, 0x088008E2, 0x25635F4E, 0x146B5F42,
+ 0x38200008, 0x1A210000, 0x3E6A5F44, 0x0A330002,
+ 0x1CD00C1A, 0x196B5F46, 0x1132FFFF, 0x2E0EC000,
+ 0x19230C2A, 0x20800345, 0x2B9702CD, 0x3E6A5F44,
+ 0x2E9702C7, 0x3E6A5F44, 0x19685F4A, 0x33695F4C,
+ 0x1632FFFE, 0x1A048000, 0x10C40C25, 0x1E2D0001,
+ 0x01615F4C, 0x2B605F4A, 0x356A5F46, 0x0A20FFFF,
+ 0x1A210000, 0x2B9702CD, 0x356A5F46, 0x25200010,
+ 0x1A210000, 0x176B5F4E, 0x20800345, 0x3780021B,
+ 0x02030000, 0x0C37FFFF, 0x0CCC021B, 0x052C0C35,
+ 0x21884000, 0x06800C36, 0x28970382, 0x3E20000E,
+ 0x2197038B, 0x093C000E, 0x12CC020F, 0x2A2001FF,
+ 0x2197038B, 0x3D605F3C, 0x3F340003, 0x12CC020F,
+ 0x122E000E, 0x1632FFFE, 0x3A9703A3, 0x319702B8,
+ 0x1122000E, 0x36200000, 0x1A210000, 0x26970345,
+ 0x01685F34, 0x122101D8, 0x3E610106, 0x3B2C0008,
+ 0x27490000, 0x3E2C0002, 0x0B480000, 0x07615F4A,
+ 0x2D605F4C, 0x0F685F3C, 0x30695F40, 0x3930FFFE,
+ 0x36605F3E, 0x1F090000, 0x04C40C58, 0x2E605F40,
+ 0x202001A0, 0x08230C5D, 0x19600104, 0x3B635F36,
+ 0x258002F5, 0x25200010, 0x19600104, 0x2B80043E,
+ 0x20970106, 0x15220003, 0x1F62B438, 0x2C695FCA,
+ 0x04685EDE, 0x19220000, 0x1461B400, 0x1162B406,
+ 0x30380000, 0x36C800A5, 0x2A340080, 0x00C80C6F,
+ 0x13200C80, 0x19230C70, 0x288000B4, 0x36605EDE,
+ 0x09685EEC, 0x332300A5, 0x19220000, 0x14625EEC,
+ 0x28695EDE, 0x366A5EF0, 0x30380000, 0x22C8010E,
+ 0x01198000, 0x2E6A5F02, 0x01198000, 0x336A5EA0,
+ 0x24D000B4, 0x3C36FDFF, 0x01625EA0, 0x288000B4,
+ 0x22215EDE, 0x1F220006, 0x1D97100D, 0x2F215EEC,
+ 0x21510000, 0x21510000, 0x21884000, 0x1F220030,
+ 0x1F62B438, 0x21695FCE, 0x19685EF0, 0x19220000,
+ 0x0161B420, 0x0462B426, 0x30380000, 0x3AC800A6,
+ 0x2A340080, 0x0CC80C95, 0x02200C9B, 0x05230C96,
+ 0x288000B4, 0x2B605EF0, 0x11685EFE, 0x3F2300A6,
+ 0x19220000, 0x0C625EFE, 0x1B800C74, 0x3F215EF0,
+ 0x1F220006, 0x1D97100D, 0x37215EFE, 0x21510000,
+ 0x21510000, 0x21884000, 0x1F220300, 0x1F62B438,
+ 0x21695FCE, 0x01685F02, 0x19220000, 0x0261B440,
+ 0x0762B446, 0x30380000, 0x3DC800A7, 0x2A340080,
+ 0x13C80CB0, 0x13200CB6, 0x11230CB1, 0x288000B4,
+ 0x33605F02, 0x19685F10, 0x382300A7, 0x19220000,
+ 0x04625F10, 0x1B800C74, 0x27215F02, 0x1F220006,
+ 0x1D97100D, 0x3F215F10, 0x21510000, 0x21510000,
+ 0x21884000, 0x04685EDE, 0x22215EDE, 0x30380000,
+ 0x0CD00CC9, 0x03205EEC, 0x0B518000, 0x0D500000,
+ 0x30695EA0, 0x0D500000, 0x00390200, 0x02615EA0,
+ 0x228B4000, 0x0200C000, 0x1F220006, 0x362300AF,
+ 0x19801030, 0x19685EF0, 0x3F215EF0, 0x30380000,
+ 0x0CD00CC9, 0x1B205EFE, 0x02800CC2, 0x01685F02,
+ 0x27215F02, 0x30380000, 0x0CD00CC9, 0x13205F10,
+ 0x02800CC2, 0x04685EDE, 0x22215EDE, 0x30380000,
+ 0x33D40CC1, 0x398000AF, 0x19685EF0, 0x3F215EF0,
+ 0x30380000, 0x35D000AF, 0x1B205EFE, 0x02800CC2,
+ 0x3B605EEC, 0x1C615EEE, 0x228B4000, 0x23605EFE,
+ 0x14615F00, 0x228B4000, 0x2B605F10, 0x0C615F12,
+ 0x228B4000, 0x19685EF0, 0x1A210000, 0x30380000,
+ 0x0DC80CFE, 0x1F61B434, 0x226A5FCE, 0x0761B426,
+ 0x0262B420, 0x2A340080, 0x01C80CFD, 0x28635E9C,
+ 0x3F215EF0, 0x1F220006, 0x1D97100D, 0x1A6B5E9C,
+ 0x288000B4, 0x07615EF0, 0x228B4000, 0x2E620116,
+ 0x1B200D02, 0x288000B4, 0x15970CD9, 0x1C6A0116,
+ 0x0D20B404, 0x19500011, 0x01500003, 0x1150C400,
+ 0x0A500001, 0x0E500180, 0x0D500000, 0x0962B414,
+ 0x352000AF, 0x192100AF, 0x362300AF, 0x11800CE4,
+ 0x01690102, 0x36200000, 0x0A350020, 0x28C8020D,
+ 0x30218000, 0x1F615ED4, 0x3B605EDA, 0x3D605EDC,
+ 0x228B4000, 0x2D695ED4, 0x30380000, 0x22C8010E,
+ 0x1C390000, 0x18D4010A, 0x3B605EDA, 0x228B4000,
+ 0x2D695ED4, 0x30380000, 0x22C8010E, 0x1C390000,
+ 0x18D4010A, 0x3D605EDC, 0x228B4000, 0x01685ED4,
+ 0x27215ED4, 0x30380000, 0x1ED4010C, 0x21510000,
+ 0x228B4000, 0x30695ECC, 0x07685ED2, 0x1C390000,
+ 0x06D400A4, 0x30380000, 0x31C800A4, 0x342300A4,
+ 0x288000B4, 0x3A215ECC, 0x0B518000, 0x36200000,
+ 0x35605ED2, 0x228B4000, 0x30695ECC, 0x35605ED2,
+ 0x1C390000, 0x30695EA0, 0x18D4010A, 0x12390008,
+ 0x02615EA0, 0x228B4000, 0x336A5EA0, 0x1C685ECC,
+ 0x3A215ECC, 0x2E36FFF7, 0x01625EA0, 0x30380000,
+ 0x1ED4010C, 0x21510000, 0x228B4000, 0x04685F52,
+ 0x30218000, 0x2D144000, 0x04CC00A9, 0x1A615F52,
+ 0x302300A9, 0x19200D53, 0x288000B4, 0x29200400,
+ 0x2660B144, 0x06210200, 0x1468B144, 0x3C34000F,
+ 0x2B190000, 0x0A61B144, 0x07645F52, 0x2D010000,
+ 0x20310008, 0x1139A0C8, 0x214B4000, 0x0F2D002C,
+ 0x0E494000, 0x2E020000, 0x06330001, 0x20377F00,
+ 0x1263010A, 0x21320003, 0x1A625F68, 0x2E020000,
+ 0x1032FFF8, 0x313A4001, 0x11625F6A, 0x2E020000,
+ 0x1132FFFF, 0x2C2E0D70, 0x07230D84, 0x0E8A4000,
+ 0x15205F7A, 0x228B4000, 0x12205F82, 0x228B4000,
+ 0x1C205F8A, 0x228B4000, 0x01205F92, 0x228B4000,
+ 0x0F205F9A, 0x228B4000, 0x07205FA2, 0x228B4000,
+ 0x09205FAA, 0x228B4000, 0x14205FB2, 0x228B4000,
+ 0x1A205FBA, 0x228B4000, 0x04205FC2, 0x228B4000,
+ 0x38605F6C, 0x27490000, 0x3E2C0002, 0x084B0000,
+ 0x3E2C0002, 0x244A0000, 0x3E2C0002, 0x0B480000,
+ 0x1F615F58, 0x38635F56, 0x17625F5A, 0x3E605F5C,
+ 0x10970E96, 0x236A5F5C, 0x266B010C, 0x1F3A0000,
+ 0x1AC80DA0, 0x19213000, 0x35098000, 0x190B4000,
+ 0x3061010E, 0x2CC00D9B, 0x34CC0EB5, 0x0A685F5A,
+ 0x1F230DA0, 0x33635F54, 0x046B5F68, 0x12800E9B,
+ 0x0F69010A, 0x0A6B5F56, 0x20310008, 0x0DC80DD1,
+ 0x2E6A5F58, 0x05390080, 0x162E0035, 0x0E458000,
+ 0x0E970DE8, 0x04685F52, 0x1B230DAD, 0x16341000,
+ 0x2DCC109C, 0x3A2000A0, 0x00645F53, 0x2D695F58,
+ 0x3197028E, 0x0269010E, 0x1A223000, 0x350A4000,
+ 0x1DC80DCD, 0x28680108, 0x25620114, 0x30380000,
+ 0x0CC80DBA, 0x06970CFF, 0x10970CD3, 0x0269010E,
+ 0x1B20B444, 0x19500011, 0x0A500001, 0x1150C400,
+ 0x0A500001, 0x2335FFFF, 0x15410000, 0x176A0114,
+ 0x3E2C0002, 0x0D500000, 0x1F62B454, 0x1D200DCB,
+ 0x31210DCB, 0x362300AF, 0x19800CEA, 0x35203000,
+ 0x1C60010E, 0x1A210000, 0x36610108, 0x1A615F52,
+ 0x398000AF, 0x19220000, 0x3662015E, 0x228B4000,
+ 0x1D210001, 0x3561015E, 0x1260015C, 0x38635F56,
+ 0x02970E78, 0x076B5F52, 0x0A685F6C, 0x3F37000F,
+ 0x293B0100, 0x2563B144, 0x25695F56, 0x3E2C0002,
+ 0x15410000, 0x26695F5A, 0x3E2C0002, 0x15410000,
+ 0x20695F5C, 0x3E2C0002, 0x15410000, 0x04800DB1,
+ 0x04685F52, 0x3569B140, 0x3930FFFE, 0x38D003AD,
+ 0x33635F54, 0x09300002, 0x02030000, 0x3C34000F,
+ 0x3D3CFFFF, 0x33228000, 0x1A120000, 0x301D8000,
+ 0x0761B140, 0x336A5EA0, 0x27CC0DF9, 0x2D36FFFB,
+ 0x01625EA0, 0x3D3CFFFF, 0x3A225F7A, 0x3530FFFD,
+ 0x1F060000, 0x22520000, 0x22520000, 0x153B2000,
+ 0x07685F32, 0x35635F52, 0x1A344000, 0x19C80E09,
+ 0x0A685F36, 0x2E9700B4, 0x02685F54, 0x362300AF,
+ 0x288000B4, 0x04685F52, 0x3569B140, 0x1F238000,
+ 0x3C34000F, 0x2E020000, 0x123EFFFF, 0x1C138000,
+ 0x2819C000, 0x0761B140, 0x3F30FFF8, 0x2838A084,
+ 0x18500020, 0x3B680118, 0x2E695F54, 0x0418C000,
+ 0x09600118, 0x351CC000, 0x28CC0E53, 0x2361011E,
+ 0x07685F68, 0x0763011C, 0x0260011A, 0x10970CD3,
+ 0x336B011A, 0x1B20B444, 0x1C500041, 0x0A500001,
+ 0x0E500180, 0x0D500000, 0x2D02C000, 0x2636FF00,
+ 0x0262B44C, 0x363700FF, 0x2563B44E, 0x3F222000,
+ 0x1F62B454, 0x3E6B011E, 0x36200000, 0x0F60011E,
+ 0x333B0000, 0x2BCC0E33, 0x362300AF, 0x16200E36,
+ 0x3A210E36, 0x19800CEA, 0x3668011C, 0x3569B140,
+ 0x146A0118, 0x1A1D0000, 0x0761B140, 0x191E0000,
+ 0x26620118, 0x09C80E4F, 0x36200000, 0x1D210001,
+ 0x28038000, 0x2E174000, 0x31CC0E46, 0x322C0001,
+ 0x1231FFFF, 0x0C800E40, 0x2861011C, 0x0E300003,
+ 0x2B695F32, 0x0260011A, 0x36354000, 0x0CC80E1F,
+ 0x0A200E1F, 0x096B5F36, 0x288000B4, 0x07685F32,
+ 0x26695F36, 0x1A344000, 0x33C800AF, 0x0D894000,
+ 0x1F3A0000, 0x3EC803AD, 0x3B635F36, 0x1A6B5F4A,
+ 0x19600104, 0x3E610106, 0x19625F3E, 0x23635F48,
+ 0x0B970CCD, 0x2B680104, 0x0F6A0106, 0x116B5F48,
+ 0x2360B428, 0x3C21B42A, 0x21510000, 0x0200C000,
+ 0x0934FF00, 0x281A0000, 0x0162B42C, 0x363700FF,
+ 0x2663B42E, 0x2B6A5F3E, 0x27200041, 0x2060B424,
+ 0x1C62B434, 0x3C210E5C, 0x362300AF, 0x18940CE7,
+ 0x096B5F36, 0x228B4000, 0x3B635F36, 0x39200120,
+ 0x1A210000, 0x0C220020, 0x1C6B5F4C, 0x11800E58,
+ 0x33635F54, 0x0F6B5F6A, 0x3A200140, 0x1A210000,
+ 0x0C220020, 0x3B605F60, 0x1C615F62, 0x12625F66,
+ 0x36635F5E, 0x10970CD3, 0x09685F60, 0x2D6A5F62,
+ 0x046B5F5E, 0x2060B448, 0x3F21B44A, 0x21510000,
+ 0x0200C000, 0x0934FF00, 0x281A0000, 0x0262B44C,
+ 0x363700FF, 0x2563B44E, 0x206A5F66, 0x27200041,
+ 0x2360B444, 0x1F62B454, 0x05200EB3, 0x24210E81,
+ 0x362300AF, 0x19800CEA, 0x33635F54, 0x36200000,
+ 0x16210140, 0x0F22002C, 0x0F6B5F6A, 0x3B605F60,
+ 0x1C615F62, 0x12625F66, 0x36635F5E, 0x10970CD3,
+ 0x286A5F5E, 0x09685F60, 0x2E695F62, 0x28038000,
+ 0x0A37FF00, 0x0418C000, 0x2060B448, 0x1A3600FF,
+ 0x0462B44A, 0x0161B44C, 0x36200000, 0x2660B44E,
+ 0x206A5F66, 0x22200011, 0x2360B444, 0x1F62B454,
+ 0x3F210E9F, 0x362300AF, 0x1C940CEA, 0x016B5F54,
+ 0x228B4000, 0x0B210041, 0x1D800DA4, 0x08210021,
+ 0x1D800DA4, 0x2E6A5F58, 0x04690164, 0x012E0028,
+ 0x1C390000, 0x1CD00ECA, 0x1F090000, 0x1531FFFE,
+ 0x2B680168, 0x3F418000, 0x2F34001F, 0x112E0002,
+ 0x13408000, 0x2B008000, 0x3E2C0002, 0x0D500000,
+ 0x0D500000, 0x228B4000, 0x1C208000, 0x13408000,
+ 0x36200000, 0x19800EC3, 0x01685F58, 0x1A210000,
+ 0x2E2C0028, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x15410000, 0x228B4000, 0x11230DA8, 0x0F3607FC,
+ 0x3EC803AD, 0x33635F54, 0x026B5F58, 0x12625F66,
+ 0x010CC000, 0x084B0000, 0x3E2C0002, 0x0B480000,
+ 0x33635F62, 0x2D6B010E, 0x36605F64, 0x2D0DC000,
+ 0x36610108, 0x1B970CBD, 0x02685F62, 0x28695F64,
+ 0x3B60B40C, 0x1C61B40E, 0x28680108, 0x206A5F66,
+ 0x2921B40A, 0x3660B408, 0x21510000, 0x28200081,
+ 0x3560B404, 0x0962B414, 0x02685F54, 0x2A210EE5,
+ 0x362300AF, 0x11800CE4, 0x2D695F6E, 0x1C208000,
+ 0x28150000, 0x1BC80EFB, 0x228B4000, 0x336A5EA0,
+ 0x33605F6E, 0x0B200F01, 0x2B36FFFD, 0x01625EA0,
+ 0x288000B4, 0x15685FDC, 0x2D695F6E, 0x30380000,
+ 0x04C80F64, 0x28605F70, 0x232C0040, 0x27490000,
+ 0x2E655F6E, 0x3865B112, 0x1F31FFFB, 0x232D4010,
+ 0x0D4A4000, 0x1F6BB110, 0x122D0002, 0x1F0AC000,
+ 0x33C00F58, 0x214B4000, 0x2C2DFFF6, 0x333B0000,
+ 0x2AD40F1D, 0x1A685F70, 0x012D0012, 0x0D4A4000,
+ 0x282C0042, 0x084B0000, 0x312DFFEE, 0x1F1F8000,
+ 0x3BCC0F5A, 0x28004000, 0x37215F72, 0x0B97104D,
+ 0x3D695F72, 0x332C0006, 0x13350003, 0x31CC0F5F,
+ 0x37215F72, 0x2922FFFC, 0x16971063, 0x1A685F70,
+ 0x33215FDC, 0x0B970FCB, 0x12971097, 0x1B970CBD,
+ 0x196B5F70, 0x11685F72, 0x3B695F74, 0x2A22B40A,
+ 0x3563B408, 0x22520000, 0x3B60B40C, 0x1C61B40E,
+ 0x28200081, 0x3560B404, 0x20200040, 0x2660B414,
+ 0x30210F2A, 0x362300AF, 0x14940CE4, 0x01685F6E,
+ 0x39695FEA, 0x353400FF, 0x3330FFFB, 0x0A2C401A,
+ 0x084B0000, 0x1E2D0001, 0x312F0001, 0x3A430000,
+ 0x002CFFF6, 0x244A0000, 0x332C0006, 0x084B0000,
+ 0x0B615FEA, 0x312F0001, 0x1F0AC000, 0x1BC40F4D,
+ 0x35230000, 0x3A430000, 0x2E6A5F6E, 0x1A685F70,
+ 0x1A3600FF, 0x3A3A1000, 0x1462B130, 0x06970FA3,
+ 0x1C208000, 0x33605F6E, 0x08230F01, 0x26800130,
+ 0x0D210088, 0x29655F6F, 0x1A685F70, 0x2D695F6E,
+ 0x3D2C0038, 0x0B480000, 0x0C800F03, 0x35970110,
+ 0x1A685F70, 0x33215FDC, 0x06230F53, 0x0D800FCB,
+ 0x336A5EA0, 0x3C350800, 0x1F615F6E, 0x33C800AF,
+ 0x143A0002, 0x01625EA0, 0x398000AF, 0x1768B148,
+ 0x05300001, 0x11D00F74, 0x03300007, 0x15D00F79,
+ 0x0C300008, 0x3D3CFFFF, 0x1464B148, 0x388000A8,
+ 0x35230000, 0x2663B148, 0x39635FF2, 0x32635FF0,
+ 0x0B800F6E, 0x0E710048, 0x13710149, 0x2871804B,
+ 0x12800F7B, 0x00685FFC, 0x276AB1F8, 0x0934FF00,
+ 0x0C300008, 0x322C0001, 0x03361F00, 0x23320008,
+ 0x1C0A0000, 0x06C00114, 0x3F225E90, 0x3330FFFB,
+ 0x1C2C4000, 0x1C0A0000, 0x10C0010E, 0x2F605FD2,
+ 0x06625FD4, 0x242A000F, 0x16C00108, 0x228B4000,
+ 0x10685FD6, 0x37695FD4, 0x30380000, 0x01C80F97,
+ 0x27490000, 0x0E615FD6, 0x228B4000, 0x33290044,
+ 0x3DC00F9F, 0x1D685FD2, 0x05615FD4, 0x2D010000,
+ 0x022D0044, 0x03615FD2, 0x228B4000, 0x361C0000,
+ 0x2F605FD2, 0x29605FD4, 0x228B4000, 0x3C695FD6,
+ 0x30380000, 0x22C8010E, 0x15410000, 0x22605FD6,
+ 0x228B4000, 0x1C390000, 0x24C80108, 0x0D4A4000,
+ 0x30380000, 0x22C8010E, 0x10404000, 0x1F3A0000,
+ 0x14C80FB7, 0x362C003A, 0x16420000, 0x122E0038,
+ 0x062CFFC6, 0x13408000, 0x228B4000, 0x222DFFFE,
+ 0x10404000, 0x228B4000, 0x1C390000, 0x24C80108,
+ 0x0D4A4000, 0x30380000, 0x22C8010E, 0x10404000,
+ 0x1F3A0000, 0x0BC80FC8, 0x3D2C0038, 0x16420000,
+ 0x192E003A, 0x0E2CFFC8, 0x13408000, 0x228B4000,
+ 0x122D0002, 0x10404000, 0x228B4000, 0x1C390000,
+ 0x24C80108, 0x30380000, 0x22C8010E, 0x2D635E96,
+ 0x362C003A, 0x084B0000, 0x0E2CFFFE, 0x244A0000,
+ 0x333B0000, 0x1EC80FDE, 0x1F3A0000, 0x12C80FEB,
+ 0x3E2F0038, 0x1542C000, 0x192E003A, 0x0D2FFFC8,
+ 0x10438000, 0x1C800FE6, 0x3F424000, 0x1F3A0000,
+ 0x1DC80FE4, 0x192E003A, 0x10438000, 0x1C800FE6,
+ 0x122D0002, 0x3F424000, 0x0D500000, 0x0D500000,
+ 0x1F6B5E96, 0x0D2CFFC4, 0x228B4000, 0x122D0002,
+ 0x3F424000, 0x3E2F0038, 0x1542C000, 0x1C800FE6,
+ 0x2A320001, 0x0A367FFF, 0x19C81003, 0x252A0008,
+ 0x3EC00FFF, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x0D500000, 0x0D500000, 0x0D500000,
+ 0x0D500000, 0x19C81003, 0x05800FF3, 0x26260008,
+ 0x0D500000, 0x262EFFFF, 0x24CC1000, 0x228B4000,
+ 0x26635E94, 0x1D97100D, 0x146B5E94, 0x288000B4,
+ 0x26635E94, 0x1D97100D, 0x02030000, 0x17685E94,
+ 0x288000B4, 0x22484000, 0x0F615E92, 0x28605E90,
+ 0x0C300008, 0x3FD4102E, 0x2D635E96, 0x2C34007F,
+ 0x3E30FFFF, 0x122D0002, 0x2E0D0000, 0x214B4000,
+ 0x05300001, 0x322C0001, 0x36695E90, 0x191E0000,
+ 0x3FCC101E, 0x36200000, 0x07024000, 0x36368000,
+ 0x0035007F, 0x1A1D0000, 0x3D695E92, 0x03C8102C,
+ 0x23320008, 0x281A0000, 0x1E2D0001, 0x0E464000,
+ 0x0200C000, 0x1F6B5E96, 0x30380000, 0x228B4000,
+ 0x3F424000, 0x04801028, 0x361C0000, 0x228B4000,
+ 0x28605E90, 0x22484000, 0x0A625E94, 0x0C300008,
+ 0x36D4104B, 0x2E020000, 0x0C300008, 0x2C34007F,
+ 0x0336007F, 0x191E0000, 0x24C80108, 0x3E30FFFF,
+ 0x356A5E90, 0x0F615E92, 0x122D0002, 0x2E0D0000,
+ 0x3F424000, 0x386A5E94, 0x3D695E92, 0x05300001,
+ 0x322C0001, 0x191E0000, 0x3CCC1048, 0x36200000,
+ 0x29380080, 0x21444000, 0x228B4000, 0x36200000,
+ 0x1A80103C, 0x2D635E96, 0x084B0000, 0x3E2C0002,
+ 0x13434000, 0x244A0000, 0x122D0002, 0x3F424000,
+ 0x2E1B8000, 0x3E2C0002, 0x244A0000, 0x122D0002,
+ 0x3F424000, 0x2E1B8000, 0x3E2C0002, 0x244A0000,
+ 0x122D0002, 0x3F424000, 0x2B1AC000, 0x1F6B5E96,
+ 0x3E2C0002, 0x122D0002, 0x228B4000, 0x28605E90,
+ 0x0F615E92, 0x2D635E96, 0x27490000, 0x280C8000,
+ 0x0B480000, 0x1C390000, 0x09C8108A, 0x03340FFC,
+ 0x0EC81072, 0x15280041, 0x3CC01072, 0x16240041,
+ 0x15072000, 0x0E801077, 0x1831FFFA, 0x07024000,
+ 0x2936FFC0, 0x2B034000, 0x3937003F, 0x3D695E92,
+ 0x22484000, 0x1A048000, 0x10404000, 0x122D0002,
+ 0x22484000, 0x2C04C400, 0x10404000, 0x0AC4108A,
+ 0x122D0002, 0x22484000, 0x19220000, 0x05048400,
+ 0x10404000, 0x0AC4108A, 0x122D0002, 0x22484000,
+ 0x05048400, 0x10404000, 0x1F6B5E96, 0x1A685E90,
+ 0x228B4000, 0x14685F14, 0x32215F14, 0x30380000,
+ 0x15D01093, 0x0B518000, 0x228B4000, 0x0200C000,
+ 0x12220002, 0x362300AF, 0x19801030, 0x14685F14,
+ 0x3A215F1A, 0x30380000, 0x15D01093, 0x228B4000,
+ 0x14685F14, 0x32215F14, 0x30380000, 0x1ED4010C,
+ 0x2A340080, 0x14C810A4, 0x12220002, 0x11801008,
+ 0x21510000, 0x1C685F1A, 0x28635E9C, 0x30380000,
+ 0x2DCC10AA, 0x228B4000, 0x3A215F1A, 0x12220002,
+ 0x14971004, 0x1A6B5E9C, 0x198010A5, 0x3DFFFFFF,
+ 0x01000000, 0x01000000, 0x01000000
+};
+
+// Encapsulates the PKA firmware images information.
+typedef struct {
+ const uint32_t *farm_img;
+ uint32_t farm_img_size;
+ const uint32_t *boot_img;
+ uint32_t boot_img_size;
+ const uint32_t *master_img;
+ uint32_t master_img_size;
+} pka_firmware_info_t;
+
+static const pka_firmware_info_t pka_firmware_array[] =
+{
+ {
+ fw0_farm_img_data_buf, 2048, // actual length is 1652
+ fw0_boot_img_data_buf, 152,
+ fw0_master_img_data_buf, 4161
+ },
+ {
+ fw1_farm_img_data_buf, 2048, // actual length is 2000
+ fw1_boot_img_data_buf, 127,
+ fw1_master_img_data_buf, 4186
+ },
+ {
+ fw2_farm_img_data_buf, 2048, // actual length is 2045
+ fw2_boot_img_data_buf, 154,
+ fw2_master_img_data_buf, 4275
+ }
+};
+
+#define PKA_FIRMWARE_IMAGE_0_ID 0
+#define PKA_FIRMWARE_IMAGE_1_ID 1
+#define PKA_FIRMWARE_IMAGE_2_ID 2
+
+// Global storage for the actual firmware identifier
+static uint8_t pka_firmware_id;
+
+// Setter of pka_firmware_id
+static inline void pka_firmware_set_id(uint8_t id)
+{
+ pka_firmware_id = id;
+}
+
+// Getter of pka_firmware_id
+static inline uint8_t pka_firmware_get_id(void)
+{
+ return pka_firmware_id;
+}
+
+
+#endif
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ioctl.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ioctl.h
new file mode 100644
index 000000000..8081a01fd
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ioctl.h
@@ -0,0 +1,127 @@
+//
+// BSD LICENSE
+//
+// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved.
+// 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 Mellanox Technologies 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 __PKA_IOCTL_H__
+#define __PKA_IOCTL_H__
+
+
+#include <linux/types.h>
+#include <linux/ioctl.h>
+
+#define PKA_IOC_TYPE 0xB7
+
+/// PKA_RING_GET_REGION_INFO - _IORW(PKA_IOC_TYPE, 0x0, pka_dev_region_info_t)
+///
+/// Retrieve information about a device region. This is intended to describe
+/// MMIO, I/O port, as well as bus specific regions (ex. PCI config space).
+/// Zero sized regions may be used to describe unimplemented regions.
+/// Return: 0 on success, -errno on failure.
+typedef struct
+{
+ uint32_t reg_index; ///< Registers region index.
+ uint64_t reg_size; ///< Registers region size (bytes).
+ uint64_t reg_offset; ///< Registers region offset from start of device fd.
+
+ uint32_t mem_index; ///< Memory region index.
+ uint64_t mem_size; ///< Memory region size (bytes).
+ uint64_t mem_offset; ///< Memeory region offset from start of device fd.
+} pka_dev_region_info_t;
+#define PKA_RING_GET_REGION_INFO _IOWR(PKA_IOC_TYPE, 0x0, pka_dev_region_info_t)
+
+/// PKA_GET_RING_INFO - _IORW(PKA_IOC_TYPE, 0x1, pka_dev_ring_info_t)
+///
+/// Retrieve information about a ring. This is intended to describe ring
+/// information words located in PKA_BUFFER_RAM. Ring information includes
+/// base addresses, size and statistics.
+/// Return: 0 on success, -errno on failure.
+typedef struct // Bluefield specific ring information
+{
+ /// Base address of the command descriptor ring.
+ uint64_t cmmd_base;
+
+ /// Base address of the result descriptor ring.
+ uint64_t rslt_base;
+
+ /// Size of a command ring in number of descriptors, minus 1.
+ /// Minimum value is 0 (for 1 descriptor); maximum value is
+ /// 65535 (for 64K descriptors).
+ uint16_t size;
+
+ /// This field specifies the size (in 32-bit words) of the
+ /// space that PKI command and result descriptor occupies on
+ /// the Host.
+ uint16_t host_desc_size : 10;
+
+ /// Indicates whether the result ring delivers results strictly
+ /// in-order ('1') or that result descriptors are written to the
+ /// result ring as soon as they become available, so out-of-order
+ /// ('0').
+ uint8_t in_order : 1;
+
+ /// Read pointer of the command descriptor ring.
+ uint16_t cmmd_rd_ptr;
+
+ /// Write pointer of the result descriptor ring.
+ uint16_t rslt_wr_ptr;
+
+ /// Read statistics of the command descriptor ring.
+ uint16_t cmmd_rd_stats;
+
+ /// Write statistics of the result descriptor ring.
+ uint16_t rslt_wr_stats;
+
+} pka_dev_hw_ring_info_t;
+#define PKA_GET_RING_INFO _IOWR(PKA_IOC_TYPE, 0x1, pka_dev_hw_ring_info_t)
+
+/// PKA_CLEAR_RING_COUNTERS - _IO(PKA_IOC_TYPE, 0x2)
+///
+/// Clear counters. This is intended to reset all command and result counters.
+/// Return: 0 on success, -errno on failure.
+#define PKA_CLEAR_RING_COUNTERS _IO(PKA_IOC_TYPE, 0x2)
+
+/// PKA_GET_RANDOM_BYTES - _IOWR(PKA_IOC_TYPE, 0x3, pka_dev_trng_info_t)
+///
+/// Get random bytes from True Random Number Generator(TRNG).
+/// Return: 0 on success, -errno on failure.
+typedef struct // True Random Number Generator information
+{
+ /// Number of random bytes in the buffer; Length of the buffer.
+ uint32_t count;
+
+ /// Data buffer to hold the random bytes.
+ uint8_t *data;
+
+} pka_dev_trng_info_t;
+#define PKA_GET_RANDOM_BYTES _IOWR(PKA_IOC_TYPE, 0x3, pka_dev_trng_info_t)
+
+#endif // __PKA_IOCTL_H__
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_mmio.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_mmio.h
new file mode 100644
index 000000000..c70823c2a
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_mmio.h
@@ -0,0 +1,49 @@
+//
+// BSD LICENSE
+//
+// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved.
+// 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 Mellanox Technologies 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 __PKA_MMIO_H__
+#define __PKA_MMIO_H__
+
+
+/// Macros for standard MMIO functions.
+
+#include <linux/types.h>
+#include <linux/compiler.h>
+#include <linux/io.h>
+
+#define pka_mmio_read64(addr) readq_relaxed(addr)
+#define pka_mmio_write64(addr, val) writeq_relaxed((val), (addr))
+#define pka_mmio_read(addr) pka_mmio_read64(addr)
+#define pka_mmio_write(addr, val) pka_mmio_write64((addr), (val))
+
+#endif // __PKA_MMIO_H__
diff --git a/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ring.h b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ring.h
new file mode 100644
index 000000000..be56b61ee
--- /dev/null
+++ b/drivers/platform/mellanox/mlxbf_pka/mlxbf_pka_ring.h
@@ -0,0 +1,276 @@
+//
+// BSD LICENSE
+//
+// Copyright(c) 2016 Mellanox Technologies, Ltd. All rights reserved.
+// 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 Mellanox Technologies 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 __PKA_RING_H__
+#define __PKA_RING_H__
+
+///
+/// @file
+///
+/// This file forms an interface to the BlueField Public Key Accelerator based
+/// on EIP-154.
+///
+/// Rings are used as a communication mechanism between ARM cores (controller)
+/// and the farm engines controlled by EIP-154 master firmware.
+///
+/// Note that the API defines data stuctures and functions to manage rings
+/// within window RAM, and to enqueue/dequeue descriptors. Rings are considered
+/// as a memory of descriptors (command/result descriptors) using finite size
+/// circular queue and a couple of control status registers (count registers).
+///
+
+
+#include <linux/types.h>
+
+#ifdef PKA_LIB_RING_DEBUG
+// A structure that stores the ring statistics.
+typedef struct
+{
+ uint64_t enq_success_cmd; ///< Cmd descriptors successfully enqueued.
+ uint64_t enq_fail_cmd; ///< Cmd descriptors that failed to be enqueued.
+ uint64_t deq_success_rslt; ///< Rslt descriptors successfully dequeued.
+ uint64_t deq_fail_rslt; ///< Rslt descriptors that failed to be dequeued.
+} pka_ring_debug_stats __pka_cache_aligned;
+#endif
+
+#ifdef PKA_LIB_RING_DEBUG
+#define __RING_STAT_ADD(r, name, n) ({ ##r##->stats.##name += 1; })
+#else
+#define __RING_STAT_ADD(r, name, n) do {} while(0)
+#endif
+
+/// Bluefield PKA command descriptor.
+typedef struct // 64 bytes long. 64 bytes aligned
+{
+ uint64_t pointer_a;
+ uint64_t pointer_b;
+ uint64_t pointer_c;
+ uint64_t pointer_d;
+ uint64_t tag;
+ uint64_t pointer_e;
+
+#ifdef __AARCH64EB__
+ uint64_t linked : 1;
+ uint64_t driver_status : 2;
+ uint64_t odd_powers : 5; ///< shiftCnt for shift ops
+ uint64_t kdk : 2; ///< Key Decryption Key number
+ uint64_t encrypted_mask : 6;
+ uint64_t rsvd_3 : 8;
+ uint64_t command : 8;
+ uint64_t rsvd_2 : 5;
+ uint64_t length_b : 9;
+ uint64_t output_attr : 1;
+ uint64_t input_attr : 1;
+ uint64_t rsvd_1 : 5;
+ uint64_t length_a : 9;
+ uint64_t rsvd_0 : 2;
+#else
+ uint64_t rsvd_0 : 2;
+ uint64_t length_a : 9;
+ uint64_t rsvd_1 : 5;
+ uint64_t input_attr : 1;
+ uint64_t output_attr : 1;
+ uint64_t length_b : 9;
+ uint64_t rsvd_2 : 5;
+ uint64_t command : 8;
+ uint64_t rsvd_3 : 8;
+ uint64_t encrypted_mask : 6;
+ uint64_t kdk : 2; ///< Key Decryption Key number
+ uint64_t odd_powers : 5; ///< shiftCnt for shift ops
+ uint64_t driver_status : 2;
+ uint64_t linked : 1;
+#endif
+
+ uint64_t rsvd_4;
+} pka_ring_hw_cmd_desc_t;
+
+#define CMD_DESC_SIZE sizeof(pka_ring_hw_cmd_desc_t) // Must be 64
+
+/// Bluefield PKA result descriptor.
+typedef struct // 64 bytes long. 64 bytes aligned
+{
+ uint64_t pointer_a;
+ uint64_t pointer_b;
+ uint64_t pointer_c;
+ uint64_t pointer_d;
+ uint64_t tag;
+
+#ifdef __AARCH64EB__
+ uint64_t rsvd_5 : 13;
+ uint64_t cmp_result : 3;
+ uint64_t modulo_is_0 : 1;
+ uint64_t rsvd_4 : 2;
+ uint64_t modulo_msw_offset : 11;
+ uint64_t rsvd_3 : 2;
+ uint64_t rsvd_2 : 11;
+ uint64_t main_result_msb_offset : 5;
+ uint64_t result_is_0 : 1;
+ uint64_t rsvd_1 : 2;
+ uint64_t main_result_msw_offset : 11;
+ uint64_t rsvd_0 : 2;
+
+ uint64_t linked : 1;
+ uint64_t driver_status : 2; ///< Always written to 0
+ uint64_t odd_powers : 5; ///< shiftCnt for shift ops
+ uint64_t kdk : 2; ///< Key Decryption Key number
+ uint64_t encrypted_mask : 6;
+ uint64_t result_code : 8;
+ uint64_t command : 8;
+ uint64_t rsvd_8 : 5;
+ uint64_t length_b : 9;
+ uint64_t output_attr : 1;
+ uint64_t input_attr : 1;
+ uint64_t rsvd_7 : 5;
+ uint64_t length_a : 9;
+ uint64_t rsvd_6 : 2;
+#else
+ uint64_t rsvd_0 : 2;
+ uint64_t main_result_msw_offset : 11;
+ uint64_t rsvd_1 : 2;
+ uint64_t result_is_0 : 1;
+ uint64_t main_result_msb_offset : 5;
+ uint64_t rsvd_2 : 11;
+ uint64_t rsvd_3 : 2;
+ uint64_t modulo_msw_offset : 11;
+ uint64_t rsvd_4 : 2;
+ uint64_t modulo_is_0 : 1;
+ uint64_t cmp_result : 3;
+ uint64_t rsvd_5 : 13;
+
+ uint64_t rsvd_6 : 2;
+ uint64_t length_a : 9;
+ uint64_t rsvd_7 : 5;
+ uint64_t input_attr : 1;
+ uint64_t output_attr : 1;
+ uint64_t length_b : 9;
+ uint64_t rsvd_8 : 5;
+ uint64_t command : 8;
+ uint64_t result_code : 8;
+ uint64_t encrypted_mask : 6;
+ uint64_t kdk : 2; ///< Key Decryption Key number
+ uint64_t odd_powers : 5; ///< shiftCnt for shift ops
+ uint64_t driver_status : 2; ///< Always written to 0
+ uint64_t linked : 1;
+#endif
+
+ uint64_t rsvd_9;
+} pka_ring_hw_rslt_desc_t;
+
+#define RESULT_DESC_SIZE sizeof(pka_ring_hw_rslt_desc_t) // Must be 64
+
+/// Describes a PKA command/result ring as used by the hardware. A pair of
+/// command and result rings in PKA window memory, and the data memory used
+/// by the commands.
+typedef struct
+{
+ uint32_t num_descs; ///< total number of descriptors in the ring.
+
+ uint32_t cmd_ring_base; ///< base address of the command ring.
+ uint32_t cmd_idx; ///< index of the command in a ring.
+
+ uint32_t rslt_ring_base; ///< base address of the result ring.
+ uint32_t rslt_idx; ///< index of the result in a ring.
+
+ uint32_t operands_base; ///< operands memory base address.
+ uint32_t operands_end; ///< end address of operands memory.
+
+ uint32_t desc_size; ///< size of each element in the ring.
+
+ uint64_t cmd_desc_mask; ///< bitmask of free(0)/in_use(1) cmd descriptors.
+ uint32_t cmd_desc_cnt; ///< number of command descriptors currently in use.
+ uint32_t rslt_desc_cnt; ///< number of result descriptors currently ready.
+} pka_ring_desc_t;
+
+/// This structure declares ring parameters which can be used by user interface.
+typedef struct
+{
+ int fd; ///< file descriptor.
+ int group; ///< iommu group.
+ int container; ///< vfio cointainer
+
+ uint32_t idx; ///< ring index.
+ uint32_t ring_id; ///< hardware ring identifier.
+
+ uint64_t mem_off; ///< offset specific to window RAM region.
+ uint64_t mem_addr; ///< window RAM region address.
+ uint64_t mem_size; ///< window RAM region size.
+
+ uint64_t reg_off; ///< offset specific to count registers region.
+ uint64_t reg_addr; ///< count registers region address.
+ uint64_t reg_size; ///< count registers region size.
+
+ void *mem_ptr; ///< pointer to map-ped memory region.
+ void *reg_ptr; ///< pointer to map-ped counters region.
+
+ pka_ring_desc_t ring_desc; ///< ring descriptor.
+
+#ifdef PKA_LIB_RING_DEBUG
+ struct pka_ring_debug_stats stats;
+#endif
+
+ uint8_t big_endian; ///< big endian byte order when enabled.
+} pka_ring_info_t;
+
+typedef struct
+{
+ uint32_t dst_offset; ///< operands desctination offset.
+ uint32_t max_dst_offset; ///< operands end offset.
+
+ pka_ring_info_t *ring;
+} pka_ring_alloc_t;
+
+// This sturcture encapsulates 'user data' information, it also includes
+// additional information useful for command processing and statistics.
+typedef struct
+{
+ uint64_t valid; ///< if set to 'PKA_UDATA_INFO_VALID' then info is valid
+ uint64_t user_data; ///< opaque user address.
+ uint64_t cmd_num; ///< command request number.
+ uint8_t cmd_desc_idx; ///< index of the cmd descriptor in HW rings
+ uint8_t ring_num; ///< command request number.
+ uint8_t queue_num; ///< queue number.
+} pka_udata_info_t;
+
+#define PKA_UDATA_INFO_VALID 0xDEADBEEF
+
+// This structure consists of a data base to store user data information.
+// Note that a data base should be associated with a hardware ring.
+typedef struct
+{
+ pka_udata_info_t entries[32]; // user data information entries.
+ uint8_t index : 5; // entry index. Wrapping is permitted.
+} pka_udata_db_t;
+
+#endif /// __PKA_RING_H__
+
+
--
2.20.1